Newsgroup: it.comp.lang.delphi
Titolo: [D7]DbGrid

salve a tutti..
sto facendo un programmino per inserire dei documenti..
come se fosse una bolla o fattura..
la classica relazione testa/corpo di un master detail..
nn ho mai operato direttamente sulle grigli un po per ignoranza e un pò
per questioni di tempo/studio..
ora stavo facendo varie prove ma nn riesco a popolare la tabella..
ad esempio.. se inserisco nel dettaglio un campo codice.. (preso dalla
tabella codici) vorrei che questo tirasse su anche il descrittivo e
altri campi collegati..
come intercetto l'evento sulla tabella??..
o lo devo intercettare nel DBgrid?? (uso un componente IP4000 ma cmq la
minestra è quella)..
e poi compilo i campi rimanenti direttamente nella tabella???!
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 come intercetto l'evento sulla tabella??..
Hai le idee molto confuse. In Delphi, la TDBGrid viene collegata a un
TDatasource e il TDatasource viene collegato a un TDataset. 
Stai attento a quando dico "un TDataset". In realtà intendo una qualsiasi
istanza di una classe derivata dal TDataset. In Delphi, per implementare
l'astrazione del "dataset" ovvero insieme di dati, rifletta esso una
tabella del DB o il semplice risultato di una query, è stato adottato un
modello astratto: il TDataset, appunto.  Questo modello prevede le
operazioni standard ammissibili su tutti i "dataset", appunto, quali la
navigazione, l'editing e il post delle modifiche.
Nella pratica, se si vuol accedere a un DB, viene lasciata libertà
d'azione: la suite dbExpress offre una serie di classi derivate dal
TDataSet, come TSQLQuery e TSQLTable, per esempio (anche se andrebbe usata
solo la prima, con i RDBMS), la suite IBX offre TIBDataSet, TIBQuery,
TIBTable, mentre la suite ADO offre TADOQuery, TADOTable, e così via.
Quando parlo di avere l'istanza di una classe derivata dal TDataset,
intendo l'uso di uno di questi componenti specifici.  
In particolare, io utilizzo i ClientDataSet, che costituiscono un layer
ancora superiore, rispetto alle suite che ho citato. Si tratta di un
componente studiato per ottimizzare le operazioni lato client e rendere
atomiche in modo semplice le operazioni su un insieme di tabelle in
master-detail e la gestione della concorrenza tra utenti.  Ha molte
funzionalità avanzate, che sarebbe troppo lungo citare.
In ogni caso, per tornare al tuo problema, volendo implementare una
relazione master/detail tipica del tipo: documento <-- riga_documento,
supponendo di avere le tabelle:
documento (id(pk), numero, data, ...)
           ^--------v
riga_documento (id, id_documento(fk), articolo, quantità, prezzo, ....)
L'organizzazione che adopero di solito è: datasource e dbgrid sulla
maschera e l'istanza del dataset nel datamodule.  Nel tuo caso, quindi,
avrai la dbgDocumento, che mostrerà i dati del documento contabile e la
dbgRigaDoc che mostrerà i dati della riga del documento.  I datasource
rispettivi saranno dsDocumento e dsRigaDoc.
|-------- sulla form --------|   |------ nel datamodule -------|
dbgDocumento---->dsDocumento------->cdsDocumento 
dbgRigaDoc------>dsRigaDoc--------->cdsRigaDoc
Come implementare la relazione M/D tra cdsDocumento e cdsRigaDoc è
semplice:
Bisogna aggiungere il DataSetProvider principale che servirà a gestire
l'interazione vera e propria con il db finale:
   |---------------- nel datamodule ------------------|
..-->cdsDocumento-->dspDocumento
..-->cdsRigaDoc
Il DataSetProvider dovrà puntare a un componente TSQLQuery che farà da
accesso vero e proprio alla tabella "documento":
   |---------------- nel datamodule ------------------|
..-->cdsDocumento-->dspDocumento-->sqlDocumento
..-->cdsRigaDoc
La proprietà SQL.Text della sqlDocumento conterrà il codice SQL per
l'accesso al dato vero e proprio:
select * from documento where id=:id
Il dato di dettaglio, invece, va reperito legandolo (ovviamente)
all'informazione master, quindi avrai qualcosa del tipo:
      |---------------- nel datamodule ------------------|
..-->cdsDocumento-->dspDocumento-->sqlDocumento
..-->cdsRigaDoc                    sqlRigaDoc
sqlRigaDoc non è per ora legato a nulla, ma conterrà, nella proprietà
SQL.Text, il seguente codice:
select * from riga_documento where id_documento=:id
(seleziona tutte le righe documento che hanno id_documento uguale all'id
del documento "id")
Il valore di questo "id" verrà prelevato mediante un DataSource che punta
a sqlDocumento:
      |---------------- nel datamodule -----------------------------|
..-->cdsDocumento-->dspDocumento-->sqlDocumento<-----dsDocumento
..-->cdsRigaDoc                    sqlRigaDoc--------^
Mancano solo due ultimi step: bisogna fare doppio click sul cdsDocumento e
aggiungere i campi cosiddetti persistenti. Tra di essi comparirà anche un
TDatasetField chiamato: cdsDocumentosqlRigaDoc (nome un po' astruso, ma
che è semplicemente una composizione del nome del dataset e del nome
"sqlRigaDoc").
Questo nome andrà assegnato alla proprietà DatasetField di cdsRigaDoc,
completando il giro della relazione.
Ovviamente, le due TSQLQuery dbExpress, sqlDocumento e sqlRigaDoc andranno
poi legate a un componente TSQLConnection, che punterà al DB vero e
proprio.
Considera, però, che questo non è l'unico modo di implementare il
master/detail (guarda anche le proprietà MasterSource e MasterFields) e
per quanto comodo, è il più dispendioso, perché il cdsRigaDoc finisce per
essere un dataset "nested" in quello master. I suoi dati verranno quindi
caricati *tutti*, una volta aperto il CDS master.
Spero che la spiegazione sia chiara, l'ho scritta al volo, potrei aver
tralasciato dettagli importanti, ma tu prova ugualmente.
 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 tralasciato dettagli importanti, ma tu prova ugualmente.
Spiegazione esemplare, grazie :)
-- 
Morde

 TDatasource e il TDatasource viene collegato a un TDataset. 
grazie.. mi sono espresso male ovvio che la Dbgrid è collegata con il
dataset..
intendevo che indirettamente era collegata alla griglia..
nn sono molto tecnico scusa.. :(
grazie 1000 della spiegazione anche se nn era quello che cercavo
mi hai risolto molte lacune ;) cmq grazie :D
ma io cmq chiedevo una cosa diversa..
io ho 3 tabelle..
la tabella di testa
la tabella di dettaglio (collegata come hai detto tu)
e una tabella articoli (collegata per alla tabella dettaglio ma nn in
modo "stretto"
solo per movimetazione e storico degli articoli)..
quindi la tabella dettaglio deve essere popolata da articoli.. (gli
articoli che andiamo a vendere
con il nostro documento.. che popolano le righe del doc)
che sono presenti appunto nella tabella articoli..
quindi io nel mio campo cod articolo (sempre nella tabella dettaglio)
premo il mio tasto "gestione" oppure scrivo il codice articolo..
ecco a questo punto voglio "automaticamente" pescare dalla tabella
articoli
i miei campi descrizione, costo ecc.. per popolare la tabella
dettaglio..
ecco come intercetto questo???..
come "visualizzo" i dati collegati all'articolo (quindi descr. costo)
nella TDBGRID????!!
Io fino ad esso gestivo questi con dei semplici Tedit una volta
confermata la riga
facevo la mia dovuta registrazione nella tabella di dettaglio..
idem per l'edit caricavo i dati della riga selezionata sui Tedit facevo
le modifiche e infine
la tabella in edit e poi.. il post..
insomma credo tu abbia capito..
ora questi passaggia arcaici e macchinosi vorrei farli direttamente
dalla
TDBgrid (io uso la griglia degli IP con ADO e D7 cmq sempre una TDBGID)
ecco come posso fare?!
ho visto da alcuni gestionali che si può fare è + gestibile rapido e
funzionale
e vorrei farlo anchio!
mi potete aiutare..
dove devo intervenire??!
grazie.. e scusa ancora se nn mi sono fatto capire.. :(


nella TDBGRID????!!
Con dei campi di look-up.  Facendo doppio click sul tuo componente
TDataset, si creano come campi persistenti, impostando le proprietà di
"pescaggio" dal dataset degli articoli.  In questo modo, mostrando i
campi di look-up nella griglia, sarà anche possibile cambiare
articolo, cliccando sul campo della griglia, che si trasformerà in una
combobox.

combobox.
si ok..
ma io nn devo trasportare solo un campo ma + campi..
questo nn riesco a farlo..
come faccio?!


 come faccio?!
Già detto.


 Già detto.
scusa la mia ignoranza ma continuo a nn capire..
ecco cosa voglio fare io..
http://img86.imageshack.us/img86/2052/comboma3.jpg
il campo codice è un lookup..
pero mi deve tirar su anche gli altri campi..
ho risolto ospitando i valori nella tabella dettaglio!! (e rendendoli
di sola lettura in modo che l'utente nn potesse modificarli)
ma cmq sono campi che nn mi servono.. (ci vorrebbe un inner join  in
tempo reale..
ma è questo che nn riesco a fare)
so come fare i lookup..
http://img170.imageshack.us/img170/5305/combo2cl1.jpg
un'altra cosa..
come posso bloccare L'INSERT in una tabella???..
attenzione solo l'insert l'edit deve essere possibile..
nn posso inserire nuovi record..
ciao e grazie.
