|
![]() |
#1 |
Участник
|
Спасибо за развернутый ответ.
С получением списка номенклатур напрямую из таблиц стало понятно. Тем не менее, количество входящих номенклатур через BOM.BOMQty почему-то возвращает 0, хотя в таблице оно указано. Raven Melancholic, Цитата:
если нужен не только список номенклатур а и количество (которое может зависеть от формулы расчета, настроек отходов), то еще и BOMCalcData.
|
|
![]() |
#2 |
Участник
|
в своём примере я не выбираю данные из строк спецификации. Если они вам нужны, то замените
X++: //join TableId from BOM join BOM Как минимум ещё стоит учесть значение "В серии" (BOMSeries), а в более сложных случаях может использоваться формула для расчёта нормы. |
|
![]() |
#3 |
Участник
|
Можно поискать по перекрестным ссылкам его использование. Например, он используется при создании складского журнала "Спецификация" из карточки номенклатуры в классе BOMReportFinish.
Если для учебных целей, то простой пример будет примерно следующим (это для DAX4, в 2009 нужно еще учесть возможность иметь разные спецификации для разных сайтов). Создаем класс, в нем реализуем метод: X++: public void expandBOM( ItemId _itemId, ConfigId _configId, TransDate _baseDate, InventQty _qtySeries, Counter _level, BOMId _bomId = '', boolean _expandPhantom = true ) { InventTable inventTable; InventTable childInventTable; BOMSearch search; BOMCalcData calcData; BOMCalcConsumption calcConsump; BOMId bomId; ItemId childItemId; ConfigId childConfigId; BOMId childBOMId; CompanyId companyId; boolean expandChild; Qty qty; ; if (_level > bomMaxLevel) { return; } select firstOnly inventTable where inventTable.ItemId == _itemId ; if (!inventTable.inventItemType().canHaveBOM()) { return; } bomId = (_bomId && BOMTable::exist(_bomId)) ? _bomId : inventTable.BOMId(_baseDate, _qtySeries); search = BOMSearch::newBOMExplode_OVK(bomId, _baseDate, _itemId, _configId); calcData = BOMCalcData::newInventTable(_qtySeries, inventTable); while (search.next()) { childItemId = search.BOM().itemId; if (!childItemId || !InventTable::exist(childItemId)) { continue; } childInventTable = search.BOM().inventTable(); calcConsump = BOMCalcConsumption::construct(search.BOM().formula, calcData); qty = calcConsump.calcConsumption(search.BOM()) * _qtySeries; qty = UnitConvert::qty( qty, search.BOM().unitId, childInventTable.inventUnitId(), childItemId, false); if (!qty) { continue; } childConfigId = search.BOM().configId(); childBOMId = search.BOM().itemBOMId(_baseDate, qty); expandChild = false; if (search.BOM().BOMType == BOMType::Phantom) { if (_expandPhantom) { expandChild = true; } } else if (childInventTable.inventItemType().canHaveBOM() && !childInventTable.StopExplode) { expandChild = true; } if (!_expandPhantom || search.BOM().BOMType != BOMType::Phantom) { info(strFmt("%1Уровень = %2 Номенклатура = %3, конфигурация = %4, количество = %5", strRep(" ", _level*4), _level, childItemId, childConfigId, qty)); } if (!expandChild) { continue; } select firstOnly childInventTable where childInventTable.ItemId == childItemId ; if (childInventTable.inventItemType().canHaveBOM()) { this.expandBOM( childItemId, childConfigId, _baseDate, qty, _level + (search.BOM().BOMType != BOMType::Phantom ? 1 : 0), childBOMId, _expandPhantom ); } } } X++: static void TestExpandBOM_job(Args _args) { InventTable inventTable; ConfigTable configTable; TestExpandBOM testExpandBOM; Counter maxLevel; TransDate baseDate; InventQty qtySeries; boolean expandPhantom; ; baseDate = systemDateGet(); expandPhantom = true; qtySeries = 1; maxLevel = 1; // BOMParameters::find().BOMMaxLevel(); testExpandBOM = TestExpandBOM::newBlank(maxLevel); while select inventTable where inventTable.ItemId == "140782" { if (!inventTable.configActive()) { info(strFmt("Основная номенклатура %1", inventTable.ItemId)); testExpandBOM.expandBOM(inventTable.ItemId, '', baseDate, qtySeries, 1, '', expandPhantom); } else { while select configTable where configTable.ItemId == inventTable.ItemId { info(strFmt("Основная номенклатура %1, конфигурация %2", inventTable.ItemId, configTable.ConfigId)); testExpandBOM.expandBOM(inventTable.ItemId, configTable.ConfigId, baseDate, qtySeries, 1, '', expandPhantom); } } } } |
|
|
|