![]() |
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:
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 ?
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; 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. |
AW: FireDAC : Trigger geht nicht
Welche eine Komponente? Wie sieht der Trigger aus?
FireDAC führt keinen Trigger aus, sondern der Server. |
AW: FireDAC : Trigger geht nicht
Zitat:
|
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? |
AW: FireDAC : Trigger geht nicht
Zitat:
Zitat:
|
AW: FireDAC : Trigger geht nicht
Bin mal wieder naiv, was passiert denn bei:
Delphi-Quellcode:
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.
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; |
AW: FireDAC : Trigger geht nicht
Zitat:
![]() ![]() Zitat:
|
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:
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-)
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(GEN_TEST_ID, 1); @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: |
AW: FireDAC : Trigger geht nicht
Was steht bitte in der Create-Anweisung des Triggers:
Delphi-Quellcode:
Before oder After?
CREATE TRIGGER trigger-name for table-name
[ACTIVE | INACTIVE] {BEFORE | AFTER} <actions> [POSITION number] AS 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 ![]() Eigentlich erscheint mir der Trigger korrekt zu sein, er dürfte ja diesem Beispiel entsprechen:
Delphi-Quellcode:
Wenn Du im Trigger eine Exception schmeißt (ohne jede Bedingung, immer und grundsätzlich
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
Delphi-Quellcode:
, bekommst Du sie aus dem Programm zu sehen? Wenn nein, dann wird der Trigger (höchstwahrscheinlich) nicht immer aufgerufen.
EXCEPTION [<exception-name> [custom-message]]
Allerdings hab' ich überhaupt keine Idee, warum es eine derartige Situation geben sollte. |
AW: FireDAC : Trigger geht nicht
Zitat:
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 10:06 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