Putroppo non sono riuscito a trovare esempi su come utilizzare ZQuery per eseguire con certezza l'aggiornamento di record relativi.
In questa fase di studio ho provato ad eseguire sial il commit dhe il Rollback del comando di aggiornamento.
Riporto qui le istruzioni salienti:
Impostazione oggetto ZConnection.AutoCommit = False
writeln('sqlQry= |' + sqlQry + '|');
{ sqlQry= |SELECT CoVocMovvgg FROM movimgg WHERE CoVocMovvgg = 101306007 AND DtCoMovgg >= 20190824 AND DtCoMovgg <= 20200824 ORDER BY DtCoMovgg, IdMovvgg| }
Form1.ZQuery1.SQL.Text := sqlQry;
Form1.ZQuery1.Open;
totRecQRY:= Form1.ZQuery1.RecordCount;
writeln('totRecQry= |' + IntToStr(totRecQry) + '|'); // totRecQry= |1|
case totRecQry of
0:
begin
showMessage( 'nessun record presente');
Exit;
end;
end;
Form1.ZQuery1.SQL.Clear;
writeln('sqlUpd= |' + sqlUpd + '|');
{ sqlUpd= |UPDATE movimgg SET CoVocMovvgg = 101306004 WHERE CoVocMovvgg = 101306007 AND DtCoMovgg >= 20190824 AND DtCoMovgg <= 20200824| }
Form1.ZQuery1.SQL.Text := sqlUpd;
Form1.ZQuery1.ApplyUpdates;
Form1.ZQuery1.Close;
Form1.ZConnection1.Commit;
Il contenuto delle variabili sqlQry e sqlUpd è corretto, infatti le esecuzioni della SELECT e della UPDATE dentro DB Browser funzionano perfettamente.
Tutte le istruzioni riportate sopra vengono eseguite l'una dopo l'altra, senza alcun errore d'eccezione.
I parametri selettivi interni alla SELECT ed alla UPDATE sono uguali.
Ho quasi risolto.
Per mia necessità, sono costretto ad usare le variabili. Oggi ho fatto un bel passo avanti, riuscendo a completare l'UPDATE di due tabelle del DB. Riporto parte del codice scritto:
Implementation
---
type
TtbQryID = array of array[0..1] of String;
TtbTrasf = array[0..3] of String;
...
var
...
tbTrasf: TtbTrasf;
tbQryID: TtbQryID;
...
function DbUpdate(indCol: Integer; sql: String): Integer; // indCol:= Indice di colonna di tbQryID, per prelevare i cod.ID dei record da aggiornare dul DB
var
i, lun: Integer;
begin
lun:= Length(tbQryID) - 1;
for i:= 0 to lun do
begin
try
sql:= sql + tbQryID[i, indCol];
Form1.ZQuery1.SQL.Text:= sql;
Form1.ZQuery1.ExecSql;
Form1.ZQuery1.ApplyUpdates;
except on E: exception do
begin
ShowMessage('ERRORE: |' + E.message + '|' );
Application.Terminate;
end;
end;
end;
Result:= i + 1;
end;
...
procedure TForm1.BAvantiClick(Sender: TObject);
var
numUpd1, numUpd2: Integer;
...
begin
...
sqlUpd:= 'UPDATE movimgg SET CoVocMovvgg = ' + tbTrasf[1] + ' WHERE IdMovvgg = ';
numUpd1:=DbUpdate(0, sqlUpd); // 0:= indice di col. in tbQryID per aggiornare "movimgg"
sqlUpd:= 'UPDATE partmovv SET CoVoPartGlob = ' + tbTrasf[3] + ' WHERE IdPartGlob = ';
numUpd2:=DbUpdate(1, sqlUpd); // 1:= indice di col. in tbQryID per aggiornare "partmovv" o "prestmom"
ShowMessage('*** TRASFERIMENTO terminato con SUCCESSO *** ' +
System.lineending + 'Reord trasferiti: in "movimgg": n.' + IntToStr(numUpd1) + ' - in "partmovv": n. ' + IntToStr(numUpd2));
...
end;
Non ho capito come utilizzare l'intervallo try ... Except, perchè non sono sicuro di avere fatto bene o se, invece, debba scriverne uno per ciscuna riga di tipo ZQuery.