![]() |
#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); Если "зацикливание" возможно, то нужно еще дополнительное поле для записи BomId и дополнительный запрос по tmpItemLocal на предмет существования комбинации BomId+ItemId+LineNum и если такая комбинация есть, то не делать запись и не входить в следующий шаг рекурсии Ну, или просто ограничится глубиной вложенности, скажем, на 10 уровней. Если получилось, что _level больше 10, то это зацикливание и глубже идти не надо. В принципе, можно сделать и цикл по аналогии с SQL. Вполне можно в запрос включить временную таблицу. Но! В Axapta объединение постоянных и временных таблиц в одном запросе зачастую очень плохо кончается. Как минимум, с точки зрения производительности. А в данном случае еще и с пониманием логики выполнения будут проблемы
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: mazzy (2), SuperStar88 (1). |
|
|