petrusic:
Dare il titolo a questa nuova discussione non è stato semplice. Spero tuttavia di riuscire a spiegarmi ora:
Nel programma che sto realizzando accedo ai record di una tabella di DB ("riepmovg") la quale contiene sempre un solo record per ciascuna data di calendario registrata.
A inizio programma, una volta accettata la data di registrazione, devo capire se il record riepilogativo per quella giornata esiste, o meno. Lo faccio richiamando una funzione di lettura, ma riporto le istruzioni per arrivare alla Open del DB, in base alla query preparata:
--- Codice: --- sql:= 'SELECT DtCoMovg, StaDtMovg FROM riepmovg WHERE DtCoMovg = dataCont ORDER BY DtCoMovg'; // totRecQry:= contRecDbTbX('riepmovg', sql); Form1.ZQuery1.SQL.Text := sql; try Form1.ZQuery1.Open; except on E: Exception do WriteLn('ERRORE nella OPEN del ContabFamdb (sql: "' + sql + '" ' + IntToStr(E.HelpContext) + ': ' + E.Message); end; totRecQry:= Form1.ZQuery1.RecordCount; Form1.ZQuery1.Close; Result:= totRecQry;
--- Termina codice --- Quando, alla Open, si verifica un Exception (per record insesitenti), l'ERRORE letto nella riga writeLn è:
--- Citazione ---ERRORE nella OPEN del ContabFamdb (sql: "SELECT DtCoMovg, StaDtMovg FROM riepmovg WHERE DtCoMovg = dataCont ORDER BY DtCoMovg" 0: SQL Error: SQL logic error --- Termina citazione --- Naturalmente, per effetto dell'Errore alla open, l'istruzione successiva (ZQuery1.RecordCount) non viene eseguita perchè il programma si arresta addirittura.
Dal messaggio capisco soltanto che si è manifestato un errore logico, ma non capisco che è successo per inesistenza dei record cercati.
Se io eseguo la stessa query dentro l'applicativo DB Browser for SQLite mi viene fornita la seguente risposta:
--- Citazione ---Risultato: 0 righe ritornate in 3ms Alla riga 1: SELECT DtCoMovg,StaDtMovg FROM riepmovg WHERE DtCoMovg = 20210924
--- Termina citazione ---
Quindi DB Browser riesce a capire ed informarmi di non avere trovato record nella ricerca.
Vorrei ottenere una risposta simile da Zeoslib. E' possibile?
DragoRosso:
"extended error information"
--- Citazione ---The SQLite driver of Zeos 7.2 now can get extended error information from SQLite and provide much better error descriptions. In Zeos 8.0 this will be the default. In Zeos 7.2 we introduced the new parameter ExtendedErrorMessage to enable the behaviour. Setting this parameter to 1 / Yes / true will get you the extended error messages. This parameter will not exist in Zeos 8.0 anymore. --- Termina citazione ---
Abilita questo intanto. Il parametro "E" della eccezione (di cui tu usi la proprietà "Message") dovrebbe essere equivalente a una particolare classe di eccezione definita direttamente in ZEOS (tipo EDivbyZero, EMathError, etc ...). Provo a cercare dove ZEOS definisce le eccezioni.
Ciao
DragoRosso:
Non ho trovato un elenco specifico su ZEOS, prova a "visualizzare" il codice di errore: inttostr(E.ErroCode), quello dovrebbe essere il codice identificativo dell'eccezione.
Il codice ErrorCode non è sempre settato nelle eccezioni, quindi potrebbe essere che il codice di errore non ti possa aiutare.
Ciao
petrusic:
--- Citazione da: DragoRosso - Settembre 24, 2021, 06:48:03 pm ---prova a "visualizzare" il codice di errore: inttostr(E.ErroCode), quello dovrebbe essere il codice identificativo dell'eccezione.
Il codice ErrorCode non è sempre settato nelle eccezioni, quindi potrebbe essere che il codice di errore non ti possa aiutare.
--- Termina citazione --- Ho provato a modificare il mio codice di accesso al DB, cercando di mettere in pratica il tuo suggerimento:
--- Codice: --- Form1.ZQuery1.SQL.Text := sql; try Form1.ZQuery1.Open; except on E: Exception do begin WriteLn('ERRORE nella OPEN del ContabFamdb (sql: "' + sql + '" ' + IntToStr(E.ErroCode) + ': ' + E.Message); swOpenErro:= True; end; end;
--- Termina codice --- Purtroppo il compilatore NON riconosce il parametro ErroCode
--- Citazione ---utilmiedb.pas(38,101) Error: identifier idents no member "ErroCode" --- Termina citazione ---
Probabilmente l'identificatore ErroCode fa parte di un pacchetto aggiuntivo in Zeos.
DragoRosso:
A parte che dopo l'aperitivo ero un pò fuori io ... eventualmente era ErrorCode ::)
Prova a verificare questo, anche se sono quasi convinto che l'ExceptionCode non viene inizializzato ....
--- Codice: --- try //inserisci il tuo codice qui .... except on e:exception do begin if e is EExternal then ShowMessage(inttostr((E as EExternal).ExceptionRecord^.ExceptionCode)); end; end;
--- Termina codice ---
Con calma verifico se si può ritrovare più dettagliatamente l'errore da SQLite ...