Pagine: 1 2 [3] 4 5 ... 14
In questo articolo visioneremo i concetti basilari della programmazione per database con i componenti che permettono la visualizzazione dei contenuti di un campo appartenente al record selezionato di un datasource.

Nell'esempio che andremo a vedere prenderemo in considerazione SQLite come DBMS. La struttura SQL che useremo per il nostro esempio è la seguente.

CREATE TABLE "main"."" (
    "Id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "Cognome" TEXT,
    "Nome" TEXT,
    "Citta" TEXT
);

Lazarus possiede molti package per poter lavorare con i DB, i due sicuramente più usati, mantenuti e testati sono: i componenti standard rilasciati con Lazarus stesso e ZeosLib.
Questo articolo prende in considerazione ZeosLib il quale permette un altissimo grado di astrazione del DBMS, cosa estremamente utile per non vincolare l'applicazione al DBMS. L'esempio che andremo a vedere vi permetterà di acquisire i rudimenti per impadronirvi dell'argomento.

Per prima cosa, creiamo una nuova applicazione tenendo in considerazione quanto imparato nei precedenti articoli sui database, quello che segue è il codice del nostro esempio

Codice: [Seleziona]

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, db, FileUtil, ZConnection, ZDataset, Forms, Controls,
  Graphics, Dialogs, DBGrids, DbCtrls, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    DataSource1: TDataSource;
    DBEdit1: TDBEdit;
    DBGrid1: TDBGrid;
    DBMemo1: TDBMemo;
    DBNavigator1: TDBNavigator;
    DBText1: TDBText;
    ZConnection1: TZConnection;
    ZQuery1: TZQuery;
    Q_Inserimento: TZQuery;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    function GetLastId(): integer;
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
   LastId: integer;
begin
     LastId:=Self.GetLastId()+1;
     Self.Q_Inserimento.SQL.Text:='INSERT INTO utenti(Id, Cognome,Nome,Citta)VALUES(' + IntToStr(LastId) + ',''Cognome' + IntToStr(LastId) + ''',''Nome' + IntToStr(LastId) + ''',''Città' + IntToStr(LastId) + ''');';
     Self.Q_Inserimento.ExecSQL;
     Self.ZQuery1.Refresh;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     //svuoto la tabella
     Self.Q_Inserimento.SQL.Text:='DELETE FROM utenti;';
     Self.Q_Inserimento.ExecSQL;
     Self.ZQuery1.Refresh;
end;

function TForm1.GetLastId(): integer;
var
   ret: integer;
begin
     ret:=0;
     Self.Q_Inserimento.SQL.Text:='select Id as MaxId from utenti group by Id order by Id desc;';
     Self.Q_Inserimento.Open;
     if not Self.Q_Inserimento.EOF then
     begin
          Self.Q_Inserimento.First;
          ret:=Self.Q_Inserimento.FieldByName('MaxId').AsInteger;
     end;
     Self.Q_Inserimento.Close;
     result:=ret;
end;

end.


ma prendiamo in considerazione le singole parti

Andiamo a vedere la FormCreate, ovvero le azioni che vengono svolte dal programma alla creazione della form, nel nostro caso specifico la prima procedura che viene eseguita dal programma

Codice: [Seleziona]

procedure TForm1.FormCreate(Sender: TObject);
begin
     //svuoto la tabella
     Self.Q_Inserimento.SQL.Text:='DELETE FROM utenti;';
     Self.Q_Inserimento.ExecSQL;
     Self.ZQuery1.Refresh;
end;


come si può vedere andiamo a cancellare il contenuto della tabella usata nell'esempio.

Poi possiamo notare che abbiamo creato la seguente funzione
Codice: [Seleziona]

function TForm1.GetLastId(): integer;
var
   ret: integer;
begin
     ret:=0;
     Self.Q_Inserimento.SQL.Text:='select Id as MaxId from utenti group by Id order by Id desc;';
     Self.Q_Inserimento.Open;
     if not Self.Q_Inserimento.EOF then
     begin
          Self.Q_Inserimento.First;
          ret:=Self.Q_Inserimento.FieldByName('MaxId').AsInteger;
     end;
     Self.Q_Inserimento.Close;
     result:=ret;
end;

che permette di ottenere l'indice massimo contenuto nella griglia.
Nell'evento OnClick del pulsante Button1 andiamo ad inserire il codice che automaticamente aggiunge in maniera incrementale le singole righe della tabella basandosi sul risultato della funzione GetLastId visionata poco sopra.
Codice: [Seleziona]

procedure TForm1.Button1Click(Sender: TObject);
var
   LastId: integer;
begin
     LastId:=Self.GetLastId()+1;
     Self.Q_Inserimento.SQL.Text:='INSERT INTO utenti(Id, Cognome,Nome,Citta)VALUES(' + IntToStr(LastId) + ',''Cognome' + IntToStr(LastId) + ''',''Nome' + IntToStr(LastId) + ''',''Città' + IntToStr(LastId) + ''');';
     Self.Q_Inserimento.ExecSQL;
     Self.ZQuery1.Refresh;
end;


Poi successivamente andiamo ad impostare la proprietà ReadOnly a True nella DbGrid del nostro esempio in modo da non lasciare modificare i dati all'utente dalla DBGrid stessa.
Ora aggiungiamo al seguente esempio 3 componenti

    DBEdit1: TDBEdit;
    DBMemo1: TDBMemo;
    DBText1: TDBText;

Andiamo ad impostare per il componente DBEdit1 le seguenti proprietà:
DataSource: DataSource1
DataField: Nome

Andiamo ad impostare per il componente DBText1 le seguenti proprietà:
DataSource: DataSource1
DataField: Cognome

Andiamo ad impostare per il componente DBMemo1 le seguenti proprietà:
DataSource: DataSource1
DataField: Citta

Se eseguiamo il programma vedremo che in funzione del record su cui ci spostiamo possiamo visionare ma non modificare il campo Nome, mentre possiamo visionare e modificare i campi Cognome e Citta.

Qui trovate il link per scaricare l'esempio dell'articolo: www.lazaruspascal.it/esempi/Quarta_Applicazione.zip
Share on Twitter! Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon
In questo articolo visioneremo i concetti basilari per usare le DBGrid in maniera professionale.

Partiamo subito dicendo che le DBGrid sono tra i componenti più usati e più comodi per lavorare con i database, permettono di sveltire di molto il lavoro dell'utente finale se sono usate correttamente. Le DBGrid necessitano di un solo parametro ovvero la voce DataSource che a sua volta punta ad un oggetto Query sia che si tratti dei componenti standard sia che si tratti di un componente ZeosLib.
Così otteniamo un uso standard della DBGrid, ma possiamo personalizzarla di molto usando un po' di codice, partiamo dall'esempio realizzato nell'articolo “DB concetti fondamentali e ZeosLib” e andiamo a modificare il database sqlite con il seguente codice:

-- Descrizione UTENTI
CREATE TABLE utenti (
    "Id" INTEGER,
    "Cognome" VARCHAR(50),
    "Nome" VARCHAR(50),
    "Citta" VARCHAR(50),
    "MyCheck" VARCHAR(50),
    "MyButton" VARCHAR(50),
    "MyPick" VARCHAR(50)
, "IdPickExternalKey" INTEGER)

-- Descrizione CHIAVEESTERNAPICK
CREATE TABLE "ChiaveEsternaPick" (
    "Id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "Descrizione" TEXT
)

Come si può notare abbiamo aggiunto il campo IdPickExternalKey alla tabella principale in modo che faccia da chiave esterna e successivamente abbiamo creato una tabella apposita che contiene la chiave e il valore dei dati che vogliamo compaiano nella PickList (o combobox) che apparirà in una colonna della nostra DBGrid.

Ora aggiungiamo al progetto lazarus un componente TZQuery dal nome ZQuery2 e andiamo ad impostare i seguenti valori ai parametri:

Connection: ZConnection1
SQL: select * from chiaveesternapick;
Active: true

Successivamente aggiungiamo una nuova unit al progetto e inseriremo questo codice al suo interno:

Codice: [Seleziona]

{***********************************************************
*** Unit realizzata da Sammarco Francesco
*** per inserire delle combobox/picklist
*** all'interno della DBGrid. Sembra non funzionare con
*** tutti i tipi di DataSet, nel caso qualcuno riesca a
*** migliorare questa unit mi invii il codice migliorato
*** al seguente indirizzo: francesco.sammarco@gmail.com
***********************************************************}
unit Unit_CampoComboDBGrid;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, db, Grids;

function AddDBComboBoxToGrid(NomeNuovoCampo: string;MyDataSet: TDataSet; CampoDataSet: string ;DataSetList: TDataSet; ChiaveLista: string; CampoLista: string): boolean;

implementation

              function AddDBComboBoxToGrid(NomeNuovoCampo: string;MyDataSet: TDataSet; CampoDataSet: string ;DataSetList: TDataSet; ChiaveLista: string; CampoLista: string): boolean;
              var
                i: integer;
                ret: boolean;
                Field:TField;
              begin
                     ret:=false;
                     try
                        try
                           MyDataSet.FieldDefs.Update;
                           MyDataSet.Close;
                           for i:=0 to MyDataSet.FieldDefs.Count-1 do
                               if MyDataSet.FindField(MyDataSet.FieldDefs[i].Name) = nil then
                                  Field:=MyDataSet.FieldDefs[i].CreateField(MyDataSet);

                           if MyDataSet.FindField(NomeNuovoCampo)<>nil then
                              Exit;

                           Field:=TStringField.Create(MyDataSet);
                           with Field do
                           begin
                             FieldName:=NomeNuovoCampo;
                             Dataset:=MyDataSet;
                             FieldKind := fkLookup; //QUI DICO CHE E' UNA COMBOBOX
                             LookupDataSet:=DataSetList; //QUI ASSEGNO IL DATASET DA CUI EREDITARE I DATI DA FAR VEDERE NELLA COMBOBOX
                             LookupCache:=FALSE;
                             LookupKeyFields:=ChiaveLista;//'CHIAVE'; //CHIAVE CHE VERRA' INSERITA NEL CAMPO Temf.KeyFields
                             LookupResultField:=CampoLista;//'NOME'; //VALORE CHE VEDI NELLA COMBOBOX DA SELEZIONE
                             ReadOnly:=FALSE; //SOLA LETTURA
                             ProviderFlags:=[pfInUpdate, pfInWhere];
                             Required:=FALSE;
                             KeyFields:=CampoDataSet;//'CHIAVEPV';
                           end;
                           MyDataSet.Open;
                           ret:=TRUE;
                        finally
                       end;
                     except
                           on E: Exception do
                           begin

                           end;
                     end;
                     result:=ret;
              end;
end.


Bene con questa utilissima unit abbiamo messo i presupposti per proseguire nel nostro intento, ora manca una cosa sola, la seguente riga:

AddDBComboBoxToGrid('appoggio', Self.ZQuery1, 'IdPickExternalKey',Self.ZQuery2,'Id', 'Descrizione');

Che non fa altro se non dire di aggiungere alla griglia una nuova colonna (al fondo) di metterle come titolo della colonna la stringa 'appoggio' che riporta il valore del campo 'Descrizione' che ha come chiave di accoppiamento la colonna 'Id' e che entrambi i dati sono presenti nell'oggetto TZQuery (ma andrebbe benissimo ogni oggetto TdataSet) di nome ZQuery2, in modo tale da modificare automaticamente il valore presente nella colonna 'IdPickExternalKey' della fonte ovvero all'oggetto TZQuery (ma andrebbe benissimo ogni oggetto TdataSet) di nome ZQuery1.

Ma il nostro esempio non si ferma qui, vediamo inoltre come usare delle checkbox e altri utilissimi oggetti all'interno di una colonna (della Dbgrid).

             Self.DBGrid1.Columns.ButtonStyle:=cbsCheckboxColumn;
             Self.DBGrid1.Columns.ValueChecked:='TRUE';
             Self.DBGrid1.Columns.ValueUnchecked:='FALSE';

Come si può notare dal codice posto sopra andiamo a giocare con tre proprietà della colonna numero i (ovviamente i è un indice per scorrere tutte le colonne della griglia), che sono:

ButtonStyle: in cui andiamo a dire che forma possiederà la colonna, nel nostro caso andremo a dirgli che si tratta di una checkbox
ValueChecked: ovvero il valore che deve avere la colonna per apparire selezionata
ValueUncheked: ovvero il valore che deve avere la colonna per apparire deselezionata

Se invece avessimo voluto una picklist “fissa” che non facesse uso di chiavi esterne avremmo potuto usare il codice che segue:

               Self.DBGrid1.Columns.ButtonStyle:=cbsPickList;
               app:=TStringList.Create;
               app.Add('valore1');
               app.Add('valore2');
               app.Add('valore3');
               Self.DBGrid1.Columns.PickList:=app;
               app.Free;


Dove con
                Self.DBGrid1.Columns.ButtonStyle:=cbsPickList;      
andiamo a dire che vogliamo una picklist, mentre concetti
               app:=TStringList.Create;
               app.Add('valore1');
               app.Add('valore2');
               app.Add('valore3');
andiamo a creare una stringlist, ovvero una stringa di liste e gli aggiungiamo dentro tre stringhe, e con la seguente riga diciamo che la colonna deve presentare i valori della stringlist appena creata
               Self.DBGrid1.Columns.PickList:=app;

Ora creiamo l'evento FormCreate e inseriamo il seguente codice al nostro esempio

Codice: [Seleziona]

procedure TForm1.FormCreate(Sender: TObject);
var
   i: integer;
   app: TStringList;
begin
     for i:=0 to Self.DBGrid1.Columns.Count-1 do
     begin
          if Self.DBGrid1.Columns[i].FieldName='MyCheck' then
          begin
             Self.DBGrid1.Columns[i].ButtonStyle:=cbsCheckboxColumn;
             Self.DBGrid1.Columns[i].ValueChecked:='TRUE';
             Self.DBGrid1.Columns[i].ValueUnchecked:='FALSE';
          end
          else if Self.DBGrid1.Columns[i].FieldName='MyButton' then
          begin
               Self.DBGrid1.Columns[i].ButtonStyle:=cbsButton;
          end
          else if Self.DBGrid1.Columns[i].FieldName='MyPick' then
          begin
               Self.DBGrid1.Columns[i].ButtonStyle:=cbsPickList;
               app:=TStringList.Create;
               app.Add('valore1');
               app.Add('valore2');
               app.Add('valore3');
               Self.DBGrid1.Columns[i].PickList:=app;
               app.Free;
          end;
          //ora vado ad impostare una larghezza fissa per tutte le colonne della griglia
          Self.DBGrid1.Columns[i].Width:=100;
     end;
     //ora vado ad impostare la picklist ereditata da una query utilizzando la Unit chiamata Unit_CampoComboDBGrid
     AddDBComboBoxToGrid('appoggio', Self.ZQuery1, 'IdPickExternalKey',Self.ZQuery2,'Id', 'Descrizione');

     //ora vado ad impostare una larghezza fissa per tutte le colonne della griglia
     for i:=0 to Self.DBGrid1.Columns.Count-1 do
     begin
          Self.DBGrid1.Columns[i].Width:=100;
     end;

end;


otterremo così una griglia con una colonna checkbox, una colonna con la picklist fissa, ed una con una picklist variabile in funzione di quanto contenuto nell'apposita tabella. Il tutto con delle colonne tutte larghe 100.

Qui trovate il link per scaricare l'esempio dell'articolo: www.lazaruspascal.it/esempi/Terza_Applicazione.zip
Share on Twitter! Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon

15 Lug 2014 - Advanced Record Syntax

 
Con la versione 2.6.0 di fpc è stata introdotta, tra le altre, una nuova caratteristica che vale sicuramente la pena di conoscere: Advanced recod syntax (sintassi record avanzata).

E' stata introdotta come elemento di compatibilità con Delphi e quindi è utilizzabile con la direttiva:
Codice: [Seleziona]
{$mode delphi}
.

Solitamente quando si programma si ha in mente uno schema ben preciso:
record + procedure = classe

e quindi, dovendo lavorare con le liste di record o oggetti, dobbiamo quasi subito risolvere un problema: implementare un "manager" che gestisca i record o utilizzare le classi?

E' bene sapere che i record possono avere funzioni e procedure, equivalenti a quelli che in OOP sono conosciuti come metodi!

Le note fpc che parlano di questa caratteristica rimandano ad una pagina di delphi: http://docwiki.embarcadero.com/RADStudio/XE6/en/Structured_Types#Records_.28advanced.29

Record e oggetti quindi si avvicinano mantenendo però una profonda diversità.

ereditarietà
i record non supportano l'ereditarietà

contenuto variante
con i record si possono definire contenuti varianti, con le classi no

memoria e passaggio dati
CaratteristicaRecordOggetto
tipo dativaloripuntatori
assegnamentotramite l'assegnamento il loro contenuto viene copiato con l'assegnamento sono passati per riferimento
come parametrosono passati per valore sono passati, quando parametri, per riferimento
memoriasono allocati nello stack (a meno che non si faccia uso di New e Disposte che
lavorano nello heap)
sono allocati nello heap



operator overloading
i record permettono l'operator overloading, le classi no

gestione memoria
i record sono costruiti automaticamente mentre le classi devono essere istanziate esplicitamente

costruttore
i record hanno un costruttore di default senza argomento (volendo dichiararne uno bisogna che abbia uno o più parametri)

distruttore
i record non hanno distruttore

metodi virtuali
i record non possono avere metodi virtuali e non possono usare la keyword "message"

interfacce
i tipi record non implementano le interfacce

Ho anche fatto una verifica personale (in quanto non ho trovato documentazione in merito) che però voglio approfondire e, quindi, non  prendetela ancora per oro colato ma aspettate che a breve fornirò i risultati della prova. Mi sono domandato se nello stack la memoria occupata da ogni singolo item fosse al netto di funzioni e procedure oppure se lo spazio allocato comprendesse pure il codice. Non è una differenza da poco se applicata ad un array. Sembra che l'implementazione sia come ci si aspetterebbe: solo i dati nello stack.

Edit:
Citazione

verifica effettuata: in effetti non c'è nessuna differenza nella dimensione, vedere articolo https://www.lazaruspascal.it/index.php?page=151



Le differenze sono quindi sostanziali e come già accennato è importante conoscerne l'esistenza. Da quì i ragionamenti che si possono fare sono molteplici.
Pensate ad esempio al classico accesso ai file con record tipizzato: si potrebbe incapsulare qualche funzione/procedura per trasformare una semplice struttura dati in un cursore (esempio: First, Next, Last, Prior, EOF, ecc...).
Pensando invece alla gestione della memoria (ricordo che i record sono nello stack) ed ai fanatici dei garbage collector di cui il pascal è (a mio avviso) fortunatamente privo, possiamo essere certi di avere fatto un altro passo avanti in favore dell'efficenza e della facilità di programmazione allo stesso tempo.
Altra riflessione obbligatoria va fatta per le liste, decisamente diverso
l'approccio che questa funzionalità permette.

Si chiude quì questa breve introduzione sulla nuova caratteristica del compilatore fpc.
Seguirà a breve un articolo con un esempio pratico.
Share on Twitter! Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon
In questo articolo visioneremo i concetti basilari della programmazione per database con la libreria ZeosLib, dando per scontato che abbiate già installato il package appropriato.

Nell'esempio che andremo a vedere prenderemo in considerazione SQLite come DBMS. La struttura SQL che useremo per il nostro esempio è la seguente.

CREATE TABLE "main"."" (
    "Id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "Cognome" TEXT,
    "Nome" TEXT,
    "Citta" TEXT
);

Lazarus possiede molti package per poter lavorare con i DB, i due sicuramente più usati, mantenuti e testati sono: i componenti standard rilasciati con Lazarus stesso e ZeosLib.
Questo articolo prende in considerazione ZeosLib il quale permette un altissimo grado di astrazione del DBMS, cosa estremamente utile per non vincolare l'applicazione al DBMS. L'esempio che andremo a vedere vi permetterà di acquisire i rudimenti per impadronirvi dell'argomento.

Per prima cosa, creiamo una nuova applicazione con:

File → Nuovo... → Applicazione

Ci si presenterà una form vuota sulla quale andiamo a disporre i seguenti oggetti (tra parentesi trovate i nomi delle tab che contengono tale oggetto nell'IDE).

    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    ZConnection1: TZConnection;
    ZQuery1: TZQuery;

TZConnection è un connettore per db che permette di astrarre il passaggio da un DBMS ad un altro, permettendo una facilità di gestione e manutenzione del software che pochi componenti al mondo possono vantare. I parametri da valorizzare sono:

DataBase: /home/francesco/Documenti/Lazarus/ArticoliDB/Seconda_Applicazione/db.s3db
HostName: 127.0.0.1
Password:
User:
Protocol: sqlite-3
Connected: True

Ovviamente questi dati vanno bene sul mio pc, in quanto il database file si trova nel percorso da me menzionato, con 127.0.0.1 diciamo che il database si trova sul pc locale, in caso contrario avremmo dovuto mettere l'indirizzo IP del DB server remoto. Il file non possiede dati d'autentificazione, in caso contrario avremmo dovuto inserire il nome utente e la password per accedervi.
Se andate a visionare la lista delle voci presenti nella combobox alla voce protocol capirete cosa si intende con astrazione e quanto è facile passare da un dbms ad un altro lavorando con l'accoppiata Lazarus+ZeosLib.


TZQuery è un oggetto che permette di elaborare i dati del DBMS attraverso il linguaggio SQL, i parametri che vanno valorizzati sono i seguenti

Connection: ZConnection1
SQL: select * from utenti;  
Active: True;

TdataSource è un oggetto che si occupa di essere il contenitore della sorgente dei dati appena ottenuti attraverso la query SQL sopra realizzata. I parametri da visualizzare sono:

DataSet: ZQuery

Ora siamo pronti per parametrizzare gli oggetti con cui andremo ad interfacciarci per modificare i dati presenti nel database relazionale su cui operiamo, nel caso specifico una griglia e un navigatore di record, con la prima vediamo/modifichiamo/inseriamo/cancelliamo i singoli record, con il secondo ci spostiamo di record in record.
Sia per gli oggetti TDBGrid che per i TDBNavigator bisogna impostare il seguente parametro:

DataSource: DataSource1

Fatto questo compilate il vostro progetto e noterete che avrete una griglia che vi permeterà di lavorare con i dati del database da voi scelti.
Personalmente ZeosLib è il componente che uso per i miei lavori, è comodo, flessibile ed estremamente potente, grazie a Lazarus si astrae il sistema operativo, con ZeosLib astraggo il dbms, in questo modo i miei software non hanno dipendenze che lo vincolano, permettendomi di usare database open source e gratuiti per i test e i lavori per le piccole aziende e prodotti di colossi dell'informatica per le aziende che lo richiedono.

Qui trovate il link per scaricare l'esempio dell'articolo: www.lazaruspascal.it/esempi/Seconda_Applicazione.zip
Share on Twitter! Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon
Quando si lavora con i database su Lazarus è bene capire che bisogna passare attraverso un connettore DB, ovvero un oggetto che si prende l'incarico di collegare l'applicazione che state scrivendo con il DBMS (database management system). Nell'esempio che andremo a vedere prenderemo in considerazione SQLite come DBMS. La struttura SQL che useremo per il nostro esempio è la seguente.


CREATE TABLE “main"."utenti" (
    "Id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "Cognome" TEXT,
    "Nome" TEXT,
    "Citta" TEXT
);

Lazarus possiede molti package per poter lavorare con i DB, i due sicuramente più usati, mantenuti e testati sono: i componenti standard rilasciati con Lazarus stesso e ZeosLib.
Questo articolo prende in considerazione i primi, ma vanno spese due parole anche per ZeosLib, che è un ottimo strumento il quale permette un altissimo grado di astrazione del DBMS, cosa estremamente utile per non vincolare l'applicazione al DBMS. L'esempio che andremo a vedere vi permetterà di acquisire i rudimenti per impadronirvi dell'argomento.

Per prima cosa, creiamo una nuova applicazione con:

File → Nuovo... → Applicazione

Ci si presenterà una form vuota sulla quale andiamo a disporre i seguenti oggetti (tra parentesi trovate i nomi delle tab che contengono tale oggetto nell'IDE).

    SQLite3Connection1: TSQLite3Connection;  (Tab SQLDB)
    SQLQuery1: TSQLQuery;  (Tab SQLDB)
    SQLTransaction1: TSQLTransaction;  (Tab SQLDB)
    DataSource1: TdataSource;  (Data Access)
    DBGrid1: TDBGrid;  (Data Controls)
    DBNavigator1: TDBNavigator;  (Data Controls)

TSQLite3Connection è un connettore per db, nel caso specifico per SQLite, avessimo dovuto collegarci con Firebird avremmo usato TIBConnection e via discorrendo. In caso avessimo usato le ZeosLib avremmo astratto questo discorso in quanto il passaggio da un DBMS ad un altro sarebbe stato un parametro del TZConnection ottenendo così l'astrazione che ha reso famoso questo tool. Tali oggetti devono essere parametrizzati con alcuni dati che elencherò qui sotto:

DataBaseName: /home/francesco/Documenti/Lazarus/ArticoliDB/Prima_Applicazione/db.s3db
HostName: 127.0.0.1
Password:
UserName:
Transaction: SQLTransaction1
Connected: True

Ovviamente questi dati vanno bene sul mio pc, in quanto il database file si trova nel percorso da me menzionato, con 127.0.0.1 diciamo che il database si trova sul pc locale, in caso contrario avremmo dovuto mettere l'indirizzo IP del DB server remoto. Il file non possiede dati d'autentificazione, in caso contrario avremmo dovuto inserire il nome utente e la password per accedervi.

TSQLTransaction è un oggetto che permette tra transazione dei dati dal DB all'applicazione che fa riferimento al connettore, infatti lo abbiamo passato per parametro poco sopra. A tutti gli effetti è un oggetto che non esiste nelle ZeosLib visto che è inglobato automaticamente nel TZConnection per semplificare la vita del programmatore. Ora impostiamo il parametro:

Active: True;

TSQLQuery è un oggetto che permette di elaborare i dati del DBMS attraverso il linguaggio SQL, i parametri che vanno valorizzati sono i seguenti

DataBase: SQLite3Connection1
SQL: select * from utenti;   
Active: True;

TdataSource è un oggetto che si occupa di essere il contenitore della sorgente dei dati appena ottenuti attraverso la query SQL sopra realizzata. I parametri da visualizzare sono:

DataSet: SQLQuery1

Ora siamo pronti per parametrizzare gli oggetti con cui andremo ad interfacciarci per modificare i dati presenti nel database relazionale su cui operiamo, nel caso specifico una griglia e un navigatore di record, con la prima vediamo/modifichiamo/inseriamo/cancelliamo i singoli record, con il secondo ci spostiamo di record in record.
Sia per gli oggetti TDBGrid che per i TDBNavigator bisogna impostare il seguente parametro:

DataSource: DataSource1

Fatto questo compilate il vostro progetto e noterete che avrete una griglia che vi permeterà di lavorare con i dati del database da voi scelti.

Qui trovate il link per scaricare l'esempio dell'articolo: www.lazaruspascal.it/esempi/Prima_Applicazione.zip
Share on Twitter! Digg this story! Del.icio.us Share on Facebook! Technorati Reddit StumbleUpon
Pagine: 1 2 [3] 4 5 ... 14