Ну, я так понимаю, вопрос ставится так: В каких спецификациях используется указанная номенклатура, с учетом того, что спецификация сама может выступать как номенклатура для других спецификаций
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 объединение постоянных и временных таблиц в одном запросе зачастую очень плохо кончается. Как минимум, с точки зрения производительности. А в данном случае еще и с пониманием логики выполнения будут проблемы