* * * *

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, 05:33:03 pm

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

91 Visitatori, 2 Utenti
   

Autore Topic: informazioni per creare database  (Letto 29987 volte)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:informazioni per creare database
« Risposta #15 il: Novembre 10, 2021, 01:30:09 am »
In allegato un miniprogetto con un DB.

C'è il file Leggimi.TXT come spiegazione più o meno esauriente.

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

casey

  • Newbie
  • *
  • Post: 43
  • Karma: +0/-0
Re:informazioni per creare database
« Risposta #16 il: Novembre 10, 2021, 01:17:13 pm »
In allegato un miniprogetto con un DB.

C'è il file Leggimi.TXT come spiegazione più o meno esauriente.

Ciao

all'1.30 di mattina


grazie

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:informazioni per creare database
« Risposta #17 il: Novembre 10, 2021, 02:26:39 pm »
E' un'ora standard per rispondere sul forum.

I veri programmatori non dormono mai, sonnecchiamo sopra la tastiera ma non non dormono  ;D ;D ;D
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:informazioni per creare database
« Risposta #18 il: Novembre 10, 2021, 03:10:16 pm »
E se proprio dormono... stanno sognando un uovo programma da sviluppare!
Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:informazioni per creare database
« Risposta #19 il: Novembre 10, 2021, 03:50:06 pm »
E se proprio dormono... stanno sognando un uovo programma da sviluppare!

 ;D ;D ;D Si si, è proprio un UOVO programma  ;D ;D ;D
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

casey

  • Newbie
  • *
  • Post: 43
  • Karma: +0/-0
Re:informazioni per creare database
« Risposta #20 il: Novembre 10, 2021, 04:15:22 pm »
E' un'ora standard per rispondere sul forum.

I veri programmatori non dormono mai, sonnecchiamo sopra la tastiera ma non non dormono  ;D ;D ;D

da sposati è un pò più difficile


cmq ho guardato il programmino che mi hai postato,
e ci ho finalmente capito qualcosina,

ora se io volessi aggiungere due Bottoni al form,

il primo bottone che quando premuto, con uno showmessage mi visualizza il secondo cognome memorizzato nel database,

e con l'altro bottone che mi aggiunga al database un nuovo nome,
nome bruce, cognome Wayne, città gotham city

quale codice dovrei inserire al tocco dei tasti?

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:informazioni per creare database
« Risposta #21 il: Novembre 10, 2021, 04:20:58 pm »
E se proprio dormono... stanno sognando un uovo programma da sviluppare!

 ;D ;D ;D Si si, è proprio un UOVO programma  ;D ;D ;D

è perchè dormivo...   ;D
Imagination is more important than knowledge (A.Einstein)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:informazioni per creare database
« Risposta #22 il: Novembre 10, 2021, 04:35:52 pm »
L'inserimento da codice è semplice e ci sono diversi modi per farlo:

Primo modo:

1) Poni il tuo componente (in questo caso direttamente la ZTable1) in modalità INSERT.

2) Riempi i campi (sarebbero le colonne) con i valori che vuoi).

3) Esegui il POST della ZTable1.

Secondo modo:

1) Componi una query SQL con i dati.

2) la Esegui.

Il secondo modo prevede che tu conosca il linguaggio SQL, perchè devi comporre la query perfetta, con apici, virgole e tutto il resto correttamente.
Non conosco ZEOS a sufficienza per dirti se puoi eseguire una query diertta tramite la Table1 o se devi usare un componente query nuova (che quindi devi costruire a runtime o prevedere a design time).

Io se ho a disposizione una tabella inserisco i dati tramite la modalità INSERT della tabella. Se invece lavoro con i Thread uso le query SQL anche per le tabelle.

Comunque per il primo modo il codice è questo:

Vado a memoria ...

Codice: [Seleziona]
procedure TFMain.ButtonxxxClick(Sender: TObject);
begin
  DataModule1.ZTable1.Insert;
  DataModule1.ZTable1.FieldByName('Cognome').Value := 'Wayne';
  DataModule1.ZTable1.FieldByName('Nome').Value := 'Bruce';
  DataModule1.ZTable1.FieldByName('Citta').Value := 'Gotham City';
  DataModule1.ZTable1.Post;
end;

Può essere che l'ordinamento di visualizzazione della griglia non sia corretto.
Se vuoi l'ordinamento per il campo ID ad esempio inserisci "ID" (senza virgolette) come valore della proprietà SortedFields della ZTable1.

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

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:informazioni per creare database
« Risposta #23 il: Novembre 10, 2021, 05:20:32 pm »
il primo bottone che quando premuto, con uno showmessage mi visualizza il secondo cognome memorizzato nel database,

Questa richiesta invece è posta in modo errato.
Non esiste un secondo cognome, così come l'hai detta tu, in un database.

Nei database esiste un ordinamento che per default segue la chiave primaria di modalità ascendente.
L'ordinamento per default dovrebbe essere secondo ID in formato numero, quindi 1,2,7,20,31,156, .....

Una volta chiarito ciò se vale ancora la tua richiesta, dobbiamo necessariamente eseguire una query sul database per carpire il secondo cognome.
E' da sottolineare che difficilmente ci saranno richieste tipo: dammi il quindicesimo numero che appre sul terza riga della tabella n. 5  ..... ho esagerato per far capire che i dati in un database si leggono e ragruppano in modo logico e che il "secondo" cognome non ha un senso pratico.

Ulteriore info, l'ordine di immissione e quindi probabilmente anche l'ordine originario rappresentato in una tabella normalmente ha poco senso in generale: prova a pensare a diversi operatori che immettono dati, l'ordine di immissione è quasi causale, ciò che importa normalmente è il contenuto e su quello verranno fatte le query.

Il dato si potrebbe prendere anche dalla griglia, ma a priori non sappiamo se la griglia ha qualche ordinamento suo, oppure magari qualche filtro che inibisce la visualizzazione di certe righe, ovvero non possiamo fare pieno affidamento sul componente grafico.

In ogni caso, per farla breve questo è il codice per la tua richiesta. La premessa è che tu inserisca nel DATAMODULE1 un componeten nuovo ZQUERY1 (di tipo TZQUERY) e compili l'abbinamento con la ZConnection (devi solo riempire una proprietà).

Codice: [Seleziona]
procedure TFMain.ButtonxxxClick(Sender: TObject);
begin
  DataModule1.ZQuery1.Active := false;
  DataModule1.ZQuery1.SQL.Text := 'Select * from Utenti order by ID';
  DataModule1.ZQuery1.Active := true;
  if DataModule1.ZQuery1.RecordCount > 1 then
    begin
      DataModule1.ZQuery1.RecNo := 2; //Secondo record
      ShowMessage(DataModule1.ZQuery1.FieldByName('Cognome').AsString);
    end
  else
   ShowMessage('Non ci sono record che soddisfano la richiesta');
end;

Ciao
« Ultima modifica: Novembre 10, 2021, 05:23:33 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:informazioni per creare database
« Risposta #24 il: Novembre 10, 2021, 05:31:39 pm »
Questo è un ulteriore modo, scorrendo tutti i record trovati:

Codice: [Seleziona]
procedure TFMain.Button4Click(Sender: TObject);
var counter: integer;
begin
  DataModule1.ZQuery1.Active := false;
  DataModule1.ZQuery1.SQL.Text := 'Select * from Utenti order by ID';
  DataModule1.ZQuery1.Active := true;
  if DataModule1.ZQuery1.RecordCount > 1 then
    begin
     counter := 0;
     DataModule1.ZQuery1.First;
     while not DataModule1.ZQuery1.Eof do
      begin
        if counter = 1 then //secondo record
          ShowMessage(DataModule1.ZQuery1.FieldByName('Cognome').AsString);
        DataModule1.ZQuery1.Next;
        inc(counter);
      end;
    end
  else
   ShowMessage('Non ci sono record che soddisfano la richiesta');
end;
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

casey

  • Newbie
  • *
  • Post: 43
  • Karma: +0/-0
Re:informazioni per creare database
« Risposta #25 il: Novembre 10, 2021, 09:55:11 pm »
il primo bottone che quando premuto, con uno showmessage mi visualizza il secondo cognome memorizzato nel database,

Questa richiesta invece è posta in modo errato.
Non esiste un secondo cognome, così come l'hai detta tu, in un database.

Nei database esiste un ordinamento che per default segue la chiave primaria di modalità ascendente.
L'ordinamento per default dovrebbe essere secondo ID in formato numero, quindi 1,2,7,20,31,156, .....

Una volta chiarito ciò se vale ancora la tua richiesta, dobbiamo necessariamente eseguire una query sul database per carpire il secondo cognome.
E' da sottolineare che difficilmente ci saranno richieste tipo: dammi il quindicesimo numero che appre sul terza riga della tabella n. 5  ..... ho esagerato per far capire che i dati in un database si leggono e ragruppano in modo logico e che il "secondo" cognome non ha un senso pratico.

Ulteriore info, l'ordine di immissione e quindi probabilmente anche l'ordine originario rappresentato in una tabella normalmente ha poco senso in generale: prova a pensare a diversi operatori che immettono dati, l'ordine di immissione è quasi causale, ciò che importa normalmente è il contenuto e su quello verranno fatte le query.

Il dato si potrebbe prendere anche dalla griglia, ma a priori non sappiamo se la griglia ha qualche ordinamento suo, oppure magari qualche filtro che inibisce la visualizzazione di certe righe, ovvero non possiamo fare pieno affidamento sul componente grafico.

In ogni caso, per farla breve questo è il codice per la tua richiesta. La premessa è che tu inserisca nel DATAMODULE1 un componeten nuovo ZQUERY1 (di tipo TZQUERY) e compili l'abbinamento con la ZConnection (devi solo riempire una proprietà).

Codice: [Seleziona]
procedure TFMain.ButtonxxxClick(Sender: TObject);
begin
  DataModule1.ZQuery1.Active := false;
  DataModule1.ZQuery1.SQL.Text := 'Select * from Utenti order by ID';
  DataModule1.ZQuery1.Active := true;
  if DataModule1.ZQuery1.RecordCount > 1 then
    begin
      DataModule1.ZQuery1.RecNo := 2; //Secondo record
      ShowMessage(DataModule1.ZQuery1.FieldByName('Cognome').AsString);
    end
  else
   ShowMessage('Non ci sono record che soddisfano la richiesta');
end;

Ciao

non intendevo il secondo cognome nel senso che hai detto tu,
intendevo appunto l'ID2

Devo fare un pò di prove per prenderci la mano,
ci ho capito un bel pò, ma ancora sono in alto mare.

Ma posso fare prove anche da un programma console?
così essendo più pulito, è tutto più facile.

Devo usare per forza Zeo con i relativi oggetti da mettere sul form?

se volessi fare un programmino console che appena lanciato nel database dell'esempio memorizzasse due nomi a caso,
e subito dopo chiuso il database,
lo interroghi e mi scriva con writeln sullo schermo ciò che è memorizzato,
si potrebbe fare?


DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:informazioni per creare database
« Risposta #26 il: Novembre 10, 2021, 10:28:55 pm »
Si, crei un programma console, ci aggiungi le uses che hai nel programma visuale che ti servono (riguardanti zeos ad esempio) e crei tutto a runtime. Devi stare attento a crere ed usare le interfacce e non le parti visuali (non hai il supporto visuale nei programmi console).

@bonmario ha riportato in qualche post precedente che usa il tutto a runtime. Prova a vedere i riferimenti che ha inserito in quel post.

Però, prima di andare alla console, a mio parere, dovresti lavorare un pò a livello Visuale: è più semplice fare prove, fare debug.

Ovviamente ripeto è solo un mio parere.

Inoltre già a livello visuale puoi incominciare ad usare le interfacce, a creare a runtime gli oggetti.

Ciao
« Ultima modifica: Novembre 10, 2021, 10:32:40 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

casey

  • Newbie
  • *
  • Post: 43
  • Karma: +0/-0
Re:informazioni per creare database
« Risposta #27 il: Novembre 10, 2021, 10:33:09 pm »
Si, crei un programma console, ci aggiungi le uses che hai nel programma visuale che ti servono (riguardanti zeos ad esempio) e crei tutto a runtime. Devi stare attento a crere ed usare le interfacce e non le parti visuali (non hai il supporto visuale nei programmi console).

@bonmario ha riportato in qualche post precedente che usa il tutto a runtime. Prova a vedere i riferimenti che ha inserito in quel post.

Però, prima di andare alla console, a mio parere, dovresti lavorare un pò a livello Visuale: è più semplice fare prove, fare debug.

Ovviamente ripeto è solo un mio parere.

Inoltre già a livello visuale puoi incominciare ad usare le interfacce, a creare a runtime gli oggetti.

Ciao

va bene,
domani sarò a casa e farò un pò di test tutto il giorno

grazie

casey

  • Newbie
  • *
  • Post: 43
  • Karma: +0/-0
Re:informazioni per creare database
« Risposta #28 il: Novembre 11, 2021, 12:23:12 am »
perfetto,
ho capito come funziona,

ho creato un nuovo progetto,
e nel form1 ho inserito tramite Zeos TZconnection che punta al database dell'esempio di prima, specificando il Protocollo Sqllite3,
e poi una TZquery che si collega a TZconection

poi ho messo un bottone nel form1 che esegue questo codice:
Codice: [Seleziona]
procedure TForm1.Button2Click(Sender: TObject);
begin
  Form1.ZQuery1.Active := false;
  Form1.ZQuery1.SQL.Text := 'Select * from Utenti order by ID';    //filtro
  Form1.ZQuery1.Active := true;    //attiva la query
  Form1.ZQuery1.First; //va al primo record
  ShowMessage(Form1.ZQuery1.FieldByName('Cognome').AsString);   //visualizza record corrente 'mouse'
  Form1.ZQuery1.edit;  //inizia modifica cognome record corrente
  Form1.ZQuery1.FieldByName('Cognome').Value := 'Rossi'; //modifica il cognome in Rossi
  Form1.ZQuery1.Post;  //fine modifica cognome corrente;
  Form1.ZQuery1.Recno := 2;     //va al record n. 2
  ShowMessage(Form1.ZQuery1.FieldByName('Cognome').AsString);  //visualizza il record n. 2 'De peppis'
  Form1.ZQuery1.First;    //torna al primo record
  ShowMessage(Form1.ZQuery1.FieldByName('Cognome').AsString);  //visualizza di nuovo il primo record (che stavolta è diventato Rossi)
end;           

ho capito così come leggere i record, spostarmi nel database, e modificare i campi

oltre i .Recno. .First . Next .edit
c'è anche il .delete per cancellare tutto il record?
il .post salva, giusto?

altre chicche da suggerire?


« Ultima modifica: Novembre 11, 2021, 12:24:58 am da casey »

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:informazioni per creare database
« Risposta #29 il: Novembre 11, 2021, 12:44:38 am »
Fai attenzione a quando navighi nei record, potresti avere brutte sorprese.

Quando fai delle modifiche (EDIT, INSERT, DELETE) o fai un SELECT, il puntatore al record (chiamato anche cursore) potrebbe non puntare al record che tu ritieni .... ossia quelle operazioni potrebbero modificare il record selezionato.

Inoltre anche altre attività sulla Query (come il refresh) modificano la posizione del cursore.

In genere, per fare una EDIT ad esempio si cerca di fare prima una SELECT che limiti il risultato a un solo rerocrd o a un numero limitato di record (ad esempio tutti quelli che si chiamano PIPPO e sono di Topolinia) poi andando a selezionarlo con il FIRST, NEXT, PREC o LAST.

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

 

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: 2
Guests: 91
Total: 93

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.