Announcement

Collapse
No announcement yet.

Refresh/Resync auf berechnetes Feld

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

  • Refresh/Resync auf berechnetes Feld

    Hallo,
    <br>
    <br>D5,ADO,SQL7
    <br>DataSet.CommandText := 'Select Preis, Preis * 1,16 as GPreis From T';
    Ergebnis wird z.B. in einem Grid angezeigt.
    Ändere ich nun in einer Zeile den Wert des Feldes Preis und speichere, so wird GPreis nicht aktualisiert (erst nachdem DataSet geschlossen und geöffnet wurde). Unter IBX kann man ein Refresh Select Statement angeben. <br>Muß man sowas in Ado auch machen?
    <br>Wäre der Weg über DataSet.Properties['Resync Command'].Value := 'Select Preis, Preis * 1,16 as GPreis From T'; der richtige (beste) oder gibt es da noch andere (bessere) Möglichkeiten? Ist dieser Weg das Gegenstück zu IBX Refresh Selectstring?
    <br>
    <br>Nachtrag:
    <br>Ich mußte gerade festellen, daß das mit DataSet.Properties['Resync Command'].Value := 'Select Preis, Preis * 1,16 as GPreis From T'; auch nicht funktioniert (oder ich habe da etwas falsch gemacht).
    <br>
    <br>Ich hoffe jemand da draußen weiß Rat.
    <br>
    <br>Danke!
    <br>
    <br>mfg
    <br>PS

  • #2
    ist es auf clserver gestellt

    Comment


    • #3
      Nein, auf clUseClient.
      <br>
      <br>mfg
      <br>P

      Comment


      • #4
        in meinem Wunderbuch steht folgendes

        Sie können die Resync methode nur für client-seitige Recordset-Objekte ausführen, die nicht schreibgeschützt sind.

        hmmm.. irgendwie hast du das e gemacht, vielleicht finde ich noch was ,...

        BIN

        Comment


        • #5
          Hallo,

          was taucht im Protokollfenster vom <b>Profiler</b> auf? Welche SQL-Anweisung geht zum Server

          Comment


          • #6
            <br>@A.Kosch
            <br>
            <br>Folgendes wird in Delphi ausgeführt
            <br>procedure TfrmKorrespondenz.dlcbKorPos_MWSTCloseUp(Sender: TObject);
            <br>begin
            <br> ShowMessage('Test');
            <br> //btnSpeichernClick(Self);
            <br> qrytbl_Kor_Positionen.Resync([]);
            <br>// qrytbl_Kor_Positionen.Refresh;
            <br>end;
            <br>
            <br>und dann passiert im Profiler folgendes:
            <br>nichts
            <br>
            <br>wie ruft man denn diese Methode auf?
            <br>
            <br>mfg
            <br>p

            Comment


            • #7
              <br>Vieleicht sollte ich die Frage anders formulieren:
              <br>
              <br>AdoDataSet mit clUseClient
              <br>und CommandText = 'Select Preis, Preis * 1,16 as GPreis From T'
              <br>
              <br>AdoDataSet wird in einem Grid dargestellt.
              <br>ändere ich nun in einer Zeile den Preis und speichere, so soll GPreis aktualisiert werden. Aber wie?
              <br>
              <br>ADODataSet1.Resync([]); scheint nur die echten Felder aus dem ClientPuffer zu lesen (also nicht die berechneten)
              <br>
              <br>ADODataSet1.Refresh; scheint die Daten zu speichern und erneut einzuladen (glaube ich), aber berechnete Felder wie GPreis werden nicht aktualisiert.
              <br>
              <br>ADODataSet1.Requery; klar funktioniert, jedoch werden eben alle Datensätze neu geladen, auch dann wenn nur ein GPreis aktualisiert werden soll. Des Weiteren wird der Datensatzzeiger wieder auf den ersten Datensatz gestellt. Kann man in einem solchen Fall eigentlich mit Bookmarks arbeiten?
              <br>Bsp.:
              <br>x := GetBookmark
              <br>Requery
              <br>GoroBookmark(x)
              <br>x.free
              <br>
              <br>Das wäre ja schon mal eine Lösung für mein Problem.
              <br>Aber gibt es vieleicht noch andere (bessere) Möglichkeiten so was zu machen?
              <br>
              <br>mfg
              <br>P

              Comment


              • #8
                Hallo,

                in diesem Fall würde ich den direkten Zugriff auf das RecordSet-Objekt probieren und <b>Resync(adAffectCurrent, adResyncAllValues)</b> direkt aufrufen. Ich habe das aber noch nie mit berechneten Feldern ausprobiert;-)
                <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


                • #9
                  Hallo Herr Kosch
                  <br>
                  <br>so funktioniert es:
                  <br>
                  <br>procedure TForm1.Button1Click(Sender: TObject);
                  <br>resourcestring
                  <br> cRC = 'select tbl_test.*, tbl_test.Preis * 1.16 as GPreis from tbl_test Where tbl_Test.ID = ';
                  <br>var
                  <br> sRC : String;
                  <br> Old_Resync_Command, Old_Unique_Table : String;
                  <br>begin
                  <br> If ADODataSet1.Modified Then
                  <br> ADODataSet1.Post; //Muß
                  <br> sRC := cRC + ADODataSet1ID.AsString;
                  <br> with ADODataSet1.Recordset do
                  <br> begin
                  <br> Old_Unique_Table := Properties['Unique Table'].Value;
                  <br> Old_Resync_Command := Properties['Resync Command'].Value;
                  <br> Properties['Unique Table'].Value := 'TBL_TEST'; //muß sein auch wenn man keinen Join verwendet
                  <br> Properties['Resync Command'].Value := sRC;
                  <br> Resync(adAffectCurrent, adResyncAllValues);
                  <br> Properties['Resync Command'].Value := Old_Resync_Command; //muß sonst bekommt man beim Scrollen nur noch einen Datenzatzangezeigt
                  <br> Properties['Unique Table'].Value := Old_Unique_Table; //muß anscheinend nicht umbedingt sein aber ...
                  <br> end;
                  <br> ADODataSet1.Refresh; //Muß damit die berechneten Felder aktualisiert werden
                  <br>end;
                  <br>
                  <br>Danke für die Hilfe!
                  <br>
                  <br>Aber ich habe natürlich ein neues Problem (Refresh auf ...Left Join... (wirklich heißes Thema))
                  <br>Dafür habe ich eine neue Diskusion eröffnet ich hoffe sie schauen mal rein.
                  <br>
                  <br>Danke!
                  <br>
                  <br>mfg
                  <br>P

                  Comment


                  • #10
                    <br>Hallo A.Kosch,
                    <br>
                    <br>so geht es:
                    <br>
                    <br>procedure TForm1.Button1Click(Sender: TObject);
                    <br>resourcestring
                    <br> cRC = 'select tbl_test.*, tbl_test.Preis * 1.16 as GPreis from tbl_test Where tbl_Test.ID = ';
                    <br>var
                    <br> sRC : String;
                    <br> Old_Resync_Command, Old_Unique_Table : String;
                    <br>begin
                    <br> sRC := cRC + ADODataSet1ID.AsString;
                    <br> with ADODataSet1 do
                    <br> begin
                    <br> CheckBrowseMode; //if modified then post
                    <br> UpdateCursorPos;
                    <br> Old_Unique_Table := Properties['Unique Table'].Value;
                    <br> Old_Resync_Command := Properties['Resync Command'].Value;
                    <br> Properties['Unique Table'].Value := 'tbl_test'; //muß sein auch wenn man keinen Join verwendet
                    <br> //Muß damit die berechneten Felder aktualisiert werden
                    <br> Properties['Resync Command'].Value := sRC;
                    <br> Recordset.Resync(adAffectCurrent, adResyncAllValues);
                    <br> Resync([]);
                    <br> Properties['Resync Command'].Value := Old_Resync_Command; //muß sonst bekommt man beim Scrollen nur noch einen Datenzatzangezeigt
                    <br> Properties['Unique Table'].Value := Old_Unique_Table; //muß anscheinend nicht umbedingt sein aber ...
                    <br> end;
                    <br>end;
                    <br>
                    <br>guter Link zu diesem Thema (hier im Forum):
                    <br><a href="/webx?14@@.ee70b63">Hermann Schmidt "Refresh auf MS-SQL7 Views mit ADO" 02.04.2001 21:13</a>
                    <br>
                    <br>
                    <br>Danke!
                    <br>
                    <br>mfg
                    <br>P

                    Comment

                    Working...
                    X