Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    Filtri DropDown e SP condizionali

    ho una GV e 2 DDL.
    queste 2 DDL fungono da filtro per la gv.
    siccome i filtri possono essere anche tutti e 2 mi rimane scomodo fare diverse SP (in totale sarebbereo 4).
    allora ho pensato di fare una cosa del genere:
    codice:
    ALTER Procedure [dbo].[TNW_select_files_deploy_siti]
    @descrizione_ip varchar(64),
    @stato tinyint
    
    As
    IF @descrizione_ip = '*' AND @stato = 60
    	SELECT file_deploy_sito#,stato,siti.descrizione AS Expr1,files_deploy_siti.IP AS Expr2,data_ora_trasferimento FROM files_deploy_siti INNER JOIN siti ON files_deploy_siti.IP=siti.IP
    ELSE IF @descrizione_ip != '*' AND @stato = 60
    	SELECT file_deploy_sito#,stato,siti.descrizione AS Expr1,files_deploy_siti.IP AS Expr2,data_ora_trasferimento FROM files_deploy_siti INNER JOIN siti ON files_deploy_siti.IP=siti.IP 
    	WHERE siti.descrizione = @descrizione_ip
    ELSE IF @descrizione_ip = '*' AND @stato != 60
    	SELECT file_deploy_sito#,stato,siti.descrizione AS Expr1,files_deploy_siti.IP AS Expr2,data_ora_trasferimento FROM files_deploy_siti INNER JOIN siti ON files_deploy_siti.IP=siti.IP 
    	WHERE stato = @stato
    ELSE 
    	SELECT file_deploy_sito#,stato,siti.descrizione AS Expr1,files_deploy_siti.IP AS Expr2,data_ora_trasferimento FROM files_deploy_siti INNER JOIN siti ON files_deploy_siti.IP=siti.IP 
    	WHERE siti.descrizione = @descrizione_ip AND stato = @stato
    funziona ma il problema è che il secondo parametro è di tipo tinyint, ma ha come valore iniziale un * e poi i numeri estratti dal db.
    io per ora ho agito così:
    codice:
    <asp:ListItem Selected="True" Value="60">*</asp:ListItem>
    e così richiamo il metodo nell'objectdata source:
    codice:
            public static DataSet gvFilesSiti(string descrizione, byte stato)
            {
                DataSet ds = null;
                SqlDataAdapter adapter = null;
                SqlCommand cmd = null;
                try
                {
                    conn.Open();
                    cmd = new SqlCommand("TNW_select_files_deploy_siti", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@descrizione_ip", descrizione);
                    cmd.Parameters.AddWithValue("@stato", stato);
                    adapter = new SqlDataAdapter(cmd);
                    ds = new DataSet();
                    adapter.Fill(ds);
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    ds.Dispose();
                    adapter.Dispose();
                    conn.Close();
                }
                return ds;
            }
    capite bene che nn è il migliore modo di procedere, perchè un giorno 60 potrebbe diventare un valore nel db.
    come posso rimediare secondo voi??

  2. #2
    io userei un altro approccio.
    Non ho capito molto bene perché usi il valore "60" come valore iniziale per lo stato, inoltre farei un controllo dei parametri prima di passarli alla SP TNW_select_files_deploy_siti.
    Cosa utilizzi per leggere i dati della GV? Immagino un ObjectDataSource.

    Io ti propongo una possibile soluzione come esempio è la tabella impiegati di Northwind con 2 filtri:
    due DDL con valore iniziale vuoto:
    codice:
            <asp:DropDownList ID="Cities" runat="server" DataSourceID="CitiesDS" AutoPostBack="true"
                DataTextField="Value" DataValueField="Key" AppendDataBoundItems="true">
                <asp:ListItem Text="" />
            </asp:DropDownList>
            <asp:DropDownList ID="Countries" runat="server" DataSourceID="CountriesDS" AutoPostBack="true"
                DataTextField="Value" DataValueField="Key" AppendDataBoundItems="true">
                <asp:ListItem Text="" />
            </asp:DropDownList>
    Una gridview con un ObjectDataSource che prende come parametri questi due controlli:
    codice:
            <asp:ObjectDataSource ID="productsDataSource" runat="server" OldValuesParameterFormatString="original_{0}"
                SelectMethod="getImpiegati" TypeName="Logic.Utility" >
                <SelectParameters>
                    <asp:ControlParameter ControlID="Cities" Name="City" PropertyName="SelectedValue"
                        Type="String" DefaultValue="" />
                    <asp:ControlParameter ControlID="Countries" Name="Country" PropertyName="SelectedValue"
                        Type="String" DefaultValue="" />
                </SelectParameters>
            </asp:ObjectDataSource>
    Ed ecco la funzione che esegue la chiamata sul DB:
    codice:
    		public DataTable getImpiegati(string city, string country)
    		{
    			string sSQL = @"SELECT	EmployeeID, LastName, FirstName, Title, TitleOfCourtesy, BirthDate, HireDate, Address, City, Region, PostalCode, Country, HomePhone, Extension, Photo, ReportsTo, PhotoPath
    									FROM	[Employees]
    									where	(City=@city or @city is null) and
    											(Country=@country or @country is null)";
    			SqlParameter par1 = new SqlParameter("city", SqlDbType.VarChar);
    			SqlParameter par2 = new SqlParameter("country", SqlDbType.VarChar);
    
    			par1.Value = (!string.IsNullOrEmpty(city) ? city : (object)DBNull.Value);
    			par2.Value = (!string.IsNullOrEmpty(country) ? country : (object)DBNull.Value);
    			
    			return new DBHelper().getDataTable(sSQL, new SqlParameter[] { par1, par2 });
    		}
    Come puoi vedere, la query è molto semplice e senza logica. Quello che devi semplicemente controllare è il valore dei parametri che passi.
    Come vedi dal codice, io preparo 2 parametri a NULL (DBNull.Value).
    Poi assegno un valore se ne esiste uno passato dalle DropDownList.
    Io ho usato due parametri stringa, ma per un int la cosa è equivalente (puoi scegliere il valore -1 come valore iniziale se ti torna meglio, ma non 60 :) )

    Spero che questo ti possa aiutare.


    ___________________________________________
    P.S.: dai un voto al mi bimbo, grazie
    http://castingbambino.benetton.com/k...6-nicola-luigi

    Ciao

  3. #3
    ciao!!
    allora intanto grazie per l'ottimo consiglio.
    ho solo un problema: tu qui usa una query mentre io dovrei usare una stored procedure.
    posso usare lo stesso tipo di query anche nella SP??

  4. #4
    allora, ho modificato la SP cosi:
    codice:
    @soluzione_ int,
    @gruppo_ int
    
    As
    	SELECT siti.sito#, siti.localita, siti.descrizione, siti.IP, gruppi.descrizione AS Expr2, tipi_deploy.descrizione AS Expr1, siti.versione,siti.ultimo_avvio, siti.riserva, siti.app_disk_space, 
    			siti.versione_itl, tipi_connessione.descrizione AS tipo_connessione_, siti.TGU, tipologia_monitor.descrizione AS tipologia_monitor_, siti.ip_voyager
    			FROM siti 
    			INNER JOIN tipi_deploy ON siti.tipo_deploy# = tipi_deploy.tipo_deploy# 
    			INNER JOIN gruppi ON siti.gruppo#=gruppi.gruppo# 
    			INNER JOIN tipi_connessione ON siti.tipo_connessione#=tipi_connessione.tipo_connessione# 
    			INNER JOIN tipologia_monitor ON siti.tipologia_monitor#=tipologia_monitor.tipologia_monitor#
    			WHERE (soluzione# = @soluzione_ OR @soluzione_ is null) AND (gruppi.gruppo# = @gruppo_ Or @gruppo_ is null)
    poi nella pagina:
    codice:
                <td>
                    <asp:DropDownList ID="ddlNetwork" runat="server" DataSourceID="objNetwork" DataTextField="descrizione"
                        DataValueField="soluzione#" AppendDataBoundItems="True" AutoPostBack="True">
                        <asp:ListItem Selected="True" Value="">*</asp:ListItem>
                    </asp:DropDownList>
                    <asp:ObjectDataSource ID="objNetwork" runat="server" SelectMethod="ddlNetwork" TypeName="TNWDB.Decoder">
                    </asp:ObjectDataSource>
                </td>
                <td>
                    <asp:DropDownList ID="ddlGruppi" runat="server" AppendDataBoundItems="True" AutoPostBack="True"
                        DataSourceID="objGruppi" DataTextField="descrizione" DataValueField="gruppo#"
                        EnableViewState="False">
                        <asp:ListItem Selected="True" Value="">*</asp:ListItem>
                    </asp:DropDownList>
                    <asp:ObjectDataSource ID="objGruppi" runat="server" SelectMethod="ddlGruppi" TypeName="TNWDB.Decoder">
                        <SelectParameters>
                            <asp:ControlParameter ControlID="ddlNetwork" Name="par" PropertyName="SelectedValue"
                                Type="Int32" />
                        </SelectParameters>
                    </asp:ObjectDataSource>
                </td>
    .......
    GridView
    ......
            <asp:ObjectDataSource ID="objDecoder" runat="server" SelectMethod="gvSource" TypeName="TNWDB.Decoder">
                <SelectParameters>
                    <asp:ControlParameter ControlID="ddlNetwork" Name="network" PropertyName="SelectedValue"
                        Type="Int32" />
                    <asp:ControlParameter ControlID="ddlGruppi" Name="gruppo" PropertyName="SelectedValue"
                        Type="Int32" />
                </SelectParameters>
            </asp:ObjectDataSource>
    ora devo modificare il metodo richiamato nell'objectdatasource:
    codice:
            public static DataSet gvSource(int network, int gruppo)
            {
                DataSet ds = null;
                SqlDataAdapter adapter = null;
                SqlCommand cmd = null;
                try
                {
                    conn.Open();
                    cmd = new SqlCommand("TNW_select_siti", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@soluzione_", network);
                    cmd.Parameters.AddWithValue("@gruppo_", gruppo);
                    adapter = new SqlDataAdapter(cmd);
                    ds = new DataSet();
                    adapter.Fill(ds);
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    ds.Dispose();
                    adapter.Dispose();
                    conn.Close();
                }
                return ds;
            }
    come posso fare??

  5. #5
    si, utilizzare una query o una SP non fa differenza, cambia solo un pochetto il codice che richiama il command SQL, ma per il resto è ok.
    Infatti la SP che hai fatto mi pare corretta.

    Ora non ho capito cosa ti manca, a vedere il codice mi sembra ci sia tutto.

  6. #6
    bhe in pratica facendo come ho scritto sopra la GV nn viene riempita, è sempre vuota.

    in un'altra invece c'è solo un record (facendo sempre allo stesso modo).

  7. #7
    aggiungi ai parametri objectdatasource:
    codice:
    DefaultValue=""
    Inoltre devi considerare che i tuoi parametri sono Int e non string.
    Le stringhe possono essere null, metre gli Int NO!!!!!

    Quindi quando aggiungi i parametri al command, fai un controllo come faccio io, che quando necessario assegno il valore DBNull.Value.

    codice:
    par1.Value = (!string.IsNullOrEmpty(city) ? city : (object)DBNull.Value);
    nel tuo caso:
    codice:
    cmd.Parameters.AddWithValue("@gruppo_", 
       gruppo!=0 ? gruppo: (object)DBNull.Value);
    Devi essere sicuro di passare il valore null quando non selezioni nulla nelle combo

  8. #8
    ahhh! ci sono quasi!!
    ho solo un piccolo problema.
    ti prendo questo come esempio dove c'è solo una DDL come filtro.
    questa è la DDL
    codice:
                    <asp:DropDownList ID="ddlDurata" runat="server" OnDataBound="RowDataBound" AppendDataBoundItems="True"
                        AutoPostBack="True" EnableViewState="False" DataTextField="durata_spot" DataValueField="durata_spot"
                        DataSourceID="objDurata">
                        <asp:ListItem Selected="True" Value="">*</asp:ListItem>
                    </asp:DropDownList>
    qui faccio un select Distinct e i valori sono:
    -* (quello messo manuale)
    -0
    -1
    -4

    il problema è che quando clicco sullo zero il filtro nn viene applicato.
    questo il resto che ho fatto:
    codice:
            public static DataSet gvAudioSource(int eraser)
            {
                DataSet ds = null;
                SqlDataAdapter adapter = null;
                SqlCommand cmd = null;
                try
                {
                    conn.Open();
                    cmd = new SqlCommand("TNW_select_audio", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@eraser", eraser != 0 ? eraser : (object)DBNull.Value);
                    adapter = new SqlDataAdapter(cmd);
                    ds = new DataSet();
                    adapter.Fill(ds);
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    ds.Dispose();
                    adapter.Dispose();
                    conn.Close();
                }
                return ds;
            }
    codice:
            <asp:ObjectDataSource ID="objAudio" runat="server" SelectMethod="gvAudioSource" TypeName="TNWDB.Library">
                <SelectParameters>
                    <asp:ControlParameter ControlID="ddlEraser" Name="eraser" PropertyName="SelectedValue"
                        Type="Int32" DefaultValue="" />
                </SelectParameters>
            </asp:ObjectDataSource>
    codice:
    @eraser int
    AS
    SELECT * FROM audio
    WHERE (eraser = @eraser OR @eraser is null)
    io penso che il problema sia nel metodo:
    cmd.Parameters.AddWithValue("@eraser", eraser != 0 ? eraser : (object)DBNull.Value);

    qua gli imposto come condizione: eraser != 0.
    però può essere zero.
    se qua gli metto -1 come devo cambiare il tutto?

  9. #9
    no ok era una scemenza: bastavza mettere i -1 nei default delle DDL e dei parametri.
    le SP rimangono invariate.

    invece ho un problema con un'altra GV dove gli arriva un parametro byte che nn può essere -1.
    ecco perchè nell'esempio avevo messo 60.
    hai un consiglio su come gestire questa cosa??

  10. #10
    devi gestire in base al tipo di parametro che viene utilizzato come filtro, ed in base ai valori che può assumere.

    Esempio, se un parametro è stringa, è facilmente utilizzabile la stringa vuota come valore per il DefaultValue (valore che non deve effettuare il filtro).

    Per un integer, potrebbe essere 0, se il parametro prevede valori positivi.
    Ma come nel tuo caso, siccome il valore potrebbe anche essere 0, hai fatto bene a mettere -1, sempre che 0 sia il valore limite.

    In caso di parametri che possono avere anche valori negativi, allora potresti usilizzare il tipo int ma nullabile ( in c# si scrive int? )

    la cosa si potrebbe ulteriormente complicare per una data.

    Allora una prassi è utilizzare sempre parametri stringa, quindi prevedere sempre il valore stringa vuota per non effettuare filtri, gestire le stringhe vuote e le conversioni necessarie all'interno della funzione "gvAudioSource" che a questo punto avrà tutti parametri stringa ma farà la conversione quando li passa alla SP.

    Si insomma, mi sono un po annodato nella spiegazione ma si capisce

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.