Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi InterBase Trigger wird nicht ausgeführt (https://www.delphipraxis.net/83846-interbase-trigger-wird-nicht-ausgefuehrt.html)

cugar 7. Jan 2007 11:07

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?

mkinzler 7. Jan 2007 11:14

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.

marabu 7. Jan 2007 11:17

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

cugar 7. Jan 2007 13:15

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

marabu 7. Jan 2007 13:26

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

mkinzler 7. Jan 2007 13:29

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.

cugar 7. Jan 2007 14:05

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 )

mkinzler 7. Jan 2007 14:07

Re: InterBase Trigger wird nicht ausgeführt
 
Zitat:

Also wenn ich mkinzler richtig verstehe, soll ich lieber Abstand von TIBTable nehmen? (die Abfrage auf NULL im Trigger habe ich entfernt )
Ja. Nimm lieber ein DataSet, darin kannst du die entsprechenden Statements nach deinen Anforderungen setzen.
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 02:18 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