Announcement

Collapse
No announcement yet.

Interbase-Trigger und TQuery

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

  • Interbase-Trigger und TQuery

    Hallo,

    ich habe eine Interbase-Tabelle, die ein Integer-Feld als Primary-Key beinhaltet. Der Inhalt ist eine fortlaufende Nummer, die mit einem Trigger (BEFORE INSERT) per GENERATOR gefüllt wird.

    Mit der TQuery im Delphi habe ich nun ein Problem : Füge ich einen Datensatz ein und sende ein Update per TUpdateSQL, so "merkt" die Query nicht, daß das Feld bereits durch den Trigger belegt worden ist. Auf jeden Fall zeigt mit das Grid dieses nicht an. Man könnte natürlich die Query erneut ausführen, aber das kann es doch wohl nicht sein oder ? ;-)

    Hat jemand eine Lösung ??

  • #2
    Hallo,

    so sind nun einmal die Regeln in einer Client/Server-Datenbank - der Client erhält nur das vom Server, was er auch selbst abfordert. Einige Komponenten (wie zum Beispiel IBX und ADO) machen die zusätzliche Rückfrage für den neuen Primärschlüsselwerte automatisch nach dem Einfügen des neuen Datensatzes, andere (BDE-Komponenten) nicht. Wenn nicht auf IBX umgestiegen werden soll, sieht für die BDE der übliche Weg so aus: <br>
    1. Generator für den Primärschlüsselwert deklarieren <br>
    2. Client holt sich einen neuen Generatorwert ab, zum Beispiel über eine Stored Procedure <br>
    3. Client verwendet den im Schritt 2 abgeholten Wert beim INSERT <br>
    4. Der Trigger reagiert nur dann, wenn der Client keinen Wert übergibt<br>
    Das könnte zum Beispiel so aussehen:

    Stored Procedure
    <pre>
    CREATE PROCEDURE GET_PROJNR
    RETURNS (ProjNr INTEGER) AS
    BEGIN
    ProjNr = GEN_ID(Gen_ProNr,1);
    END
    </pre>
    Trigger:
    <pre>
    CREATE TRIGGER Set_ProNr FOR ProMain BEFORE INSERT AS
    BEGIN
    IF (NEW.ProNr IS NULL) THEN NEW.ProNr = GEN_ID(Gen_ProNr,1);
    END
    </pre>
    Aufruf im Client:
    <pre>
    { Es wird ein neuer Projekt-Datensatz in der Haupttabelle
    ProMain angelegt. Dazu ermittelt das Programm über eine
    Stored Procedure den nächsten Generator-Wert aus der
    InterBase-Datenbank. Außerdem werden alle Pflichtfelder
    vorbelegt. }

    procedure TDM.TableProMainNewRecord(DataSet: TDataSet);
    begin
    with SP_ProNr do
    begin
    ExecProc;
    TableProMainPRONR.Value := Params[0].Value;
    TableProMainDVERSION.Value := 4;
    TableProMainPRODATUM.Value := Now;
    TableProMainABSCHLUSS.Value := 'N';
    end;
    end;
    </pre&gt

    Comment

    Working...
    X