mal zurück zur eigentlichen Problematik
Datasets, die für Delphi und Firebird entwickelt wurden, wie zum Beispiel IBObjects, haben Properties, mit denen man den verbundenen Generator festlegen kann. Das heisst dann bei IBO z.B. KeyGeneratorLink o.ä.
Da man in Firebird selbst entscheiden kann, welcher Generator pro Tabelle benutzt wird, ist dieser Weg sehr praktisch, denn bei mir gibt es für alle Tabellen immer nur einen Generator, aus dem alle ID Werte geholt werden.
Nun kommen aber mehr generalisierte Komponenten wie Firedac nicht mit jeder unterstützten Plattform zu 100% klar. Mein Tip: Verliert euch nicht in der Abhängigkeit zu einer Komponente. Wie oben schon erwähnt bekommt Firebird noch gar nicht mit, das es einen Insert geben sollte, wenn auf Ebene der Delphi Komponente Bedingungen noch gar nicht erfüllt sind. Man könnte das als Mangel der FireDac Komponenten im Zusammenspiel mit Firebird betrachten oder einfach mal in den Dataset Events nach OnNewRecord suchen.
Wenn Ihr im OnNewRecord Ereignis dann ein
SQL startet "select gen_id(genid,1) from rdb$database" und den Rückgabewert in euer Primärschlüsselfeld übertragt, werdet Ihr feststellen, das es gar nicht so schwer ist, selbst die Kontrolle über solche Vorgänge zu haben. Wenn Ihr ein Generator pro Tabelle habt, könntet ihr das auch dynamisch machen, weil im Event ja der Sender(also das Dataset) kommt und das ja hoffentlich properties hat, aus denen sich der Tabellenname ergibt.
Und wenn Ihr das Event nicht für jedes Dataset manuell neu setzen wollt, könnt Ihr mit sehr wenig Aufwand auch ein global benutzbares Event dafür im Datenmodul generieren und das ggf. jedem Dataset in der components List im OnCreate zuweisen. Oder noch viel cleverer, einfach eine Ableitung der benutzten Dataset Klasse machen, in dem das automatisch passiert.
Wichtig: Nur weil Firebird und FireDAC vorne vier gleiche Buchstaben haben, ist FireDAC keineswegs die erste Wahl für Firebird und Delphi.