Ricerca elementi

mercoledì 22 ottobre 2008 - 13.34

squilibrio Profilo | Expert

Ho una query del tipo
...
WHERE ((Contratti.DataContratto)>=[@DataInizio] And (Contratti.DataContratto)<=[@DataFine]) AND (Contratti.CodiceGruppoCliente = @CodiceGruppoCliente) AND (Contratti.CodiceAzione = @CodiceAzione) AND (Contratti.CodiceTariffa = @CodiceTariffa)
GROUP BY Anag_Comuni.Comune;

e da codice:

DsDati = new DataSet();
myCommandCP.Parameters.Add(new OleDbParameter("@DataInizio", DataInizioRic.Text));
myCommandCP.Parameters.Add(new OleDbParameter("@DataFine", DataFineRic.Text));
myCommandCP.Parameters.Add(new OleDbParameter("@CodiceGruppoCliente", ddlGruppoRic.SelectedValue));
myCommandCP.Parameters.Add(new OleDbParameter("@CodiceAzione", ddlAzioneRic.SelectedValue));
myCommandCP.Parameters.Add(new OleDbParameter("@CodiceTariffa", ddlTariffaRic.SelectedValue));
myCommandCP.CommandType=CommandType.StoredProcedure;
OleDbDataAdapter DataAdatp = new OleDbDataAdapter(myCommandCP);
DataAdatp.Fill(DsDati, "ElencoContratti");

Come posso modificare la query per fare in modo che, anche se non passo valori al codice

(esempio ddlTariffaRic.SelectedValue nullo) mi vengano selezionati *tutti* gli elementi .... a differenza di quanto ddlTariffaRic.SelectedValue ha un valore, caso in cui mi vengono recuperati solo gli elementi che contengono tale valore?


Grazie mille

alx_81 Profilo | Guru

>Come posso modificare la query per fare in modo che, anche se
>non passo valori al codice

Il metodo che ti passo è piuttosto bruttino, ma se non hai particolari esigenze di prestazioni e/o hai poche righe, ti aiuta molto:
Nella condizione, basta testare il parametro NULL in OR con quella che filtra effettivamente:

...
WHERE
(@CodiceGruppoCliente IS NULL OR Contratti.CodiceGruppoCliente = @CodiceGruppoCliente)
AND... (

>Grazie mille
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

squilibrio Profilo | Expert

va benissimo!!!

grazie mille

squilibrio Profilo | Expert

Non sembra funzionare e non capisco dove sbaglio

ho dovuto cambiare

(@CodiceGruppoCliente IS NULL OR Contratti.CodiceGruppoCliente = @CodiceGruppoCliente)

in

(@CodiceGruppoCliente = '' OR Contratti.CodiceGruppoCliente = @CodiceGruppoCliente)

in quanto il valore passato di tipo string era una stringa vuota

quando non seleziono nulla nel DDL, tutto OK... visualizzo tutti gli elementi, quando invece seleziono un elemento... il gridview è vuoto

Cosa sbaglio??

Grazie mille

alx_81 Profilo | Guru

>quando non seleziono nulla nel DDL, tutto OK... visualizzo tutti
>gli elementi, quando invece seleziono un elemento... il gridview
>è vuoto
mmmh.. sinceramente non capisco.. La parte che non ti funziona è rimasta identica..
Hai provato a vedere se effettivamente ti arriva la chiamata come la vorresti?
Hai provato il SQL Profiler per controllarla?
Sicuro di passare correttamente i dati?
--

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

squilibrio Profilo | Expert

La stored query è

SELECT Anag_Comuni.CodiceComune, Anag_Comuni.Comune, Sum(Rel_AgentiAree.Valore) AS Gruppo, Sum(Rel_AgentiAree_1.Valore) AS Azione, Sum(Rel_AgentiAree_2.Valore) AS Tariffa, Sum(Rel_AgentiAree.Valore)+Sum(Rel_AgentiAree_1.Valore)+Sum(Rel_AgentiAree_2.Valore) AS Totale, Count(*) AS Conteggio
FROM ((((((Contratti INNER JOIN Anag_ContrattoTariffe ON Contratti.CodiceTariffa=Anag_ContrattoTariffe.CodiceTariffa) INNER JOIN Anag_ContrattoAzioni ON Contratti.CodiceAzione=Anag_ContrattoAzioni.CodiceAzione) INNER JOIN Anag_ContrattoGruppi ON Contratti.CodiceGruppoCliente=Anag_ContrattoGruppi.CodiceGruppo) INNER JOIN Anag_Comuni ON Contratti.CodiceComune=Anag_Comuni.CodiceIstat) INNER JOIN Rel_AgentiAree ON (Contratti.CodiceAgente=Rel_AgentiAree.CodiceAgente) AND (Anag_ContrattoGruppi.CodiceGruppo=Rel_AgentiAree.CodiceArea)) INNER JOIN Rel_AgentiAree AS Rel_AgentiAree_1 ON (Contratti.CodiceAgente=Rel_AgentiAree_1.CodiceAgente) AND (Anag_ContrattoAzioni.CodiceAzione=Rel_AgentiAree_1.CodiceArea)) INNER JOIN Rel_AgentiAree AS Rel_AgentiAree_2 ON (Contratti.CodiceAgente=Rel_AgentiAree_2.CodiceAgente) AND (Anag_ContrattoTariffe.CodiceTariffa=Rel_AgentiAree_2.CodiceArea)
WHERE ((Contratti.DataContratto)>=[@DataInizio] And (Contratti.DataContratto)<=[@DataFine]) And ([@CodiceComune]='' Or Contratti.CodiceComune=[@CodiceComune])
GROUP BY Anag_Comuni.CodiceComune, Anag_Comuni.Comune
ORDER BY Comune;

mentre a livello di codice ho





try
{
DsDati = new DataSet();
OleDbCommand myCommandCP = new OleDbCommand("SP_ReportComuni", dbconn);
myCommandCP.Parameters.Add(new OleDbParameter("@DataInizio", DataInizioRic.Text));
myCommandCP.Parameters.Add(new OleDbParameter("@DataFine", DataFineRic.Text));
myCommandCP.Parameters.Add(new OleDbParameter("@CodiceComune", ddlComuneRic.SelectedValue));
myCommandCP.CommandType=CommandType.StoredProcedure;
OleDbDataAdapter DataAdatp = new OleDbDataAdapter(myCommandCP);
DataAdatp.Fill(DsDati, "ElencoContratti");
}
catch (Exception exc)
{
string debug = exc.Message;
}


Cosa sbaglio??

Grazie mille!

alx_81 Profilo | Guru

Non posso fare altro che ripeterti

- Hai provato il SQL Profiler per controllare la chiamata che EFFETTIVAMENTE arriva al DBServer?

Profila e vedi se capisci come mai non funziona.
è l'unico modo sicuro per capire come arriva la chiamata.
--

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