Move Wip, working through the BO's

Has anyone done a move wip solution? I’m trying to make something that I can just move parts from one bin to another with a grid so I can move everything from one bin to a different bin. Like if some just moves a pallet of parts, they don’t have to do 30 transactions to move all of the stuff on one pallet (plus know exactly what assembly sequence and operation the part is in to be able to move it).

I’m working through the BO’s in the trace, and there is one called pcMtlQueueRowID, type GUID. The parameter in the trace just shows 0’s for the guid. Does that mean it’s going to create one? Or am I supposed to be looking something up? The context isn’t using the Material Queue, and I’m not generating a request, so I don’t think it would have an ID for a row to look up.

Does anyone have any experience working with something like this?

if you turn on full dataset tracing, you can see whats going in and coming out.

Are you tracing stuff from the MES screen? Theres so much other junk on there, I think if it were me, I’d trace WIP movements from the normal UI and work from that.

I was. I’ll try a trace from the normal UI and see if it’s different.

An updateable BAQ that edits the BinNum on WIP will let you do what you need. Otherwise the WipMove is in the IssueReturn BO if I remember correctly. Are your pallets that you are moving mixed product or all from the same job?

I think I have tried that, but I’ll give it another shot. If I did it was a while ago. That would definitely be easier.

It’s all over the place. Many time we will have identical, or nearly identical jobs that they run at the same time, so it ends up being more than one job.

yikes if you want to action to move multiple wip qtys from different jobs you are going to have to do some heavy customizing. You will need to be able to attach a common key (think PCID) to the items on the same pallet and custom code the moves.

I’m not changing the jobs that they are on, just changing the bin. I don’t have a problem looping through records in a grid one at time, I just don’t want to have the user do data entry for every transaction.

Sure but how will you know which all WIP records are on a single pallet nothing natively keys those in Epicor.

If I make a baq that filters by bin number, I should have a list of all of the parts in that bin. With that same BAQ I should be able to pull in all the requisite data to do the transactions, right? If they have a short list of what’s in the bin, the user can pick from the grid which parts he is moving, highlight those and process a move to the new bin. I can make a text box for him to type a to bin, and a button that sets the highlighted rows, then a process button that processes the selected rows.

It works with start and end activity, although those BO’s seem to be a lot easier to work with…

So the issue with this I found is that the only BO’s available to pick is the PartWipSearch, which doesn’t allow any actual updates, and the WorkQueue, which I have no Idea how to make work.

So I can try the advanced BPM update only, and make my own, which is where I’m at now, and the parameters so far are asking for some confusing stuff, so I’ll look at more trace data and see if I can figure it out.

@Chris_Conn

The traces are identical from MES to the normal UI. So unfortunately, that doesn’t help me.

The GUID parameter (MtlQueueRowID) shows up at 0’s for the whole trace, send and return, which makes sense because I’m not processing it from the material queue.

I’m going to try default(Guid) and see if that allows the method to work.

foreach(var x in ttResults.Where(r => r.Updated()))
{
	using (var txscope = IceDataContext.CreateDefaultTransactionScope()) 
	{
		var pwip = (from pw in Db.PartWip where pw.Company == callContextClient.CurrentCompany && pw.SysRowID == x.PartWip_SysRowID select pw).FirstOrDefault();
		var whseBin = (from wb in Db.WhseBin where wb.Company == pwip.Company && wb.BinNum == x.PartWip_BinNum && wb.WarehouseCode == x.PartWip_WareHouseCode select wb).FirstOrDefault();
		if(whseBin !=null)
		{
			pwip.WareHouseCode = x.PartWip_WareHouseCode;
			pwip.BinNum = x.PartWip_BinNum;
			pwip.Quantity = x.PartWip_Quantity;
			Db.Validate();
		}
		else
		{
			throw new Ice.BLException("Dude, this isn't a valid Bin location for the warehouse you have choosen.");
		}
		txscope.Complete();
	}
}
1 Like

That works great!!!

I cannot wait until I get to the point where I can make my own code to do this stuff.

This is a direct data base update right, so I assume that means we are bypassing some rules? I’ll do some testing to see if I can break it, but maybe you already know the answer. (I don’t think this will usually happen, I just want to prepare for the worst), It is theoretically possible to have a quantity of the same parts with the same job,Assembly seq and OP sequence in two different bins, (say there are 10 total and they put 5 in bin A and 5 in bin B), is there is possible issue if these parts were to be put in the same bin using this method? Should I put some error checking that doesn’t allow for that in the rare case someone does it? Or does the Db.Validate(); do that for me?

Thanks for your help, this will really help us.

If you want the qtys to combine nicely you will have to use the BO in an advanced only update. You can build whatever validation you want to enforce either in the move here or before it even hits WIP. Really the BinNum on WIP is fairly benign you just have to be careful that when the rest of the BOs run they don’t start orphaning your WIP records because they won’t be where the expect. That’s the biggest issue you could run into.

hey that exception message looks familiar…

It looks like it doesn’t care about same parts in the same location on two different rows, and then if you really want them combined, you can use the move wip screen and it combines them if you just run the quantity from and to the same locations. It would be a pretty rare workaround here, so, I think that will work.

Is this something I should test for? I’m not really sure how to do that.

This looks like it may help me as well. Where would this code be inserted?