AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Trigger

Ein Thema von Walter Landwehr · begonnen am 19. Jan 2025 · letzter Beitrag vom 20. Jan 2025
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
684 Beiträge
 
Delphi 12 Athens
 
#1

AW: Trigger

  Alt 19. Jan 2025, 13:37
ist das richtig so, dass Du old ändern willst? Steht das überhaupt schreibbar zur Verfügung?
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
405 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Trigger

  Alt 19. Jan 2025, 14:25
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?
Walter Landwehr
Mfg

Walter

Geändert von Walter Landwehr (19. Jan 2025 um 14:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.259 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Trigger

  Alt 19. Jan 2025, 17:46
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.368 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Trigger

  Alt 20. Jan 2025, 05:48
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
Peter
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
405 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Trigger

  Alt 20. Jan 2025, 07:02
OK hier nochmals der ganze Trigger:
Delphi-Quellcode:
as
    declare variable Monat Integer;
    declare variable Tag Integer;
    declare variable Jahr 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);
       Jahr = extract(year 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 = 'April';
       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';
       new.geburtstag = Tag;
       new.geburtsmonat_zahl = Monat;
       new.geburtsjahr = Jahr;
    end
end
Ich befürchte das es mit dem Geburtsdatum zu tun hat. Die ist in der Datenbank ein Datumsfeld (Date).
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Trigger

  Alt 20. Jan 2025, 07:02
Falsche Position der Klammer

((new.ZAHLUNGSZEITPUNKT) is null or (new.ZAHLUNGSZEITPUNKT = ''))) then müsste

((new.ZAHLUNGSZEITPUNKT is null) or (new.ZAHLUNGSZEITPUNKT = ''))) then lauten.
Markus Kinzler
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
541 Beiträge
 
Delphi 12 Athens
 
#7

AW: Trigger

  Alt 20. Jan 2025, 07:06
Ist das wirklich Firebird 2? Aktuell ist Firebird 5, wobei der Umstieg nicht besonders schwierig ist.

Wenn da ein eigenes Programm mit der Datenbank arbeitet, ist es wesentlich einfacher die Delphi Datumsroutinen zu verwenden als so einen relativ komplizierten Trigger zu bauen. Auch braucht man 4 Felder in der Datenbank, wo eigentlich eines reicht, wovon 3 berechnete Werte speichern. Das hat wahrscheinlich geringen Einfluss auf Größe und Performance der Datenbank, ist aber unschön.

Braucht man die Werte z.B. für Export von Daten, könnte man sie auch über eine Stored Procedure abfragen.
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.368 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Trigger

  Alt 20. Jan 2025, 07:23
Ich weiß nicht, ob man FB debuggen kann, aber falls nicht, würde ich aus dem Trigger erstmal eine User Defined Function oder Stored Procedure machen.
Mit entsprechenden Parametern und Rückgabewerten kann man dann prüfen, an welcher Stelle es hakt.
Damit hättest du auch die Möglichkeit, dir einen Soll-Ist-Vergleich zu erstellen.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
695 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Trigger

  Alt 20. Jan 2025, 07:48
debuggen kann man so was in ibexpert, aber das bringt nur wenig erkenntnisse wenn man grundlegende
vergleiche sinnlos codiert.

Code:
    if (new.geburtsdatum > '') then
warum soll ein datum >'' sein?

entweder kommt da rechts auch ein datum rein oder du prüfst auf not null

firebird liefert auch brauchbare fehler, in einigermaßen aktuellen firbeird versionen
auch gleich mit zeilennummer (die o.a. zeile ist in meinem test genau zeile 12)

Code:
Overflow occurred during data type conversion.
conversion error from string "".
At trigger 'TESTX_BU0' line: 12, col: 5.
----------------------------------------------
SQLCODE: -413
SQLSTATE: 22018
GDSCODE: 335544334
so funktioniert das

Code:
    if (new.geburtsdatum > '1.1.1900') then
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
Firebird 5 Update und Know-how Workshop – 28.8.-29.08.2025 64546 Mörfelden - Walldorf
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
405 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Trigger

  Alt 20. Jan 2025, 08:51
Danke an Holger Klemt, das war der entscheidende Tipp.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr.
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