Показать сообщение отдельно
Старый 05.11.2019, 10:05   #1  
SuperStar88 is offline
SuperStar88
Участник
 
79 / 10 (1) +
Регистрация: 11.08.2017
? AX 2009. Дерево, получить всех предков
Есть узел, надо получить список всех узлов, куда он входит.

Есть запрос, который получает родителей по таблицам BOM и BOMTable.
PS: bomTable.ItemId_X - это код номенклатуры спецификации
X++:
while select itemId_X from bomTable
     join bom where bom.BOMId == bomTable.BOMId && 
            bom.ItemId != bomTable.ItemId_X && bom.ItemId == '01.02.08.01.01.0002'
{
   tmpItemLocal.clear();
   tmpItemLocal.ItemId  = bomTable.ItemId_X;
   tmpItemLocal.LineNum = level+1;
   tmpItemLocal.insert();
}
Как рекурсивно пройтись?

PS: в SQL это будет как-то так:
PHP код:
DECLARE @tbl TABLE (itemid NVARCHAR(33), num INT);
DECLARE @
itemId VARCHAR(MAX);
DECLARE @
kol INT, @num INT;

SET @kol 1SET @num 0;
SET @itemId '01.02.08.01.01.0002'

INSERT INTO @tbl(itemidnum)
SELECT @itemId'', @num AS num;

WHILE @
kol 0
BEGIN
    
---Ищем всех родителей
    INSERT INTO 
@tbl
    SELECT bomtable
.itemid_ztr, @num AS num
    FROM BOMTable bomtable
        JOIN BOM bom ON bom
.dataareaid bomtable.dataareaid
                        
AND bom.bomid bomtable.bomid
                        
AND bomtable.itemid_ztr <> bom.itemid
    WHERE bom
.itemid IN SELECT itemid FROM @tbl WHERE num = @num )
          AND 
bomtable.dataareaid 'xxx';

    
SELECT @kol = ( SELECT COUNT(*) FROM @tbl WHERE num = @num );

    
SELECT @num = @num 1;
END;-- WHILE

SELECT FROM @tbl ORDER BY numitemid