Delphi-PRAXiS
Seite 2 von 3     12 3      

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 20. Jan 2025 07:02

AW: Trigger
 
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).

mkinzler 20. Jan 2025 07:02

AW: Trigger
 
Falsche Position der Klammer

SQL-Code:
((new.ZAHLUNGSZEITPUNKT) is null or (new.ZAHLUNGSZEITPUNKT = ''))) then
müsste

SQL-Code:
((new.ZAHLUNGSZEITPUNKT is null) or (new.ZAHLUNGSZEITPUNKT = ''))) then
lauten.

Neumann 20. Jan 2025 07:06

AW: Trigger
 
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.

Jasocul 20. Jan 2025 07:23

AW: Trigger
 
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.

IBExpert 20. Jan 2025 07:48

AW: Trigger
 
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

Walter Landwehr 20. Jan 2025 08:51

AW: Trigger
 
Danke an Holger Klemt, das war der entscheidende Tipp.

Benmik 20. Jan 2025 14:05

AW: Trigger
 
Zitat:

Zitat von IBExpert (Beitrag 1545414)
Code:
    if (new.geburtsdatum > '1.1.1900') then

Der älteste lebende Mensch wurde 1908 geboren, also passt das tatsächlich.

joachimd 20. Jan 2025 14:56

AW: Trigger
 
Zitat:

Zitat von Benmik (Beitrag 1545423)
Zitat:

Zitat von IBExpert (Beitrag 1545414)
Code:
    if (new.geburtsdatum > '1.1.1900') then

Der älteste lebende Mensch wurde 1908 geboren, also passt das tatsächlich.

Datenbank NULL entspricht diesem Datum

mkinzler 20. Jan 2025 15:29

AW: Trigger
 
Zitat:

Zitat von joachimd (Beitrag 1545426)
Zitat:

Zitat von Benmik (Beitrag 1545423)
Zitat:

Zitat von IBExpert (Beitrag 1545414)
Code:
    if (new.geburtsdatum > '1.1.1900') then

Der älteste lebende Mensch wurde 1908 geboren, also passt das tatsächlich.

Datenbank NULL entspricht diesem Datum

Ein Windowsdatum von 0 (nicht NULL) entspricht 31.12.1899. Der 01.01.1900 wäre dann 1.

Uwe Raabe 20. Jan 2025 15:43

AW: Trigger
 
Zitat:

Zitat von mkinzler (Beitrag 1545430)
Ein Windowsdatum von 0 (nicht NULL) entspricht 31.12.1899. Der 01.01.1900 wäre dann 1.

Bei Firebird steht aber:
Zitat:

The DATE data type in Dialect 3 stores only date without time. The available range for storing data is from January 01, 1 to December 31, 9999.
Intern sieht das noch etwas anders aus:
Zitat:

In storage, a date value or date-part of a timestamp is represented as the number of days elapsed since date zero — November 17, 1898


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:46 Uhr.
Seite 2 von 3     12 3      

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