Nested DataSet mit poFetchDetailsOnDemand aktualisieren

9

Gibt es eine Möglichkeit, nur das Detail DataSet zu aktualisieren, ohne den gesamten Hauptdatensatz neu zu laden?

das habe ich bisher versucht:

%Vor%

Ich habe es auch versucht:

%Vor%

Aber die obige Methode aktualisiert das gesamte Master-Dataset, nicht nur den aktuellen Datensatz.

Nun scheint der folgende Code etwas zu tun:

%Vor%

Gibt es einen Workaround oder einen richtigen Weg, um das zu tun, was ich will? (Vielleicht ein Interposer ...)

Zusätzliche Informationen:

ClientDataSet1 = Master-Datensatz

ClientDataSet2 = Detail DataSet, ist das Folgende: *

%Vor%

Anbietereigenschaften:

%Vor%     
EProgrammerNotFound 14.10.2013, 19:47
quelle

1 Antwort

2

Googeln findet zahlreiche Artikel, die sagen, dass es mit geschachtelten ClientDataSets überhaupt nicht möglich ist, die Master-CDS zu schließen und wieder zu öffnen, was das OP in diesem Fall nicht tun möchte. Jedoch ...

Die kurze Antwort auf das q ist ja, in dem relativ einfachen Fall, den ich getestet habe, und es ist ziemlich einfach, wenn es ein bisschen langatmig ist; Die notwendigen Schritte richtig zu machen dauerte eine Weile, um herauszufinden.

Der Code ist unten und enthält Kommentare, die erklären, wie es funktioniert und ein paar mögliche Probleme und wie es umgeht oder umgeht. Ich habe es nur mit TAdoQueries getestet, die den Provider der CDS füttern.

Als ich anfing, all das zu untersuchen, wurde es schnell klar, dass mit dem üblichen Meister + Detail-Einrichtung, obwohl Anbieter + CDS die Stammdaten vom Server aktualisieren, werden sie die Detail Datensätze einfach nicht aktualisieren, nachdem sie zum ersten Mal vom Server gelesen wurden der cdsMaster wurde geöffnet. Dies kann natürlich von Entwurf sein.

Ich glaube nicht, dass ich einen DFM veröffentlichen muss, um mit dem Code zu arbeiten. Ich habe einfach AdoQueries in der üblichen Master-Detail-Art eingerichtet (mit der Detailabfrage, die die PK des Masters als Parameter hat), einen DataSetProvider auf die Master-AdoQuery, eine Master-CDS auf den Provider und ein Detail-cDS auf die DataSetField des cdsMaster. Um zu experimentieren und zu sehen, was passiert, gibt es für jeden dieser Datasets DBGrids und DBNavigators.

Kurz gesagt, die Funktionsweise des folgenden Codes besteht darin, den AdoQuery-Master und den CDS-Masterdown vorübergehend auf die aktuelle Zeile zu filtern und dann eine Aktualisierung ihrer Daten und der dtail-Daten für die aktuelle Masterzeile zu erzwingen. Anders als bei allen anderen, die ich ausprobiert habe, werden die Detailzeilen, die im cdsMaster-Feld DataSet verschachtelt sind, aktualisiert.

Übrigens, die anderen Sackgassen, die ich probiert habe, enthalten mit und ohne poFetchDetailsOnDemand, das auf "true" gesetzt ist, dito cdsMaster.FetchDetailsOnDemand. Offensichtlich bedeutet "FetchDetailsOnDemand" nicht ReFetchDetailsOnDemand!

Ich bin auf ein oder zwei Probleme gestoßen, bei denen meine "Lösung" funktioniert hat, die klebrigste, die in dieser SO-Frage beschrieben wird: Aktualisieren eines in einem DataSetField geschachtelten ClientDataSets

Ich habe überprüft, dass dies mit einem Sql Server 2000 (!) - Back-End korrekt funktioniert, einschließlich der Erfassung von Zeilendatenänderungen, die auf dem Server von ISqlW abgefeuert wurden. Ich habe auch überprüft, mit Sql Server Profiler, dass der Netzwerkverkehr in einer Aktualisierung bezieht sich nur auf die einzelnen Master-Zeile und ihre Details.

Delphi 7 + Win7 64-bit, btw.

%Vor%     
MartynA 13.07.2014 16:33
quelle