AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken FireDAC : Trigger geht nicht
Thema durchsuchen
Ansicht
Themen-Optionen

FireDAC : Trigger geht nicht

Ein Thema von Hansa · begonnen am 4. Sep 2015 · letzter Beitrag vom 7. Sep 2015
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 13:38
Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC
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.
Gruß
Hansa

Geändert von Hansa ( 4. Sep 2015 um 13:41 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 13:50
Welche eine Komponente? Wie sieht der Trigger aus?

FireDAC führt keinen Trigger aus, sondern der Server.
Markus Kinzler
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 13:59
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" ???
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.292 Beiträge
 
Delphi 12 Athens
 
#4

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 14:03
Hallo Hansa,

zeig mal den Trigger. Was ist wenn du nicht mit Insert/Post arbeitest sondern wie jeder Normale (Spaß ) eine Query absetzt?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 14:06
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?)
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 14:12
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#7

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 14:12
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)


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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#8

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 14:51
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.

@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
Gruß
Hansa
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 15:11
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ätzlichEXCEPTION [<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.

Geändert von nahpets ( 4. Sep 2015 um 16:28 Uhr) Grund: Ewig diese Schreibfehler :-(
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#10

AW: FireDAC : Trigger geht nicht

  Alt 4. Sep 2015, 15:17
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
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 23:27 Uhr.
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