Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Settembre 11, 2021, 04:28:42 pm

Titolo: [Risolto] ciclo "while not Form1.ZQuery1.EOF" termina male
Inserito da: petrusic - Settembre 11, 2021, 04:28:42 pm
Non riesco a capire, perchè, ma a me succede che il ciclo di lettura dei record di una tabella fornisce l'ultimo record due volte, come se gli ultimi due record della tabella fossero uguali, ... ma NON è vero.
Il codice in osservazione è:
Codice: [Seleziona]
sql:= 'SELECT DtCoMovg, StaDtMovg FROM riepmovg WHERE StaDtMovg = "A" ORDER BY DtCoMovg';
  Form1.ZQuery1.SQL.Text := sql;
  Form1.ZQuery1.Open;
  Form1.ZQuery1.First;
  striMia:= Form1.ZQuery1.FieldByName('DtCoMovg').AsString;
  statoGgCont:= Form1.ZQuery1.FieldByName('DtCoMovg').AsString;
  LBGgAperte.Items.Add(striMia);
  tot:= tot + 1;
  Writeln('LBGgAperte.'  + IntToStr(tot) + '= ' + striMia);
  while not Form1.ZQuery1.EOF do
  begin
    Form1.ZQuery1.Next;
    striMia:= Form1.ZQuery1.FieldByName('DtCoMovg').AsString;
    statoGgCont:= Form1.ZQuery1.FieldByName('DtCoMovg').AsString;
    LBGgAperte.Items.Add(striMia);
    tot:= tot + 1;
    Writeln('LBGgAperte.'  + IntToStr(tot) + '= ' + striMia);
    case striMia of
      '20210908':
        begin
          Writeln('---');
        end;
    end;
  end;
  Writeln('Totale righe di LBGgAperte='  + IntToStr(LBGgAperte.Count));
  Form1.ZQuery1.Close;                                             

Ho seguito anche l'ultima ciclo di lettura avanzando nelle istruzioni una dopo l'altra ed, effettivamente, dopo avere letto l'ultimo record, ZEOS esegue ancora un'altra lettura e, come se non riconoscesse la condizione di EOF, restituisce ancora lo stesso record letto poco prima.

Allego anche due immagini relative alla sequenza riportata con writeln in Console e quella dgli ultimi record letti dalla tabella col "DB Browser for SQLite"

Titolo: Re:ciclo "while not Form1.ZQuery1.EOF" termina male
Inserito da: DragoRosso - Settembre 11, 2021, 05:30:32 pm
La "Form1.ZQuery1.Next" la devi fare alla fine del loop, in quanto l'EOF viene controllato ad inizio loop.

L'ultima "NEXT" generar l'EOF, ma tu procedi lo stesso a prendere i dati (ovviamente di nuovo gli ultimi .... non ce ne sono altri): poi quando si torna al FOR l'EOF ti fa uscire. Però hai "girato" una volta di troppo.

La parte prima del loop la puoi cancellare ....

Ciao
Titolo: Re:ciclo "while not Form1.ZQuery1.EOF" termina male
Inserito da: petrusic - Settembre 11, 2021, 10:16:19 pm
La parte prima del loop la puoi cancellare ....
Devo ammettere che stento a capire come funziona Zeos.  ???

Ho modificato le istruzioni di lettura della tabella di DB, in base alle tue indicazioni:
Codice: [Seleziona]
 sql:= 'SELECT DtCoMovg, StaDtMovg FROM riepmovg WHERE StaDtMovg = "A" ORDER BY DtCoMovg';
  Form1.ZQuery1.SQL.Text := sql;
  Form1.ZQuery1.Open;
  Form1.ZQuery1.First;   
 while not Form1.ZQuery1.EOF do
  begin
    striMia:= Form1.ZQuery1.FieldByName('DtCoMovg').AsString;
    statoGgCont:= Form1.ZQuery1.FieldByName('DtCoMovg').AsString;
    LBGgAperte.Items.Add(striMia);
    Form1.ZQuery1.Next;
    tot:= tot + 1;
    Writeln('LBGgAperte.'  + IntToStr(tot) + '= ' + striMia);   
  end;
  Writeln('Totale righe di LBGgAperte='  + IntToStr(LBGgAperte.Count));
  Form1.ZQuery1.Close;       
Ora funziona. Ecco le ultime Writeln riportate nella Console di Lazarus
Citazione
LBGgAperte.38= 20210901
LBGgAperte.39= 20210902
LBGgAperte.40= 20210908
Totale righe di LBGgAperte=40

Grazie!
 :)
Titolo: Re:ciclo "while not Form1.ZQuery1.EOF" termina male
Inserito da: DragoRosso - Settembre 11, 2021, 10:48:26 pm
Devo ammettere che stento a capire come funziona Zeos.  ???

Zeos funziona più o meno come tutte le interfaccie per la lettura dei database.

In particolare, nel caso specifico, il "FIRST" o il "NEXT" generano l'EOF. Quindi l'EOF deve essere testato dopo OGNI "FIRST" e dopo OGNI "NEXT", cosa che tu hai correttamente effettuato con la modifica.

Sulle letture dopo l'EOF ci sono standard differenti: a seconda dei database e delle interfaccie usate, può essere o meno ritornata una eccezione.

Ciao