Sum multiplo con controllo

martedì 23 settembre 2008 - 19.37

gae58 Profilo | Senior Member

salve,

è la prima volta che mi cimento con una select un po' più complessa.

Devo calcolare dei saldi.

Ogni movimento è composto da Dato1, Dato2, Dato3 e importo.

Il valore di Dato1 può esse 1, 2, 3, 4, 5 etc.
e Dato2 può essere a o b

Quandi, sum(Importo) se Dato1=1 sottratto la Sum(Importo) se Dato2=a
e così via
WHEN Dato3 = h

Pensavo di utilizzare questo Codice:
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Prova"].ConnectionString);
SqlCommand Qry1 = new SqlCommand("SELECT SUM(Importo) FROM Tabella WHERE Dato1 = 1 AND Dato2 = 'a' ", conn);
SqlCommand Qry2 = new SqlCommand("SELECT SUM(Importo) FROM Tabella WHERE Dato1 = 2 AND Dato2 = 'b' ", conn);
conn.Open();

SqlCommand cmd = qry.CreateCommand();

conn.Close();

Le domande sono:
1) E' giusto scrivere più sqlCommand?
2) è giusto usare qry.CreateCommand(); o è meglio executeNoScalar? (non ho capito bene cosa fa CreateCommand e come si usa
3) Le somme ed i saldi, come faccio a collegarle a delle label?

grazie per l'aiuto che mi vorrete dare.

P.S.:
preferisco in prima istanza usare il codice nel codeBehind (si dice così) e dopo aver capito creare una S.P.


Gaetano

alx_81 Profilo | Guru

>salve,
Ciao!

>è la prima volta che mi cimento con una select un po' più complessa.
>Devo calcolare dei saldi.
>Ogni movimento è composto da Dato1, Dato2, Dato3 e importo.
>Il valore di Dato1 può esse 1, 2, 3, 4, 5 etc. e Dato2 può essere a o b
>
>Quandi, sum(Importo) se Dato1=1 sottratto la Sum(Importo) se
>Dato2=a e così via
>WHEN Dato3 = h
>
>Le domande sono:
>1) E' giusto scrivere più sqlCommand?
Se proprio necessario sì, sennò è meglio fare tutto in una query ottimizzata. Ma dipende dalla qualità dell'informazione e dai criteri.

>2) è giusto usare qry.CreateCommand(); o è meglio executeNoScalar?
CreateCommand è dell'oggetto SQLConnection.. non del command.
ExecuteNoScalar non credo proprio esista..

Se devi tornare risultati, si usa ExecuteReader per la modalità Connessa di ADO.NET, oppure il metodo Fill(dataset) o Fill(datatable) del SQLDataAdapter per la modalità disconnessa. Poi esiste ExecuteScalar che, come si può capire dal nome, torna uno scalare (una riga/una colonna) ed infine ExecuteNonQuery, che è utile per le INSERT/UPDATE/DELETE, perchè non torna nulla.

Eccoti le reference:

SQLCommand.ExecuteReader Method
http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlcommand.executereader(VS.80).aspx

SQLCommand.ExecuteScalar Method
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

SQLCommand.ExecuteNonQuery Method
http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlcommand.executenonquery(VS.80).aspx

DBDataAdapter.Fill() Method
http://msdn.microsoft.com/en-us/library/zxkb3c3d.aspx


>(non ho capito bene cosa fa CreateCommand e come si usa
Serve per creare un command da quella particolare connessione..

>3) Le somme ed i saldi, come faccio a collegarle a delle label?
Una volta che hai deciso la modalità di esecuzione ADO.Net, puoi usare dataset/datatable, datareader, collezioni di oggetti proprietari (entità).
In poche parole puoi scorrere i resultset e associare ai controlli il contenuto dei campi.
>
>grazie per l'aiuto che mi vorrete dare.
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

gae58 Profilo | Senior Member

ti ringrazio, delle segnalazioni.

Inizierò a leggere e ti farò sapere


Gaetano

gae58 Profilo | Senior Member

ciao, ho usato l'executeReader, in quanto, penso, più comodo per i controlli da realizzare. Sono uscito pazzo sul cast, ma alla fine ci sono riuscito.
Funziona tutto come volevo.
Non so se il codice sia ottimizzato per la programmazione ad oggetti inquanto ho ancora parecchi influssi della programmazione procedurale.
Comunque su questo vedrò in seguito.

Volevo, però, cambiare colore al saldo a seconda se positivo o negativo, però mi ritorna questo errore:
Impossibile convertire implicitamente il tipo 'string' in 'System.Drawing.Color'.
il codice che uso è questo:
if (OpTeSa < 0)
lblOpTeSa.ForeColor = "Red";
else
lblOpTeSa.ForeColor = "blue";

cosa centra il tipo string se uso una label?

P.S.:
scusa l'ignoranza

grazie



Gaetano

gae58 Profilo | Senior Member

chiedo scusa per il grossolano errore.

Non è voluto

Chiedo all'amministratore di togliermi la stellina


Gaetano

alx_81 Profilo | Guru

>ciao, ho usato l'executeReader, in quanto, penso, più comodo
>per i controlli da realizzare. Sono uscito pazzo sul cast, ma
>alla fine ci sono riuscito.
>Funziona tutto come volevo.
ok, perfetto.

>Volevo, però, cambiare colore al saldo a seconda se positivo
>o negativo, però mi ritorna questo errore:
>Impossibile convertire implicitamente il tipo 'string' in 'System.Drawing.Color'.
>il codice che uso è questo:
>if (OpTeSa < 0)
> lblOpTeSa.ForeColor = "Red";
>else
> lblOpTeSa.ForeColor = "blue";
>cosa centra il tipo string se uso una label?

Tu non stai valorizzando la label però.. stai cercando di passare un colore sotto forma di stringa ad una proprietà (la ForeColor) che è di tipo System.Drawing.Color.

Devi fare così:

if (OpTeSa < 0) lblOpTeSa.ForeColor = System.Drawing.Color.Red; else lblOpTeSa.ForeColor = System.Drawing.Color.Blue;

>grazie
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
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