Announcement

Collapse
No announcement yet.

TADODataSet.RecordSet - Resync Methode

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

  • TADODataSet.RecordSet - Resync Methode

    Hallo,

    um immmer auf den aktuellen Datenstand zurück zugreifen, setzte ich sehr oft die Resync - Methode vom Object TAdoDataSet.Recordset ein. Da nicht jeder Provider den Methodenaufruf unterstützt, sieht der Code zur Zeit folgendermaßen aus:

    <pre>

    //************************************************** ***********************
    procedure adoResyncCurrent(Const DataSet : TAdoDataSet);
    begin
    // Resync nur bei clUseClient möglich
    if DataSet.CursorLocation <> clUseClient then Exit;

    with DataSet.Recordset do
    begin

    if RecordCount = 0 then Exit; // Patch: bei leerer Datei nicht möglich
    Resync(adAffectCurrent,adResyncAllValues);
    end;
    end;
    </pre>

    Die Abprüfung auf die clUseClient reicht glaube nicht aus um ganz sicher zu gehen. Ich habe irgendwo schon einmal gelesen das man zur Laufzeit den Provider fragen kann, welche Methoden unterstützt werden. Kann mir jemand sagen wie das geht ?

    Gruß Mathias

  • #2
    Hallo Mathias,
    in der ADODB.Pas findet sich zu Deinem Problem folgender Ansatz:

    procedure TCustomADODataSet.InternalRefresh;
    begin
    if Recordset.Supports(adResync) then
    Recordset.Resync(adAffectAll, adResyncAllValues)
    else
    InternalRequery;
    end;

    Jen

    Comment


    • #3
      Hallo Jens,

      danke für die Info. Ich habe hier eine komische Geschichte. Bevor der User in den ausgewählten Datensatz eintritt, führe ich ein Resync durch, somit soll immer der aktuelle Datensatz als Grundlage für weitere Änderungen zur Verfügung stehen. Aber bei dem Resync werden die Feldwerte nicht mit synchronisiert. Muss ich nach dem Resync noch irgendwelche Aktionen durchführen ? Vielleicht über das TFieldDef - Object alle Felder durchgehen und aktualisieren.

      Mathia

      Comment


      • #4
        Hallo,

        zur Frage 1:<br>
        <pre>
        if ADODataSet1.Supports([coResync])then ...
        </pre>

        zur Frage 2: <br>
        <pre>
        procedure TForm1.ButtonResyncClick(Sender: TObject);
        begin
        ADODataSet1.Recordset.Resync(adAffectCurrent, adResyncAllValues);
        end;
        </pre>
        Immer dann, wenn ADO Probleme mit dem Auffinden von Datensätzen in einer JOIN-Abfrage hat, kann außer Unique Table auch noch die Eigenschaft <b>Resync Command</b> verwendet werden:
        <pre>
        uses ADOInt;

        resourcestring
        cRC = 'select m.id, d.id, m.name, d.email from tbl_master m ' +
        'join tbl_detail d on m.ID = d.MasterID ' +
        'where d.ID = ';

        procedure TForm1.ADODataSet1AfterOpen(DataSet: TDataSet);
        begin
        ADODataSet1.Recordset.Properties['Unique Table'].Value := 'TBL_DETAIL';
        end;

        procedure TForm1.DBNavigator1BeforeAction(Sender: TObject;
        Button: TNavigateBtn);
        var
        sRC : String;
        begin
        if Button = nbRefresh then
        if CheckBoxRC.Checked then
        begin
        sRC := cRC + ADODataSet1ID_1.AsString;;
        with ADODataSet1.Recordset do
        begin
        Properties['Resync Command'].Value := sRC;
        Resync(adAffectCurrent, adResyncAllValues);
        end;
        MemoSQL.Lines.Clear;
        MemoSQL.Lines.Add(sRC);
        Abort;
        end;
        end;
        </pre&gt

        Comment

        Working...
        X