I have a problem where people are accidentally kanbanning in a part which is listed as a Phantom bom. I tried doing a BPM to give an error message, method directive on kanban receipts, however the Part.PhantomBOM field is not available to check.
Iâm kind of surprised the application allows a non-qty-bearing non-stock part to be put into stock. EDIT: It actually doesnât. It just creates a MFG-STK transaction but no part ever goes on hand. Iâm sure that does goofy things with the GL.
I have confirmed the same behavior, though. I think the thing that saves us is we typically donât have operations on our phantoms so that Kanban jobs wonât process.
I didnât think iot would allow it either, but it did . It did not add the phantom part into stock , though it did relieve inventory of the parts in the phantom bom. So, parts just kind of disappearedâŚ
forgive me, i know nothing about the kanban processâŚ
But maybe you could get the part.PhantomBOM field using a fill table by query.
Just link the current ttKanbanReceipt row to the part table by company and part.
Then use the results of that query to check and stop the submition of that kanban receipt if PhantomBOM is true.
(We also donât have operations on phantoms, so I canât verify this would work as intended.)
Iâd hope not! Since nothing gets dispositioned out of the job into inventory, it should only go wherever MFG-VAR is mapped to. If itâs posting to the phantom partâs part classâs mapped GL location without adding inventory, then itâs inflating inventory value.
Worth giving GL journal detail descriptions a search for that kanban job number and verifying where exactly it posted. If itâs distributing WIP value to anything but MFG-VAR, that needs a support ticket.
Itâs setup to go to Inventory on my system. Iâm not super familiar with the Posting rules, but I am imagining that ours are not super customized. Only a small amount went to MFG-VAR. All the more reason to support the OPâs request to make a BPM to stop it.
This is where there are probably dueling processes in play. According to the Inventory Transaction Hierarchy, a MFG-STK transaction has a defined GL account path. The fact that this is a PhantomBOM AND NonStock AND NonQuantity Bearing part MIGHT mean that a different process takes precedence, but Iâd hate to bet the ranch on it.
Processes maybe, but the outcome should follow practice.
WIP value is dispositioned to inventory if itâs received to inventory, COGS if itâs shipped direct, or another jobâs WIP if itâs a make direct component. If WIP posts to any of those when it shouldnât, itâs artificially inflating an account related to taxable outcomes, performance metrics, and business valuation.
Ideally the âkanbanâ receipt process could be constrained to specific parts. But unexpected things inevitably happen and error handling needs to handle exceptions in ways that make the most sense.
@WayneH - I would do a trace and evaluate what the method that fires when you enter or change the part number in the Kanban receipts screen. When I did it, I am getting KanbanReceipts.ChangePart. I would make a post-processing on that method⌠Then Iâd create a boolean variable in your BPM context called qtyBearing. I would then set the variable using the widget and Iâd write a LINQ query such as this (corrected):
(from p in Db.Part
where p.Company == @CompanyID
&& p.PartNum == dsKanbanReceiptsRow.PartNum
select p.QtyBearing).FirstOrDefault()
Now that youâve stored your qtyBearing variable for the given part, you can use it in a condition widget and youâd select the condition type âThe specified argument/variable is equal to the true expression.â
Then Iâd use a Raise Exception widget off the false side of the condition widget to display a message to the user explaining that you canât use Kanban Receipts for parts that are not qty-bearing.
Some other thoughts:
I used qty bearing instead of phantom because all phantoms are non-qty-bearing but you also wouldnât want to receive a non-qty-bearing anything⌠But you could easily pick the PhantomBOM field instead and that would be fine (youâd want to switch the side of the condition widget you hang the exception on, though).
You can also use the current plant session variable and filter to that in your PartPlant (instead of Part) table and check the QtyBearing or PhantomBOM fields there. Those are able to be set by site so if youâre running multi-site, Iâd look at the PartPlant table instead of the Part table.
This looks like a good idea, I âm not sure if I am doing this correctly, however, once I put in the fill table by query I cannot seem to access the field in the next condition statement.
Hi,
I tried doing this, my first time using linq, I keep getting errors
CS0742 A query body must end with a select clause or a group clause
CS0019 Operator â==â cannot be applied to operands of type âstringâ and âcharâ
Thatâs my bad. I donât think I copied/pasted all the code. Sorry about that.
it should look like this:
(from p in Db.Part
where p.Company == @CompanyID
&& p.PartNum == dsKanbanReceiptsRow.PartNum
select p.QtyBearing).FirstOrDefault()
Iâve corrected it above also just in case someone else tries to copy/paste that they wonât have to read through additional comments to find the correct syntax.
Then I mapped the query results into the variable, which contains a Part table. I always use Bind Automatically cause it auto-maps the fields youâve include in your query.
I havenât tried this recently, but I absolutely recall having to create a BPM to prevent phantoms from being added to sales orders at one point in time as well.
Never underestimate the ability of an end user to do things you never expected!
We have a report that goes out every morning that looks for a number of âoddballâ things on sales orders. Phantoms is one of them. But a BPM probably wouldnât hurt.