进步4GL语言支持分层查询吗?



进度网站订阅的简单问题:进步4GL语言是否支持像Oracle(连接子句)或Sql Server(CTE)这样的分层查询?

我有以下表格:

<>之前的名字 父-----------------------伊丽莎白二世无效查尔斯·伊丽莎白二世安德鲁·伊丽莎白二世爱德华·伊丽莎白二世哈利 查尔斯威廉 查尔詹姆斯 爱德华。乔治 威廉之前

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

<>之前伊丽莎白二世| _Charles| _William| _George| _Harry| _Andrew| _Edward| _James

由于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.

最新更新