进展4GL语言是否支持分层查询?

时间:2014-06-26 11:22:50

标签: progress-4gl hierarchical-query

在进度网站上订阅的简单问题: 进度4GL语言是否支持Oracle(Connect by子句)或Sql Server(CTE)等分层查询?

我有下表:

Name             parent
-----------------------
Elizabeth II     null
Charles           Elizabeth II
Andrew          Elizabeth II
Edward           Elizabeth II
Harry              Charles
William           Chales
James             Edward
George           William

是否有正在生成以下输出的脚本?

Elizabeth II
     |_Charles
          |_William
               |_George
          |_Harry
     |_Andrew
     |_Edward
          |_James

1 个答案:

答案 0 :(得分:2)

由于Progress 4GL(实际上是ABL几年)是一种完整的图灵完整语言,你可以。然而,也许不是在一个查询......

这个递归的例子可以做到,你可以通过多种不同的方式来做。您可以从此代码开始,但可能需要进行更多错误检查等。

DEFINE TEMP-TABLE ttPerson NO-UNDO
    FIELD PersonName   AS CHARACTER FORMAT "x(20)"
    FIELD PersonParent AS CHARACTER.

/* A procedure for loading example data */
PROCEDURE createPerson:
    DEFINE INPUT  PARAMETER pcName AS CHARACTER   NO-UNDO.
    DEFINE INPUT  PARAMETER pcParent AS CHARACTER   NO-UNDO.

    CREATE ttPerson.
    ASSIGN 
        ttPerson.personName   = pcName
        ttPerson.personParent = pcParent.

END.

/* Load some data */
RUN createPerson("Elizabeth II", "").
RUN createPerson("Charles", "Elizabeth II").
RUN createPerson("Andrew", "Elizabeth II").
RUN createPerson("Edward", "Elizabeth II").
RUN createPerson("Harry", "Charles").
RUN createPerson("William", "Charles").
RUN createPerson("James", "Edward").
RUN createPerson("George", "William").

/* Define a frame where the result will be displayed */
DEFINE FRAME f1 ttPerson.personName WITH 20 DOWN.

/* The recursive prodecure */
/* pcPerson - the person where to start track heritage (or perhaps it should have been lineage?*/
/* piDepth, just to format the output */
PROCEDURE trackHeritage:
    DEFINE INPUT  PARAMETER pcPerson AS CHARACTER   NO-UNDO.
    DEFINE INPUT  PARAMETER piDepth  AS INTEGER     NO-UNDO.

    piDepth = piDepth + 1.
    /* Find the tracked person */
    FIND FIRST ttPerson NO-LOCK WHERE ttPerson.personName = pcPerson NO-ERROR.
    IF AVAILABLE ttperson THEN DO:

        DISPLAY FILL(" ", piDepth) + "|_" + ttPerson.personName @ ttPerson.personName WITH FRAME f1.

        DOWN 1 WITH FRAME f1.

        /* Track all available children to the person */
        FOR EACH ttPerson NO-LOCK WHERE ttPerson.personParent = pcPerson:
            RUN trackHeritage(ttPerson.personName, piDepth).
        END.
    END.
END.
/* Start tracking */
RUN trackHeritage("Elizabeth II", 0).

MESSAGE "Done" VIEW-AS ALERT-BOX.