Цитата:
Сообщение от
1349
Получить просто список всех спецификаций удалось так: ...
Уточню терминологию. Таким образом вы получили список номенклатур с типом спецификаця. Т.е. таких номенклатур, которые могут иметь спецификацию.
Дело в том что в аксапте термин "Спецификация" используется для обозначения не номенклатуры со списком входящих, а для обозначения непостредственно самого списка составляющих номенклатуры. Спецификации в аксапте имеют отдельные коды, вообще говоря отличные от кодов номенклатурных. Причём связь между номенклатурными кодами и спецификациями - многие ко многим. Это сделано, например, для того чтобы одну и туже аксаптовскую спецификацию можно было назначить одновременно нескольким номенклатурам. Это будут разные номенклатурные коды, но состав у них будет одинаковым, и если потом внести изменения в такую спецификацию, то эти изменения отразятся на всех номенклатурах использующих эту спецификацию. Иногда это бывает полезно. И наоборот чтобы на один и тот же номенклатурный код можно было назначить несколько разных спецификаций.
Теперь о структуре таблиц.
Сами спецификации хранятся в двух таблицах. Заголовки спецификаций (BOMTable) и строки спецификаций (BOM). Связь между ними один ко многим по полю BOMId. Связь между таблицей спецификаций (BOMTable) и таблицей номенклатур (InventTable), как я уже говорил - многие ко многим. Реализуется она через таблицу версий спецификации (BOMVersion).
В случае когда одному ItemId в таблице BOMVersion соответствует несколько BOMId возникает необходимость в определении какой именно состав номенклатуры нужно использовать в данный момент для текущей задачи. Для этого в таблице BOMVersion присутствуют дополнительные атрибуты, которые помогают идентифицировать искомую версию спецификации. В зависимости от версии аксапты набор этих признаков может различаться. Как минимум, это период действия версии спецификации и её активность. Помимо этих характеристик в составной ключ могут входить номенклатурные аналитики, складская аналитика сайт и размер партии. Подробности смотрите в методе BOMVersion::findActive()
Цитата:
Сообщение от
1349
Связать же эту таблицу с собой через itemId, чтобы узнать, какие строки входят в спецификацию с конкретным itemId, не выходит. Подскажите, пожалуйста, куда копать.
Учитывая всё вышесказанное, решения вашей задачи может выглядеть примерно так:
X++:
while select InventTable
where
InventTable.itemType == ItemType::BOM
join TableId from BOMVersion
where
BOMVersion.ItemId == InventTable.ItemId
&& BOMVersion.Active == NoYes::Yes
&& BOMVersion.FromDate <= _date
&& BOMVersion.ToDate >= _date
join TableId from BOM
where
BOM.BOMId == BOMVersion.BOMId
join InventTableChild
where
InventTableChild.ItemId == BOM.ItemId
{
info(strfmt("%1, %2", InventTable.ItemId, InventTableChild.ItemId));
}