Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird : Tabelle erstellen mit AutoInc-Feld (https://www.delphipraxis.net/92697-firebird-tabelle-erstellen-mit-autoinc-feld.html)

mkinzler 26. Mai 2007 11:41

Re: Firebird : Tabelle erstellen mit AutoInc-Feld
 
IMHO sind alle Lösungen, welche auf Generatoren aufsetzen gleich gut. Seien es jetzt durch Einsatz eines Triggers, einer SP, direkt im Statement oder dem Einsatz von clientseitiger Komponenten, welche darauf aufsetzen (TZSequence usw.)

Elvis 26. Mai 2007 12:49

Re: Firebird : Tabelle erstellen mit AutoInc-Feld
 
Zitat:

Zitat von alex517
Zitat:

Zitat von Elvis
Nicht zu schnell widersprechen! :warn: ( ;) )

:warn: Oh, doch! :wink:

Gibst nicht auf was? :)

Zitat:

Zitat von alex517
Zitat:

Zitat von Elvis
Natürlich braucht man den Trigger, er sollte die ID aber bedingungslos aus dem Generator setzen, auch wenn beim Insert schon ein Wert dafür angegeben wurde.

Dazu folgendes Szenario:
Ich generiere eine NEUE Rechnung (Rech) mit Rechnungsposten (RPosten) im Formular.
Da Rech- und RPosten-Daten in einer Transaktion gespeichert werden müssen, benötige ich vorher die ID der Rechnung, um diese
in den RPosten-Daten als Link(FK) auf die Rech eintragen zu können. Ich hole mir, wie oben beschrieben, explizit eine neu ID, und gebe diese beim Insert sowohl der Rechnung als auch den RPosten mit.
Fertig!

Also die Rechungsposten haben einen FK auf die Rechung? Das heißt die Rechung muss existieren bevor du den Rechnungsposten einfügen kannst? Wenn du jetzt mit Ja/Ja antwortest, dann war das kein Grund diese potentielle Schlüsselverletzung im Trigger zu lassen. ;)
Pseudo code:
Delphi-Quellcode:
using transaction := deineConnection.BeginTransaction() do
begin
  using command := connection.CreateCommand() do
  begin
    command.CommandText := 'INSERT INTO Rechungen(blabla) VALUES(:Blabla) RETURINNG ID';
    command.Parameters.Add('Blabla', 1);
    var rechungsId := command.ExecuteScalar() as Integer;
    command.CommandText := 'INSERT INTO RechungsPostenen(Rechung) VALUES(:Rechung) RETURNING ID';
    command.Parameters.Add('Rechung', rechungsId);
    var rechungsPostenId := command.ExecuteScalar() as Integer;
    ...
  end;
 
  transaction.Commit();
end;
Zitat:

Äh.., natürlich nur wenn der Trigger nicht einfach bedingungslos der Rechnung eine andere ID verpasst.
Aber den Trigger habe ja ich angelegt und nicht Elvis :wink:
;-)

Zitat:

Zitat:

Zitat von Elvis
Hatte ich das wirklich so unverständlich geschrieben? :gruebel:

Nein, nicht unverständlich, aber ich denke, dass ich Recht habe.
Kann gar nicht sein.... :mrgreen:
Zitat:

Es ist also keine dunkle Ära, man muss nur die Augen aufmachen, damit es hell wird! :mrgreen:
Ganz genau! :P


Zitat:

Zitat von mkinzler
IMHO sind alle Lösungen, welche auf Generatoren aufsetzen gleich gut. Seien es jetzt durch Einsatz eines Triggers, einer SP, direkt im Statement oder dem Einsatz von clientseitiger Komponenten, welche darauf aufsetzen (TZSequence usw.)

Wenn ich 2 Lösungen für ein Problem habe, und die eine mindestens ein weiteres Problem bewirken kann, ohne Vorteile zu bringen...
Dann können nicht beide Lösungen gleich gut sein. ;)

Hansa 26. Mai 2007 13:31

Re: Firebird : Tabelle erstellen mit AutoInc-Feld
 
Zitat:

Zitat von Elvis
Wenn ich 2 Lösungen für ein Problem habe, und die eine mindestens ein weiteres Problem bewirken kann, ohne Vorteile zu bringen...
Dann können nicht beide Lösungen gleich gut sein. ;)

Du hast dabei vergessen : viele Wege führen nach Rom. Und dann noch, dass Alex sowieso Recht hat. :mrgreen:

Er hat das klassische Bsp. der Rechnung erklärt. Genau so nuss es gemacht werden. Also wird Rückgabewert gebraucht. Der Trigger scheidet somit aus und die beiden Möglichkeiten bestehen dann darin eine SP zu verwenden oder eben FB 2.0. Beides ist für den Zweck gut und macht keine Probleme.

Elvis 26. Mai 2007 13:48

Re: Firebird : Tabelle erstellen mit AutoInc-Feld
 
Sorry Alex, "schöne Pfingsten" vergessen.


Und nun die quartalsmäßige Antwort an Hansa:
Zitat:

Zitat von Hansa
Er hat das klassische Bsp. der Rechnung erklärt. Genau so nuss es gemacht werden. Also wird Rückgabewert gebraucht. Der Trigger scheidet somit aus...

Warum kannst du dir nicht einfach angewöhnen nicht auf meine Beiträge zu antworten? Du hast natürlich wieder absolut gar nix kapiert, in dem Fall dass das erste Insert direkt die Rechnungs-ID zurückgegeben hat.
Deine "Kompetenz" beginnt und endet bei Firebird, und selbst da hast du absolut keinen Plan.

Kleiner Tipp an alle anderen, wenn es euch so wie mir gerade geht[1], versucht das was ich normalerweise auch mache: Versucht ihn zu ignoriert...


[1] Hansa hat auf einen Beitrag von euch geantwortet

alex517 29. Mai 2007 19:18

Re: Firebird : Tabelle erstellen mit AutoInc-Feld
 
Zitat:

Zitat von Elvis
Also die Rechungsposten haben einen FK auf die Rechung? Das heißt die Rechung muss existieren bevor du den Rechnungsposten einfügen kannst? Wenn du jetzt mit Ja/Ja antwortest, dann war das kein Grund diese potentielle Schlüsselverletzung im Trigger zu lassen. ;)

Ich verstehe nicht so richtig was du damit sagen möchtest. :gruebel:
Aber ich werte ich das einfach als Zustimmung zu meiner Darstellung. Überredet? ;)


alex

Elvis 30. Mai 2007 08:46

Re: Firebird : Tabelle erstellen mit AutoInc-Feld
 
Zitat:

Zitat von alex517
Ich verstehe nicht so richtig was du damit sagen möchtest. :gruebel:

Was da steht. :mrgreen:
IOW, dein Einwand für das manuelle Generatorgefriemel und die Lücke im Trigger, die es ermöglicht eine ID in die Tabelle einzufügen, die als DeinGenerator.NextValue ist.
Ich wollte zeigen dass es mit "Returning" auch in dem von dir geschilderten Fall einfacher ist. Wenn zusätzlich die Lücke aus dem Trigger entfernt werden kann ist's ja nur besser. :)
Schließlich kannst du ja nur dann einen FK von Rechnungsposten auf Rechungen haben wenn der Rechungsdatensatz existiert, bevor du den Rechungsposten einfügst.
Zitat:

Aber ich werte ich das einfach als Zustimmung zu meiner Darstellung. Überredet? ;)
Tsss.... Dickkopf.... :mrgreen:

alex517 30. Mai 2007 09:42

Re: Firebird : Tabelle erstellen mit AutoInc-Feld
 
Zitat:

Zitat von Elvis
Ich wollte zeigen dass es mit "Returning" auch in dem von dir geschilderten Fall einfacher ist.

Ja, sofern bereits FB2.x verwendet wird.

Zitat:

Zitat von Elvis
Wenn zusätzlich die Lücke aus dem Trigger entfernt werden kann ist's ja nur besser.

Jetzt verstehe ich erst, was du mit "Lücke im Trigger" meinst.
Diese Lücke ist aber nur theoretisch, da praktisch das Programm die ID vor dem Insert aus dem Generator holt.


Allerdings bekommst du mit deinem "lückenslosen"-Trigger u.U. Probleme:
z.B beim Import bestehender verlinkter Daten, der Trigger muß dann ggf. deaktiviert werden.


von
Zitat:

Tsss.... Dickkopf.... :mrgreen:
So bin ich.. :-D

alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 Uhr.
Seite 3 von 3     123   

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