Announcement

Collapse
No announcement yet.

Cached Updates / IBClientDataset

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

  • Cached Updates / IBClientDataset

    Gibt es eine Möglichkeit in der OnUpdateRecord Routine die Feldwerte mit Field.NewValue zu setzen (IBDataset bzw. IBClientDataSet).

  • #2
    Hallo,

    so richtig verstehe ich den Sinn dieser Frage nicht. Wenn man bei der Implementierung von Cached Updaten über die <b>OnUpdateRecord</b>-Ereignisbehandlungsmethode als Alternative zu einer TUpdateSQL-Komponente geht, hat man ja dort die volle Kontrolle darüber, welche Daten in die Datenbank geschrieben werden. Das folgende Beispiel stammt aus meinem neuen Buch <i>InterBase Datenbankentwicklung mit Delphi</i>. Dort werden drei separate Stored Procedure anstelle von INSERT, UPDATE oder DELETE aufgerufen:
    <pre>
    { Cached Update über OnUpdateRecord-Ereignisbehandlungsmethode als
    Alternative zu einer TUpdateSQL-Komponente }

    procedure TDataModule2.IBDataSet2UpdateRecord(DataSet: TDataSet;
    UpdateKind: TUpdateKind; var UpdateAction: TIBUpdateAction);
    begin
    if UpdateKind = ukDelete then
    begin
    IBStoredProcDELETE.Params[0].Value := IBDataSet2ID.OldValue;
    IBStoredProcDELETE.ExecProc;
    end;
    if UpdateKind = ukInsert then
    begin
    IBStoredProcINSERT.Params[1].Value := IBDataSet2LAND.Value;
    IBStoredProcINSERT.Params[2].Value := IBDataSet2HAUPTSTADT.Value;
    IBStoredProcINSERT.ExecProc;
    if GetGeneratorID then
    begin
    FID := IBStoredProcINSERT.Params[0].Value;
    ShowMessage('Neue ID:' + IntToStr(FID));
    // Vom Generator vergebenen Primärschlüsselwert einsetzen
    IBDataSet2ID.NewValue := FID;
    end;
    end;
    if UpdateKind = ukModify then
    begin
    IBStoredProcUPDATE.Params[1].Value := IBDataSet2LAND.NewValue;
    IBStoredProcUPDATE.Params[2].Value := IBDataSet2HAUPTSTADT.NewValue;
    IBStoredProcUPDATE.ExecProc;
    end;
    UpdateAction := uaApplied;
    end;
    </pre&gt

    Comment


    • #3
      Ja, das ist genau das was ich brauche. Ich werde das nochmal überprüfen, da ich genau diesen Weg gegangen bin. Es wird ja wohl keinen Unterschied machen, ob ich mit einem persistenten Feld arbeite oder über FieldByName. Kann es sein, daß mir der neue Feldwert z.B in einem Grid nicht angezeigt wird

      Comment


      • #4
        Hallo,

        wenn der Wert direkt in OnUpdateRecord geändert und in die Datenbank geschrieben wird, zeigt die Benutzeroberflächt (TDBGrid) den neuen Wert erst dann an, wenn IBX danach seinen internen Datensatzpuffer mit Hilfe von <b>RefreshSQL</b> aktualisiert (d.h. den Datensatz neu aus der Datenbank einliest, da eventuell auch Trigger Werte geändert haben könnten)

        Comment


        • #5
          Hallo,

          wenn ich jetzt so wie im oben genannten Fall mittels Stored Procedures den Primärschlüssel setze, diesen dann auch mit Field.NewValue zuweise, wie lautet dann das Statement für die Eigenschaft von RefreshSQL? Muß ich mir den neuen Wert merken und das Statement jedesmal anpassen, oder gibt es einen eleganteren Weg

          Comment


          • #6
            Hallo

            das Zuweisen des neuen, innerhalb der Stored Procedure vergebenen Generatorwertes habe ich in meinem Beispiel vom 7.8. bereits gezeigt. Die Stored Procedure verwendet als Rückgabewert den Generator-Wert, so dass der Client direkt darauf zugreifen kann:
            <pre>
            CREATE PROCEDURE INS_CUTEST2 (LAND VARCHAR(25), HAUPTSTADT VARCHAR(25))
            RETURNS (ID INTEGER)
            AS
            BEGIN
            ID = GEN_ID(Gen_CUTEST2, 1);
            insert into CUTEST2
            (ID, LAND, HAUPTSTADT)
            values
            (:ID, :LAND, :HAUPTSTADT);
            END
            </pre>
            Die TIBDataSet-Eigenschaft <b>RefreshSQL</b> ist in meinem Beispielprojekt statisch und muss nicht geändert werden. Das vollständige Projekt ist auf der CDROM zu meinem Buch im Verzeichnis <i>Kapitel 7\TIBDataSet\CachedUpdate1</i> zu finden

            Comment

            Working...
            X