Дерево в FB 1.5

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
oxotnik
Сообщения: 1
Зарегистрирован: 07 мар 2008, 10:51

Дерево в FB 1.5

Сообщение oxotnik » 11 мар 2008, 11:13

Добрый день!
Есть таблица дерева:
KOD_SUBUSER - VARCHAR - узел (наименование)
KOD_USER - VARCHAR - родительский узел (наименование)

необходимо от заданного узла раскрыть дерево, с добавлением поля "уровень в дереве"

Процедура полного "раскрытия" узла дерева:

Код: Выделить всё

ALTER PROCEDURE EXPAND (AnID VARCHAR(32), Self INTEGER)
  RETURNS (ID VARCHAR(32), PARENT_ID VARCHAR(32), TREE_LEVEL INTEGER)
AS
BEGIN
  TREE_LEVEL = 0;
  IF (:Self <> 0) THEN
  BEGIN
    ID = :AnID;
    SUSPEND;
  END

  FOR SELECT KOD_SUBUSER FROM STRUCT_USERS
  WHERE KOD_USER = :AnID
  INTO :ID
    DO FOR SELECT ID, :ID, TREE_LEVEL+1 FROM EXPAND (:ID, 1)
    INTO :ID, :PARENT_ID, :TREE_LEVEL
    DO SUSPEND;
END;
Не получается правильно вставить PARENT_ID
что подставлять в качестве 2-го выходного параметра в запросе:
SELECT ID, :ID, TREE_LEVEL+1 FROM EXPAND (:ID, 1) INTO :ID, :PARENT_ID, :TREE_LEVEL

armagedon2007
Сообщения: 44
Зарегистрирован: 14 мар 2008, 21:01

Сообщение armagedon2007 » 14 мар 2008, 21:16

Код: Выделить всё

CREATE PROCEDURE S_SPR_PRODUCTS_GROUP(
  INID INTEGER,
  SELF SMALLINT)
RETURNS(
  ID INTEGER,
  PARENT_ID INTEGER,
  ISGROUP SMALLINT,
  LEVEL_ID INTEGER,
  NAME VARCHAR(100) CHARACTER SET WIN1251,
  ISDELETED SMALLINT)
AS
BEGIN
  IF (:SELF <> 0) THEN BEGIN
    ID = :INID;
    SUSPEND;
  END
  FOR SELECT ID, ISGROUP, LEVEL_ID, NAME, ISDELETED, PARENT_ID
      FROM SPR_PRODUCTS_GROUP
      WHERE PARENT_ID = :INID AND PARENT_ID <> ID
      ORDER BY ID
      INTO :ID, :ISGROUP, :LEVEL_ID, :NAME, :ISDELETED, :PARENT_ID DO
    FOR SELECT ID
        FROM S_SPR_PRODUCTS_GROUP(:ID, 1)
        INTO :ID DO BEGIN
          SELECT DISTINCT ID, ISGROUP, LEVEL_ID, NAME, ISDELETED, PARENT_ID
          FROM SPR_PRODUCTS_GROUP
          WHERE ID = :ID
          ORDER BY ID
          INTO :ID, :ISGROUP, :LEVEL_ID, :NAME, :ISDELETED, :PARENT_ID;
      SUSPEND;
    END
END
[модератор: указывайте тег для кода, черт возьми!]

Ответить