Показать сообщение отдельно
Старый 05.11.2019, 11:16   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,709 / 1201 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ну, я так понимаю, вопрос ставится так: В каких спецификациях используется указанная номенклатура, с учетом того, что спецификация сама может выступать как номенклатура для других спецификаций

X++:
    void setLevel(ItemId _itemId, int _level)
    {
        BomTable    bomTable;
        Bom         bom;
        ;
 
        while select itemId_X from bomTable
             join bom where bom.BOMId == bomTable.BOMId &&
                    bom.ItemId != bomTable.ItemId_X && bom.ItemId == _itemId
        {
           tmpItemLocal.clear();
           tmpItemLocal.ItemId  = bomTable.ItemId_X;
           tmpItemLocal.LineNum = _level;
           tmpItemLocal.insert();

           // рекурсия
           setLevel(bomTable.ItemId_X, _level+1);
        }
    }
    ;

    // Вход в рекурсию    
    setLevel('01.02.08.01.01.0002', 1);
Правда, тут не учтена вероятность "зацикливания". Впрочем, и Ваш запрос SQL, тоже это не учитывает.

Если "зацикливание" возможно, то нужно еще дополнительное поле для записи BomId и дополнительный запрос по tmpItemLocal на предмет существования комбинации BomId+ItemId+LineNum и если такая комбинация есть, то не делать запись и не входить в следующий шаг рекурсии

Ну, или просто ограничится глубиной вложенности, скажем, на 10 уровней. Если получилось, что _level больше 10, то это зацикливание и глубже идти не надо.

В принципе, можно сделать и цикл по аналогии с SQL. Вполне можно в запрос включить временную таблицу. Но! В Axapta объединение постоянных и временных таблиц в одном запросе зачастую очень плохо кончается. Как минимум, с точки зрения производительности. А в данном случае еще и с пониманием логики выполнения будут проблемы
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: mazzy (2), SuperStar88 (1).