Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: Serpente80 - Febbraio 22, 2013, 05:17:38 pm

Titolo: Firebird + Zeos
Inserito da: Serpente80 - Febbraio 22, 2013, 05:17:38 pm
Salve  :D
Uso Lazarus da un paio di annetti e ho sviluppato qualche programmino su SQLite senza troppi problemi.
Ora vorrei fare il salto e passare a firebird per un progetto un attimo più serio.
Non ho mai avuto a che fare seriamente con DB relazionali.
Ora espongo il mio problema:
Mettiamo che io voglia creare un form "SCHEDA" che contenga i dati del cliente sotto forma di DBedit, e l'elenco degli ordini sotto forma di DBgrid.
Da quello che ho capito dovrei creare 2 tabelle: Clienti e Ordini, creare una relazione tra le 2 e caricare i dati delle rispettive tabelle tramite 2 Zquery e 2 datasource separati.
E' così o sono totalmente in alto mare ?
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 22, 2013, 05:26:49 pm
diciamo che ci sei, non sei sicuramente in alto mare
però per gli ordini forse dovresti creare 2 tabelle:
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 22, 2013, 05:31:48 pm
Si, m'era pure venuto il dubbio che le tabelle dovessere essere addirittura 3.
Ma come le "collego" in modo che passando alla scheda successiva si aggiornino tutti i dati ?
Devo fare tutto via codice o esiste un modo automatico ?
Titolo: Re:Firebird + Zeos
Inserito da: Stilgar - Febbraio 22, 2013, 05:32:21 pm
Dove testata faccia da master table per dettaglio...
Altrimenti sai che bordellone cercare di capire ;)
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 22, 2013, 05:46:00 pm
Avete per caso una buona guida per FlameRobin ? In particolare che mi faccia capire come creare correttamente una relazione tra tabelle.
Ho provato ad impostare primary e foreign key di 2 tabelle ma non so se l'ho fatto in modo giusto.
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 22, 2013, 06:31:09 pm
Avete per caso una buona guida per FlameRobin ? In particolare che mi faccia capire come creare correttamente una relazione tra tabelle.
Ho provato ad impostare primary e foreign key di 2 tabelle ma non so se l'ho fatto in modo giusto.

in questo caso non ti serve una guida per flame robin ma una per sql ;)
posta le 2 PK e la "ADD CONSTRAINT"
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 22, 2013, 06:33:17 pm
Appena rientro posto il pastrocchio  :)
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 23, 2013, 11:19:32 am
Ecco:

(https://dl.dropbox.com/u/8521732/pk.jpg)

Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 23, 2013, 11:33:48 am
sembra corretta

permettimi un paio di consigli ;)

1) abituati a leggere il DDL (istruzioni SQL per definizione tabelle etc)
nel tuo caso dovresti trovare
ALTER TABLE ORDINI
ADD CONSTRAINT FK_ORDINI_1
FOREIGN KEY (CLIENTEID) REFERENCES TABLE CLIENTI (ID);
a prescindere dalla GUI che usi, una frase simile verrà comunque generata: se è giusto si vede meglio da quà ;)

2) chiama le primary key come PK_NOME_TABELLA
non è di sicuro una regola ma se dai un prefisso, dall'interno dei tuoi programmi puoi intercettare le eccezioni e tentare di dare un messaggio decente all'utente


Edit:
una domanda: nella tabella CLIENTI c'è un campo ORDINI.
Che uso intendi farne?
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 23, 2013, 11:53:28 am
Si, la DDL dice esattamente quello che hai scritto.
Il campo ordini in effetti l'ho messo lì ma non mi erano ben chiari alcuni concetti.
Il parametro restrict in update e delete cosa significa ?
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 23, 2013, 01:47:22 pm
Il parametro restrict in update e delete cosa significa ?

nul tuo caso significa che non puoi cambiare il campo ID di un record della tabella CLIENTI se c'è un solo record nella tabella ORDINI dove il campo CLIENTEID ha il suo riferimento.

se fosse stato specificato CASCADE si avrebbe avuto un comportamento un sacco interessante: al variare del valore del campo ID di un record della tabella CLIENTI, tutti i record della tabella ORDINI (dove si verifica il riferimento CLIENTEID / ID) avrebbero subito un aggiornamento del campo CLIENTEID allo scopo di mantenere l'integrità referenziale.

forse sono stato un po' contorto nella spiegazione? :P
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 23, 2013, 02:23:27 pm
Ho capito.
Ma esiste un modo per caricare dati da diverse tabelle, su diversi controlli (dbedit,dbgrid) usando una singola query ?
E c'è un modo "automatico" per collegare tot articoli ad un ordine o bisogna fare via codice ?
Perdonate la niubbaggine  :(
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 23, 2013, 02:52:42 pm
Ma esiste un modo per caricare dati da diverse tabelle, su diversi controlli (dbedit,dbgrid) usando una singola query ?

solitamente il collegamento database->controlli passa per un dataset ed un datasource.
Un datasource punta ad un dataset (quest'ultimo riceve i dati dal database). N controlli puntano ad uno stesso datasource (e quindi più controlli possono manipolare lo stesso campo).
E' una suddivisione dei compiti di ciascuna classe molto logica e radicata nella programmazione. Anche ADO sotto win funziona così nonostante alcune differenze di implementazione.

E c'è un modo "automatico" per collegare tot articoli ad un ordine o bisogna fare via codice ?

Mi sa che non ho capito "o bisogna fare via codice"...
Comunque, in linea generale nel database devi avere un'altra tabella che colleghi N articoli ad uno stesso ordine. Queste due tabelle devono essere gestite da 2 dataset e 2 datasource.

Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 24, 2013, 04:14:06 pm
In effetti mi sono spiegato da cani.
Volevo dire:
In visual studio una volta create tabelle e relazione, e trascinati i controlli sul form, in automatico collega i dati delle 2 tabelle. É possibile fare una cosa del genere in lazarus o bisogna fare via codice ? Non che mi pesi il culo, ma scoprire che esiste un modo easy dopo aver scritto un mare di codice mi darebbe alquanto fastidio :-)
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 24, 2013, 05:14:37 pm
visual studio non lo conosco quindi non so fare paragoni.
però lazarus ti permette di creare le relazioni master/detail impostando i campi chiave e poco altro.
non sarà automatico nel senso del riconoscimento delle pk ma non serve scrivere codice.
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 24, 2013, 05:21:32 pm
Mica hai qualche esempio da mostrare ? Te ne sarei eternamente grato.
Titolo: Re:Firebird + Zeos
Inserito da: xinyiman - Febbraio 24, 2013, 05:36:43 pm
Serpente ma tu non vorrai vedere delle combobox all'interno della dbgrid tipo in access?! Cioè che grazie alle relazioni automaticamente ti imposta le combobox e via discorrendo?!
Titolo: Re:Firebird + Zeos
Inserito da: Stilgar - Febbraio 24, 2013, 07:05:33 pm
xinyiman... in Delphi quando dicevi che un campo era di lookup su di un'altra entità ti ti forniva la combobox ... sospetto che sia quello che sta chiedendo.
Data una DBGrid, impostati i campi di lookup, messi in relazione tra di loro:come mai non esce la combo di conseguenza?
Serpente.
Allora devi creare un campo "virtuale" nella tua DataSet.
Al wizard devi indicare che è un campo di Lookup.
Imposti le info che servono e ottieni il comportamento delle combo nel caso di campi di lookup.
(Visual Studio ... .Net? Se è .Net il papà di questo linguaggio è lo stesso di Delphi ... quindi il 90% delle cose sono simili, magari si ottengono con un giro del fumo diverso da quello in cui sei abituato).

Stilgar
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 25, 2013, 11:15:12 am
No, non parlavo del lookupcombobox.
Riformulo ...
Ho un DB con 3 tabelle: CLIENTI,ARTICOLI e SCHEDE.
La tabella schede deve "unire" gli ARTICOLI di un dato CLIENTE.
Ho questo form:
(https://dl.dropbox.com/u/8521732/testzeos.jpeg)
Posso gestire le 3 tabelle utilizzando una solo query/datasourse o me ne serve una per ogni tabella ?
C'è un modo "automatico" per far capire al DB che a quella SCHEDA deve associare un determinato cliente e tot articoli ?
Titolo: Re:Firebird + Zeos
Inserito da: Stilgar - Febbraio 25, 2013, 11:44:38 am
Se mi dai la struttura delle tabelle con le chiavi esterne ti posso aiutare.
Stilgar
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 25, 2013, 11:53:01 am
Ecco:
(https://dl.dropbox.com/u/8521732/tabelle.jpeg)

(https://dl.dropbox.com/u/8521732/ddl.jpeg)

Se non sono chiare te le rimando.
Titolo: Re:Firebird + Zeos
Inserito da: Stilgar - Febbraio 25, 2013, 03:05:23 pm
Bene ... nelle alter table hai i campi che devi impostare come chiavi di "match" tra le tabella slave (articoli e cliente) alla master (scheda).
Solo che devi "girare" il rapporto.

Quindi per fare un esempio:
Imposti schede come master della clienti.
Imposti Schede.IDCliente come campo di riferimento da mettere in relazione Cliente.IDDCliente.
Prova e fammi sapere.
Stilgar
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 25, 2013, 03:40:18 pm
c'è qualcosa che non mi convince tra la gui e la definizione delle tabelle

Da quello che vedo, la tabella SCHEDE ha una relazione 1:1 sia con CLIENTI che con ARTICOLI (infatti la PK di SCHEDE è IDSCHEDE).

Nell'immagine del form però c'è una griglia e quando leggo "La tabella schede deve "unire" gli ARTICOLI di un dato CLIENTE" mi viene da pensare che in realtà la relazione tra SCHEDE e ARTICOLI dovrebbe essere 1:N.
In questo caso la PK di SCHEDE dovrebbe essere IDSCHEDE + IDARTICOLO.

Le intenzioni potrebbero anche essere altre ma se si vuole che un IDSCHEDE rappresenti un legame con tutti gli articoli secondo me bisogna aggiungere IDARTICOLO alla PK
Titolo: Re:Firebird + Zeos
Inserito da: Stilgar - Febbraio 25, 2013, 04:18:24 pm
nomore, schede è la rappresentazione di una relazione n a m con attributi.
Nulla di assurdo ;)
IDScheda è una chiave artificiale e non naturale ;)
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 25, 2013, 04:26:41 pm
State parlando arabo  :'(
Titolo: Re:Firebird + Zeos
Inserito da: Stilgar - Febbraio 25, 2013, 04:45:12 pm
albrulabtasa.  .... forse è più chiaro :D

Serpente. Allora la questione è semplice.
Vuoi legare una entità (tabella) ad un'altra.
Questo via DDL lo fai con i costrutti di foreign key.
Nel caso di rapporti 1 a N basta una semplice chiave esterna e la questione è terminata.
Nel caso di rapporti N a M devi appoggiarti ad una tabella di legame.
Nel tuo caso la tabella SCHEDE è la tabella di legame.
Questa contiene le chiavi esterne sulle entità di riferimento (CLIENTE E ARTICOLO).

La cosa non è sbagliata e nemmeno senza senso.
Un cliente può comperare più articoli.
Un articolo può essere comperato da più clienti.
A questa relazione intermedia metti altre infomazioni (N a M con attributi).

Stilgar
EDIT PS:
Le speculazioni che facevamo con Nomore sono legate alla chiave e agli indici, per questioni di velocità nelle ricerche e altre amenità che si possono considerare anche in un secondo momento.
Ri-Stilgar
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 25, 2013, 04:53:14 pm
Spè, una cosa per volta  ;D
N ed M stanno per ?
Come rendo Master la tabella SCHEDE ?
Cosa dovrei modificare nel DB ?
Ve l'ho detto che non ho mai avuto a che fare seriamente coi DB relazionali  :(
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 25, 2013, 05:22:35 pm
nomore, schede è la rappresentazione di una relazione n a m con attributi.
Nulla di assurdo ;)
IDScheda è una chiave artificiale e non naturale ;)

nel database l'intenzione sembra quella ma la gui, d'altro canto, mi sembra che nasca con un'altra idea
potrebbe essere se nell'immagine del form, i campi DATA e CLIENTE, quelli fuori dalla griglia in realtà non sono campi ma semplici TEdit da usare come filtri di ricerca per farci una select

poi una relazione N:M non dovrebbe permettere l'esistenza di situazioni ambigue tipo

SchedaClienteArticoloDataNote
1758GOLF01/01/2013nota 1
2758GOLF01/01/2013nota 2
3758GOLF01/01/2013nota 1

ok, è illogico caricare come sopra, ma è possibile, quindi: se vengono caricati record così, cosa ci si fa? :)

@Serpente
scusa la curiosità, ma cosa dovresti rappresentare con la tabella SCHEDE?
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 25, 2013, 05:27:09 pm
Spè, una cosa per volta  ;D
N ed M stanno per ?
Come rendo Master la tabella SCHEDE ?
Cosa dovrei modificare nel DB ?
Ve l'ho detto che non ho mai avuto a che fare seriamente coi DB relazionali  :(

anche tu una cosa per volta :D
come dicevo nell'altro post, scpiegaci meglio cosa vuoi fare con SCHEDE
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 25, 2013, 05:31:27 pm
Come dicevo,
Il form SCHEDA deve contenere la data dell'ordine, le note, i dati del cliente e gli articoli nella dbgrid.
Ma non date troppo retta alla struttura del mio DB, che potrei aver cannato totalmente.
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 25, 2013, 06:52:53 pm
in questo caso farei qualcosa del genere:

1) dalla tabella SCHEDE elimina IDARTICOLO (campo e FK)
2) nuova tabella detail per gli articoli (e le date evasioni)
Codice: [Seleziona]
CREATE TABLE SCHEDE_RIGHE (
IDSCHEDE INTEGER NOT NULL,
IDRIGA INTEGER NOT NULL,
IDARTICOLO INTEGER NOT NULL
)
ALTER TABLE SCHEDE_RIGHE
ADD CONSTRAINT PK_SCHEDE_RIGHE
PRIMARY KEY (IDSCHEDE, IDRIGA);

ALTER TABLE SCHEDE_RIGHE
ADD CONSTRAINT FK_SCHEDE_RIGHE1
FOREIGN KEY (IDSCHEDE) REFERENCES SCHEDE(IDSCHEDE);

ALTER TABLE SCHEDE_RIGHE
ADD CONSTRAINT FK_SCHEDE_RIGHE2
FOREIGN KEY (IDARTICOLO) REFERENCES ARTICOLI(IDARTICOLO);

in questo modo hai:
- SCHEDE che sarebbe il master degli ordini (dove mettere tutti i campi testata e piede documento)
- SCHEDE_RIGHE che sarebbero le righe con gli articoli di un solo ordine

Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 26, 2013, 10:09:26 am
Ho modificato il DB come dici, ma continuo a non capire se posso gestirlo tramite il form postato poco fa con un'unica Zquery e un unico Datasource.
La proprietà SQL della query è la seguente: select * from schede,schede_righe,articoli,clienti
Ma quando vado per fare il commit mi dice che non può aggiornare una query complessa con più di una tabella.
Titolo: Re:Firebird + Zeos
Inserito da: Stilgar - Febbraio 26, 2013, 10:44:23 am
Serpente Pian e Ben. (Sono due amici che mi aiutano spesso).
Vuoi gestire 4 entià con un una sola query?
Fai 4 query. In questo modo puoi evitare gran casini in futuro.
I componenti dataAware ti aiutano a gestire le relazioni (nascono per farlo).
Imposta le relazioni ai componenti dei dati. Trovare altre strade è 1) Difficile. 2) Non danno garanzie.

Stilgar
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 26, 2013, 11:03:58 am
Stilgar ha ragione
non ha senso "risparmiare" sui dataset: nascono per semplificare la vita in questi casi.
Crea un datamodule ed imposta 1 Zquery ed 1 datasource per ogni tabella, vedrai che ne guadagni in funzionalità e manutenibilità.
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 26, 2013, 11:10:54 am
Era quello che stavo cercando di dirvi da circa 2 giorni  :'(
Per questo chiedevo se esisteva una scorciatoia.
Titolo: Re:Firebird + Zeos
Inserito da: Stilgar - Febbraio 26, 2013, 11:18:52 am
Bravo Serpente. Hai nominato il demonio ... scorciatoia.
La via del software non funzionante è lastricato di scorciatoie ...
mmm non ricordo .. mi sembrava fosse così il proverbio ...
Forse sbaglio ...

Stilgar
Titolo: Re:Firebird + Zeos
Inserito da: xinyiman - Febbraio 26, 2013, 11:33:42 am
Bravo Serpente. Hai nominato il demonio ... scorciatoia.
La via del software non funzionante è lastricato di scorciatoie ...
mmm non ricordo .. mi sembrava fosse così il proverbio ...
Forse sbaglio ...

Stilgar

Hahahahahaha
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Febbraio 26, 2013, 11:45:33 am
 ;D
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Febbraio 26, 2013, 11:56:03 am
 ;D
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Marzo 05, 2013, 04:42:43 pm
Ma esiste una BUONA guida/manuale su Firebird ? Sul sito ufficiale non ho trovato nulla di particolarmente utile.
Vorrei capire come funzionano le procedure, o come attivarle, ma trovo tutto confuso.
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Marzo 05, 2013, 05:47:04 pm
se lo vuoi usare con zeos puoi provare questa guida, è per delphi ma i componenti sono gil stessi
http://zeos.firmos.at/kb.php?mode=article&k=12 (http://zeos.firmos.at/kb.php?mode=article&k=12)

per capirci di più sul database
http://www.firebirdsql.org/manual/it/qsg2-it.html (http://www.firebirdsql.org/manual/it/qsg2-it.html)
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Marzo 05, 2013, 05:54:46 pm
Tanta roba, grazie.
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Marzo 13, 2013, 01:54:24 pm
Il programma procede, a rilento, ma procede.
Ho un altro problema, non riesco ad usarlo via client. Su server funziona tutto, ma da client non riesco a collegarmi al DB.
Ho impostato la proprietà hostname con l'ip del server e la proprietà Database come E:\percorso\db.fdb.
Sbaglio qualcosa ? Uso ovviamente Zeos, ed ho installato Firebird sul client con la procedura CLIENT.
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Marzo 14, 2013, 08:25:46 am
Nessuno sa aiutarmi ?
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Marzo 14, 2013, 09:21:29 am
se usi un tool tipo flamerobin dal client, riesci a collegarti?
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Marzo 14, 2013, 09:45:35 am
Devo provare.
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Marzo 14, 2013, 09:52:03 am
Si, FlameRobin si collega correttamente dal client.
Ho provato ad aprire la porta 3050 del server senza successo.
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Marzo 14, 2013, 02:03:50 pm
Sto impazzendo  :'(
Titolo: Re:Firebird + Zeos
Inserito da: Stilgar - Marzo 14, 2013, 02:09:48 pm
Domanda scema, hai impostato i parametri di connessioni uguali a FlameRobin?

Stilgar
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Marzo 14, 2013, 02:12:16 pm
Uguali.
Titolo: Re:Firebird + Zeos
Inserito da: nomorelogic - Marzo 14, 2013, 04:00:19 pm
ok, altra prova:
invece che con zeos, prova la libreria SqlDb

il database si specifica con
Codice: [Seleziona]
IP:PATH
tipo
Codice: [Seleziona]
127.0.0.1:E:\percorso\db.fdb

Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Marzo 14, 2013, 04:39:48 pm
Ho risolto:

Zconnection.hostname = ip del server
Zconnection.database = percorso assoluto del DB
Zconnection.port = 3050

Ora funge a meraviglia.
Titolo: [RISOLTO] Re:Firebird + Zeos
Inserito da: Stilgar - Marzo 14, 2013, 04:46:04 pm
Ok, chiudo allora.
Titolo: Re:Firebird + Zeos
Inserito da: Serpente80 - Marzo 14, 2013, 05:48:41 pm
No, che chiudi.
Tanto salta fuori qualche altro problema  :D