* * * *

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

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

Inserisci il nome utente, la password e la durata della sessione.

84 Visitatori, 0 Utenti

Autore Topic: mie utility su database  (Letto 13398 volte)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:mie utility su database
« Risposta #15 il: Agosto 28, 2022, 12:07:38 pm »
Codice: [Seleziona]
      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

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:mie utility su database
« Risposta #16 il: Agosto 28, 2022, 05:50:52 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 da: 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

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:mie utility su database
« Risposta #17 il: Agosto 28, 2022, 11:07:25 pm »
@ 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):
Codice: [Seleziona]
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

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:mie utility su database
« Risposta #18 il: Agosto 29, 2022, 10:25:04 am »
Ora dovrei scriverci dentro le istruzioni per aprire il database, sfruttando gli strumenti Zeoslib.

Codice: [Seleziona]
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

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:mie utility su database
« Risposta #19 il: Agosto 29, 2022, 04:50:46 pm »
@ DragoRosso
Grazie per l'instradamento.

Leggendo il codice che hai preparato per me, trovo:

Codice: [Seleziona]
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
Codice: [Seleziona]
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.  :-\ :-[
« Ultima modifica: Agosto 29, 2022, 05:30:42 pm da petrusic »
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:mie utility su database
« Risposta #20 il: Agosto 29, 2022, 05:51:39 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.

Codice: [Seleziona]
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.

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
« Ultima modifica: Agosto 29, 2022, 06:12:41 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:mie utility su database
« Risposta #21 il: Agosto 29, 2022, 06:13:49 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!
« Ultima modifica: Agosto 29, 2022, 06:16:20 pm da petrusic »
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:mie utility su database
« Risposta #22 il: Agosto 29, 2022, 09:36:23 pm »
@ 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
Codice: [Seleziona]
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.
« Ultima modifica: Agosto 29, 2022, 10:30:41 pm da petrusic »
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:mie utility su database
« Risposta #23 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".

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

petrusic

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:mie utility su database
« Risposta #24 il: Agosto 30, 2022, 04:18:12 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:
Codice: [Seleziona]
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

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:mie utility su database
« Risposta #25 il: Agosto 30, 2022, 05:10:17 pm »
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:
Codice: [Seleziona]
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:
Codice: [Seleziona]
unit UModDBcontfam;

{$mode ObjFPC}{$H+}

interface

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

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:mie utility su database
« Risposta #26 il: Agosto 30, 2022, 05:18:49 pm »
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

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:mie utility su database
« Risposta #27 il: Agosto 30, 2022, 10:01:42 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
Codice: [Seleziona]
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

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:mie utility su database
« Risposta #28 il: Agosto 31, 2022, 11:12:06 am »
Codice: [Seleziona]
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

  • Hero Member
  • *****
  • Post: 624
  • Karma: +0/-0
Re:mie utility su database
« Risposta #29 il: Agosto 31, 2022, 04:15:50 pm »
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 
Codice: [Seleziona]
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

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19169
  • Topic in totale: 2286
  • Online Today: 117
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 84
Total: 84

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.