VALID-Funktion mittels RI oder Trigger
Verfasst: Di, 12. Jun 2018 11:35
Hallo allerseits,
ich versuche, möglichst viel Intelligenz in das Data Dictionary auszulagern. Z.B. funktioniert dies bei der Prüfung der Datenkonsistenz von 1:n-Verknüpfungen mit RIs (Referenzielle Integritäten) hervorragend.
Jetzt habe ich einen etwas komplizierteren Fall: bei Angeboten wird der Kopf und die zugehörigen Positonen in zwei Tabellen gespeichert:
Angebot: AngId,...
AngebotPos: AngPId,AngId,AngPNr,...
Die Angebotspositionen eines Angebots sollen mittels des Feldes AngPNr eindeutig durchnummeriert werden. Z.B.
Erstes Angebot mit 2 Positionen:
Ang:
AngId=123
zugehörige Positionen:
AngP:
AngPId=1234,AngId=123,AngPNr=1
AngPId=1235,AngId=123,AngPNr=2
Jetzt darf aber nicht eine weitere Position mit AngPNr=2 gespeichert werden:
AngPId=1236,AngId=123,AngPNr=3
Wie kann ich das im DD verhindern? Hier habe ich einen Trigger (before insert) Ansatz geschrieben:
Wenn also lResult=FALSE ist, soll das Einfügen (oder Speichern) verhindert werden. Kann ich das mit einem Trigger machen? Und wenn ja, wie?
ich versuche, möglichst viel Intelligenz in das Data Dictionary auszulagern. Z.B. funktioniert dies bei der Prüfung der Datenkonsistenz von 1:n-Verknüpfungen mit RIs (Referenzielle Integritäten) hervorragend.
Jetzt habe ich einen etwas komplizierteren Fall: bei Angeboten wird der Kopf und die zugehörigen Positonen in zwei Tabellen gespeichert:
Angebot: AngId,...
AngebotPos: AngPId,AngId,AngPNr,...
Die Angebotspositionen eines Angebots sollen mittels des Feldes AngPNr eindeutig durchnummeriert werden. Z.B.
Erstes Angebot mit 2 Positionen:
Ang:
AngId=123
zugehörige Positionen:
AngP:
AngPId=1234,AngId=123,AngPNr=1
AngPId=1235,AngId=123,AngPNr=2
Jetzt darf aber nicht eine weitere Position mit AngPNr=2 gespeichert werden:
AngPId=1236,AngId=123,AngPNr=3
Wie kann ich das im DD verhindern? Hier habe ich einen Trigger (before insert) Ansatz geschrieben:
Code: Alles auswählen
declare lResult logical;
declare nAngId integer;
declare nAngPId integer;
declare nAngPNr integer;
set nAngId = (select AngId from __New);
set nAngPId = (select AngPId from __New);
set nAngPNr = (select AngPNr from __New);
set lResult = 0 = (select count(*) from AngebotPos where AngId = nAngId and
AngPId <> nAngPId and
AngPNr = nAngPNr);