进度网站订阅的简单问题:进步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.