Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#22

Re: Firebird : Tabelle erstellen mit AutoInc-Feld

  Alt 26. Mai 2007, 13:49
Zitat von alex517:
Zitat von Elvis:
Nicht zu schnell widersprechen! ( )
Oh, doch!
Gibst nicht auf was?

Zitat von alex517:
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


Zitat:
Zitat von Elvis:
Hatte ich das wirklich so unverständlich geschrieben?
Nein, nicht unverständlich, aber ich denke, dass ich Recht habe.
Kann gar nicht sein....
Zitat:
Es ist also keine dunkle Ära, man muss nur die Augen aufmachen, damit es hell wird!
Ganz genau!


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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat