Announcement

Collapse
No announcement yet.

Resync und Datensatzaktualisierung

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

  • Resync und Datensatzaktualisierung

    Hallo alle zusammen!

    Problem : Datensatz im Grid nach der Änderung wird nicht aktuallisiert.
    Umgebung : D5,Oracle 8.. , ADODataset.
    Datensätze werden im Grid angezeigt und über Editmaske kann aktueller Datensatz editiert werden (dabei wird andere Dataset verwendet). Nach der Änderung sollte Ansicht aktualisiert werden. Dafür rufe ich Resync-Methode von Dataset auf. Es läuft ohne Fehlermeldung durch aber danach bleiben die "alte Werte" stehen.
    Das Ganze als Testumgebung siehet so aus :

    procedure TForm1.Button1Click(Sender: TObject);
    begin

    // Hier wird Datensatz editiert
    adsEdit.Close;
    adsEdit.Parameters.ParamByName('FSD_ID').Value := dsSend.FieldByName ('FSD_ID').AsInteger;
    adsEdit.Open;
    adsEdit.Edit;
    // ändern ...
    end;

    // hier schreibe ich die Änderungen zurück und ...
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    if adsEdit.Active then
    begin
    adsEdit.Post;
    adsEdit.Close;
    adsSend.DisableControls; // Dataset für Anzeigen
    adsSend.Recordset.Resync(adAffectCurrent, adResyncAllValues);
    adsSend.EnableControls;
    end;
    end;

    Fehlt's noch etwas oder ... ?

    Vitali

  • #2
    Hallo,

    >Fehlt da noch etwas ...

    die Antwort auf diese Frage hängt davon ab, was die Datenbank (Trigger etc.) macht. Die Kombination von <b>'Resync Command'</b> und <b>Resync</b> sollte das Problem jedoch lösen, wie das folgende Beispiel zeigt:
    <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;
    ADODataSet1.Resync([rmExact]);
    Abort;
    end;
    end;
    </pre>
    Was passiert, wenn DisableControls/EnableControls auskommentiert und statt dessen <b>ADODataSet1.Resync([rmExact])</b> aufgerufen wird

    Comment


    • #3
      Hallo, Herr Kosch.

      Vielen Dank für Ihre Antwort. Ich bin gestern auch auf dise Lösung gekommen. Mir fehlte nur !!??? zweite RESYNC vom ADODataset
      ADODataSet1.Resync([rmExact]);
      In allen gefundenen Beispielen zum Thema RESYNC stand der Aufruf der Resync-Methode von Recordset. Leider gabs kein Hinweis darauf, daß man danach noch ein Resync von TADODataset aufrufen muß.

      Ich möchte noch was fragen. Ich war im Februar bei Ihrem Seminar ( ADO, mehrschichtige Architektur). Sie haben gesagt, daß Inhalt von CD mit aktualisierten Beispielen im Internet zur Verfügung steht. Ich habe versucht zu finden, aber leider ohne Erfolg.
      Könnten Sie mir dabei helfen ?

      MfG Vital

      Comment


      • #4
        Hallo,

        die geänderten ADO-Unterlagen sind seit dem 20.02. unter der URL zu downloaden (3,2 MByte ZIP), die ich auf der ersten Seite meiner Powerpoints gezeigt habe. Da es sich um einen Linux-Server handelt, spielt die exakte Schreibweise (alles Kleinbuchstaben!) eine entscheidende Rolle (d.h. nur die Teilnehmern kennen die URL und müssen diese direkt eintippen, es gibt keinen Link).

        Falls es immer noch Problem gibt, schicken Sie am besten eine eMail zum Veranstalter oder zu mir

        Comment


        • #5
          Hallo Herr Kosch.
          Jetzt hats geklappt. Ich danke Ihnen sehr.

          MfG
          Vital

          Comment


          • #6
            Hallo Andreas,

            suche schon seit langer Zeit eine gut funktionierte Funktion um den aktuellen Datensatz neu von der DB anzufordern. Diese Funktion muss
            sehr schnell Ihren Job durchführen. Arbeite hier mit clUseClient.

            Den Aufruf Resync(adAffectCurrent, adResyncAllValues) verwende ich zwar auch, aber leider nicht ohne sichtbaren erfolg wenn die Daten von einem andren Arbeitsplatz geändert wurden.

            Gibt es da vielleicht schon eine neue Möglichkeit ?

            Gruß
            Mathia

            Comment


            • #7
              Hallo,

              spätestens die Kombination von 'Resync Command' und Resync sollte die aktuellen Daten liefern, vorausgesetzt, die von anderen Benutzern geänderten Daten sind in der eigenen aktuellen Transaktion überhaupt sichtbar

              Comment


              • #8
                Hallo,

                Danke für die Nachricht. Es sollte nur der aktuelle Datensatz neu angefordert werden. In der Praxis könnte das eine Kundenliste auf dem Bildschirm sein. Befvor der Datensatz für das ediditieren vorbereitet wird möchte ich gerne noch mal den aktuellen Stand des Datensatzes von der DB anfordern. Ein Resync fordert ja alle Daten an die im DataSet definiert sind, die Netzwerk und Prozessorlast sollte zu klein wie möglich sein. Das wäre schon sehr schön wenn es da eine Möglichkeit gebe. Mircosoft macht es ja selber auch, z.B. in Access kann man das sehr gut erkennen. Wenn ein User im Netzwerk ein Datensatz entfernt ist diese Aktion sofort auf einer anderen Station sichtbar. Und ADO bzw. ADOX wird ja von Micosoft selber auch verwendet.

                Zur Zeit sieht meine Refresh Funktion so aus:

                <pre>
                procedure adoResyncCurrent(Const DataSet : TAdoDataSet);
                begin
                if DataSet.RecordCount = 0 then Exit;

                DataSet.UpdateCursorPos;

                if DataSet.Recordset.Supports(adResync) then
                begin
                DataSet.Recordset.Resync(adAffectCurrent,adResyncA llValues);
                end
                else TDataSet(DataSet).Resync([rmExact]);
                end;
                </pre>

                Aber leider funktioniert diese nur bei serverseitigen Zeigern

                Comment


                • #9
                  Hi,
                  <br>
                  <br>schau mal hier rein vieleicht hilft das (da ist auch noch ein Merker auf eine andere gute Diskussion zu diesem Thema):
                  <br>http://www.entwickler-forum.de\webx?14@@.ee7e01c
                  <br>
                  <br>Damit nur ein Datensatz geladen wird wird hier das Refresh SQL Statement via where eingeschränkt.
                  <br>
                  <br>"Wenn ein User im Netzwerk ein Datensatz entfernt ist diese Aktion sofort auf einer anderen Station sichtbar. "
                  <br>Ein simples Verfahren dazu würde mich auch interessieren.
                  <br>
                  <br>mfg
                  <br>P

                  Comment


                  • #10
                    Hallo Patrick,

                    ja okay habe es verstanden, mit der Veränderung von Resync Command den Datenstom eingrenzen.

                    Für die Löschgeschichte habe ich leider auch noch nichts, meine Vorstellung wäre ein Ereignis im entsprechenden DataSet. Prüfintervall muss variable sein und darf nur im Browse Mode funktionieren. Maximale Rechenzeit darf 1 sek. nicht überschreiten.

                    Meiner Meinung nach solle das eine Sache des DB Servers sein, gespeicherte Prozedur oder so. IsRecordDeleted(ID, Table). Diese Funktion sollte aber sehr schnell sein.

                    Naja mal sehen, vieleicht wird es ja noch irgendwann was geben.

                    Achso zwecks Resync und so. Wollte da ne generelle Sache schreiben. Weist Du zufällig wie man an alle Felder des primären Schlüssel kommt ?

                    Gruß
                    Mathia

                    Comment

                    Working...
                    X