![]() |
Datenbank: InterBase • Version: 6.5 • Zugriff über: IBconsole - Delphi 2006
InterBase Trigger wird nicht ausgeführt
Hallo,
fange gerade mit Interbase an, komme leider nciht weiter..... Habe z.Z. zwei Tabellen: Kunden und Anrede Zugriff aus Delphi2006 heraus über: 1xTIBDataBase, 1xTIBTransaction, TIBTable (kunden), TIBTable (anrede), 2xDataSource Es gibt einen Generator (GENID) und einen Trigger (AUTOINC) für Kunden: SET TERM ^ ; CREATE TRIGGER "AUTOINC" FOR "kunden.dbf" ACTIVE BEFORE INSERT POSITION 0 AS BEGIN new.ID = GEN_ID(GENID, 1); END ^ COMMIT WORK ^ SET TERM ;^ Dieser Trigger funktioniert auch richtig (aus meinem Programm heraus o.k., IBConsole verlangt manuelle Eingabe des Kunden.ID), das ID-Feld wird um 1 jeweils erhöht. Meine zweite Tabelle: Anrede (Felder: ID, Anrede) besitzt auch einen Generator (GENID_0) und einen Trigger (AutoInc0), aber beim Speichern eines neuen Datensatzes scheint der Trigger nicht zu funktionieren und es es gibt eine Fehlermeldung (ID-Feld darf nicht leer bleiben), der Trigger sieht so aus: SET TERM ^ ; CREATE TRIGGER "AutoInc0" FOR "anrede.dbf" ACTIVE BEFORE INSERT POSITION 0 as begin IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(GENID_0, 1); end ^ COMMIT WORK ^ SET TERM ;^ Wo ist der Fehler? |
Re: InterBase Trigger wird nicht ausgeführt
Der Trigger sieht korrekt aus.
Wie wird der Datensatz eingefügt? Das Feld scheint nicht Null zu sein. Du könntest die entsprechende Prüfung weglassen (wie beim 1. Trigger) um die Verwendung des Generators zu erzwingen. BTW die Endung dbf bei den Tabellennamen kannst du weglassen. |
Re: InterBase Trigger wird nicht ausgeführt
Herzlich willkommen in der Delphi-PRAXiS, cugar.
InterBase-Tabellennamen wie "anrede.dbf" irritieren mich. Ich würde den Plural der Entität verwenden, also "Anreden". Statt IBTable solltest du dich vielleicht mit TIBDataSet anfreunden. Der Name des Generators sollte vielleicht seinen Verwendeungszweck reflektieren - GEN_Kunden bzw. GEN_Anreden wäree eine gute Möglichkeit. Für die Beantwortung deines eigentlichen Problems wäre die Kenntnis der DDL-Statements von Vorteil. Freundliche Grüße - auch an Markus |
Re: InterBase Trigger wird nicht ausgeführt
Danke für die schnelle Antworten!
Die Datensätze füge ich ein, in dem ich einfach in der DGrid eine neue Zeile einfüge, gebe die Daten ein und beim Versuch zu speichern kommt die Fehlermeldung (nur bei Anrede). Ist es etwa problematisch mit TIBTable zu arbeiten? Warum soll TIBDataSet besser sein? Gruß cugar |
Re: InterBase Trigger wird nicht ausgeführt
Zu TIBTable: dabei handelt es sich um eine Portierungshilfe für BDE-Programme, welche rund um TTable aufgebaut wurden.
Ich hatte nach den DDL Statements (CREATE TABLE und die DRI-Klauseln) gefragt, weil ich vermute, dass deine Tabelle mit den Anreden eine Lookup-Tabelle für deine Tabelle mit den Kunden darstellt. Freundliche Grüße |
Re: InterBase Trigger wird nicht ausgeführt
Bei Verwendung einer Table-Komponente, werden alle Felder gesetzt, so daß der Trigger wegen der erwähnten Abfrage nicht wirksam wird.
Du kannst entweder die Abfrage auf NULL im Trigger entfernen oder von der Table-Komponente weggehen, dann kannst du das verwendete Insert-SQL-Statement manuell ohne das ID-Feld setzen. Table-Komponenten dienen nur dazu, das Verhalten einer BDE-Tabelle auf Basis von SQL abzubilden, was wenig performat ist und zu Problemen führt. BTW. Gruß zurück an Achim. |
Re: InterBase Trigger wird nicht ausgeführt
Hallo marabu,
ja du hast natürlich Recht, Anrede soll als Lookup später dienen. Tabelle Anrede "ID" INTEGER NOT NULL, "Anrede" VARCHAR(20) NOT NULL, PRIMARY KEY ("ID") Tabelle Kunden "ID" INTEGER NOT NULL, "Firma" "TSTR(30)", "Kontakt_Name" "TSTR(30)" NOT NULL, "Kontakt_Vorname" "TSTR(30)", "Strasse" "TSTR(50)" NOT NULL, "HausNr" "TSTR(30)", "TelefonNr" "TSTR(30)" NOT NULL, "FaxNr" "TSTR(30)", "HandyNr" "TSTR(30)", "Geburtsdatum" DATE, "Email" "TSTR(50)NULL", "Anmerkung" VARCHAR(100), "Anrede" VARCHAR(20) DEFAULT '0' NOT NULL, PRIMARY KEY ("ID") Also wenn ich mkinzler richtig verstehe, soll ich lieber Abstand von TIBTable nehmen? (die Abfrage auf NULL im Trigger habe ich entfernt ) |
Re: InterBase Trigger wird nicht ausgeführt
Zitat:
So kannst du z.B. nur die benötigten Felder wählen und beim Insert und Update das Feld ID aus der Liste nehmen und beim Update und Delete alle anderen Felder aus der Where-Clause. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 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