Wurmi Geschrieben 5. Dezember 2011 Teilen Geschrieben 5. Dezember 2011 Hallo, kann mir jemand bei einem Trigger-Problem in Oracle helfen? Ich möchte gerne bei Belegbuchungen (INSERTS, vielleicht später auch bei UPDATE und DELETE) in der Lage sein, per Trigger weitere Tabellen zu beschreiben. Mein Problem ist, daß ich mit dem klassischen for-each-row-Trigger bei INSERT-Vorgängen nicht weiterkomme. Die Tabellen, um die es geht, sind (vereinfacht) so strukturiert wie unten. Es ist nicht die genaue Oracle-Syntax, weil ich das hier aus dem Kopf aufschreibe, aber in Wirklichkeit sind die CREATE-TABLE-Anweisungen und die ganzen Constraints und Foreign-Keys syntaktisch und semantisch korrekt. Tabelle KOPF: -VORGANG CHAR(1) NOT NULL -BUKRS CHAR(2) NOT NULL -BELNR NUMBER(6,0) NOT NULL -KUNDE CHAR(4) NOT NULL -BUDAT DATE NOT NULL PRIMARY KEY (VORGANG, BUKRS, BELNR) Tabelle ZEILEN: -VORGANG CHAR(1) NOT NULL -BUKRS CHAR(2) NOT NULL -BELNR NUMBER(6,0) NOT NULL -BUZEI NUMBER(3,0) NOT NULL -KONTO CHAR(3) NOT NULL -MATNR VARCHAR(5) -MENGE NUMBER(10,1) -BETRAG NUMBER(10,2) NOT NULL -ZTEXT VARCHAR(50) NOT NULL PRIMARY KEY (VORGANG, BUKRS, BELNR, BUZEI) FOREIGN KEY(VORGANG, BUKRS, BELNR) REFERENCES KOPF (VORGANG, BUKRS, BELNR) Eine Buchung für einen neuen Beleg ist immer ein Kopf und mindestens eine Zeile und wird in eine Transaktion gekapselt. Beispiel: BEGIN TRANSACTION INSERT INTO KOPF(VORGANG, BUKRS, BELNR, KUNDE, BUDAT) VALUES ('A', '01', 4711, 'AB23', SYSDATE) INSERT INTO ZEILEN(VORGANG, BUKRS, BELNR, BUZEI, KONTO, BETRAG, ZTEXT) VALUES ('A', '01', 4711, 1, '100', 800.00, 'Rechnung') INSERT INTO ZEILEN(VORGANG, BUKRS, BELNR, BUZEI, KONTO, MATNR, MENGE, BETRAG, ZTEXT) VALUES ('A', '01', 4711, 2, '300', 'ABCD1', -19.4, -500.00, 'Makkaroni') INSERT INTO ZEILEN(VORGANG, BUKRS, BELNR, BUZEI, KONTO, MATNR, MENGE, BETRAG, ZTEXT) VALUES ('A', '01', 4711, 3, '400', 'CDEFG', -3.5, -300.00, 'Rigatoni') COMMIT TRANSACTION To-Do: Es soll für jede Zeile ein Trigger feuern und mit den Werten aus der Zeile ggfalls. weitere Tabellen gefüllt werden. Allerdings braucht es zum Füllen dieser Tabellen auch Werte aus dem Belegkopf (also quasi die Daten aus dem Join von Belegkopf und Belegzeile): Beispiel: Etwa sollte aus dem Beispiel oben der Kunde (aus dem Kopf) und die Kontonummer (aus der Zeile) abgefragt werden und bei einer bestimmten Konstellation in eine offene-Posten-Tabelle angefügt werden: INSERT INTO KUNDENOPS (BELNR, KUNDE, BUDAT, Betrag) VALUES (kopf.BELNR, kopf.KUNDE, kopf.BUDAT, zeilen.Betrag) Eine Abfrage der Kopf-Werte aus der Datenbank geht nicht, weil der Kopf ja noch gar nicht existiert (~die Transaktion ist noch nicht fertig). Und da komme ich nicht weiter. Ich möchte das Problem aber ungern im Anwendungsprogramm lösen, sondern direkt in der Datenbank, vor allem weil es u.U. verschiedene Clients geben wird mit unterschiedlichen Plattformen (JDBC, ADO), aber die Logik hingegen immer die gleiche sein soll. Kann mir vielleicht einer sagen, wie man so etwas löst. Dafür vielen Dank im voraus. Grüße Wurmi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.