Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [Firebird] Trigger/Generatoren anlegen (https://www.delphipraxis.net/52195-%5Bfirebird%5D-trigger-generatoren-anlegen.html)

Thanatos81 25. Aug 2005 10:26

Datenbank: embedded Firebird • Version: 1.5.2.4731 • Zugriff über: ZEOS

[Firebird] Trigger/Generatoren anlegen
 
Moin DP!

Ich möchte jetzt in ner FireBird-DB ein AutoInc realisieren. Ich hab mittlerweile rausbekommen, das ich dafür nen Trigger und nen Generator brauche. Habe hier auch bereits einen Code-Schnipsel für nen Trigger gefunden, den ich mir angepasst habe:
SQL-Code:
CREATE TRIGGER "Debitoren_BI0" FOR "Debitoren"
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.LfdNr = 0) then
    new.LfdNr = lfdNr_id(Debitoren, 1);
end
Meine Frage ist jetzt: Kann ich das einfach über ne Query als SQL-Befehl hinschicken? Und vor allem, wann muss ich das machen? Kommt das mit beim Create Table-Befehl? Oder nachdem die Tabelle angelegt ist, oder ist das egal? Dann müsste ich mich halt nur noch informieren, wie mein Generator auszusehen hat.

DAnke im Voraus,

Tom70 25. Aug 2005 10:55

Re: [Firebird] Trigger/Generatoren anlegen
 
Die Reihenfolge der einzelnen Statements:

Delphi-Quellcode:
Erst die Tabelle:

CREATE TABLE TEST (
IDFILED INTEGER
)

danach der Generator:

CREATE GENERATOR TEST_IDFILED_GEN

und dann der Trigger:

CREATE TRIGGER AI_TEST_IDFILED FOR TEST
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.IDFILED IS NULL) THEN
      NEW.IDFILED = GEN_ID(TEST_IDFILED_GEN, 1);
END
...nur mal so als Beispiel.

Marcel Gascoyne 25. Aug 2005 10:56

Re: [Firebird] Trigger/Generatoren anlegen
 
Zitat:

Zitat von Thanatos81
SQL-Code:
CREATE TRIGGER "Debitoren_BI0" FOR "Debitoren"
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.LfdNr = 0) then
    new.LfdNr = lfdNr_id(Debitoren, 1);
end

So wird das wohl nix, der Trigger müsste etwa so aussehen wenn Dein Generator lfdNr_id heisst:

SQL-Code:
CREATE TRIGGER "Debitoren_BI0" FOR "Debitoren"
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.LfdNr is null or new.LfdNr = 0) then
    new.LfdNr = gen_id(lfdNr_id, 1);
end
Zitat:

Meine Frage ist jetzt: Kann ich das einfach über ne Query als SQL-Befehl hinschicken? Und vor allem, wann muss ich das machen? Kommt das mit beim Create Table-Befehl? Oder nachdem die Tabelle angelegt ist, oder ist das egal?
Die Reihenfolge wäre 1.) Tabelle anlegen, 2.) Generator anlegen und 3.) Trigger anlegen.

Zitat:

Dann müsste ich mich halt nur noch informieren, wie mein Generator auszusehen hat.
Ein Generator kann nur einen Integer Wert enthalten und wird mit
SQL-Code:
create generator <name_of_generator>
angelegt.

Gruß,
Marcel

marabu 25. Aug 2005 11:02

Re: [Firebird] Trigger/Generatoren anlegen
 
Hallo,

zuerst erzeuge deine Tabelle und den Generator, dann den Trigger. Bei der Anpassung des gefundenen SQL-Codes ist dir vielleicht nicht klar gewesen, dass du gen_id() nicht einfach umbenennen kannst. Es handelt sich dabei um eine Funktion, der erste Parameter ist der Name des Generators und nicht der Tabelle. Schau nochmal hier: klick

Das sind alles DDL Statements, die in der Regel nichts mit deiner Anwendung zu tun haben. Sie werden beim Aufsetzen der Datenbank ausgeführt. Wenn das von deinem Programm miterledigt wird, dann bitte in einem abgeschotteten Programmzweig. Du könntest sowas mit ZQuery erledigen, besser finde ich ein DDL-Script. Oder mache es mit einer SQl-Konsole und installiere im Setup später eine Leerdatenbank, die schon alles enthält.

Grüße vom marabu

Tom70 25. Aug 2005 11:08

Re: [Firebird] Trigger/Generatoren anlegen
 
Man kann die gen_id() auch über eine SP abrufen, einfügen und gleich an das aufrufende Programm zurückgeben. Ist m.E. der bessere Weg, da man die aktuelle ID gleich im Programm benutzen kann, ohne die Daten neu einlesen zu müssen.

Hansa 25. Aug 2005 11:17

Re: [Firebird] Trigger/Generatoren anlegen
 
Anscheinend will er das aber mit einem TQuery machen, aus Delphi raus ! Die Table mitsamt Generator/Trigger lege ich aber mit IBExpert in 1 Min. an. Für den Trigger wird ein Grundgerüst angelegt, ähnlich wie in Delphi. Das wird angepaßt und das wars schon.

Thanatos81 25. Aug 2005 11:19

Re: [Firebird] Trigger/Generatoren anlegen
 
Wow, da ist man ne halbe Stunde bei nem Kunden und denkt sich, vielleicht hat ja schon einer geantwortet. Und man hat gleich vier Antworten :thumb: Danke für eure Mühe!

@marabu und Marcel
Danke für die Fehlerberichtigung. DAs Gebiet ist halt noch ziemliches Neuland für mich (Einzige "SQL"-Kenntnisse aus der 11. Klasse mit MS Access *grusel*)

@marcel
Sollte schon alles vom Programm erledigt werden. Hauptsächlich aus dem Grund, um es endlich mal zu lernen :wink:

@tom70
Das mit der SP werd ich mir mal anschauen, noch brauch ich die LfdNr nicht, aber wer weiß, was kommt :!:

@hansa
Genau, ich wollte keinen Designer verwenden. Kann man SPs nicht zur Laufzeit anlegen?

Tom70 25. Aug 2005 11:39

Re: [Firebird] Trigger/Generatoren anlegen
 
Mit einer SP könnte dasso aussehen:

Delphi-Quellcode:
CREATE PROCEDURE TEST_INSERT (
      TEXT VARCHAR (10))
RETURNS (ID INTEGER)
AS
BEGIN
-- ID von Generator holen
ID = GEN_ID(TEST_ID_GEN, 1);

-- Daten einfügen
  INSERT INTO TEST (
    ID,
    TEXT)
  VALUES (
    :ID,
    :TEXT);
    SUSPEND;
END

Hansa 25. Aug 2005 12:06

Re: [Firebird] Trigger/Generatoren anlegen
 
Zitat:

Zitat von Thanatos81
Genau, ich wollte keinen Designer verwenden. Kann man SPs nicht zur Laufzeit anlegen?

Kehre mal in Dich ! Kaum ist der Papst wieder weg und schon wird wieder Unfug getrieben. :lol: Ne, jetzt im Ernst. Bei so was stellt sich folgende Frage : ändert sich die Struktur der DB und zwar oft und zwar vor Ort im Einsatz ? Muß diese Voraussetzung tatsächlich erfüllt werden, dann gibt es zwei Wege. Delphi-Programm dafür schreiben (IMHO zu aufwändig) oder ein SQL-Script und das ausführen. Wenn es aber irgendwie geht, auf so was zu verzichten, dann sollte man es auch sein lassen. Der Verwaltungsaufwand ist ja nicht nur Trigger usw. zu schreiben, sondern auch den alten eventuell zu löschen usw.

Läßt sich die DB zumindest für eine vorhersehbare Zeit planen, dann ist der Laufzeitweg ein Irrweg, weil es genügend Hilfsmittel gibt, die einem die Arbeit erleichtern. Also beser Rad nicht neu erfinden und die DB möglichst vorausschauend planen ! Wenn ich mir vorstelle meine DB mit einem Delphi-Programm verwalten zu müssen, dann wird mir ganz schlecht. :mrgreen:

P.S.: zur Laufzeit und SPs : hat jetzt mit Trigger usw. nicht viel zu tun, aber da kann man Parameter definieren, die erst zur Laufzeit mit konkreten Werten bestückt werden.

Thanatos81 25. Aug 2005 12:11

Re: [Firebird] Trigger/Generatoren anlegen
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von Thanatos81
Genau, ich wollte keinen Designer verwenden. Kann man SPs nicht zur Laufzeit anlegen?

Kehre mal in Dich ! Kaum ist der Papst wieder weg und schon wird wieder Unfug getrieben. :lol: Ne, jetzt im Ernst. Bei so was stellt sich folgende Frage : ändert sich die Struktur der DB und zwar oft und zwar vor Ort im Einsatz ? [...]

Unfug hab ich auch getrieben, als der Papst noch im Lande war :twisted:

Aber ernsthaft: Die Struktur wird sich kaum ändern, da das ganze Programm nicht sonderlich umfangreich wird. Mir gings mehr um den Lerneffekt. Aber vielleicht sollte ich wirklich mal überlegen, ob der Lerneffekt darin liegt, auch mal nen Designer zu verwenden... :-D

Btw. kennt da jemand einen guten Freeware-Designer für Firebird-DBs, die nicht übern Server anzusprechen sind (embedded Firebird, halt)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:29 Uhr.
Seite 1 von 2  1 2      

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