Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Trigger (https://www.delphipraxis.net/216568-trigger.html)

Walter Landwehr 19. Jan 2025 10:21

Datenbank: Firebird • Version: 2.0 • Zugriff über: IBO

Trigger
 
Hallo ich habe folgenden Code im Trigger:
Delphi-Quellcode:
  if (new.geburtsdatum > '') then
    begin
       new.geburtstag = extract(day from new.geburtsdatum);
       new.geburtsmonat_zahl = extract(Month from new.geburtsdatum);
       if new.geburtsmonat_zahl = 1 then
         if new.geburtsmonat = 'Januar';

    end
Bei if new.geburtsmonat_zahl = 1 then kommte ein Parsing error. Was ist hier falsch?

DeddyH 19. Jan 2025 10:28

AW: Trigger
 
Sicher, dass nicht stattdessen das sinnlose „if“ in der nachfolgenden Zeile moniert wird?

hes 19. Jan 2025 10:34

AW: Trigger
 
Hab mit Firebird noch nie was gemacht, aber ist es nicht wie z.b. in C, dass du == machen musst?

DeddyH 19. Jan 2025 10:37

AW: Trigger
 
Auf jeden Fall kann es auch nicht schaden, den Ausdruck zu klammern
Code:
if (…) then

Walter Landwehr 19. Jan 2025 11:59

AW: Trigger
 
Danke

So funktioniert es:
Delphi-Quellcode:
  if (new.geburtsdatum > '') then
    begin
       new.geburtstag = extract(day from new.geburtsdatum);
       new.geburtsmonat_zahl = extract(Month from new.geburtsdatum);
       if (new.geburtsmonat_zahl = 1) then
         new.geburtsmonat = 'Januar';

    end

Walter Landwehr 19. Jan 2025 13:24

AW: Trigger
 
Leider immer noch ein Problem. Hier mal der Ganze Trigger.
Delphi-Quellcode:
as
    declare variable Monat Integer;
    declare variable Tag Integer;
begin
  if (new.ZAHLUNGSPFLICHTIG = 'J') then
    if (((new.ZAHLUNGSART is null) or (new.ZAHLUNGSART = '')) or ((new.ZAHLUNGSZEITPUNKT) is null or (new.ZAHLUNGSZEITPUNKT = ''))) then
        exception EXCP_INVALID;

    if (new.geburtsdatum > '') then
    begin
       Tag = extract(day from new.geburtsdatum);
       Monat = extract(Month from new.geburtsdatum);

       if (Monat = 1) then
         New.geburtsmonat = 'Januar';
       if (Monat = 2) then
         new.geburtsmonat = 'Februar';
       if (Monat = 3) then
         new.geburtsmonat = 'März';
       if (Monat = 4) then
         new.geburtsmonat = 'Aprol';
       if (Monat = 5) then
         new.geburtsmonat = 'Mai';
       if (Monat = 6) then
         new.geburtsmonat = 'Juni';
       if (Monat = 7) then
         new.geburtsmonat = 'Juli';
       if (Monat = 8) then
         new.geburtsmonat = 'August';
       if (Monat = 9) then
         new.geburtsmonat = 'September';
       if (Monat =10) then
         new.geburtsmonat = 'Oktober';
       if (Monat = 11) then
         new.geburtsmonat = 'November';
       if (Monat = 12) then
         new.geburtsmonat = 'Dezember';
       Old.geburtstag = Tag;
       Old.geburtsmonat_zahl = Monat;
    end
end
Der Trigger lässt sich nicht kompilieren. Keine Ahnung warum. Vielleicht sieht jemand den Fehler.

joachimd 19. Jan 2025 13:37

AW: Trigger
 
ist das richtig so, dass Du old ändern willst? Steht das überhaupt schreibbar zur Verfügung?

Walter Landwehr 19. Jan 2025 14:25

AW: Trigger
 
Ja stimmt ist natürlich falsch. Hab ich geändert nun lässt sich der Trigger kompilieren. Leider kann ich aber weder einen Daten Satz ändern noch neu anlegen. Muss glaub ich irgendwie mit den Variablen zu tun haben.

Hier muss der Fehler liegen.
Tag = extract(day from new.geburtsdatum);
Monat = extract(Month from new.geburtsdatum);
Jahr = extract(year from new.geburtsdatum);
aber was ist falsch?

Sharky 19. Jan 2025 17:46

AW: Trigger
 
Hallo Walther,

auch wenn Firebird bei mir viele Jahre her ist...
Aber deine 12 if then Statements solltest Du auch so schreiben können:

Code:
New.geburtsmonat = case
               when Monat = 1 then 'Januar'
               when Monat = 2 then 'Februar'
               when Monat = 3 then 'März''
               when Monat = 4 then 'April'
               when Monat = 5 then 'Mai'
               when Monat = 6 then 'Juni'
               when Monat = 7 then 'Juli'
               when Monat = 8 then 'August'
               when Monat = 9 then 'September'
               when Monat = 10 then 'Oktober'
               when Monat = 11 then 'November'
               when Monat = 12 then 'Dezember'
         end;
Macht das Ganze etwas übersichtlicher.

Jasocul 20. Jan 2025 05:48

AW: Trigger
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1545404)
Hier muss der Fehler liegen.
Tag = extract(day from new.geburtsdatum);
Monat = extract(Month from new.geburtsdatum);
Jahr = extract(year from new.geburtsdatum);
aber was ist falsch?

Das halte ich für unwahrscheinlich, falls geburtsdatum ein Datumstyp ist. Falls es ein varchar ist, kann es Interpretationsfehler durch die DB geben. Allerdings lässt nicht jede DB dann noch dieses extract zu. Wie es in Firebird ist, weiß ich nicht.
Außerdem machst du noch ein extract auf das Jahr, was in deinem Code für den Trigger nicht enthalten ist. Ist der Code, den du uns zeigst vielleicht unvollständig und wie sehen daher gar nicht alle potentiellen Fehlerstellen?

Bitte folgendes genau prüfen:
Code:
if (((new.ZAHLUNGSART is null) or (new.ZAHLUNGSART = '')) or ((new.ZAHLUNGSZEITPUNKT) is null or (new.ZAHLUNGSZEITPUNKT = ''))) then
    exception EXCP_INVALID;
Läuft der Trigger vielleicht in die Exception?
Abgesehen davon ist beim Zahlungszeitpunkt nicht richtig geklammert.
Um es zu vereinfachen, kannst du die Prüfung wie folgt ändern:
Code:
(new.ZAHLUNGSART is null) or (new.ZAHLUNGSART = '')
-- wird zu:
coalesce(new.ZAHLUNGSART, '') = ''
-- und
(new.ZAHLUNGSZEITPUNKT) is null or (new.ZAHLUNGSZEITPUNKT = '')
-- wird zu:
coalesce(new.ZAHLUNGSZEITPUNKT, '') = ''
Das sollte dann so aussehen:
Code:
if ((coalesce(new.ZAHLUNGSART, '') = '') or (coalesce(new.ZAHLUNGSZEITPUNKT, '') = '')) then
    exception EXCP_INVALID;
Und bei der Gelegenheit noch Aprol in April ändern :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz