![]() |
ZEOS - Interbase: Fehler bei Post eines neuen Datensatzes
Moin zusammen,
Greifee mit Zeos auf eine Interbase DB zu und habe die einzelnen Tabellen mit einem AutoInc-Feld über einen Generator-Trigger aufgebaut. CREATE GENERATOR adress_basis; COMMIT; set term ! ; CREATE TRIGGER Trigger1 FOR adress_basis before insert position 0 as begin NEW.ADR_BAS_PID = GEN_ID(adress_basis,1); end !! set term ; ! WAS GEHT Man kann Datensätze anlegen und angelegte ändern oder löschen. Wenn ein Anwender einen Neuen Datensatz anlegt und Änderungen in den visuellen Datenbankkomponenten / Feldern macht dann wird auf dem DBNavigator der Haken zum Posten aktiviert. Dieser kann auch gecklickt werden und die Änderungen gehen an die Datenbank OK ! Danach ist der Haken deaktiviert PROBLEM: Wenn der Kandidat aber jetzt ohne !!! den Datensatz zu wechseln nochmals Änderungen im DB Feldern des Fomular macht dann wird der Haken im DBNavigator wieder aktiviert, da ja neue Daten vorliegen. Wird dieser jedoch jetzt geklickt oder Query.Post angewendet, läuft die Anwendung in einen Datenbankfehler und der geänderte Satz wird nicht gespeichtert. Irgendjemand eine Idee :?: :?: Grüße // Martin |
Hallo MSchaefer 8)
Ich weiß jetzt nicht gezielt was für einen Fehler Du bekommst... nun... kann ich nur vermuten, dass Deine Datenbank kriegt nicht richtig mit... Bescheid über neue ADRESS_BASIS (ich hoffe, dass das ein Primärschlüssel in Deiner Tabelle ist!) Nun das Generator sollte so aussehen: CREATE GENERATOR ADRESS_BASIS_ID_GEN; SET GENERATOR ADRESS_BASIS_ID_GEN TO 0 und Trigger: CREATE TRIGGER ADRESS_BASIS _ID_GEN FOR ADRESS_BASIS BEFORE INSERT POSITION 0 AS BEGIN IF (NEW. ADRESS_BASIS IS NULL) THEN NEW. ADRESS_BASIS = GEN_ID(ADRESS_BASIS _ID_GEN, 1); END So….! __________________________________________________ _____ __________________________________________________ _____ Hilft das weiter nicht, dann kannst Du noch gezielt nach abspeichern eines Datensatzes das Befehl ‚COMMIT’ in dem Ereignis AfterPost Deiner Query „wegschicken“ Dies kann man auf zwei Arten realisieren: __________________________________________________ _____ 1.) Du kannst in dem besagtem Ereignis gezielt eine andere Query mit nur einem Befehl ‚COMMIT’ (Eine Operation, die alle Änderungen an Datenbanken speichert) ausführen... z.B. so: Query1.Add('COMMIT'); try Query1.ExecSQL; except end; Somit erzwingst Du die Aktualisierung der Daten... ___________________________________________ 2.) Verwendest Du in Deinem Projekt die Komponennte TdataBase und Deine Query „hängt“ an dieser Komponente dann kannst Du in dem AfterPost-Ereignis gezielt Commit erzwungen: DataBase1.Commit; Gruß Paul Jr. |
Hallo,
ich habe zwar das Problem, daß ich Zeos nicht kenne, ich habe aber eine Ahnung, wo Du suchen mußt. Vornweg, Deine Datenbankdeklaration sieht ganz gut aus. Was passiert: 1. Beim Andern Die Komponente liest die Felder aus der Datenbank, Du änderst die Felder und Zeos schreibt die geänderten Felder zurück, ungefähr so: Update tabelle set adr_bas_pid=alterwert1, feld2=neuerwert2 where adr_bas_pid=alterwert1 and feld2=alterwert2 2. Beim Einfügen Du füllst die Felder und schickst diese an die Datenbank, Zeos bekommt nichts von Deinem Feld adr_bas_pid mit insert into tabelle (adr_bas_pid, feld2) values (null, wert2) 3. Beim Einfügen und anschließendem Ändern Da Du den Datensatz nicht verlassen hast, bildet sich Zeos vermutlich ein, alle Feldinhalte zu kennen: Update tabelle set adr_bas_pid=null, feld2=neuerwert2 where adr_bas_pid=null and feld2=alterwert2 allerdings hast Du mit dem Trigger dem Feld adr_bas_pid einen Inhalt verpaßt. Da ich, wie gesagt, zeos nicht kenne, mußt Du mal alles untersuchen, was irgendwie wie update (oder auch refresh) heißt. Und dann müßtest Du ihm sagen, daß er das Feld adr_bas_pid bitte nicht vergleichen soll. Und damit kommen wir zum Problem, das Feld hast Du sicherlich genau für diesen Zweck angelegt. Als Lösung, falls Du innerhalb Zeos nicht fündig wirst, kann ich Dir nur anbieten, den Trigger nicht zu verwenden, sondern den Generator über eine Stored_proc abzufragen und dann in das Feld adr_bas_pid einzutragen. Ich hoffe, es hilft, und seit bitte nachsichtig, falls ich SQL-Fehler gemacht habe. Viele Grüße |
Es geht !!
Hallo Paul Jr. und Delphianer
Zunächst einmal vielen Dank für die Tipps, das Ding hat mich doch einige Nerven gekostet :? . Hat jetzt ein bischen gedauert bis ich wieder an diese DB gekommen bin. Die Lösung war das IF (NEW. ORD_BAS_PID IS NULL) THEN NEW.ORD_BAS_PID = GEN_ID( ORDER_BASIS_PID_GEN,1 ); Die Idee mit dem Autocomit ist auch nicht ohne. In meinem Fall habe ich das allerdings so gelöst, das ein Post abgesetzt wird wenn das entsprechende Formular geschlosssen wird. Trotzde, da sind auch einige Hinweise die später sicher mal eingebaut werden... Hier nochmal eine Tabelle mit der kompletten Definition CREATE TABLE order_basis ( ORD_BAS_PID INTEGER, ORD_BAS_DeadlineDate DATE, ORD_BAS_DeadlineTime DATE, ORD_BAS_OrderTopic CHAR(50), ODR_BAS_PayedBy CHAR(50) ); COMMIT; CREATE INDEX PRIMARYINDEX ON order_basis (ORD_BAS_PID); CREATE GENERATOR ORDER_BASIS_PID_GEN ; SET GENERATOR ORDER_BASIS_PID_GEN TO 0 ; COMMIT; DROP TRIGGER ORDER_BASIS_PID_TRG; set term ! ; CREATE TRIGGER ORDER_BASIS_PID_TRG FOR order_basis before insert position 0 as begin IF (NEW. ORD_BAS_PID IS NULL) THEN NEW.ORD_BAS_PID = GEN_ID( ORDER_BASIS_PID_GEN,1 ); end ! set term ; ! Übrigens Paul Jr. Danke, das Du Dich auf meine Feldbezeichnungen eingelassen hast, die sind nun nicht jedermanns Sache. Viele Grüße aus der Stadt an der Leine // Martin :coder: :party: :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 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