Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Febbraio 27, 2022, 01:01:46 pm

Titolo: [Risolto] coesistenza di ZReadOnlyQuery1 e ZReadOnlyQuery2
Inserito da: petrusic - Febbraio 27, 2022, 01:01:46 pm
nella form allegata ho definito due serie di oggetti di connessione al mio DB SQLite3 tramite zeos.
Nello spezzone di codice seguente appare come, durante la lettura dati tramite join di 2 tabelle, si presenta, non sempre, la necessità di accedere ad una terza tabella  per rilevare altri dati da presentare poi nella stringGrid in costruzione:
Codice: [Seleziona]
procedure FaiGridDescr();      // Ricerca per  Descrizione
. . .
begin
nuRec:= DbContaRecInOpen(sql);
  if (nuRec > 0) then
  begin
     . . .
    swOpenErro:= OpenDbZQuery1(sql);
    if not swOpenErro then
    begin
      Form6.ZReadOnlyQuery1.First;   // Accesso alla Tabella DB.movimgg
      iRg:= 0;
      while not Form6.ZReadOnlyQuery1.EOF do
      begin
        iRg:= iRg + 1;
        dtMov:= Form6.ZReadOnlyQuery1.FieldByName('dtContMov').AsString;
        Form6.GridMovvComune.Cells[1, iRg]:= RightStr(dtMov, 2) + '/' + Copy(dtMov, 5, 2) + '/' + LeftStr(dtMov, 4);   //  data contabile del movimento corrente
        importo:= Form6.ZReadOnlyQuery1.FieldByName('Importo').AsFloat;
        impEdt:= EdtImp(importo, Form6.ZReadOnlyQuery1.FieldByName('lirEur').AsString);
        end;
        coVoSotCtoCassa:= Form6.ZReadOnlyQuery1.FieldByName('coVoMovg').AsString;    // Codice Voce del conto di movimentazione
        sql:= 'SELECT NomeVoce, ContrPartSiNo FROM piancont WHERE NumVoce = ' +  coVoSotCtoCassa;
//-------------------------------------------------------------------- fin qui FUNZIONA ---------------------------------------------------------------------------------------------------------
        striMia:= EstraiVocePianCont(sql);           //  da qui NON ritorna   
per comodità di lettura riporto qui sotto, e non sopra, il codice della function EstraiVocePianCont e della OpenDbZQuery2 richiamata da quest'ultima:
Codice: [Seleziona]
function OpenDbZQuery2(sql: String): Boolean;     // funzione usata per accedere alla lettura di un solo Record della TB.piancont o dalla TB.racodvoci
var
  swOpenErro: Boolean = False;
begin
  WriteLn('function OpenDbZQuery2');
//----------- Open del DB ------------------------------------------------------
  Form6.ZConnect2.Database := dbCorr;
  Form6.ZReadOnlyQuery2.SQL.Text := sql;
  try
    Form6.ZReadOnlyQuery2.Open;
    except
    on E: Exception do
    begin
      WriteLn('ERRORE nella OPEN del ContabFamdb (sql: "' + sql + '" ' + IntToStr(E.HelpContext) + ': ' + E.Message);
      swOpenErro:= True;
    end;
  end;
  Result:= swOpenErro;
end;

function EstraiVocePianCont(sql: String): String;    // Estrae la Voce contabile, a cui accoda il contenuto del campo "ContrPartSiNo"
var
  swOpenErro: Boolean = False;

  estratto: String;

begin
  swOpenErro:= OpenDbZQuery2(sql);   // qui dentro va in ERRORE
  case swOpenErro of
    False:
    begin
      Form6.ZReadOnlyQuery2.First;
      estratto:= Form6.ZReadOnlyQuery2.FieldByName('NomeVoce').AsString;
      estratto:= estratto + Form6.ZReadOnlyQuery2.FieldByName('ContrPartSiNo').AsString;
    end
    else begin
      estratto:= '*?*';   // CODICE DI errore  PER recor NON TROVATO
    end;
  end;
  Form6.ZReadOnlyQuery2.Close;
  Result:= estratto;
end;                                       
L'esecuzione si interrompe a causa dii un Errore nell'apertura del DB come si legge nella WriteLn di controllo:
Citazione
ERRORE nella OPEN del ContabFamdb (sql: "SELECT NomeVoce, ContrPartSiNo FROM piancont WHERE NumVoce = 101018070" 0: Requested database driver was not found

A prescindere dal fatto che penso avere abbondato nelle definizioni degli oggetti (un unico ZConnect nella mia logica sarebbe bastato), il codice scritto avrebbe dovuto funzionare, invece non è così.

Allora devo ammettere che continuo a non capire come muovermi per l'accesso e la gestione di dati di DB tramite Zeos.
 
Titolo: Re:coesistenza di ZReadOnlyQuery1 e ZReadOnlyQuery2
Inserito da: DragoRosso - Febbraio 27, 2022, 02:05:11 pm
Fermo restando che così non si capisce molto di quello che stai facendo (o meglio di come lo fai), due connessioni allo stesso DB non ha molto senso.
SQLite potrebbe aprire il db in modalità exclusiv, e quindi potresti non riuscire ad aprirlo da due connessioni diverse.

Puoi connettere quante tabelle, query, etc ...  vuoi ad una connesione: crea due datasource e associa le due query il tutto ad una stessa connessione.

Ciao

Titolo: Re:coesistenza di ZReadOnlyQuery1 e ZReadOnlyQuery2
Inserito da: petrusic - Febbraio 27, 2022, 03:17:39 pm
Puoi connettere quante tabelle, query, etc ...  vuoi ad una connesione: crea due datasource e associa le due query il tutto ad una stessa connessione.
Quello che mi hai suggerito ora è esattamente quello che pensavo quando ho detto nel mio post precedente  (un unico ZConnect nella mia logica sarebbe bastato).

Ho perciò messo in pratica quanto mi hai incoraggiato a fare e questa volta ha funzionato.

Non so spiegarmi come mai, ma l'ho provato prima di chidere aiuto e non ha funzionato.  :o

Tutto è bene quel procede bene  :D
Titolo: Re:coesistenza di ZReadOnlyQuery1 e ZReadOnlyQuery2
Inserito da: DragoRosso - Febbraio 27, 2022, 08:25:21 pm
Non so spiegarmi come mai, ma l'ho provato prima di chidere aiuto e non ha funzionato.  :o
Tutto è bene quel procede bene  :D

No problem, come hai accennato: tutto è bene se si risolve.

Ciao ciao