Einzelnen Beitrag anzeigen

DelphiDeveloper

Registriert seit: 9. Apr 2003
Ort: Köln
256 Beiträge
 
Delphi XE2 Enterprise
 
#10

Re: Oracle + Firebird + Rekursion

  Alt 3. Feb 2005, 19:24
Hallo Fatima,
ja der Trick liegt im For Select in die Rekusrion zu gehen.

Du schriebst etwas von preorder Traversierung, dass ist nicht moeglich da dein
Baum ja keine Ordnung auf LevelEbene hat.

da die Bäume
Code:
    20
   |   |
   10  5

und
   20 
  |    |
  5    10

ja äquivalent sind.
Hier noch ein alternativer Vorschlag von mir zu der gesuchten Stored proc:
Code:
CREATE PROCEDURE TRAVERSIERE (
    ACHEF_ID INTEGER)
RETURNS (
    EMPID INTEGER)
AS
DECLARE VARIABLE NR INTEGER;
BEGIN
  EMPID = :ACHEF_ID;
  SUSPEND;
  FOR SELECT E.EMP_ID FROM EMPLOYEE E
  WHERE E.CHEF_ID =:ACHEF_ID
  ORDER BY E.EMP_ID DESC
  INTO :NR DO
  BEGIN
    EMPID = :NR;
    SUSPEND;
    FOR SELECT EMPID
        FROM TRAVERSIERE(:NR)
        WHERE EMPID <> :NR
        INTO :EMPID DO
      SUSPEND;
  END
END
Diese Proc liefert die Knoten hierarchisch:
Die Proc kannst du dann in einer Query nutzen und deine Spalten
individuell setzen.
etwa so:
Code:
SELECT P.EMPID , E.CHEF_ID, E.EMP_NAME ,
(SELECT EE.EMP_NAME FROM EMPLOYEE EE
  WHERE EE.EMP_ID = E.CHEF_ID) AS SEIN_DIREKTER_CHEF_IST
FROM TRAVERSIERE(20) P, EMPLOYEE E
WHERE P.EMPID = E.EMP_ID
Richtige gute Firebird Seiten kenne ich nicht! Lernt man wohl am besten wenn man sich
selbst damit auseinander setzt.
Im übrigen ist die SP Language von firebird ja nicht so mächtig wie bei Oracle,
die 20-30 Befehle die es bei Firebird gibt, beherrscht man schnell.

Noch ein Tip für deine Datenstruktur:
Sie sieht es leider nicht vor, dass ein Untergebener 2 direkte Vorgesetzte hat,
bspw. eine Sekräterin morgens in Abteilung A und nachmittags in Abteilung B.
Aber da wirst du sicherlich schon drauf gekommen sein.

mfg
DD

[edit=MrSpock]Doppelpost gelöscht. Mfg, MrSpock[/edit]
  Mit Zitat antworten Zitat