Aiuto sui datatable

lunedì 22 giugno 2009 - 14.56

benedetto_campi Profilo | Newbie

ciao a tutti....eccomi qui col mio primo post...spero di essere abbastanza chiaro nello spiegarvi il mio problema :)
ho un datatable dt composto da una sola colonna chiamata evento e la colonna è riempita tramite una query. a questo punto scorro tutte le righe di dt e passo uno alla volta il nome dell evento ad altre query (parametriche ) e quindi alla fine del listato mi trovo con il seguente stato
dt che contiene una colonna con tutti gli eventi
dt1 che contiene, per ogni evento passatogli come parametro, il numero di volte che si è verificato a maggio del 2007
dt2 idem come per dt1 solo che per maggio 2008
dt3 idem ma per maggio 2009

quindi sia dt che dt1,dt2,che dt3 avranno lo stesso numero di righe. ora volevo importare in dt(che contiene una sola colonna) le colonne di dt1,dt2,dt3 che contengono il numero di volte per il quale si è verificato un evento e quindi ottenere dt che invece di una colonna ne avrà 4. Ho provato col metodo merge ma non funziona bene...Esiste un modo per importare le colonne di un datatable in un altro? altrimenti sapreste consigliarmi come realizzarlo?
grazie per aver letto fino a qui :) e spero di essere stato abbastanza chiaro
un saluto a tutti

alx_81 Profilo | Guru

>ciao a tutti....eccomi qui col mio primo post...
ciao e benvenuto in DotNetHell!

>ho un datatable dt composto da una sola colonna chiamata evento
>e la colonna è riempita tramite una query. a questo punto scorro
>tutte le righe di dt e passo uno alla volta il nome dell evento
>ad altre query (parametriche ) e quindi alla fine del listato
>mi trovo con il seguente stato
>dt che contiene una colonna con tutti gli eventi
>dt1 che contiene, per ogni evento passatogli come parametro,
>il numero di volte che si è verificato a maggio del 2007
>dt2 idem come per dt1 solo che per maggio 2008
>dt3 idem ma per maggio 2009
>
>quindi sia dt che dt1,dt2,che dt3 avranno lo stesso numero di
>righe. ora volevo importare in dt(che contiene una sola colonna)
>le colonne di dt1,dt2,dt3 che contengono il numero di volte
>per il quale si è verificato un evento e quindi ottenere dt che
>invece di una colonna ne avrà 4. Ho provato col metodo merge
>ma non funziona bene...Esiste un modo per importare le colonne
>di un datatable in un altro? altrimenti sapreste consigliarmi
>come realizzarlo?
Personalmente, se leggi da un database, farei tutto tramite query, con semplici funzioni di aggregazione.

>grazie per aver letto fino a qui :) e spero di essere stato abbastanza
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

benedetto_campi Profilo | Newbie

beh diciamo che ho un pò semplificato ...il problema sorge perchè ad esempio a luglio dovrei fare la stessa identica cosa però per il mese di giugno...e nel 2010 (ammesso che ancora userò quest applicazione) fare la stessa identica cosa per gli anni 2008-09-10...quindi mi sembrava che la cosa più immediata fosse operare come ho scritto precedentemente...

alx_81 Profilo | Guru

>beh diciamo che ho un pò semplificato ...il problema sorge perchè
>ad esempio a luglio dovrei fare la stessa identica cosa però
>per il mese di giugno...e nel 2010 (ammesso che ancora userò
>quest applicazione) fare la stessa identica cosa per gli anni
>2008-09-10...quindi mi sembrava che la cosa più immediata fosse
>operare come ho scritto precedentemente...
Continuo a pensare che una bella query (magari una stored procedure) con funzioni di aggregazione, sia la cosa migliore.
Hai le SUM, puoi tranquillamente ricavare i mesi da filtrare. Per l'approccio applicativo, devi fare tutto a manina.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

benedetto_campi Profilo | Newbie

ok proverò a fare una query un po' più articolata...anche se nelle query non me la cavo benissimo in effetti :P però può essere un buon modo per imparare...

alx_81 Profilo | Guru

>ok proverò a fare una query un po' più articolata...anche se
>nelle query non me la cavo benissimo in effetti :P però può essere
>un buon modo per imparare...
tranquillo, posta pure che ti diamo una mano

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

benedetto_campi Profilo | Newbie

il fatto è che per risolvere ho risolto...con la query più complessa in effetti funziona tutto...il problema è che però ora ho veramente necessità di importare colonne da altri datatable realizzando un metodo che mi permetta di farlo...ora provo a farlo e vedo che esce fuori...

benedetto_campi Profilo | Newbie

sto riprendendo in seria considerazione di usare il metodo merge...il fatto è che mi duplica dei campi! è una cosa normale? nel senso..se in dt ho 5 righe e faccio il merge con una tabella dt2 che ha altre 5 righe..invece di darmi dt3 con 5 righe mi da dt3 in questa maniera
le prime 5 righe di dt1 con i valori e poi 5 campi vuoti
di nuovo le 5 righe di dt1 con valori e 5 righe conteneti i valori di dt2

esiste un modo per far si che quelle prime 5 righe duplicate vengano eliminate?

alx_81 Profilo | Guru

>sto riprendendo in seria considerazione di usare il metodo merge...il
>fatto è che mi duplica dei campi! è una cosa normale? nel senso..se
>in dt ho 5 righe e faccio il merge con una tabella dt2 che ha
>altre 5 righe..invece di darmi dt3 con 5 righe mi da dt3 in questa
>maniera
>le prime 5 righe di dt1 con i valori e poi 5 campi vuoti
>di nuovo le 5 righe di dt1 con valori e 5 righe conteneti i valori
>di dt2
>
>esiste un modo per far si che quelle prime 5 righe duplicate
>vengano eliminate?
ma a te serve una join o una union. Perchè se non ricordo male il metodo merge fa l'unione di due datatable e se lo schema è differente fa quello che è successo a te.
Prova a vedere se questo può darti un aiuto:
http://blogs.ugidotnet.org/marcom/archive/2007/12/29/90487.aspx

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

alfred1234 Profilo | Newbie

Quello che mi viene in mente su due piedi sono due opzioni...o usi le datarelation e quindi nella dt1....dt5 ci metti una colonna chiave che la peschi dalla datatable DT (e usi le viste sulla datarelation) oppure farei l'unione a manina e cioè aggiungo n colonne alla tabella DT e ciclo per tutte le righe di DT e pesco i dati dalle datatable dt1...dt5 e li metto nelle colonne della datatable DT che ho appena creato.

Spero di aver compreso il tuo problema...

benedetto_campi Profilo | Newbie

eh si Alfred..credo che farò tutto a manina..alla fine sono un pò di righe nulla di trascendentale

benedetto_campi Profilo | Newbie

hem...domanda credo banale... creo una riga di un datatable...e manualmente inserisco dei dati...ora volevo colorare la cella di rosso o verde a seconda che il numero sia < oppure > 0..esisteun modo per colorare caselle dei datatable?

siccome associo i dati del datatable in una gridview.. magari è possibile cambiare del codice per colorare la casella del gridview...

alx_81 Profilo | Guru

>hem...domanda credo banale... creo una riga di un datatable...e
>manualmente inserisco dei dati...ora volevo colorare la cella
>di rosso o verde a seconda che il numero sia < oppure >
>0..esisteun modo per colorare caselle dei datatable?
No, il datatable è solo una struttura in memoria coi dati e i metadati del resultset.

>siccome associo i dati del datatable in una gridview.. magari
>è possibile cambiare del codice per colorare la casella del
>gridview...
Esatto, in questo caso devi sottoscrivere l'evento RowDataBound e usare l'EventArgs per ricavare il valore del campo della grid.
e.Item.DataItem puoi castarlo in un DataRowView (una vista sulla riga) e poi da qui puoi accedere al campo e al dato particolare.
Attenzione a considerare solo le righe di un certo tipo, escludendo Footer, Pager e Header..
Poi è facile accedere alla riga corrente andando a cambiare il background della cella che ti serve.

Leggi qui
http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.gridview.rowdatabound(VS.80).aspx

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

benedetto_campi Profilo | Newbie

dunque...nella parte aspx ho aggiunto la seguente cosa

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

nella pagina .aspx.cs ho inserito il seguente codice
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { DataRowView drv = (DataRowView)e.Row.DataItem; if (Convert.ToInt32(drv[qui ci metto il nome della colonna che mi interessa]) < 0) e.Row.ForeColor = System.Drawing.Color.Blue; } }

in questo modo dovrebbe colorare il testo della cella del colore che voglio....il problema che mi viene presentato è il seguente

Impossibile eseguire il cast dell'oggetto da DBNull ad altri tipi. mi viene sollevato l errore quando valuta la condizione dell if...è dovuto dal fatto che lui vede la gridview vuota? altrimenti non saprei da che è dato l errore...

alx_81 Profilo | Guru

>Impossibile eseguire il cast dell'oggetto da DBNull ad altri
>tipi. mi viene sollevato l errore quando valuta la condizione
>dell if...è dovuto dal fatto che lui vede la gridview vuota?
>altrimenti non saprei da che è dato l errore...
sembra che in quel campo ci sia un NULL, su SQL, aggiungi, per la colonna un bell' ISNULL(campo, 0), così non avrai il problema.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

benedetto_campi Profilo | Newbie

grazie mille :D

domanda a cui so gia che non esiste risposta ma...hai visto mai che invece esiste un modo per....
quando nel datatable aggiungo una riga nella quale salvo i dati, posso, inserire in una cella dove andrebbe un Double un qualche valore "speciale" che mi dia la cella come riempita ma che non sia visualizzabile? per ora aggiungo un valore 0 non è elegante ma funzionando lascerei tutto così...

alx_81 Profilo | Guru

>quando nel datatable aggiungo una riga nella quale salvo i dati,
>posso, inserire in una cella dove andrebbe un Double un qualche
>valore "speciale" che mi dia la cella come riempita ma che non
>sia visualizzabile? per ora aggiungo un valore 0 non è elegante
>ma funzionando lascerei tutto così...
Sinceramente non ho capito. Vuoi che una cella, di tipo double, non si veda nella griglia in base ad un default value?


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

alfred1234 Profilo | Newbie

Io fare i così

if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRowView drv = (DataRowView)e.Row.DataItem;
if(drv["colonnaX"]!=DBNull.Value)
{
if (Convert.ToInt32(drv[qui ci metto il nome della colonna che mi interessa]) < 0)
e.Row.ForeColor = System.Drawing.Color.Blue;
}
else
e.Row.ForeColor = System.Drawing.Color.Red;

}


così eviti che il convert in Int32 se c'è un valore null non ti solleva l'eccezione :)

Bye
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5