AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi InterBase Trigger wird nicht ausgeführt
Thema durchsuchen
Ansicht
Themen-Optionen

InterBase Trigger wird nicht ausgeführt

Ein Thema von cugar · begonnen am 7. Jan 2007 · letzter Beitrag vom 7. Jan 2007
Antwort Antwort
cugar

Registriert seit: 6. Jan 2007
149 Beiträge
 
Delphi XE Professional
 
#1

InterBase Trigger wird nicht ausgeführt

  Alt 7. Jan 2007, 11:07
Datenbank: InterBase • Version: 6.5 • Zugriff über: IBconsole - Delphi 2006
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: InterBase Trigger wird nicht ausgeführt

  Alt 7. Jan 2007, 11:14
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.
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: InterBase Trigger wird nicht ausgeführt

  Alt 7. Jan 2007, 11:17
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
  Mit Zitat antworten Zitat
cugar

Registriert seit: 6. Jan 2007
149 Beiträge
 
Delphi XE Professional
 
#4

Re: InterBase Trigger wird nicht ausgeführt

  Alt 7. Jan 2007, 13:15
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: InterBase Trigger wird nicht ausgeführt

  Alt 7. Jan 2007, 13:26
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: InterBase Trigger wird nicht ausgeführt

  Alt 7. Jan 2007, 13:29
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.
Markus Kinzler
  Mit Zitat antworten Zitat
cugar

Registriert seit: 6. Jan 2007
149 Beiträge
 
Delphi XE Professional
 
#7

Re: InterBase Trigger wird nicht ausgeführt

  Alt 7. Jan 2007, 14:05
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 )
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: InterBase Trigger wird nicht ausgeführt

  Alt 7. Jan 2007, 14:07
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:11 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