* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 21, 2024, 11:34:54 pm

Inserisci il nome utente, la password e la durata della sessione.

105 Visitatori, 0 Utenti

Autore Topic: [Risolto] Errore ZQuery1.Open per "Nessun Record trovato"  (Letto 2582 volte)

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
[Risolto] Errore ZQuery1.Open per "Nessun Record trovato"
« il: Settembre 24, 2021, 05:28:12 pm »
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: [Seleziona]
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;                 
 
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
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

Quindi DB Browser riesce a capire ed informarmi di non avere trovato record nella ricerca.

Vorrei ottenere una risposta simile da Zeoslib. E' possibile?

« Ultima modifica: Ottobre 01, 2021, 04:29:43 pm da petrusic »
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Errore ZQuery1.Open per "Nessun Record trovato"
« Risposta #1 il: Settembre 24, 2021, 06:21:58 pm »
"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.

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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Errore ZQuery1.Open per "Nessun Record trovato"
« Risposta #2 il: Settembre 24, 2021, 06:48:03 pm »
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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:Errore ZQuery1.Open per "Nessun Record trovato"
« Risposta #3 il: Settembre 27, 2021, 04:24:46 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.
Ho provato a modificare il mio codice di accesso al DB, cercando di mettere in pratica il tuo suggerimento:
Codice: [Seleziona]
 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;
Purtroppo il compilatore NON riconosce il parametro ErroCode
Citazione
utilmiedb.pas(38,101) Error: identifier idents no member "ErroCode"

Probabilmente l'identificatore ErroCode fa parte di un pacchetto aggiuntivo in Zeos.
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Errore ZQuery1.Open per "Nessun Record trovato"
« Risposta #4 il: Settembre 27, 2021, 05:02:51 pm »
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: [Seleziona]
  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;

Con calma verifico se si può ritrovare più dettagliatamente l'errore da SQLite ...

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:Errore ZQuery1.Open per "Nessun Record trovato"
« Risposta #5 il: Settembre 27, 2021, 06:51:25 pm »
A parte che dopo l'aperitivo ero un pò fuori io ... eventualmente era ErrorCode  ::)
Non cambia niente, perchè, già in fase di scrittura, dopo avere digitato " IntToStr(E.E", prermendo |CTRL|+|Barra Spazio| si apre la finestra d'aiuto dove compare un solo termine che inizia con "E" (Equals), quindi qualsiasi altro termine non viene riconosciuto.

Ho provato l'ultimo tuo codice di suggerimento:
Codice: [Seleziona]
 try
    Form1.ZQuery1.Open;
    except
    on e: exception do
    begin
      if e is EExternal then
      begin
        ShowMessage(inttostr((E as EExternal).ExceptionRecord^.ExceptionCode));
      end;
    end;                                                     
end;

Anche alla riga [i]ShowMessage[/i] il compilatore  da Errore
[quote]
utilmiedb.pas(62,47) Error: identifier idents no member "ExceptionRecord"[/quote]


ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Errore ZQuery1.Open per "Nessun Record trovato"
« Risposta #6 il: Settembre 27, 2021, 07:03:50 pm »
Anche alla riga ShowMessage il compilatore  da Errore
Citazione
utilmiedb.pas(62,47) Error: identifier idents no member "ExceptionRecord"

Mi sono dimenticato di riportare che quel record è definito solo x Win  ....

Rimane solo la verifica di cui al precedente post.

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:Errore ZQuery1.Open per "Nessun Record trovato"
« Risposta #7 il: Settembre 29, 2021, 12:04:42 pm »
Nel mio piccolo mondo di esperienza ho fatto una prova, comandando una open che mi producesse una condizione di nessun record trovato, ottenendo così zero record letti:
Codice: [Seleziona]
var
 . . .
tot: Integer = 0;
sql:= 'SELECT DtCoMovg FROM riepmovg WHERE StaDtMovg = "K" ORDER BY DtCoMovg';   // StaDtMovg = "K" (valore impossibile)
  try
    Form1.ZQuery1.Open;
    except
    on E: Exception do
    begin
      WriteLn('ERRORE nella OPEN della tabella "ContabFamdb.riepmovg"   -   ' + IntToStr(E.HelpContext) + ': ' + E.Message);
      swdbOpenErro:= True;
    end;
  end;
  tot:= Form1.ZQuery1.RecordCount;   
 . . .                                             
Ho avviato il programma, ma ... ho incassato due sorprese.
- La prima mi andrebbe bene perchè la Open non ha prodotto errori.
- La seconda invece mi ha lasciato di stucco perchè ho trovato la variabile "tot", dopo l'esecuzione dell'istruzione RecordCount, valorizzata a 9, come se la Open avesse trasferito nel buffer di lettura 9 record.
Pur essendo sicuro dell'inesistenza di record con  StaDtMovg = "K", ho eseguito la select in ambito DBBrowser che, a conferma di quanto ricordo, mi ha fornito
la seguente risposta:
Citazione
Risultato: 0 righe ritornate in 11ms
Alla riga 1:
SELECT DtCoMovg FROM riepmovg WHERE StaDtMovg = "K" ORDER BY DtCoMovg
« Ultima modifica: Settembre 29, 2021, 12:20:15 pm da petrusic »
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:Errore ZQuery1.Open per "Nessun Record trovato"
« Risposta #8 il: Settembre 29, 2021, 12:35:28 pm »
Chiedo scusa per avere postato una risposta inutile.
Nel mio codice manca una riga:
Codice: [Seleziona]
sql:= 'SELECT StaDtMovg FROM riepmovg WHERE StaDtMovg = "K" ORDER BY DtCoMovg';
Form1.ZQuery1.SQL.Text := sql;      // <-- Avevo dimenticato Questa
  try
    Form1.ZQuery1.Open;           
 . . .
 
La open ora funziona sempre, cioè, come prima non produce Errore, ma sono in grado di capire che non c'è alcun record che risponda ai parametri impostati nella Select.

Posso dire che, alla fine, il risultato ottenuto risponde alle mie necessità e posso evitare di comandare la lettura di record inesistenti.
Eseguo una Select in più ed allungo un pochino il programma, ma può andare bene lo stesso.
ciao ciao

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19169
  • Topic in totale: 2286
  • Online Today: 123
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 105
Total: 105

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.