Partendo da questa pagina (https://www.sqlitetutorial.net/sqlite-transaction/), dove spiega che tutti i comandi compresi fra un "BEGIN TRANSACTION;" ed un "COMMIT / ROLLBACK;", estremi fra cui la transazione resta aperta, possono essere dati ed eseguiti correttamente, ho cercato di ripetere il concetto dentro il mio progetto:
sql:= 'BEGIN TRANSACTION;';
DataModule1.ZQuery1Transaz.Active:= False;
DataModule1.ZQuery1Transaz.SQL.Text:= sql;
DataModule1.ZQuery1.ExecSQL;
sql:= 'SELECT IdMovvgg FROM movimgg ORDER BY IdMovvgg DESC';
numId:= DataModule1.EstraiCodIDMax(sql, 'IdMovvgg');
numId:= numId + 1;
codId:= IntToStr(numId);
descrCorr:= Form2.CBdescr.Text;
DecodeDateTime(Now, aaaa, mm, gg, ore, minuti, secondi, mSecondi);
dtOggi:= IntToStr(aaaa) + IntToStr(mm) + IntToStr(gg);
orario:= IntToStr(ore) + IntToStr(minuti) + IntToStr(secondi);
sql:= 'INSERT INTO movimgg VALUES(';
sql:= sql + codId + ', ';
sql:= sql + dataCont + ', ';
sql:= sql + dtOggi + ', '; // data corrente di registrazione del movimento (aaaaMMgg)
sql:= sql + orario + ', '; // ora corrente di registrazione del movimento (hhmmss)
sql:= sql + 'xxx' + ', '; // Numero progressivo del movimento corrente nella giornata
sql:= sql + '123456789' + ', '; // Codice Voce ddi Sottoconto di Cassa
sql:= sql + descrCorr + ', ';
sql:= sql + '€, ';
sql:= sql + 'importo(1,55)' + ', ';
sql:= sql + 'Famiglia)';
. . .
sql:= 'COMMIT';
DataModule1.ZQuery1Transaz.Active:= False;
DataModule1.ZQuery1Transaz.SQL.Text:= sql;
DataModule1.ZQuery1.ExecSQL;
Putroppoo la prova non ha funzionato, perchè già all'esecuzione del primo comando (BEGIN TRANSACTION;), ho ricevuto il
messaggio d'errore SQL Query is Empty.
Io non sono in grado di capire se dipenda da un cattivo uso del comando da parte mia o se , piuttosto, il comando non è supportato in ZEOS.
Non credo che il DB SQLite non supporti le TRANSACTIONS: ho provato a fare una verifica eseguendo il comando "BEGIN TRANSACTION;" dentro DB BROWSER for SQLite. Ebbene, il messaggio informativo restituito (Esecuzione completata senza errori.), è di assoluto conforto.
A parte ciò rimane sempre il mio problema iniziale: come passare il comando "BEGIN TRANSACTION" a Sqlite attraverso ZEOS .
.....
Innanzi tutto ZEOS supporta le transaction a livello di connessione. Per fare funzionare le transaction devi operare come ti indico (NON USARE la procedura StarTransaction, le transaction sono automatiche):
Mi pare di avertelo scritto. Se setti l'autocommit a false, la transaction parte automaticamente al primo comando (ad esempio query) e termina o con il COMMIT o con il ROLLBACK. CHE DEVONO ESSERE ESPLICITI A CODICE.
Non servono ne "BEGIN TRANSACTION" ne "StartTransaction". ZEOS supporta (come quasi tutti i componenti simili) 1 transazione sola per connessione.
2) fai doppio click sull'Evento ONRollBack sempre di ZConnection1, e nell'evento dovrai disattivare (mettere a FALSE) la proprietà "ACTIVE" di TUTTE LE ZTABLE INTERESSATE DALLE TRANSACTION e di seguito le rimetti a TRUE. In realtè basta eseguire la procedura REFRESH di ogni tabella. Ciò ha l'unico effetto di mantenere allineata la parte grafica e non ha alcun effetto sulla funzionalità del ROLLBACK o del COMMIT.
sulla 2a, riguardante il refresh, non ho capito e non ho trovato come eseguire la procedura refresh.
procedure ZConnection1Rollback(Sender: TObject); //// <-------- Evento di RollBack della ZConnection
begin
ZTable1.Refresh;
end;
P.S.: TRA LA PRIMA QUERY ed il COMMIT o il ROLLBACK posso esserci quante altre QUERY o altre operazioni sul DB. Tutte appartengono alla transaction che dovrà essere chiusa come indicato.
Dopo la COMMIT o il ROLLBACK, riparte il ciclo quindi alla prima Query o altro parte una nuova transaction.
Ciao
La COMMIT deve essere effettuata tramite la TZConnection (ad esempio ZConnection1):
ZConnection1.Commit; //Esegue la Commit manuale
//oppure
ZConnection1.RollBack; //Esegue il RollBack manuale
Questo perchè ZEOS supporta le transazioni solo a livello di "connection" (1 transazione attiva e possibile per connessione).
Ciao
Va bene.
Finalmente ce l'ho fatta.
Ha funzionato tutto. C'erano alcuni errori nella formazione delle stringhe dati per l'inserimento record e anche qualcosina dimenticata nel richiamo delle ZConnection.
[/code]
Penso quindi di essere a buon punto col mia prima modifica dati di un D.B
2) fai doppio click sull'Evento ONRollBack sempre di ZConnection1, e nell'evento dovrai disattivare (mettere a FALSE) la proprietà "ACTIVE" di TUTTE LE ZTABLE INTERESSATE DALLE TRANSACTION e di seguito le rimetti a TRUE. In realtè basta eseguire la procedura REFRESH di ogni tabella. Ciò ha l'unico effetto di mantenere allineata la parte grafica e non ha alcun effetto sulla funzionalità del ROLLBACK o del COMMIT.
il mio codice di modifica tabelle è:
DataModule1.ZConn1Transaz.Database:= dbCorr;
DataModule1.ZQuery1Transaz.Active:= False;
DataModule1.ZQuery1Transaz.SQL.Text:= sqlInsMovimg;
try
DataModule1.ZQuery1Transaz.ExecSQL;
except
DataModule1.ZQuery1Transaz.SQL.Text:= 'ROLLBACK';
DataModule1.ZQuery1Transaz.ExecSQL;
ShowMessage('Errore "'+ E.Message + '" durante l''ExecSQL(' + sqlInsMovimg + ')' + LineEnding + LineEnding + 'Transazione FALLITA - Il programma verrà chiuso' ););
Halt;
end;
if (Length(sqlInsPartMovv) > 0) then
begin
DataModule1.ZQuery1Transaz.SQL.Text:= sqlInsPartMovv;
try
DataModule1.ZQuery1Transaz.ExecSQL;
except
DataModule1.ZQuery1Transaz.SQL.Text:= 'ROLLBACK';
DataModule1.ZQuery1Transaz.ExecSQL;
ShowMessage('Errore "'+ E.Message + '" durante l''ExecSQL(' + sqlInsPartMovv + ')' + LineEnding + LineEnding + 'Transazione FALLITA - Il programma verrà chiuso' ););
Halt;
end;
end;
DataModule1.ZQuery1Transaz.SQL.Text:= 'COMMIT';
DataModule1.ZQuery1Transaz.ExecSQL;
Il verificarsi di un'anomalia durante la modifica nel D.B., in base al mio tipo di urilizzo, CREDO CHE SIA alquando impropabile, per cui ho previsto la chiusura brutale del programma, dopo il RollBack. Ritengo pertanto altresì non necessario eseguire un refresh delle tabelle già modificate, solo per mantenere allineata la parte grafica.
@ DragoRosso
Mi dispiace non poterti ringraziare di persona per tutto l'aiuto di supporto che mi hai voluto apportare, aiuto senza il quale non avrei sicuramente imparato tanti piccoli segreti sull'argomento D.B. e ZEOSLIB.