Seite 1 von 1

VALID-Funktion mittels RI oder Trigger

Verfasst: Di, 12. Jun 2018 11:35
von UliTs
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:

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);
Wenn also lResult=FALSE ist, soll das Einfügen (oder Speichern) verhindert werden. Kann ich das mit einem Trigger machen? Und wenn ja, wie?

Re: VALID-Funktion mittels RI oder Trigger

Verfasst: Di, 12. Jun 2018 11:49
von UliTs
Ich habe eine Lösung gefunden. Ich füge noch den Code

Code: Alles auswählen

if not lResult then 
  raise PosNrDoppelt( 1,'PosNr doppelt!' );
endif;
hinzu. Dann klappt es wie gewünscht :-) . Gibt es noch eine bessere Lösung?

Re: VALID-Funktion mittels RI oder Trigger

Verfasst: Di, 12. Jun 2018 16:40
von nightcrawler
leg doch einfach einen UNIQUE Index auf die Kombination der Felder "AngId;AngPId;AngPNr" an.

Re: VALID-Funktion mittels RI oder Trigger

Verfasst: Di, 12. Jun 2018 21:35
von UliTs
nightcrawler hat geschrieben: Di, 12. Jun 2018 16:40 leg doch einfach einen UNIQUE Index auf die Kombination der Felder "AngId;AngPId;AngPNr" an.
Danke für die gute und einfache Idee.
AngPId ist bereits unique.
Der Index müsste über die Kombination der Felder "AngId;AngPNr" gehen. Ich werde es ausprobieren :D .

Re: VALID-Funktion mittels RI oder Trigger

Verfasst: Di, 12. Jun 2018 21:38
von UliTs
Danke, funktioniert :D .
Meine Lösung könnte ich dann aber für kompliziertere Bedingungen (irgendwann) benutzen 8) .