petrusic:
Nel costruire il mio file di utility per accedere al database coi miei dati (SQLite3), ho inserito nel mio primo programma alcune funzioni come
--- Codice: --- function OpenDbQuery1F1(sql: String): Boolean; function OpenDbQuery2F1(sql: String): Boolean;
--- Termina codice --- Ciò, perchè mentre è ancora attiva la Query1F1, mi è successo di dovere eseguire una Query2F1. Bene
Sto ora scrivendo un altro programma che accede sempre allo stesso database, ma soltanto attraverso la Query1F1, quindi non ha bisogno di un secondo oggetto Query.
Ebbene, la compilazione di quest'ultimo programma mi restituisce un mesaaggio d'errore perchè non trova la Query2F1.
Francamente non me l'aspettavo. Non capisco perchè, se il file di utility contiene due function di tipo Query, ma al programma corrente occorre richiamarne una sola, il compilatore debba protestare.
Io non so come fate voi di fronte ad una situazione del genere.
Io attualmente vedo solo una via: non utilizzare file utility, ma scrivere le function direttamente dentro ciascun programma. Mi sembra una scelta bambinesca, ma non saprei fare diversamente.
Per completezza riporto le immagini dei form dei due diversi programmi.
DragoRosso:
Non hai importato nella Uses il corretto file delle definizioni.
Inoltre hai definito anonime le funzioni sotto elencate.
Se le vuoi anonime ma di uso globale, devi definirle nel "global section" (cioè nella sezione INTERFACE)
Ciao
petrusic:
--- Citazione da: DragoRosso - Agosto 25, 2022, 07:09:35 pm ---Non hai importato nella Uses il corretto file delle definizioni.
Inoltre hai definito anonime le funzioni sotto elencate.
--- Termina citazione --- Riporto qui le uses dei due programmi, perchè non ho capito dove avrei sbagliato.
// dataOggi, dbCopia, dbCorr, dbOrig, dbProve, percorso, sql, status ,striMia: String; dataOggi, sql, status ,striMia: String;
procedure TForm1.FormCreate(Sender: TObject); begin Form1.Caption:= 'CANCELLAZIONE, in Tb.restacassagg di tutti i record di una giornata contabile'; percorso := ExtractfilePath(Application.ExeName); //------------------------------------ Assegno percorso per l'accesso al DB corretto dbCopia:= '/media/dirdati/dativari/contabfam/ContabFamdb(copia)'; // ) dbOrig:= '/media/dirdati/dativari/contabfam/ContabFamdb'; // ( per impostare dbCorr:= dbOrig o dbProve -> Form1.Panel1Enter dbProve:= '/media/dirdati/dativari/contabfam/ContabFamdb_prove'; // ) //------------------------------------------------------------------------------------ end;
--- Termina codice ---
2-Progetto DomusRatio (Di questo riporto soltanto la parte iniziale della unit frm1
function DbContaRecInOpen(sql: String): Integer; // Esegue la OPen del DB tramit Query contenuta in "sql" ed accerta la presenza di record di riscontro function EstraiVocePianCont(sql: String): String; // Estrae dalla Tabella "piancont" la Voce contabile, a cui accoda il contenuto del campo "ContrPartSiNo" function EstraiCoVoColleg(sql, segnal: String): String; // Estrae dalla Tabella "racodvoci" il codice di sottoconto contrappoto al tipo inmdicato in "segnal" function OpenDbQuery1F1(sql: String): Boolean; function OpenDbQuery2F1(sql: String): Boolean;
implementation uses frm1; function OpenDbQuery1F1(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 //----------- Open del DB ------------------------------------------------------ Form1.ZConnection.Database := dbCorr; 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.HelpContext) + ': ' + E.Message); swOpenErro:= True; end; end; Result:= swOpenErro; end; function OpenDbQuery2F1(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 //----------- Open del DB ------------------------------------------------------ Form1.ZConnection.Database := dbCorr; Form1.ZReadOnlyQuery2.SQL.Text := sql; try Form1.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;
--- Termina codice ---
Spero che possa bastare per aiutarmi a capire come dovrei intervenire.
DragoRosso:
Le dichiarazioni dovrebbero essere a posto. Non posti però la parte di codice dove usi la funzione (con le Uses).
Se nel codice dove usi la funzione non genera errore e genera solo l'errore per la "mancanza" dell'altra che però non usi, allora è un bel dilemma.
Io non saprei come aiutarti.
petrusic:
--- Citazione da: DragoRosso - Agosto 25, 2022, 10:40:22 pm ---Le dichiarazioni dovrebbero essere a posto. Non posti però la parte di codice dove usi la funzione (con le Uses). Se nel codice dove usi la funzione non genera errore e genera solo l'errore per la "mancanza" dell'altra che però non usi, allora è un bel dilemma.
--- Termina citazione --- Cerco di riportare il codice con ordine Il programma richiamala la funzione "DbContaRecInOpen" , presente nella unit "utilmiedb" delle utility mie:
function DbContaRecInOpen(sql: String): Integer; // Esegue la OPen del DB tramit Query contenuta in "sql" ed accerta la presenza di record di riscontro function EstraiVocePianCont(sql: String): String; // Estrae dalla Tabella "piancont" la Voce contabile, a cui accoda il contenuto del campo "ContrPartSiNo" function EstraiCoVoColleg(sql, segnal: String): String; // Estrae dalla Tabella "racodvoci" il codice di sottoconto contrappoto al tipo inmdicato in "segnal" function OpenDbQuery1F1(sql: String): Boolean; function OpenDbQuery2F1(sql: String): Boolean;
implementation uses frm1;
function DbContaRecInOpen(sql: String): Integer; // Esegue la OPen del DB tramite Query contenuta in "sql" ed accerta la presenza di record di riscontro var totRec: Integer;
begin Form1.ZConnection.Database:= dbCorr; Form1.ZQuery1.SQL.Text:= sql; try Form1.ZQuery1.Open; except on E: Exception do WriteLn('ERRORE nella OPEN-sql= "' + sql + ' -"' + IntToStr(E.HelpContext) + ': ' + E.Message + '"-'); end; totRec:= Form1.ZQuery1.RecordCount; Result:= totRec; Form1.ZQuery1.Close; end;
--- Termina codice --- che è quella che viene richiamata.
Tuttavia nella unit sono presenti anche altre function, non richiamate nel programma corrente. Ebbene il compilatore fornisce il seguente errore per ben 9 volte puntando a tutte le righe tipicamente anomale delle altre function, pur non essendo mai richiamate:
--- Citazione ---Compila il progetto, Destinazione: DomusRatioCancResta: Codice di uscita 1, Errori: 9 utilmiedb.pas(54,9) Error: identifier idents no member "ZReadOnlyQuery2" . . . utilmiedb.pas(138,9) Error: identifier idents no member "ZReadOnlyQuery2"
--- Termina citazione ---
Io vedo solo 2 alternative: - creare una unit di utilility per ciascuna function: - abbandonare il concetto unit di utility e riportare le function di volta in volta che servono, dentro il programma chiamante.