Announcement

Collapse
No announcement yet.

Den Generatorwert ermitteln nach einem Insert und Commit mit IBX

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

  • Den Generatorwert ermitteln nach einem Insert und Commit mit IBX

    Hallo!

    Ich habe eine schon gefüllte IB Tabelle mit einem Feld, dem über einen Generator ein Wert zugewiesen wird.
    Der Generator startet bei 0 (das soll so sein !).
    Der Trigger des Generators überprüft nun, ob der neue Generatorwert schon existiert, wenn ja erhöht er den Wert des Generators weiter ( immer um 1), bis keine Übereinstimmung gefunden wird, dann wird der Wert als neue ZeilenID übernommen.

    In Delphi verwende ich IBDataSet, ein DBGrid (nur zur anzeige und zur auswahl des aktuellen Datensatzes) und mehrere DBEdit (zur Werteingabe der Felder des aktuellen Datensatzes)

    Ich führe nun ein Dataset.Insert aus und füge Felder Daten ein. Danach führe ich ein Dataset.Post und ein Transaction.commit aus.
    Das muß alles so sein!

    Danach muß IBDataSet neu geöffnet werden.
    Normaler weise speichere ich den Wert von DataSet.RecNo vor dem Post und setzte den alten Wert danach wieder ein, um den eingefügten Datensatz wiederzufinden.
    Aber dies funktioniert nur, wenn kein Generatorwert mit im Spiel ist.
    Wenn ich mit einem Generator arbeite, wird der Datensatz dort eingefügt wo der nächst freie GeneratorWert ist.

    <B> ALSO: Wie kann ich diesen Datensatz wiederfinden?
    Logisch währe, den Generatorwert an das Programm zu senden, aber WIE?
    </B>

  • #2
    Hi,

    ich verwende auch IBDataSets mit GeneratorField. Den aktuellen Datensatz hole ich mir VOR dem Post:

    selectDS:=IBDataSet['ID'];

    Mit der globalen Variable SelectDS kann ich dann nach dem Commit den Datensatz wieder anzeigen lassen.

    Grüße
    Wolfgan

    Comment


    • #3
      Leider hilft mir das nichts.

      Ich trage keinen Wert im Generator-Feld ein. Denn dieser Wert wird erst auf dem Server bestimmt, nach einem Commit aufruf.

      Würde ich den Wert vorher bestimmen wollen, würde der Trigger nicht funktionieren

      Comment


      • #4
        Hallo,

        IBX bietet die Auswahl unter 3 Optionen für die TIBDataSet-Eigenschaft <b>GeneratorField</b>. Wenn die Option <b>On Server</b> (gamOnServer) aktiviert wird, passiert folgendes: IBX fordert den neuen Primärschlüsselwert nicht an, da dieser in einem Trigger direkt in der Datenbank gesetzt wird. Der Client kennt somit diesen Wert nicht, allerdings wird die Eigenschaft <b>Required</b> für diese TField-Instanz automatisch auf False gesetzt. Über <b>RefreshSQL</b> kann IBX auf der Client-Seite den vom Trigger auf der Server-Seite gesetzten Primärschüsselwert automatisch ohne Zutun des Entwicklers ermitteln, wenn im WHERE-Part eine eindeutige Einschränkung (logisch eindeutige Suche) möglich ist. Gibt es diese eindeutige logische Suchmöglichkeit nicht, muss man auf die Alternativen <b>On Post</b> oder <b>On New Record</b> ausweichen

        Comment


        • #5
          Vielen Dank!

          Ich habe das Problem jetzt über ein DataSet.Locate gelöst.
          So das der Datensatz vor dem Post gespeichert wird und nachher über Locate gesucht wird, ohne den Generatorwert zu nutzen

          Comment

          Working...
          X