Показать сообщение отдельно
Старый 04.04.2012, 09:30   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от 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));
    }
За это сообщение автора поблагодарили: 1349 (1).