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

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

Recenti

How To

Utenti
Stats
  • Messaggi totali: 20.582
  • Totale discussioni: 2.471
  • Online today: 310
  • Online ever: 5.949 (Luglio 30, 2026, 09:49:59 PM)
Utenti online
5 Visitatori, 1 Utente

mie utility su database

Aperto da petrusic, Agosto 25, 2022, 06:33:34 PM

Discussione precedente - Discussione successiva

DragoRosso

Citazione di: petrusic il Agosto 27, 2022, 11:11:12 PM
      property ElencoDatabase: TStringList read getElencoDatabase write setElencoDatabase;
Per ora non capisco quale sia la sua utilità, perchè m'immagino che una lettura o scrittura su una tabella di DB (sia fisica che logica) si faccia sempre attraverso il trasferimento di una stringa, in formato sql, nella proprieta ZQuery1.SQL.Text, anche se fino ad ora non ho incontrato niente del genere.

Mi pare che tu non mi stia dando un aiuto, ma tutt'altro.
Non voglio tediarti ulteriormente. Ho capito che  Il percorso è lungo ed impegnativo e non mi pare corretto approfittare così tanto della tua disponibilità.
Grazie!
L'aiuto che ti posso dare è spiegarti alcune tecniche di programmazione, non posso certo sostituirmi a te.

Quella proprietà era solo un esempio. E' opportuno comunque che tu prosegua quando avrai qualcosa di concreto.

Ciò che ti ho spiegato è una delle innumerevoli strade che si possono percorrere, e ognuno deve trovare la propria.

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

petrusic

Citazione di: DragoRosso il Agosto 28, 2022, 12:07:38 PM
Ciò che ti ho spiegato è una delle innumerevoli strade che si possono percorrere, e ognuno deve trovare la propria.
Quella che conosco io non riguarda l'accesso al DB da codice. Se ci fosse una guida dettagliata sull'argomento, mi permetterebbe di accedervi in qualsiasi momento senza farmi sentire a disagio per il continuo chiedere.

Citazione di: DragoRosso
E' opportuno comunque che tu prosegua quando avrai qualcosa di concreto
Vuoi dire che ci vorrebbe un programma di un certo spessore di impegno ed utilizzo?
Ma quello di contabilità familiare che sto riscrivendo in Lazarus Free Pascal andrebbe benissimo, ma  . . .   :-[

ciao ciao

petrusic

@ DragoRosso
in questo post ho trovato uno spunto di partenza per accedere al mio databas SQLite3.
Dopo avere letto una vecchia guida borland, ho creasto un modulo dati.
Come prima operazione vorrei eseguire la Open del database, però quella guida non spende granchè sul da farsi relativamente ai database. Non ho trovato altro.
Comunque, con la creazione del suddetto modulo, è stata aggiunta una nuova unit (unit1):

unit Unit1;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils;

type

  { TDataModule1 }

  TDataModule1 = class(TDataModule)
    procedure DataModuleCreate(Sender: TObject);
  private

  public

  end;

var
  DataModule1: TDataModule1;

implementation

{$R *.lfm}

{ TDataModule1 }

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin

end;

end.

Ora dovrei scriverci dentro le istruzioni per aprire il database, sfruttando gli strumenti Zeoslib.
ciao ciao

DragoRosso

Citazione di: petrusic il Agosto 28, 2022, 11:07:25 PM
Ora dovrei scriverci dentro le istruzioni per aprire il database, sfruttando gli strumenti Zeoslib.

unit Unit1;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, ZCompatibility,
  ZConnection, ZDataset, SQLite3Conn, SQLDB, DB;

type

  { TDataModule1 }

  TDataModule1 = class(TDataModule)
    procedure DataModuleCreate(Sender: TObject);
  private
    ZConnection1: TZConnection;
   
  public

  end;

var
  DataModule1: TDataModule1;

implementation

{$R *.lfm}

{ TDataModule1 }

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  ZConnection1 := TZConnection.Create(nil);
  with ZConnection1 do
    begin
      ControlsCodePage := cCP_UTF8;
      AutoEncodeStrings := True;
      ClientCodepage := 'UTF-8';
      Properties.Add('AutoEncodeStrings=True');
      Properties.Add('controls_cp=CP_UTF8');
      Properties.Add('codepage=UTF-8');
      Port := 0;
      Database := '.\db.s3db';
      Protocol := 'sqlite-3';
    end;
  ZConnection1.Connected:= True;

end;

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

petrusic

#19
@ DragoRosso
Grazie per l'instradamento.

Leggendo il codice che hai preparato per me, trovo:

unit Unit1;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, ZCompatibility,           // ZCompatibility per la prima volta
  ZConnection, ZDataset, SQLite3Conn, SQLDB, DB;         // SQLite3Conn, SQLDB per la prima volta

Per capire, comincio da qui, perchè alcune classi richiamate in uses non le mai incontrate prima d'ora, usando i componenti grafici di Zeoslib (ZConnection, Zquery, DataSource). Ritengo che siano necessari nella gestione di DB, tramite codice.

La procedura

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  ZConnection1 := TZConnection.Create(nil);
  with ZConnection1 do
    begin
      ControlsCodePage := cCP_UTF8;     //---  come prima                                <---------|
      AutoEncodeStrings := True;      //---  come prima                             <------|       |
      ClientCodepage := 'UTF-8';      //--- prima non me ne preopccupavo                   |       |    <-----|
      Properties.Add('AutoEncodeStrings=True');     //--- sembra la ripetizione  di      --|       |          |
      Properties.Add('controls_cp=CP_UTF8');                 //--- sembra la ripetizione  di     --|          |
      Properties.Add('codepage=UTF-8');                                     //--- sembra la ripetizione  di --|
      Port := 0;                                            //---  come prima 
      Database := FrmMain.dbCorr;        //--- caricando così il percorso corretto, col DB effettivo o quello di prova
      Protocol := 'sqlite-3';                               //---  come prima 
    end;
  ZConnection1.Connected:= True;
end;

è il costruttore per la connessione al DB?

Bene, la procedura appena creata nel 1° modulo dati permette di eseguire la Open del database, ma nel momento in cui dovessi andare a leggere o scrivere, occorre creare un altro modulo dati? e così per ogni nuova operazione sul DB?

Come vedi, ogni passo, ho sempre nuove domande da fare.  :-\ :-[
ciao ciao

DragoRosso

#20
Citazione di: petrusic il Agosto 29, 2022, 04:50:46 PM
Per capire, comincio da qui, perchè alcune classi richiamate in uses non le mai incontrate prima d'ora, usando i componenti grafici di Zeoslib (ZConnection, Zquery, DataSource). Ritengo che siano necessari nella gestione di DB, tramite codice.

Puoi cancellare uno alla volta le unità che sembrano di troppo. Se il progetto compila vuole dire che erano effettivamente di troppo.

Citazione di: petrusic il Agosto 29, 2022, 04:50:46 PM

procedure TDataModule1.DataModuleCreate(Sender: TObject);
......
  Database := '.\db.s3db';          // se non lo imposto ora, ma soltanto quando eseguo la TForm1.FormCreate ? ......
end;


Tecnicamente non lo puoi fare nel TForm1.FormCreate, perchè l'istanza relativa alla TDataModule non è ancora stata "creata". Occhio alla catena di creazione degli oggetti.

Citazione di: petrusic il Agosto 29, 2022, 04:50:46 PM
Bene, la procedura appena creata nel 1° modulo dati permette di eseguire la Open del database, ma nel momento in cui dovessi andare a leggere o scrivere, occorre creare un altro modulo dati? e così per ogni nuova operazione sul DB?
Come vedi, ogni passo, ho sempre nuove domande da fare.  :-\ :-[

NEL TDATAMODULE, così come in una qualsiasi classe che costruisci, puoi metterci quanti componenti vuoi.

Ti allego un progetto db demo che contiene un TDataModule con i componentidi ZEOS. Questo ti spiega come usare un TDataModule ... è come usavi tu la FORM con i componenti ZEOS.

Ora se vuoi partire a costruire a RUNTIME, incomincia a eliminare i singoli componenti UNO ALLA VOLTA e a sostituirne il codice. Per la ZConnection sai come fare ... inizia da li.

P.S: SE FRA LE USES ci sono unità che danno errore (come ad esempio odbc...) semplicemente eliminale.

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

petrusic

#21
Citazione di: DragoRosso il Agosto 29, 2022, 05:51:39 PM
Ti allego un progetto db demo che contiene un TDataModule con i componentidi ZEOS. Questo ti spiega come usare un TDataModule ... è come usavi tu la FORM con i componenti ZEOS.

Ora se vuoi partire a costruire a RUNTIME, incomincia a eliminare i singoli componenti UNO ALLA VOLTA e a sostituirne il codice. Per la ZConnection sai come fare ... inizia da li.
Va bene. Grazie!
ciao ciao

petrusic

#22
@ DragoRosso
Ho guardato la demo, cercando di capire come è stato usato il modulo dati.

Intanto non ho trovato più il costruttore che m'aspettavo dopo l'esercizio precedente.
Ho visto poi che nella finestra del Modulo dati hai inserito tutti gli oggetti TZConnection, TZQuery e DataSource che avevo capito non andavano più impiegati nella tecnica digestione DB a runtime.

Sono rimasto abbastanza sorpreso, perchè così gli strumenti grafici ci  sono sempre, sono inseriti solo una volta, è vero, non sono dentro una classe di tipo Form e sono accessibili, tramite uses, da tutte le Form del progetto.

Provo a modificare il mio programma e ti faccio sapere.

Ho notato però che la

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  ZConnection1.Connected:= True;
  ZTable1.Active:= True;
  ZReadOnlyQuery1.Active:= true;
end;

imposta a True sia la TZConnection che le TZQuery. Ma così, se non ho capito male, il database è aperto sin dal momento del create del Modulo-Dati, con le Query già pronte a fornire i dati.
E a proposito, nella modifica che ho cominciato, ho visto la il modulo-dati  veniva creato automaticamente insieme alla Form1. Io vorrei avviarne il create, al momento del bisogno, dentro la Form1, in modo da potere assegnargli il percorso corretto del database da collegare all'oggetto TZConnection.
ciao ciao

DragoRosso

Togli le tre righe da DataModuleCreate e inserscile in una nuova procedura che chiamerai quando ne hai bisogno.

La procedura la creerai nel TDataModule sotto "public".

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

petrusic

Citazione di: DragoRosso il Agosto 29, 2022, 11:35:38 PM
Togli le tre righe da DataModuleCreate e inserscile in una nuova procedura che chiamerai quando ne hai bisogno.
La procedura la creerai nel TDataModule sotto "public".

Non conoscendo l'effetto della creazione automatica del modulo-dati, all'avvio del progetto, vorrei capire fino a che punto mi conviene gestirlo manualmente, ma ciò dipende da cosa succede dopo ila sua creazione: Viene eseguita la Open del DB? Viene solo preparato l'ambiente operativo per agire sul DB, come riconoscimenta del DataSorce, attivazione della connessione, individuazione del percorso d'accesso al DB?

Fino ad ora, a parte avere disegnato gli oggetti Zeos nella scheda del modulo-Dati, ho soltanto personalizzato il  relativo file.pas:

unit UModDBcontfam;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, ZCompatibility,
//  ZConnection, ZDataset, DB;
  ZConnection, ZDataset, SQLite3Conn, SQLDB, DB;


type

  { TDataModule1 }

  TDataModule1 = class(TDataModule)
  DataSourceX1: TDataSource;
  ZConnectionX1: TZConnection;
  ZQueryX1: TZQuery;
  ZReadOnlyQueryX1: TZReadOnlyQuery;

  procedure DataModuleCreate(Sender: TObject);
 
 

private


public

end;

var
  DataModule1: TDataModule1;

implementation

{$R *.lfm}

{ TDataModule1 }
uses
  FrmMain;

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  ZConnectionX1:= TZConnection.Create(nil);
  ZConnectionX1.Database := FrmMain.dbCorr;      // dbCorr contiene il percorso del file di DB corrente (Es.: dbProve:= '/media/dirdati/dativari/contabfam/ContabFamdb_prove'
end;
end.


Quindi ho lasciato la creazione automatica del Modulo-Dati.
ciao ciao

petrusic

Ho provato a modificare il mio sorgente considerando ora l'accesso al DB, ma, con l'inserimento del modulo-dati, cambia la mentalità di lettura e scrittura dati, perchè, pur modificando le vecchie istruzioni, ho ricevuo un messaggio d'Errore incomprensibile, per me.
Ecco il codice modificato:

sql:= 'SELECT IdRiepMovg FROM riepmovg';
  DataModule1.ZReadOnlyQueryX1.SQL.Text := sql;
  DataModule1.ZReadOnlyQueryX1.Active:= True;
  totRecQry:= DataModule1.ZReadOnlyQueryX1.RecordCount;           


L'Errore è:
Citazione
Il progetto DomusRatio ha sollevato una eccezione di classe 'EZDatabaseError' con messaggio:
Database connection component is not assigned.

Nel file 'ZAbstractRODataset.pas' alla riga 2536

La riga uses del modulo dati contiene:

unit UModDBcontfam;

{$mode ObjFPC}{$H+}

interface

uses                                             
Classes, SysUtils, ZCompatibility,
  ZConnection, ZDataset, SQLite3Conn, SQLDB, DB;                 

ciao ciao

DragoRosso

E' probabile che la proprietà "Connection" del componente ZReadOnlyQueryX1 non è assegnata a una connessione (ZConnection).

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

petrusic

Citazione di: DragoRosso il Agosto 30, 2022, 05:18:49 PM
E' probabile che la proprietà "Connection" del componente ZReadOnlyQueryX1 non è assegnata a una connessione (ZConnection).
E' vero, mi ero dimenticato ad impostarla.

Però, purtroppo le anomalie non sono finite, perchè quando esegue

sql:= 'SELECT IdRiepMovg FROM riepmovg';
  DataModule1.ZReadOnlyQueryX1.SQL.Text := sql;

  DataModule1.ZReadOnlyQueryX1.Active:= True;           <--- questa istruzione

  totRecQry:= DataModule1.ZReadOnlyQueryX1.RecordCount;                           

viene generato un errore logico sulla sql
Citazione
SQL Error: SQL logic error.

Press OK to ignore and risk data corruption.
Press Abort to kill the program.

Ma la sql precedentemente non ha mai dato problemi.
ciao ciao

DragoRosso

Citazione di: petrusic il Agosto 30, 2022, 10:01:42 PM

sql:= 'SELECT IdRiepMovg FROM riepmovg';
  DataModule1.ZReadOnlyQueryX1.SQL.Text := sql;

  DataModule1.ZReadOnlyQueryX1.Active:= True;           <--- questa istruzione

  totRecQry:= DataModule1.ZReadOnlyQueryX1.RecordCount;                           

viene generato un errore logico sulla sql
Citazione
SQL Error: SQL logic error.

Press OK to ignore and risk data corruption.
Press Abort to kill the program.

Ma la sql precedentemente non ha mai dato problemi.

Il nome del campo "IdRiepMovg" o il nome della tabella "riepmovg" non è corretta (database errato ?). Questo è il motivo dell'errore.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

Citazione di: DragoRosso il Agosto 31, 2022, 11:12:06 AM
Il nome del campo "IdRiepMovg" o il nome della tabella "riepmovg" non è corretta (database errato ?). Questo è il motivo dell'errore.

Sembra che sia così come dici tu, ma non è così.
Ho anche detto prima che quella Select, così com'è, funzionava benissimo, quindi perchè dovrebbe essere Errato ora quello che, prima di mettere in pratica il modulo-dati, funzionava benissimo.

Comunque ad evitare ulteriori incomprensioni ho voluto provare a modificare la SELECT, scrivendo 

sql:= 'SELECT * FROM riepmovg';

e non ha funzionato, poi ho cambiato tabella e continua a NON funzionare.

In ogni caso, allego un'immagine in cui puoi constatare che i nomi di colonna e tabella sono corretti.

Ho guardato anche il percorso del db ('/media/dirdati/dativari/contabfam/ContabFamdb_prove') ed è corretto. Ho ricontrollato le proprietà degli oggetti ZEOS attuali e precedenti e, secondo me, anche quelle sembrano corrette.

Cosa potrei verificare ancora?


ciao ciao

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.