2014-06-26 2 views
0

La question simple abonnée sur le site de progression: Est-ce que la progression du langage 4GL supporte les requêtes hiérarchiques comme Oracle (clause Connect by) ou Sql Server (CTE)?Est-ce que la progression du langage 4GL prend en charge les requêtes hiérarchiques?

Je le tableau suivant:

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

est-il un script en cours qui va générer la sortie suivante?

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

s'il vous plaît ajouter les étapes que vous avez déjà essayé – atk

Répondre

2

Depuis Progress 4GL (en fait ABL depuis quelques années) est un langage complet de turing complet que vous pouvez. Cependant peut-être pas dans une seule requête ...

Cet exemple récursif le fait, vous pourriez le faire de plusieurs façons différentes. Vous pouvez commencer par ce code, mais vous pourriez avoir besoin d'avoir plus de contrôles d'erreur etc.

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. 
+0

je connais récursivité en cours. Mais, comme Progress a une syntaxe SQL standard, je me demandais si le langage supportait la clause CONNECT BY. Je pensais qu'il y avait un moyen facile et rapide d'accomplir cette tâche. –

+0

Le support natif de SQL in Progress est au maximum compatible avec SQL-92. Je ne suis pas sûr si CONNECT BY est vraiment SQL standard, mais plutôt une fonctionnalité d'Oracle et d'autres dbs. Si vous exécutez Progress natif, je vous suggère de vous en tenir à ABL/4GL. Via ODBC il pourrait y avoir d'autres possibilités. – Jensd

Questions connexes