Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FireDAC : Trigger geht nicht (https://www.delphipraxis.net/186469-firedac-trigger-geht-nicht.html)

Hansa 4. Sep 2015 13:38

Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC

FireDAC : Trigger geht nicht
 
Moin,

will etwas mit FireDac testen und wollte mir deshalb eine Table erstellen.

Delphi-Quellcode:
    DM.DS.Insert;
    DM.DS.FieldByName('NR').AsInteger := i + 100;
    DM.DS.FieldByName('BEZ').AsInteger := i;
    DM.DS.Post;
    if i mod 1000 = 0 then begin
mem1.Lines.Add(IntToStr (i));
      DM.Trans.Commit;
      DM.Trans.StartTransaction;
    end;
Die Table enthält natürlich noch eine ID, die über Trigger hochgezählt wird. Lege ich in IBExpert von Hand einen Datensatz an, ähnlich wie hier im Programm, dann wird die nicht eingegebene ID automatisch vergeben, der Trigger scheint also zu gehen. Lasse ich obiges Delphi-Programm laufen, dann kommt allerdings folgende Fehlermeldung : "Das Feld ID muss einen Wert haben". Wieso das ?

Nachtrag : ersetze ich das Insert durch ein Edit, dann laufen in dem Kontrollmemo schön die Tausender durch, das Feld BEZ bleibt aber bei dem vorher manuell eingegeben Wert. Da wird also in diesem Fall nichts abgespeichert, ohne dass Fehlermeldung kommt.

mkinzler 4. Sep 2015 13:50

AW: FireDAC : Trigger geht nicht
 
Welche eine Komponente? Wie sieht der Trigger aus?

FireDAC führt keinen Trigger aus, sondern der Server.

Hansa 4. Sep 2015 13:59

AW: FireDAC : Trigger geht nicht
 
Zitat:

Zitat von Hansa (Beitrag 1314732)
Die Table enthält natürlich noch eine ID, die über Trigger hochgezählt wird. Lege ich in IBExpert von Hand einen Datensatz an, ähnlich wie hier im Programm, dann wird die nicht eingegebene ID automatisch vergeben

Was soll man denn sonst noch zu dem Trigger sagen ? Also nochmals : der geht und scheidet als Fehler aus. Wie "Welche eine Komponente" ??? :shock:

haentschman 4. Sep 2015 14:03

AW: FireDAC : Trigger geht nicht
 
Hallo Hansa,

zeig mal den Trigger. Was ist wenn du nicht mit Insert/Post arbeitest sondern wie jeder Normale (Spaß :P) eine Query absetzt?

mkinzler 4. Sep 2015 14:06

AW: FireDAC : Trigger geht nicht
 
Zitat:

Was soll man denn sonst noch zu dem Trigger sagen ? Also nochmals : der geht und scheidet als Fehler aus.
Ich glaube auch, dass der Trigger aufgerufen wird, ob die Bedingung aber greift kann ich ohne zu wissen wie er aussieht nicht.
Zitat:

Wie "Welche eine Komponente" ???
FireDAC hat eine Unmenge von Komponenten. Zumidest bei mir, bei Dir scheint es nur eine zu geben ( Table?)

nahpets 4. Sep 2015 14:12

AW: FireDAC : Trigger geht nicht
 
Bin mal wieder naiv, was passiert denn bei:
Delphi-Quellcode:
   DM.DS.Insert;
    DM.DS.FieldByName('ID').AsInteger := 0;
    DM.DS.FieldByName('NR').AsInteger := i + 100;
    DM.DS.FieldByName('BEZ').AsInteger := i;
    DM.DS.Post;
    if i mod 1000 = 0 then begin
mem1.Lines.Add(IntToStr (i));
      DM.Trans.Commit;
      DM.Trans.StartTransaction;
    end;
Wenn ID als not null definiert ist, so fehlt beim Insert für die ID natürlich ein Wert. Der Trigger schlägt (vermutlich) erst nach dieser Überprüfung zu.

Uwe Raabe 4. Sep 2015 14:12

AW: FireDAC : Trigger geht nicht
 
Zitat:

Zitat von Hansa (Beitrag 1314732)
Lasse ich obiges Delphi-Programm laufen, dann kommt allerdings folgende Fehlermeldung : "Das Feld ID muss einen Wert haben". Wieso das ?

Eigentlich erkennt FireDAC solche AutoInc-Felder ganz gut. Ist denn bei dir das ID-Feld auch ein TFDAutoIncField? Wenn nicht, lass es einfach nochmal im Feldeditor erzeugen. Sollte es nicht erkannt werden, musst du eventuell selbst Hand anlegen: Auto-Inkrementierungsfelder (FireDAC)


Zitat:

Zitat von Hansa (Beitrag 1314732)
Nachtrag : ersetze ich das Insert durch ein Edit, dann laufen in dem Kontrollmemo schön die Tausender durch, das Feld BEZ bleibt aber bei dem vorher manuell eingegeben Wert. Da wird also in diesem Fall nichts abgespeichert, ohne dass Fehlermeldung kommt.

Na ja, bei einem Edit bearbeitest du ja auch immer denselben Datensatz, der ja auch schon eine ID hat.

Hansa 4. Sep 2015 14:51

AW: FireDAC : Trigger geht nicht
 
Jetzt zum dritten mal, ein und derselbe Trigger der in IBExtert offensichtlich zuschlägt, schlägt offensichtlich über FireDAC nicht zu.

Code:
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_TEST_ID, 1);
Das steht im Trigger, was sonst ? Wenn ich schreibe Table dann ist zumindest aus dem Zusammenhang zu schliessen, dass damit Database-Table gemeint ist und nicht irgendeine Table-Komponente. DM steht übrigens für DataModule und DS für Dataset, bzw. in diesem Fall für FDQuery. Dass es viele FireDac-Komponenten gibt weiss ich auch und ich benutze nicht nur die eine. 8-)

@nahpets : das habe ich auch schon probiert, also die ID von Hand vergeben. Aber auch dann kommt offensichtlich nichts in der DB an. Fehlermeldung bleibt aber aus.

@Uwe : beim Edit ist die ID ja schon da und der Trigger tritt nicht in Aktion, ist ja klar, aber ich ändere doch zumindest die anderen beiden Felder. Auch davon ist nichts zu sehen.

Das dürfte alles nicht viel sein, irgendeine dumme Einstellung, aber momentan ein Rätsel. Mir fällt langsam nichts mehr ein, wo ich nachgucken soll :cyclops:

nahpets 4. Sep 2015 15:11

AW: FireDAC : Trigger geht nicht
 
Was steht bitte in der Create-Anweisung des Triggers:
Delphi-Quellcode:
CREATE TRIGGER trigger-name for table-name
   [ACTIVE | INACTIVE]
   {BEFORE | AFTER} <actions>
   [POSITION number]
   AS
Before oder After?
Kannst Du im Trigger irgendeine (wie auch immer geartete) Ausgabe machen, um zu erkennen, ob der Trigger beim Aufruf aus dem Programm überhaupt aktiv wird?
Er scheint ja zuweilen zu arbeiten, oder konntest Du schon sicherstellen (dich vergewissern), dass er auf jeden Fall immer aufgerufen wird.

Oder:

Könntest Du ein (vorübergehendes) Logging in den Trigger einbauen, analog zu http://www.firebirdsql.org/refdocs/l...exception.html

Eigentlich erscheint mir der Trigger korrekt zu sein, er dürfte ja diesem Beispiel entsprechen:
Delphi-Quellcode:
create trigger biu_parts for parts
  before insert or update
as
begin
  /* conditional code when inserting: */
  if (inserting and new.id is null)
    then new.id = gen_id(gen_partrec_id, 1);
 
  /* common code: */
  new.partname_upper = upper(new.partname);
end
Wenn Du im Trigger eine Exception schmeißt (ohne jede Bedingung, immer und grundsätzlich
Delphi-Quellcode:
EXCEPTION [<exception-name> [custom-message]]
, bekommst Du sie aus dem Programm zu sehen? Wenn nein, dann wird der Trigger (höchstwahrscheinlich) nicht immer aufgerufen.
Allerdings hab' ich überhaupt keine Idee, warum es eine derartige Situation geben sollte.

Uwe Raabe 4. Sep 2015 15:17

AW: FireDAC : Trigger geht nicht
 
Zitat:

Zitat von Hansa (Beitrag 1314757)
Das dürfte alles nicht viel sein, irgendeine dumme Einstellung, aber momentan ein Rätsel. Mir fällt langsam nichts mehr ein, wo ich nachgucken soll :cyclops:

Wie schon erwähnt, prüfe doch ob das ID-Feld wirklich als TFDAutoIncField erkannt wurde.

Dann das obligatorische "ist der Stecker drin?", sprich: bist du auch sicher mit derselben Datenbank verbunden?

Wenn es machbar ist, lannst du ja auch mal die nötigen Sourcen hier anhängen, damit wir auch was sehen können. :glaskugel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr.
Seite 1 von 5  1 23     Letzte »    

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