Hi all,
I was working with BOM journals and found out that the reservation for my BOM lines is automatically performed.
I have setup the reservation field on my inventory journal name to be "Manual" however it seems not to be working.
Is it possible to have manual reservation on BOM journals? Am I missing some setup? Is that standard behaviour by design?
Hope you can help me.
*This post is locked for comments
It my opinion, it's a mistake, or a bug, depending on how you feel about things like this.
Report as finished journals have their own journal type and journal name. As coded, there appears to be no way to prevent reservation as desired, even though you already have a perfectly good mechanism to achieve that for Report as finished journals without impacting other journals accidentally. In fact you could have multiple Report as finished journal names, and one of them could be used for Automatic report as finished operations, with its own setup, and another for your manual Report as finished operations. Perfectly good design, squashed by a single line of code. I really don't see how that can be on purpose.
Brandon, your explanation was awesome!
I wonder if the intention was to have a "fixed" Automatic reservation parameter despite the journal name setup or if it is a mistake.
It seems to me that an assignment to "_itemReservation" parameter should be done according to the journal name reservation configuration.
I will analyze the customization you suggest.
Thank you very very much for your time and detailed answer.
I think the source of your problem is pretty easy to see in the following code.
In class BOMReportFinish method initInventJournalTable(), there is a call to .initFromInventJournalName(..) which does indeed copy the Reservation field from InventJournalName to InventJournalTable. But then on the next line, the Reservation field is set according to a caller parameter _itemReservation, effectively ignoring the journal name setup.
void initInventJournalTable(ItemReservation _itemReservation = ItemReservation::Automatic)
{
;
if (! bomParmReportFinish.JournalId)
{
journalTableData = JournalTableData::newTable(parentInventJournalTable);
parentInventJournalTable.JournalId = journalTableData.nextJournalId();
parentInventJournalTable.JournalType = InventJournalType::BOM;
if(bomParmReportFinish.JournalNameId)
parentInventJournalTable.JournalNameId = bomParmReportFinish.JournalNameId;
else
{
parentInventJournalTable.JournalNameId = journalTableData.journalStatic().standardJournalNameId(parentInventJournalTable.JournalType);
if(!parentInventJournalTable.JournalNameId)
throw error("@SYS55001");
}
parentInventJournalTable.initFromInventJournalName(InventJournalName::find(parentInventJournalTable.JournalNameId));
parentInventJournalTable.Reservation = _itemReservation;
parentInventJournalTable.insert();
}
else
{
parentInventJournalTable = InventJournalTable::find(bomParmReportFinish.JournalId, true);
journalTableData = JournalTableData::newTable(parentInventJournalTable);
lineNum = InventJournalTrans::lastLineNum(bomParmReportFinish.JournalId);
}
}
So, what value does the caller provide?
In method run(), the .initInventJournalTable() method is called in one of two ways, depending on whether the report as finished quantity is negative or not. Below you can see that in the case of a "return" report as finished Reservation is set to None, and in the "normal" case where no parameter is provided, the default in the method declaration of Automatic is used. Thus, you're getting Automatic despite the journal name.
if (bomParmReportFinish.InventTransIdReturn && bomParmReportFinish.Qty < 0) { this.initInventJournalTable(ItemReservation::None); this.initBOMReceiptReturn(); this.searchReturnLotId(); } else { this.initInventJournalTable(); this.initBOMReceipt(); this.searchBOM( bomParmReportFinish.bomId, bomParmReportFinish.ItemId, bomParmReportFinish.inventDim(), bomCalcData); }
If it were up to me, I would only want the journal name to be overwritten when the caller ACTUALLY specified a parameter, i.e. the "return" case, and not in the normal case. I would want the journal name to control the journal's behavior. Thus, I would do something like this in the first method.
if (!prmisDefault(_itemReservation)) { parentInventJournalTable.Reservation = _itemReservation; }
Hope this helps.
Hi John, thank you for your answer.
I have checked that parameter and it is set to "Manual".
The problem is that if I set it to "Automatic", then Sales Orders will automatically reserve inventory while they are created (and I don't want that).
My customer doesn't want to use reservations of any kind in any transaction (inventory or sales). That's why I want to prevent automatic reservation on BOM journal.
Nick,
Try the accounts receivable parameters, there is a reservation parameter there for Bills of Materials...
technet.microsoft.com/.../aa551553.aspx
See the following option -
Automatic – Inventory is reserved when order lines are created, in the order in which the order lines are created. For bills of materials (BOMs), reservations are made for the BOM item number, not for the individual elements of the BOM.
Kempeth
4
Andy Adamak
4
Community Member
4