VALID-Funktion mittels RI oder Trigger

Advantage Database Server

Moderator: Moderatoren

Antworten
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

VALID-Funktion mittels RI oder Trigger

Beitrag 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?
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: VALID-Funktion mittels RI oder Trigger

Beitrag 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?
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: VALID-Funktion mittels RI oder Trigger

Beitrag von nightcrawler »

leg doch einfach einen UNIQUE Index auf die Kombination der Felder "AngId;AngPId;AngPNr" an.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: VALID-Funktion mittels RI oder Trigger

Beitrag 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 .
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: VALID-Funktion mittels RI oder Trigger

Beitrag von UliTs »

Danke, funktioniert :D .
Meine Lösung könnte ich dann aber für kompliziertere Bedingungen (irgendwann) benutzen 8) .
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten