Forum > Databases

mie utility su database

(1/9) > >>

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.

1-Progetto "DomusRatioCancResta"

--- Codice: ---
unit frm1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, DB, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ZConnection, ZDataset,
  utilmie, utilmiedb;

type

  { TForm1 }

  TForm1 = class(TForm)
    BPulsAvanti: TButton;
    Button2: TButton;
    DataSource1: TDataSource;
    Label1: TLabel;
    LBggContab: TListBox;
    ZConnection: TZConnection;
    ZQuery1: TZQuery;
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure LBggContabEnter(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

  dbCopia, dbCorr, dbOrig, dbProve, percorso: String;

implementation

{$R *.lfm}

{ TForm1 }
var
  totRec: Integer;

//  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

--- Codice: ---
unit FrmMain;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, DB, Forms, Controls, Graphics, Dialogs, Menus, ExtCtrls,
  FileUtil, StdCtrls, ZConnection, ZDataset, Frm5, Frm6, Frm7,
  utilmie, utilmiedb;
//  FileUtil, process, StdCtrls, ZConnection, ZDataset, Frm5, Frm6, Frm7,



type

    { TForm1 }

    TForm1 = class(TForm)
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    Image1: TImage;
    LAttesa: TLabel;
    MainMenu1: TMainMenu;
    Menu1: TMenuItem;
    Menu11: TMenuItem;
    Menu2: TMenuItem;
    Menu21: TMenuItem;
    Menu22: TMenuItem;
    Menu221: TMenuItem;
    Menu222: TMenuItem;
    Menu2221: TMenuItem;
    Menu2222: TMenuItem;
    Menu2223: TMenuItem;
    Menu2224: TMenuItem;
    Menu2225: TMenuItem;
    Menu223: TMenuItem;
    Menu224: TMenuItem;
    Panel1: TPanel;
    ZConnection: TZConnection;
    ZReadOnlyQuery1: TZReadOnlyQuery;
    ZReadOnlyQuery2: TZReadOnlyQuery;
    procedure FormCreate(Sender: TObject);
    procedure Menu11Click(Sender: TObject);
    procedure Menu21Click(Sender: TObject);     // Inserimento Movimenti giornalieri
    procedure Menu221Click(Sender: TObject);    // Ricerca Movimenti per Descrizione (tipoRicerca:= '0')
    procedure Menu2221Click(Sender: TObject);   // Ricerca Movimenti per Voce principale di Cassa (tipoRicerca:= '1')
    procedure Menu2222Click(Sender: TObject);   // Ricerca Movimenti per Voce di Sottoconto di Cassa (tipoRicerca:= '2')
    procedure Menu2223Click(Sender: TObject);   // Ricerca Movimenti per Voce Primaria di Collegamento (tipoRicerca:= '3')
    procedure Menu2224Click(Sender: TObject);   // Ricerca Movimenti per Voce Secondaria di Collegamento (tipoRicerca:= '4')
    procedure Menu2225Click(Sender: TObject);   // Ricerca Movimenti per Voce di Sottoconto di Collegamento (tipoRicerca:= '5')
    procedure Menu223Click(Sender: TObject);    // Ricerca per Componente familiare (tipoRicerca:= '6')
    procedure Menu224Click(Sender: TObject);    // Ricerca per Importo (tipoRicerca:= '7')
    procedure Panel1Enter(Sender: TObject);
end;

const
  maskLire: String = '#,###,##0';
  maskEuro: String = '#,###,##0.#0';

var
  Form1: TForm1;


  dbCopia: String;
  dbOrig: String;
  dbProve: String;
  dbCorr: String;
  dataCont, dataSys, nomeGiorno, nomeMese, percorso: String;
  ggApertaChiusa: String;      //  (campo vuoto) = Giornata contabile NUOVA,   "C" = Giornata contabile CHIUSA,   "A" = Giornata contabile APERTA
  tipoValuta: String;


implementation
{$R *.lfm}

{ TForm1 }

procedure TForm1.Menu11Click(Sender: TObject);   // Scelta Menu' "File + Esci"
begin
  Application.Terminate;
end;                                     

--- Termina codice ---

I file delle mie utility sono dentro un'unica directory:

--- Codice: ---
$ ls /media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/util_mie
backup  daticomuni.pas  lib  utilmiedb.pas  utilmie.pas

--- Termina codice ---
riporto parte del contenuto del file "utilmiedb.pas"

--- Codice: ---
unit utilmiedb;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Dialogs,
//  DB, Forms, Controls, Graphics, Menus, ExtCtrls,
  DB, Forms, Controls, Menus, ExtCtrls,
  FileUtil, StdCtrls,
  ZConnection, ZDataset;


type
  TstrOut = Integer;

 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:

--- Codice: ---
unit frm1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, DB, Forms, Controls, Graphics, Dialogs, StdCtrls,
  FileUtil, ZConnection, ZDataset,
  utilmie, utilmiedb;

type

  { TForm1 }

  TForm1 = class(TForm)
    BPulsAvanti: TButton;
    Button2: TButton;
    DataSource1: TDataSource;
    Label1: TLabel;
    LBggContab: TListBox;
    ZConnection: TZConnection;
    ZQuery1: TZQuery;
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure LBggContabEnter(Sender: TObject);
  private

  public

  end;       
. . .
procedure TForm1.LBggContabEnter(Sender: TObject);
var
  dtGGfa: String;
begin
 BPulsAvanti.Caption:='Seleziona data per Cancellazione Record e' + LineEnding + Space(30) + 'CLICCA QUI';
 dataOggi:= CarDtCalendario();
 dtGGfa:= CalcDataGGfa(30);
  dbCorr:= dbProve;
  CopyFile(dbOrig, dbCorr);
  ShowMessage('----- DomusRatioCancResta -----' + System.lineending + 'DB Origine: ' + dbOrig + System.lineending + 'copiato in ' + System.lineending + 'DB di prova: ' + dbProve);
 //----------- Open del DB ------------------------------------------------------
  ZConnection.Database:= dbCorr;
  sql:= 'SELECT DtCoMovg, StaDtMovg FROM riepmovg WHERE DtCoMovg <= ' + dataOggi + ' AND DtCoMovg >= ' + dtGGfa + ' ORDER BY DtCoMovg DESC';
  totRec:= DbContaRecInOpen(sql);                                         

--- Termina codice ---

l'unit utilmiedb contiene la function DbContaRecInOpen:

--- Codice: ---
unit utilmiedb;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Dialogs,
//  DB, Forms, Controls, Graphics, Menus, ExtCtrls,
  DB, Forms, Controls, Menus, ExtCtrls,
  FileUtil, StdCtrls,
  ZConnection, ZDataset;


type
  TstrOut = Integer;

 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.

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa