OT? Firbird und rekursiver Trigger, etwas länglich :-(

20/08/2008 - 11:42 von Stephan Jaschke | Report spam
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.
 

Lesen sie die antworten

#1 Malte Tüllmann
20/08/2008 - 17:39 | Warnen spam
*von:* Stephan Jaschke
*gesendet am:* 20.08.2008 11:42:07 UTC +0200
*Betreff:* OT? Firbird und rekursiver Trigger, etwas lànglich :-(

CREATE TRIGGER TAI0_ITEM_ROOT FOR ITEM_ROOT
ACTIVE AFTER INSERT[...]
INSERT INTO ITEM_ROOT(RID,IID) VALUES (NEW.RID,:V_IID);
/* hier müsste eigentlich die Rekursion greifen ... */



NEW.ID sollte es after insert schon geben
ID (Primàrschlüssel, eigentlich überflüssig)




Gruß


Malte

Ähnliche fragen