28 messaggi dal 25 febbraio 2006
In una pagina .aspx ho predisposto una div runat server con visible=false.

All'interno di detta div ho inserito un controllo GridView e relativo SqlDataSource.

All'evento clic di un ImageButton imposto a visible=true la div e richiamo il metodo DataBind del gridView.

All'evento Selecting del SqlDataSource (origine dati della griglia) assegno i valori ai parametri delle SP impostata alla proprietà SelectQuery.

Mandando in esecuzione il tutto accade che viene eseguito l'evento di selecting ma la sp non viene eseguita sul SQL Server (ho verificato con il profiler) infatti l'evento di selected del SqlDataSource non si genera.

Vi riporto di seguito il codice della pagina aspx e il testo della SP.

Grazie.

PAGINA ASPX
<div id="finderContatti">
<fieldset id="fldCerca" class="label_11">
<legend class="legend_open" id="btnCerca">Cerca</legend>
<div id="contenutoCerca">
<fieldset id="fldTelefonate" class="left" style="padding:3px;height:55px;">
<legend>Telefonate</legend>
<p style="margin:0px;padding:3px;" class="left" id="colSxTel">
<asp:Label ID="Label1" runat="server" Text="Dal:"></asp:Label><br />
<asp:TextBox ID="TextBox_Dal" runat="server" CssClass="textbox" MaxLength="10" Width="80px"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="Data inizio ricerca non valida" ControlToValidate="TextBox_Dal" CssClass="errore" ValidationExpression="(((0[1-9]|[12][0-9]|3[01])([-./])(0[13578]|10|12)([-./])(\d{4}))|(([0][1-9]|[12][0-9]|30)([-./])(0[469]|11)([-./])(\d{4}))|((0[1-9]|1[0-9]|2[0-8])([-./])(02)([-./])(\d{4}))|((29)(\.|-|\/)(02)([-./])([02468][048]00))|((29)([-./])(02)([-./])([13579][26]00))|((29)([-./])(02)([-./])([0-9][0-9][0][48]))|((29)([-./])(02)([-./])([0-9][0-9][2468][048]))|((29)([-./])(02)([-./])([0-9][0-9][13579][26])))" ValidationGroup="vg_cerca" Display="Dynamic">!</asp:RegularExpressionValidator>
</p>
<p style="margin:0px;padding:3px;" class="left" id="colDxTel">
<asp:Label ID="Label2" runat="server" Text="Al:"></asp:Label><br />
<asp:TextBox ID="TextBox_Al" runat="server" CssClass="textbox" MaxLength="10" Width="80px"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" ErrorMessage="Data fine ricerca non valida" ControlToValidate="TextBox_Al" CssClass="errore" ValidationExpression="(((0[1-9]|[12][0-9]|3[01])([-./])(0[13578]|10|12)([-./])(\d{4}))|(([0][1-9]|[12][0-9]|30)([-./])(0[469]|11)([-./])(\d{4}))|((0[1-9]|1[0-9]|2[0-8])([-./])(02)([-./])(\d{4}))|((29)(\.|-|\/)(02)([-./])([02468][048]00))|((29)([-./])(02)([-./])([13579][26]00))|((29)([-./])(02)([-./])([0-9][0-9][0][48]))|((29)([-./])(02)([-./])([0-9][0-9][2468][048]))|((29)([-./])(02)([-./])([0-9][0-9][13579][26])))" ValidationGroup="vg_cerca" Display="Dynamic">!</asp:RegularExpressionValidator>
</p>
</fieldset>
<fieldset id="fldEsiti" class="left" style="padding:3px;margin-left:5px;height:55px;">
<legend>Esiti</legend>
<p style="margin:0px;padding:3px;" class="left" id="colSxEsi">
<asp:Label ID="Label3" runat="server" Text="Motivi"></asp:Label><br />
<asp:DropDownList ID="DropDownList_motivi" runat="server" CssClass="textbox" DataSourceID="SqlDataSource_motivi" DataTextField="motivoStr" DataValueField="idMotivo" AppendDataBoundItems="True" AutoPostBack="True" OnSelectedIndexChanged="DropDownList_motivi_SelectedIndexChanged">
<asp:ListItem Value="..."></asp:ListItem>
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource_motivi" runat="server" ConnectionString="<%$ ConnectionStrings:LocalSqlServer %>" ProviderName="System.Data.SqlClient" SelectCommand="SELECT idMotivo, motivoStr FROM dbo.MKT_list_motivi ORDER BY motivoStr"></asp:SqlDataSource>
</p>
<p style="margin:0px;padding:3px;" class="left" id="colDxEsi" onmouseover="tooltip.show('seleziona max. 3 esiti');" onmouseout="tooltip.hide();">
<asp:Label ID="Label4" runat="server" Text="Esiti"></asp:Label><br />
<asp:ListBox ID="ListBox_esiti" runat="server" AppendDataBoundItems="True" CssClass="textbox"
DataSourceID="SqlDataSource_esiti" DataTextField="esitoStr" DataValueField="idEsito"
Rows="1" SelectionMode="Multiple">
<asp:ListItem Value="...">...</asp:ListItem>
</asp:ListBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator_motivi" runat="server" ControlToValidate="ListBox_esiti"
CssClass="errore" Display="Dynamic" Enabled="False" ErrorMessage="Seleziona uno o più esiti"
ValidationGroup="vg_cerca" InitialValue="...">!</asp:RequiredFieldValidator>
<asp:SqlDataSource ID="SqlDataSource_esiti" runat="server" ConnectionString="<%$ ConnectionStrings:LocalSqlServer %>" ProviderName="System.Data.SqlClient" SelectCommand="MKT_get_ListEsiti_for_motivo" SelectCommandType="StoredProcedure" >
<SelectParameters>
<asp:Parameter Name="idMotivo" Type="Int16" />
</SelectParameters>
</asp:SqlDataSource>
</p>
</fieldset>
<p style="margin-top:42px;margin-left:5px;padding:3px;" class="left">
<asp:ImageButton ID="ImageButton_cerca" runat="server" ImageUrl="~/images/search_16x16.png" ToolTip="Cerca" ValidationGroup="vg_cerca" OnClick="ImageButton_cerca_Click" />
</p>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" CssClass="errore" DisplayMode="List" ValidationGroup="vg_cerca" /><br />
<asp:CustomValidator ID="CustomValidator_esiti" runat="server" ErrorMessage="Definire un criterio di ricerca" SetFocusOnError="True" ValidationGroup="vg_cerca" OnServerValidate="CustomValidator_esiti_ServerValidate" Display="Dynamic" ForeColor="White"></asp:CustomValidator>
</div>
</fieldset>
</div>
<div id="resultRicerca" runat="server" visible="false">
<fieldset class="label_11" id="fldResult_ricerca">
<legend>Risultati ricerca</legend>
<asp:GridView ID="GridView_resultRicerca" runat="server" DataSourceID="SqlDataSource_resultRicerca" AutoGenerateColumns="False" DataKeyNames="ID_Persona,idAssegnazione">
<Columns>
<asp:BoundField DataField="ID_Persona" HeaderText="ID_Persona" InsertVisible="False"
ReadOnly="True" SortExpression="ID_Persona" Visible="False" />
<asp:BoundField DataField="Cognome_Persona" HeaderText="Cognome_Persona" SortExpression="Cognome_Persona" />
<asp:BoundField DataField="Nome_Persona" HeaderText="Nome_Persona" SortExpression="Nome_Persona" />
<asp:BoundField DataField="DataNascita_Persona" HeaderText="DataNascita_Persona"
SortExpression="DataNascita_Persona" />
<asp:BoundField DataField="Comune_Persona" HeaderText="Comune_Persona" SortExpression="Comune_Persona" />
<asp:BoundField DataField="c_provincia" HeaderText="c_provincia" SortExpression="c_provincia" />
<asp:BoundField DataField="idAssegnazione" HeaderText="idAssegnazione" InsertVisible="False"
ReadOnly="True" SortExpression="idAssegnazione" Visible="False" />
<asp:BoundField DataField="dataLastTelefonata" HeaderText="dataLastTelefonata" ReadOnly="True"
SortExpression="dataLastTelefonata" />
<asp:BoundField DataField="esitoStr" HeaderText="esitoStr" SortExpression="esitoStr" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource_resultRicerca" ConnectionString="<%$ ConnectionStrings:LocalSqlServer %>" runat="server" ProviderName="System.Data.SqlClient" SelectCommand="MKT_get_ricercaContatti_inAssegnazione" SelectCommandType="StoredProcedure" OnSelecting="SqlDataSource_resultRicerca_Selecting" OnSelected="SqlDataSource_resultRicerca_Selected">
<SelectParameters>
<asp:Parameter Name="idRicerca" Type="Int32" />
<asp:Parameter Name="userIdOperatore" Type="Object" />
<asp:Parameter DbType="Date" DefaultValue="" Name="dal" />
<asp:Parameter DbType="Date" DefaultValue="" Name="al" />
<asp:Parameter DefaultValue="" Name="idMotivo" Type="Int16" />
<asp:Parameter Name="esiti" Type="String" />
<asp:Parameter Direction="ReturnValue" Name="RETURN_VALUE" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
</fieldset>
</div>


STORED PROCEDURE
ALTER PROCEDURE [dbo].[MKT_get_ricercaContatti_inAssegnazione]
@idRicerca int,
@userIdOperatore uniqueidentifier,
@dal smalldatetime = '19000101',
@al smalldatetime = '19000101',
@idMotivo smallint = 0,
@esiti nvarchar (12) = ''
AS
BEGIN

declare @inizio int
declare @lastFound int
declare @contatore int

declare @txtSql nvarchar(4000)

SET @inizio = 0
set @contatore = 0

SET @txtSql = N'SELECT PERSONE.ID_Persona, PERSONE.Cognome_Persona, PERSONE.Nome_Persona, PERSONE.DataNascita_Persona, PERSONE.Comune_Persona,
COMUNI.c_provincia, MKT_ASSEGNAZIONI.idAssegnazione, MAX(MKT_TELEFONATE.dataTelefonata) AS dataLastTelefonata,
MKT_ESITO_TELEFONATA.esitoStr
FROM MKT_ASSEGNAZIONI INNER JOIN
PERSONE ON MKT_ASSEGNAZIONI.idContatto = PERSONE.ID_Persona INNER JOIN
COMUNI ON PERSONE.Comune_Persona = COMUNI.c_nome INNER JOIN
MKT_TELEFONATE ON MKT_ASSEGNAZIONI.idAssegnazione = MKT_TELEFONATE.idAssegnazione INNER JOIN
MKT_DETT_TELEFONATE ON MKT_TELEFONATE.idTelefonata = MKT_DETT_TELEFONATE.idTelefonata INNER JOIN
MKT_MOTIVI_ESITI ON MKT_DETT_TELEFONATE.motivo_esito = MKT_MOTIVI_ESITI.idMotivoEsito INNER JOIN
MKT_ESITO_TELEFONATA ON MKT_MOTIVI_ESITI.idEsito = MKT_ESITO_TELEFONATA.idEsito'

--aggiungo i criteri relativi all'identificativo dell'operatore e della ricerca
SET @txtSql = @txtSql + ' WHERE (MKT_ASSEGNAZIONI.idRicerca =@idRicerca) AND (MKT_ASSEGNAZIONI.userIdOperatore =@userIdOperatore) AND (MKT_ASSEGNAZIONI.locked = 0)'

--aggiungo i criteri relativi all'esito della telefonata
IF (@idMotivo <> 0 AND @esiti <> '')
BEGIN
SET @txtSql = @txtSql + ' AND (MKT_MOTIVI_ESITI.idMotivo =@idMotivo)'

WHILE (@inizio <= LEN(@esiti))
BEGIN
SET @lastFound = CHARINDEX (N';',@esiti,@inizio)

IF (@lastFound=0 OR @lastFound = NULL)
SET @lastFound = LEN(@esiti)+1

SET @contatore = @contatore+1

IF (@contatore = 1)
BEGIN
SET @txtSql = @txtSql + ' AND ((MKT_MOTIVI_ESITI.idEsito =' + RTRIM(LTRIM(SUBSTRING(@esiti,@inizio,@lastFound-@inizio))) + ')'
END
ELSE
BEGIN
SET @txtSql = @txtSql + ' OR (MKT_MOTIVI_ESITI.idEsito =' + RTRIM(LTRIM(SUBSTRING(@esiti,@inizio,@lastFound-@inizio))) + ')'
END
SET @inizio = @lastFound + 1
END
SET @txtSql = @txtSql + ')'
END

SET @txtSql = @txtSql + ' GROUP BY PERSONE.ID_Persona, PERSONE.Cognome_Persona, PERSONE.Nome_Persona, PERSONE.DataNascita_Persona, PERSONE.Comune_Persona,
COMUNI.c_provincia, MKT_ASSEGNAZIONI.idAssegnazione, MKT_ESITO_TELEFONATA.esitoStr'

--aggiungo i criteri relativi alla data della telefonata
IF (@dal <> '19000101' AND @al <> '19000101')
BEGIN
SET @txtSql = @txtSql + ' HAVING (MAX(MKT_TELEFONATE.dataTelefonata) >= @dal) AND (MAX(MKT_TELEFONATE.dataTelefonata) <= @al )'
END

SET @txtSql = @txtSql + ' ORDER BY PERSONE.Cognome_Persona'

--PRINT @txtSql

exec sp_executesql @txtSql,
N'@idRicerca int, @userIdOperatore uniqueidentifier, @idMotivo smallint, @dal smalldatetime, @al smalldatetime',
@idRicerca, @userIdOperatore, @idMotivo, @dal, @al

END
skraus wrote:
Mandando in esecuzione il tutto accade che viene eseguito l'evento di selecting ma la sp non viene eseguita sul SQL Server (ho verificato con il profiler) infatti l'evento di selected del SqlDataSource non si genera.
Vi riporto di seguito il codice della pagina aspx e il testo della SP.

non sarebbe servito, perchè non dipende dalla SP, ma dal codice. se i controlli DataSource sono comodi quando devi fare 2 robe in croce e velocemente, in questi scenari usarli è secondo me sbagliato, come hai notato. comunque, all'atto pratico devi forzare il databind sul controllo, dopo aver assegnato i parametri e la SP, altrimenti al PostBack continua ad usare quello che già ha (cioè, niente).
molto meglio il classico modo di usare ADO.NET in casi come questi. .

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.