OT? Firbird und rekursiver Trigger, etwas länglich :-(
Von: Stephan Jaschke (news@stj-software.de) [Profil]
Datum: 20.08.2008 11:42
Message-ID: <6h277pFi88k9U1@mid.individual.net>
Newsgroup: de.comp.lang.delphi.datenbanken
Datum: 20.08.2008 11:42
Message-ID: <6h277pFi88k9U1@mid.individual.net>
Newsgroup: de.comp.lang.delphi.datenbanken
Hallo zusammen. Ich hab da ein paar Probleme mit Firebird (1.5.5) und rekursiven Triggern. Da da die GUI meiner Anwendung in Delphi entwickelt wird, frage ich mal hier (Im Zweifelsfall bitte einfach ignorieren.) Ich habe eine hierarchische Datenstruktur: Tabelle ITEM (Ein Eintrag) ID (Primärschlüssel) Caption Tabelle ROOT (Wurzeleinträge) ID (Primärschlüssel unf Fremschlüssel auf ITEM Tabelle ITEM_ROOT (Welches ITEM gehört zu welchem ROOT) ID (Primärschlüssel, eigentlich überflüssig) RID (Wurzel-Item -> muss aus ROOT sein) IID (zugeordnetes Item) Tabelle ITEM_GROUP (Welches ITEM ist welchem ITEM untergeordnet) ID (Primärschlüssel) PID (Übergeordnetes Item) IID (Item) Hierbei ergibt sich zum Beispiel folgende Struktur: ITEM: 1,'Klaus Müller' 2,'Bärbel Meier' 3,'Hans Meier' 4,'Fa. Müller' 5,'Familie Meier/Müller' 6,'Familie Meier' ROOT: 4 (-> Fa. Müller) 5 (-> Familie Meier/Müller) ITEM_ROOT: 1, 4 (Fa. Müller), 4 (Fa. Müller) 2, 4 (Fa. Müller), 1 (Klaus Müller) 3, 5 (Familie Meier/Müller), 1 (Klaus Müller) ITEM_GROUP: 1, 4 (Fa. Müller), 1 (Klaus Müller) 2, 6 (Familie Meier), 2 (Bärbel Meier) 3, 6 (Familie Meier), 3 (Hans Meier) (IDs werden automatisch generiert, hier nicht dargestellt) Soweit so gut. Wie man sieht, besteht die Familie Meier aus 2 Personen. Jetzt soll diese Gruppe (Familie Meier) der ROOT 5 zugeordnet werden. Hierzu muss die Gruppe (ITEM 6) und ihre Kinder und Kindeskinder natürlich auch der Wurzel (ROOT 5) zugeordnet werden. INSERT INTO ITEM_ROOT(RID,IID) VALUES (5,6) Danach sollte ITEM_ROOT so aussehen: ITEM_ROOT: 1, 4 (Fa. Müller), 4 (Fa. Müller) 2, 4 (Fa. Müller), 1 (Klaus Müller) 3, 5 (Familie Meier/Müller), 1 (Klaus Müller) 4, 5 (Familie Meier/Müller), 6 (Familie Meier) 5, 5 (Familie Meier/Müller), 2 (Bärbel Meier) 6, 5 (Familie Meier/Müller), 3 (Hans Meier) Hierfür habe ich einen Trigger geschrieben, der das eigentlich leisten sollte CREATE TRIGGER TAI0_ITEM_ROOT FOR ITEM_ROOT ACTIVE AFTER INSERT POSITION 0 AS DECLARE VARIABLE V_ID INTEGER; DECLARE VARIABLE V_IID INTEGER; BEGIN FOR /* für alle Einträge, die Kinder des aktuellen sind ... */ SELECT IID FROM ITEM_GROUP WHERE PID=NEW.IID INTO :V_IID DO BEGIN SELECT ID FROM ITEM_ROOT WHERE (RID=NEW.RID) AND (IID=:V_IID) INTO :V_ID; /* wenn noch nicht dem RID zugeordnet, dann zuordnen */ IF (V_ID IS NULL) THEN BEGIN INSERT INTO ITEM_ROOT(RID,IID) VALUES (NEW.RID,:V_IID); /* hier müsste eigentlich die Rekursion greifen ... */ END END END Leider tut's das so aber nicht, denn die untergeordneten ITEMS kommen nicht in die ITEM_ROOT Tabelle, d.h. diese sieht leider so aus: ITEM_ROOT: 1, 4 (Fa. Müller), 4 (Fa. Müller) 2, 4 (Fa. Müller), 1 (Klaus Müller) 3, 5 (Familie Meier/Müller), 1 (Klaus Müller) 4, 5 (Familie Meier/Müller), 6 (Familie Meier) Hat irgendjemand eine Idee, was ich in meinem Trigger falsch mache? Ich seh es einfach nicht... MfG Stephan -- Logik ist die Kunst, zuversichtlich in die Irre zu gehen.[ Auf dieses Posting antworten ]
