Announcement

Collapse
No announcement yet.

autoinc bei Firebird auslesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • autoinc bei Firebird auslesen

    Hallo beisammen,

    leider komme ich trotz mehrerer Stunden Suche und Probieren nicht zum Ziel:

    Meine Umgebung:
    ZEOS 7 stable, Delphi XE4, Firebird (embedded)

    Mein Generator:
    Code:
    CREATE GENERATOR "GEN_FIRMA";
    Meine Stored Procedure:
    Code:
    NewID = Gen_ID(GEN_FIRMA,1);
    Mein Trigger:
    Code:
    CREATE TRIGGER "SET_FIRMENID" FOR "FIRMA" 
    ACTIVE BEFORE INSERT POSITION 0
    as
    begin
      if (new.ID is null) then new.ID = gen_id(gen_FIRMA, 1);
      if (new.ID = '0') then new.ID = gen_id(gen_FIRMA, 1);
    .
    .
    end
    Ich verwende ZEO und die Kompos ZQuery, ZUpdateSQL

    In der ZUpdateSQl steht meine Insertanweisung:
    Code:
    INSERT INTO Firma
      (NR, ANLAGE, BERATER, ..)
    VALUES
      (:NR, :ANLAGE, :BERATER, ..)
    RETURNING ID
    Ich bekomm jetzt ums verrecken die ID nicht abgefragt.
    Ereignis AfterPost
    Code:
    var newID : integer;
    begin
      newid :=  ZQFirma.parambyName('ID').value;

    Könnt Ihr mir helfen?

    Gruß

    Peter

    Fehlermeldung:Paramter ID nicht gefunden

  • #2
    Tja, eigentlich verwendet man die Sequenzwerte / Generatoren ursprünglich so, dass man zuerst den neuen Sequenz-Wert abfragt (separates Statement) und diesen dann im Insert Statement einsetzt, also auf Clientseite.
    Das taugt nicht unbedingt für die Arbeit mit Triggern, außer die Trigger lassen es zu, dass wahlweise PK Werte geliefert oder selbst intern erstellt werden.
    Das Returning ist eigentlich eine gute Verbesserung, hilft aber auf Anhieb nur in der direkten (Weiter-)Verwendung innerhalb einer Stored Proc.
    Wenn du den Returning Wert aus einem Insertstatement rausbekommen willst, müsstest Du mit Out Parametern in dem Statement arbeiten, ich bin mir aber nicht sicher, ob das mit Firebird und ZEOS geht.

    Hier ein Beispiel ADO / Oracle:

    Code:
      pADOQuery.SQL.text := 'Insert into myTable (field2, field3) values('x', 'New') returning pkID into :OUT_ID';
            pADOQuery.Parameters.ParamByName('OUT_ID').Direction := pdOutput	;
            pADOQuery.Parameters.ParamByName('OUT_ID').DataType := ftInteger	;
    
            pADOQuery.ExecSQL;
    
            pRefID := pADOQuery.Parameters.ParamByName('OUT_ID').Value ;
    Gruß, defo

    Comment


    • #3
      hallo defo,
      hallo alle anderen

      gerade hab ich die Lösung für Zeos 7. stable gefunden. Eine Anregung von Markus Kinzler aus 2005 in der Entwicklerecke war der richtige Tip.
      Ich verwende jetzt eine Komponente TSequenz in welcher ich die Connection zur Designzeit und den Generator (Schreibweise berücksichtigen!) zur Laufzeit setze.

      Code:
      var newID : int64;
      begin
        ZSEQ1.sequenzname := 'GEN_FIRMA';
        newID := ZSEQ1.Getcurrentvalue;
      .
      .
      end;
      (Ausgeführt wird eine Abfrage des Generators mit Parameter 0 bei getcurrentvalue und Paramter 1 bei getnextvalue
      Diese Routine wird direkt in dem AfterPost- Ereignis ausgeführt. Hier ist ja noch meine Transaction aktiv, so dass der Wert zuverlässig sein sollte, auch in einer heftigen Multi- User Umgebung.
      So wie ich das verstanden habe sollte das zumindest in Firebird (auch embedded) ab 1.5.1, MySQL und Oracle (da kommen Sequenzen wohl her) funktionieren. Falls hierzu noch jemand etwas schreiben könnte?

      Vielen Dank für eure Mühe und vielleicht hilft es ja noch anderen.

      Gruß

      Peter

      Comment

      Working...
      X