Il linguaggio di programmazione Delphi
 

Query passata come property

Stark 2 Nov 2016 23:43
Nell'ambito di una applicazione, ho un form che si occupa di offrire
all'utente uno strumento per ricerche di vario genere. Il form include un
componente TQuery che viene usato per interrogare un dataset in vari modi.
Tutti i campi del dataset sono dichiarati persistenti e ce ne sono alcuni
calcolati ricorrendo anche a dataset collegati.
Lo stesso congegno è duplicato altrove, ospitato in un datatModule.
Volevo quindi sbarazzarmi del componente nel form delle ricerche (li, per
ragioni storiche), ma, per altre ragioni, non volevo includere il
riferimento al dataModule.

Che ne dite della soluzione di passare al form ricerche il dataset
dichiarato nel DataModule, inserendo nel form ricerche una property così:

private
fQMovim: TQuery;
public
property QMovim: TQuery read fQMovim write fQMovim;

Chiedo commenti e consigli. Grazie
Morde 4 Nov 2016 11:02
On 02.11.2016 23:43, Stark wrote:

> Lo stesso congegno è duplicato altrove

Rendi ogni form autonoma,separando le logiche di business e mantenendo
il tuo software disaccoppiato e ben coeso.

Il form delle ricerche **sa** che ricerche fare e come, è inutile che lo
rendi accessibile in scrittura da tutti esponendo la tquery come
property R/W.

Se le logiche di ricerca sono duplicate altrove e cambiano di pochi
particolari, puoi aggregarle nel form ricerche in modo mirato, randendo
il suo comportamento differente in funzione di alcuni flag che passerai.

--
Morde
Stark 4 Nov 2016 15:26
Rendi ogni form autonoma,separando le logiche di business e mantenendo
il tuo software disaccoppiato e ben coeso.
Morde

Ma è proprio tentando di rispondere a questa pratica che volevo togliere dal
form ricerche il riferimento a un dataModule pieno di altri dataset che non
gli servono e passargli il riferimento a un dataset esterno.. Come posso
fare altrimenti quello che tu dici ?
Morde 4 Nov 2016 15:43
On 04.11.2016 15:26, Stark wrote:

> Ma è proprio tentando di rispondere a questa pratica che volevo togliere
> dal form ricerche il riferimento a un dataModule pieno di altri dataset
> che non gli servono e passargli il riferimento a un dataset esterno..
> Come posso fare altrimenti quello che tu dici ?
Allora stai facendo giusto, continua su questa strada.

PS: i tuoi followups sono privi di quoting, cerca di sistemare perchè
sono spesso illeggibili -non si capisce quando scrivi tu e quando
l'altro cui stai rispondendo-

--
Morde
Daniele 5 Nov 2016 11:29
Ciao Stark,
hai il tuo datamodule che ha un nome (DM1) ed e' contenuto in una unit
(Unit_DataModule.Pas).
all'interno del tuo DM1 c'e' un componente TQuery (Movim), oltre a chissa'
cos'altro.

Nella tua form di ricerca devi solo mettere nelle uses la Unit_DataModule e
poi usare quello che ti serve, per esempio

DM1.Movim.Sql.Clear;
DM1.Movim.Sql.Add('Select * from MyTable where .....');
DM1.Movim.Active:=True;

Come ha indicato Morde, nella form di ricerca tu sai quello che devi fare e
(a colpi di flag) costruisci la tua query.

Se poi il tuo datamodule ha 100 componenti (tra tutti) nulla ti vieta di
crearti piu' dataset ognuno dei quali ha il suo Tquery.
A titolo personale, piu' e' separato ..... meglio e' !!

Ciao

Daniele
Stark 5 Nov 2016 15:59
"Daniele" ha scritto nel messaggio news:nvkcaq$okb$1@gioia.aioe.org...

Ciao Stark,
hai il tuo datamodule che ha un nome (DM1) ed e' contenuto in una unit
(Unit_DataModule.Pas).
all'interno del tuo DM1 c'e' un componente TQuery (Movim), oltre a chissa'
cos'altro.

Nella tua form di ricerca devi solo mettere nelle uses la Unit_DataModule e
poi usare quello che ti serve, per esempio

DM1.Movim.Sql.Clear;
DM1.Movim.Sql.Add('Select * from MyTable where .....');
DM1.Movim.Active:=True;

Come ha indicato Morde, nella form di ricerca tu sai quello che devi fare e
(a colpi di flag) costruisci la tua query.

Se poi il tuo datamodule ha 100 componenti (tra tutti) nulla ti vieta di
crearti piu' dataset ognuno dei quali ha il suo Tquery.
A titolo personale, piu' e' separato ..... meglio e' !!
Ciao Daniele
--
Vuoi dire 'più datamodule' ?
Nel mio caso, nel dataModule che avrei dovuto inserire negli uses ho anche
tutte le proc connesse ai vari dataset che hanno un certo livello di
generalizzazione. Pertanto mi pareva inutile e pesante inserirlo e inoltre
volevo eliminare qualsiasi dipendenza da altri moduli. Mi pareva che
trasmettendo alla form ricerche il dataset da usare tramite una property
raggiungessi proprio questo obiettivo.
4ndre4 5 Nov 2016 21:16
On Friday, 4 November 2016 10:02:44 UTC, Morde wrote:

[...]
Inutile dargli consigli: alla fine fara` comunque a modo suo.
Stark 6 Nov 2016 09:25
Inutile dargli consigli: alla fine fara` comunque a modo suo.
---
Questo non è vero. Data la mia debolezza tecnica, a volte non so applicarli
i consigli, ma cerco di farlo
Daniele 7 Nov 2016 11:49
Ciao,

> Vuoi dire 'più datamodule' ?
Si, a volte non e' difficile fare delle sviste !!!

> Nel mio caso, nel dataModule che avrei dovuto inserire negli uses ho anche
> tutte le proc connesse ai vari dataset che hanno un certo livello di
> generalizzazione. Pertanto mi pareva inutile e pesante inserirlo e inoltre
> volevo eliminare qualsiasi dipendenza da altri moduli. Mi pareva che
> trasmettendo alla form ricerche il dataset da usare tramite una property
> raggiungessi proprio questo obiettivo.

Quello che io seguo, e forse anche gli altri, e' definire solo i vari
componenti nel form/unit che contiene tutti i componenti per gestire i dati.
Poi nella form (o piu' form) di ricerca includo nelle uses la form/unit dove
risiede il datamodule che devo utilizzare e poi il codice necessario per le
ricerche.
Come vedi ho separato tutto, unit datamodule (il piu' pulito in assoluto con
zero linee di codice, se non strettamente necessario) e unit/form di
ricerca, domani in caso di manutenzione sulla ricerca lavoro solo su quella
form senza toccare nulla di altro.
Non e' detto che tenere tutto separato sia la strategia migliore, pero'
aiuta.

Nel tuo caso, se vuoi seguire questa filosofia, c'e' da lavorare non poco
perche' il codice nella unit del datamodule lo devi spostare (con le
modifiche del caso) nella form di ricerca.
Prima o poi questo passo lo devi fare; tieni presente che questo ng e'
seguito da personaggi che hanno un'esperienza piu' che decennale in questo
campo (evidentemente non io) e si deve far tesoro dei loro suggerimenti.
Questo significa che se devi riscrivere una paccata di codice per rendere
tutto piu' performante, leggibile, mantenibile, questo devi fare; oggi ti
sembrera' tempo perso, ma domani sara' tutto piu' facile.

Come sempre, buona giornata e buon lavoro

Ciao

Daniele
Stark 7 Nov 2016 14:31
Quello che io seguo, e forse anche gli altri, e' definire solo i vari
componenti nel form/unit che contiene tutti i componenti per gestire i dati.
Poi nella form (o piu' form) di ricerca includo nelle uses la form/unit dove
risiede il datamodule che devo utilizzare e poi il codice necessario per le
ricerche.
Come vedi ho separato tutto, unit datamodule (il piu' pulito in assoluto con
zero linee di codice, se non strettamente necessario) e unit/form di
ricerca, domani in caso di manutenzione sulla ricerca lavoro solo su quella
form senza toccare nulla di altro.
Non e' detto che tenere tutto separato sia la strategia migliore, pero'
aiuta.

Nel tuo caso, se vuoi seguire questa filosofia, c'e' da lavorare non poco
perche' il codice nella unit del datamodule lo devi spostare (con le
modifiche del caso) nella form di ricerca.
Prima o poi questo passo lo devi fare; tieni presente che questo ng e'
seguito da personaggi che hanno un'esperienza piu' che decennale in questo
campo (evidentemente non io) e si deve far tesoro dei loro suggerimenti.
Questo significa che se devi riscrivere una paccata di codice per rendere
tutto piu' performante, leggibile, mantenibile, questo devi fare; oggi ti
sembrera' tempo perso, ma domani sara' tutto piu' facile.

Come sempre, buona giornata e buon lavoro

Ciao

Daniele
---
Ti ringrazio molto per i consigli che riconosco sono molto sensati, tanto
che ho cercato di lavorare proprio in vista dell'obiettivo della separatezza
dei compiti. Naturalmente, mi trovo con un arretrato con il quale fare i
conti e che cerco di aggiustare man mano.
Il form ricerche ora non ha più nessun legame con altre units. L'unico
vincolo sono i dataset: Il principale è quello che viene interrogato con
delle query, e altri due o tre dataset di riferimento con i quali a volte
devo completare i dati delle query.
Poichè il form ricerche è richiamato da un' altra unit, ho pensato di
spostare questi dataset in questa unit che al momento del lancio del form
ricerche gli passa i riferimenti. Non è nella linea del 'separare' questo ?
(avevo dei dubbi, per questo ho chiesto pareri..).
Potrei mettere questi dataset in un datamodule specifico per il form
ricerche ? Ma si possono aver più dataModule ?
Ecco, più ci penso, più domande mi vengono ...
Daniele 7 Nov 2016 16:25
Ciao,

> Potrei mettere questi dataset in un datamodule specifico per il form
> ricerche ? Ma si possono aver più dataModule ?
Puoi avere tutti i datamodule che vuoi.
In 3 unit separate metti 3 datamodule distinti

Unit1 = DM1
Unit2 = DM2
Unit3 = DM3

Nei datamodule inserisci i componenti di cui necessiti

DM1 = Tabella1
DM2 = TabellaXYZ
DM3= TabellaTCS

Poi nella tua form di ricerca, se e' specifica per i dati contenuti nella
unit1 e unit3 fai

Uses ....., Unit1, Unit3

poi neil tuo codice

Stringa:=DM1.Tabella1.FieldByName('NomeCampo').AsString +
DM3.TabellaTCS.FieldByName('NomeCampo').AsString;

.... tanto per indicarti come fare ......

Nei miei piccoli progetti tendo ad avere un solo datamodule con tutte le
tabelle e componenti di query.


> Ecco, più ci penso, più domande mi vengono ...
Credo che tu non sia l'unico ..... tutti noi abbiamo molte domande ..... ma
non possiamo intasare l'NG !!!

Ciao

Daniele

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio di programmazione Delphi | Tutti i gruppi | it.comp.lang.delphi | Notizie e discussioni delphi | Delphi Mobile | Servizio di consultazione news.