Eventuell ginge aber auch sowas:
Delphi-Quellcode:
procedure TMxSQL.Get_act_MachineData(Machine_ID: string; LStream: TStream; RefreshData, SendData: boolean);
...
begin
...
OperationsList := DB_Modul.Read_Einstellungswert('Life_Data_OperationList');
MsQuery.SQL.Add('große Abfrage von oben'); // Neue Abfragen erstellen.
CDMQuery.SQL.Add('kleine Abfrage von oben');
MsQuery.Open; // Erste Abfrage öffnen
CDMQuery.ParamByName('Device').AsString := MsQuery.FieldByName('device_id').AsString; // und in zweiter Abfrage den Parameter setzen.
CDMQuery.Open; // Die zweite Abfrage öffnen,
MsQuery.Edit; // die erste Abfrage editieren und den Wert aus der zweiten Abfrage übernehmen.
MsQuery.FieldByName('Operator').AsString := CDMQuery.FieldByName('userID').AsString;
MsQuery.SaveToStream(LStream, sfJSON); // unmittelbar nach der Änderung in den Stream schreiben,
MsQuery.Cancel; // die letzte Änderung verwerfen
MsQuery.Close; // und die Abfragen schließen.
CDMQuery.Close;
...
end;
Der Stream enthält immer die aktuellen Daten, so dass bei einer Anforderung durch einen Client nicht jedesmal auf die
Query zugegriffen werden muss. Der Inhalt des Streams bleibt ja erhalten und kann beliebig oft an die Clients ausgeliefert werden.
Eigentlich wird nur die Stelle, an der die
Query in den Stream geschrieben wird, in deiner ursprünglichen Prozedur an eine andere Stelle verschoben. Der Teil ab
if SendData then begin
kann (vermutlich) entfallen.
Hoffentlich liege ich damit nicht allzuweit daneben