Wozu sind die beiden da?
Delphi-Quellcode:
CDMQuery.First;
MsQuery.First;
Vorher stehst Du in beiden Querys auf dem benötigten Datensatz.
Dann änderst Du (vermutlich) in beiden Querys den Datensatzzeiger per First, um dann auf jedenfall den ersten Datensatz in MsQuery per Edit zu ändern.
Das erscheint mir nicht zwingend sinnvoll. Bei zwei Querys mit jeweils nur einem Datensatz mag das unschädlich sein, ist dann aber, da nur ein Datensatz vorhanden ist, unsinnig, da der eine Datensatz ja auch zwingend sowohl der erste, als auch der letzte Datensatz ist. In allen anderen Fällen läuft das auf eine Art Zufallsgenerator hinaus. Abgesehen davon steht der Datensatzzeiger nach 'nem Open sowieso auf dem ersten Datensatz. Ein Konstrukt in der Form
Delphi-Quellcode:
CDMQuery.Open;
CDMQuery.First;
bringt schlicht und einfach keinen Vorteil, sondern ist im Zweifel nur sinnfrei.
Per Edit einen Datensatz zu ändern und vor dem Speichern der Änderung den Datensatz per Locate zu ändern, erscheint mir nicht sinnvoll. Je nach Einstellung dürfte das Locate ein Post implizieren oder ein Cancel. Beim Post steht dann die Änderung in einem anderen Datensatz, als in dem per Locate gesuchten und ggfls. angezeigten. Bei einem impliziten Cancel wird keine Änderung durchgeführt. Damit könnte man sich den Änderung auch sparen, da sie beim Locate sowieso verworfen wird.
Lade Dir die benötigten Daten per
SQL. Übertrage das Ergebnis in eine MemTable (s. o.) und arbeite dann ausschließlich mit dieser weiter.
Bei deiner bisherigen Anforderungsbeschreibung erscheint mir alles andere als "Gefrickel", sprich: Nicht zielführend und nicht sicher und zuverlässig implementierbar.
Delphi-Quellcode:
'CASE WHEN ( '+
'concat(rj.JOB_ID, ' + QuotedStr(' ') + ', JOB_NAME) is NULL) then '+
Was ich ncht verstehe:
concat(rj.JOB_ID, ' + QuotedStr(' ') + ', JOB_NAME)
Kann ein
concat(Null, ' ', Null)
Null sein oder ist es immer zwingend ein
' '
und damit nicht Null?
Ein paar Stunden später:
Was mir noch auffiel:
Per TOP 1 wird ein Datensatz gesucht, die Ergbenismenge enthält also 0 oder 1 Datensatz. Danach wird per First auf den ersten von einem Datensatz gewechselt und dieser eine Datensatz wird dann erfolgreich(?) in diesem einen Datensatz per Locate gesucht.
Das Ergebnis von Locate wird jedoch nicht überprüft, bei false hieße es z. B., dass der eine Datensatz in der Menge von einem Datensatz nicht gefunden wird, aber der dann zufällig beim Datansatzzeiger stehende Datensatz, also der erste und einzige Datensatz, wird zur weiteren Verarbeitung genutzt.
Wenn nun diese Konstrukt so funktioniert und vorhandene Probleme behebt, ist das absoluter Zufall.
Bitte überprüfe dein Vorgehen noch einmal, ggfls. liefere uns eine (möglichst) konkrete Beschreibung der Aufgabenstellung, damit wir zielgerichtete Hilfestellung geben können.