Classi che restituiscono hashtable con valore altre classi.. help!!!!!...

mercoledì 03 marzo 2010 - 22.10

c#_beginner Profilo | Newbie

Ciao a tutti,
ho un dubbio atroce e tantissimo bisogno di aiuto.. mi trova in estrema difficoltà.
Ho una aspx .net 2.0 con dentro un pannello contenente dei controlli di svariato tipo.
Il mio db dovrà essere strutturato in modo tale da avere una tabella con i campi che devo mostrare a video tramite controlli in una maschera che devo realizzare.
In particolare avrò 4 tabelle: Tazienda,Tdativersione,Tversione e Tcampi.
Tazienda è un anagrafica dell'azienda e quindi tra i campi ha:id_azienda,codice_fiscale,matricola e sede.
Tdativersione associa ad una particolare versione,un particolare campo con un particolare valore.Quindi i campi di questa tabella saranno id_versione,id_campo,valore_campo.
Tversione è lo storico delle versioni.I relativi campi saranno: id_versione,anno,mese,id_azienda,data_apertura,data_chiusura e stato.
Tcampi è proprio la tabella con i campi che devo mostrare.I campi saranno infatti: idcampo,descrizione,id_bloccofunzionale,tipo,decodifica e dimensione massima.
Ora mi è stato chiesto di realizzare delle classi tali che io abbia una classe "Pannello" che restituisce un hashtable avente come chiave la matricola e come valore una classe "DettaglioPannello".La stessa dovrà restituire un hastable avente come chiave il periodo (anno + mese) e come valore la classe "DettaglioAzienda" che infine restituisce un ultimo hashtable avente come chiave id_campo e come valore una classe DatoCampi.
Praticamente è una matrioska di hashtable.Non chiedetemi perchè vogliono sia fatto così,so solo che è così che devo fare e non ho idea di come realizzare queste classi.Cioè non so se creare più cs ogniuno con una delle suddette classi che restituiscono un hashtable o mettere tutto in un solo cs e non saprei come.Non so nemmeno se sia il caso di utilizzare le List<T>.In ogni caso sono ben accetti suggerimenti con esempi di codice!!

Vi ringrazio infinitamente anticipatamente per l'aiuto.

amelix Profilo | Expert

>Ciao a tutti,
Ciao!

Io ti consiglio di creare prima le tre classi Pannello, DettaglioPannello, DettaglioAzienda, DatiCampo.
Costruiscile con le proprietà che ti servono.

Una volta create metti nella classe Pannello un
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
In questo modo esporrai l'elenco di tutte le DettaglioAziende collegate "modificabile".
Sarà tuo compito popolare questo Dictionary (io lo preferisco al hashtable per tantissimi motivi).


>Vi ringrazio infinitamente anticipatamente per l'aiuto.
Spero di esserti stato utile

Andrea
http://www.formulawan.com/?ref=DinaMelix

c#_beginner Profilo | Newbie

@amelix
Grazie!!!!
Allora se ho capito bene ciò che intendi mi creo 4 file dentro una stessa cartella sotto la root della solution che chiamerò Pannello.cs,DettaglioPannello.cs, DettaglioAzienda.cs e DatiCampo.cs.
Allora sempre se ho capito bene ciacuno di essi avrà una struttura simile e cioè ad esempio per Pannello:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Mi domandavo.. Per far si che la classe Pannello possa istanziare un dictionary di oggetti DettaglioPannello e così via (Dettaglio Pannello istanzi un dictionary di oggetti DettaglioAzienda) è sufficiente mettere i file nella stessa cartella e poi fare,ad esempio nel caso di PAnnello, uno "using DettaglioPannello;"? E ancora... che intendi tu per <<Sarà tuo compito popolare questo Dictionary>>?

Ancora grazie per l'input che mi hai dato,è stato preziosissimo.

amelix Profilo | Expert

Il codice che hai scritto va benissimo!
Lo devi fare per tutte le "bamboline della matrioska" .

Tu devi solo costruire la struttura delle classi?
Chi valorizza i dati?

Se usi una modalità di programmazione a layer questo compito verrà svolto dagli strati Busines/Data.

Cmq nell programmazione ad oggetti devi pensare a "scatole chiuse" nel senso che "non ti deve interessare" cosa fa la classe collegata alla tua classe.
Andrea
http://www.formulawan.com/?ref=DinaMelix

c#_beginner Profilo | Newbie

Andrea,
sei la mia unica ancora di salvezza.Senza le tue indicazioni starei brancolando abbondantemente nel buio.
Allora ho cominciato a mettere su i file come mi hai indicato. Li ho messi dentro un unica cartella che ho chiamoto BLL radicata a livello di solution,trovi una copia degli stessi in allegato a questo messaggio.
Per permettere a ciascuna classe di vedere l'altra dovrebbe essere sufficiente indicare dentro ciascun cs il namespace comune "BLL",correggimi se sbaglio.
I dubbi sono due a questo punto:

1)A partire dalla bambolina più esterna della matrioska (Pannello),alla quale io passo un parametro, dovrei ottenere alla fine un oggetto di tipo DatoDB.MA nel momento in cui volessi inserire dati nel db,come devo approcciarmi al problema? Invece del get dovrei impostare un set da qualche parte nella matrioska (in ciascuna classe?) per andare a scrivere sul db... già ma come?

2)La classe finale della matrioska,cioè la più piccola e quindi DatoDB praticamente dovrebbe avere tutti i campi presenti nel pannello che si vuole visualizzare? Se si,devo elencarli tutti come proprietà con get e set,giusto?

Per quanto riguarda il popolamento in realtà devo mettere su oltre la struttura delle classi anche il livello data access layer...
Tra l'altro mi è stato proibito di usare le stored procedure,quindi mi dovrò inventare una classe che mappi i vari tipi di dato presente nella tabella Tcampi e che comunichi con le altre classi facente parte del business logic layer.. n'altra tragedia immane.. non so da dove cominciare!!Pensa ceh mi hanno chiesto addirittura di inserire le query in un xml.

Sono nelle tue mani...

c#_beginner Profilo | Newbie

Guarda ti allego in qst altro post pure lo schema per il db per renderti più evidente come è strutturato.
Grazie

amelix Profilo | Expert

La struttura delle classi sembra corretta.

>1)A partire dalla bambolina più esterna della matrioska (Pannello),alla
>quale io passo un parametro, dovrei ottenere alla fine un oggetto
>di tipo DatoDB.MA nel momento in cui volessi inserire dati nel
>db,come devo approcciarmi al problema? Invece del get dovrei
>impostare un set da qualche parte nella matrioska (in ciascuna
>classe?) per andare a scrivere sul db... già ma come?
Questo dipende da molti fattori.
Cmq per il momento ti consiglierei di rendere autosufficienti le classi.
Cioè pensano loro a Caricare/Salvare i dati da DB oltre al costruttore che hai implementato.

>2)La classe finale della matrioska,cioè la più piccola e quindi
>DatoDB praticamente dovrebbe avere tutti i campi presenti nel
>pannello che si vuole visualizzare? Se si,devo elencarli tutti
>come proprietà con get e set,giusto?
No. L'oggetto che rappresenta il pannello esporrà le sue proprietà e via dicendo.
La proprietà SET del dictionary non è importante.
Infatti se controlli hai le proprietà del dictionary che di danno la possibilità di aggiungere/togliere nuovi figli.
Hai anche la possibilità di modificare direttamente le proprietà del figlio.

>Per quanto riguarda il popolamento in realtà devo mettere su
>oltre la struttura delle classi anche il livello data access
>layer...
>Tra l'altro mi è stato proibito di usare le stored procedure,quindi
>mi dovrò inventare una classe che mappi i vari tipi di dato presente
>nella tabella Tcampi e che comunichi con le altre classi facente
>parte del business logic layer.. n'altra tragedia immane.. non
>so da dove cominciare!!Pensa ceh mi hanno chiesto addirittura
>di inserire le query in un xml.
Sai ... sono fortune!

>Sono nelle tue mani...
Non credo ... sei nelle tue e mi sembrano anche buone mani.

L'allegato con l'immagine non mi ha chiarito molto ... anzi!
Mi sono chiesto come mai hai una sola tabella.

Andrea
http://www.formulawan.com/?ref=DinaMelix

c#_beginner Profilo | Newbie

Andrea, ti seguo a tratti.
Di fatto mi manca un link mentale. Seguendo il tuo consiglio e cioè inserendo,oltre al costruttore, un un metodo che faccia una select nel db a partire da un parametro mi restiuisca tutti i campi ,non riesco ad immaginare come possa ad esempio la classe Pannello restituirmeli.
Cioè se io istanzio un oggetto della classe Pannello mi aspetto che mi restiuisca un dictionary avente come coppia chiave valore: matricola, DettaglioPannello. Il punto è che il dictionary dovrebbe essere riempito dei dati... chi lo riempie? Puoi farmi un esempio? Forse mi chiarirebbe le idee.
Ti riporto di seguito il codice della classe Pannello che ho scritto :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Reinserisco l'immagine dello schema,poco fa avevo caricato solo parte dello schema.
Thanks.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5