Componentes Repeater aninhados
26/11/2008
0
Olá pessoal,
Esse é meu primeiro post no fórum. Mas faz dois dias que venho sofrendo com um problema de programação simples por falta de conhecimento com .Net - cheguei ao ponto de desespero, pois o que eu faria facilmente em PHP ou ASP em 5 minutos está um martírio fazer com ASP.Net.
Tendarei documentar o problema da forma mais clara possível:
Banco de dados 1:
Isso resulta em:
Todos os dias que houveram vendas com todos os vendedores que eu preciso.
Até aí ótimo, a lógica da consulta para a minha aplicação está OK.
Aqui começa o sofrimento - preciso utilizar as datas e códigos de vendedores (Resultados acima) como argumentos para uma nova consulta.
Ou seja,
Tenho os componentes Repeater1 (Pai) e Repeater2 (Filho).
Para o Repeater1 tenho o data source -> SqlDataSourcePeriodo
Para o Repeater2 tenho o data source -> SqlDataSourceVendedores
O Repeater1 tem o evento [b:edc2515f91]OnItemDataBound=´rptSqlDataSourcePeriodo_ItemDataBound´[/b:edc2515f91]
E agora vamos ao aspx.cs
[/code]
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
//using Accessibility;
public partial class Data_EvolucaoVendedores : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void rptSqlDataSourcePeriodo_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
{
//sender.GetType();
DbDataRecord dbr = (DbDataRecord)e.Item.DataItem;
[b:edc2515f91]SqlDataSourceVendedores.SelectParameters[´dt_emissao´].DefaultValue = Convert.ToDateTime(DataBinder.Eval(dbr, ´dt_emissao´).ToString()).ToString(´s´).Substring(0,10);
SqlDataSourceVendedores.SelectParameters[´cd_vendedor´].DefaultValue = DataBinder.Eval(dbr, ´cd_vendedor´).ToString();
[/b:edc2515f91]
// @@@ SOMENTE PARA DEPURACAO
Label1.Text += ´ ´ + Convert.ToDateTime(DataBinder.Eval(dbr, ´dt_emissao´).ToString()).ToString(´s´).Substring(0, 10) + ´ ´ + DataBinder.Eval(dbr, ´cd_vendedor´).ToString() + ´ \n´;
//SqlDataSourceVendedores.DataBind();
}
}
protected void SqlDataSourcePeriodo_DataBinding(object sender, EventArgs e)
{
}
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
}
}
1/10/2008 0:00:00
1
[b:edc2515f91]685566,1800 ???? PORQUÊ[/b:edc2515f91]
1/10/2008 0:00:00
4
[b:edc2515f91]685566,1800 ???? PORQUÊ são iguais e a 4 digitos de precisao? [/b:edc2515f91]
1/10/2008 0:00:00
6
685566,1800
1/10/2008 0:00:00
65
685566,1800
1/10/2008 0:00:00
195
685566,1800
1/10/2008 0:00:00
450
685566,1800
1/10/2008 0:00:00
456
685566,1800
1/10/2008 0:00:00
458
685566,1800
1/10/2008 0:00:00
462
685566,1800
1/10/2008 0:00:00
463
685566,1800
1/10/2008 0:00:00
464
685566,1800
1/10/2008 0:00:00
465
685566,1800
1/10/2008 0:00:00
470
685566,1800
1/10/2008 0:00:00
482
685566,1800
2/10/2008 0:00:00
1
685566,1800
2/10/2008 0:00:00
4
685566,1800
2/10/2008 0:00:00
6
685566,1800
2/10/2008 0:00:00
65
685566,1800
2/10/2008 0:00:00
195
685566,1800
2/10/2008 0:00:00
450
685566,1800
2/10/2008 0:00:00
456
685566,1800
2/10/2008 0:00:00
458
685566,1800
2/10/2008 0:00:00
462
685566,1800
2/10/2008 0:00:00
463
685566,1800
2/10/2008 0:00:00
464
685566,1800
2/10/2008 0:00:00
465
685566,1800
2/10/2008 0:00:00
470
685566,1800
2/10/2008 0:00:00
482
685566,1800
Esse é meu primeiro post no fórum. Mas faz dois dias que venho sofrendo com um problema de programação simples por falta de conhecimento com .Net - cheguei ao ponto de desespero, pois o que eu faria facilmente em PHP ou ASP em 5 minutos está um martírio fazer com ASP.Net.
Tendarei documentar o problema da forma mais clara possível:
Banco de dados 1:
SELECT DISTINCT _A.[dt_emissao], VendaRepresentantes.vendedor FROM MI as _A, VendaRepresentantes WHERE VendaRepresentantes.subgrupo IN(1,2) ORDER BY 1 ASC, 2 ASC
Isso resulta em:
----------------------+-----------------+ dt_emissao | vendedor ----------------------+-----------------+ 1/10/2008 0:00:00 | 1 1/10/2008 0:00:00 | 4 1/10/2008 0:00:00 | 6 1/10/2008 0:00:00 | 65 1/10/2008 0:00:00 | 195 1/10/2008 0:00:00 | 450 1/10/2008 0:00:00 | 456 1/10/2008 0:00:00 | 458 1/10/2008 0:00:00 | 462 1/10/2008 0:00:00 | 463 1/10/2008 0:00:00 | 464 1/10/2008 0:00:00 | 465 1/10/2008 0:00:00 | 470 1/10/2008 0:00:00 | 482 2/10/2008 0:00:00 | 1 2/10/2008 0:00:00 | 4 2/10/2008 0:00:00 | 6 2/10/2008 0:00:00 | 65 2/10/2008 0:00:00 | 195 2/10/2008 0:00:00 | 450 2/10/2008 0:00:00 | 456 2/10/2008 0:00:00 | 458 2/10/2008 0:00:00 | 462 2/10/2008 0:00:00 | 463 2/10/2008 0:00:00 | 464 2/10/2008 0:00:00 | 465 2/10/2008 0:00:00 | 470 2/10/2008 0:00:00 | 482 -----------------------+----------------
Todos os dias que houveram vendas com todos os vendedores que eu preciso.
Até aí ótimo, a lógica da consulta para a minha aplicação está OK.
Aqui começa o sofrimento - preciso utilizar as datas e códigos de vendedores (Resultados acima) como argumentos para uma nova consulta.
<¬@ Page Language="C#" AutoEventWireup="true" CodeFile="EvolucaoVendedores.aspx.cs" Inherits="Data_EvolucaoVendedores" ¬> <form id="form1" runat="server"> <asp:Repeater[color=blue] ID="Repeater1"[/color] runat="server" DataSourceID="SqlDataSourcePeriodo" [color=red]OnItemDataBound="rptSqlDataSourcePeriodo_ItemDataBound"[/color]> <ItemTemplate> <¬ DataBinder.Eval(Container, "DataItem.dt_emissao") ¬> <¬ DataBinder.Eval(Container, "DataItem.cd_vendedor") ¬> <asp:Repeater [color=blue]ID="Repeater2"[/color] runat="server" DataSourceID="SqlDataSourceVendedores"> <ItemTemplate> <¬# DataBinder.Eval(Container, "DataItem.total") ¬> </ItemTemplate> </asp:Repeater> </ItemTemplate> </asp:Repeater> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> <asp:SqlDataSource DataSourceMode="DataReader" ID="SqlDataSourcePeriodo" runat="server" ConnectionString="<¬$ ConnectionStrings:independenciaConnectionString ¬>" SelectCommand="SELECT DISTINCT _A.[dt_emissao], VendaRepresentantes.vendedor as cd_vendedor FROM MI as _A, VendaRepresentantes WHERE VendaRepresentantes.subgrupo IN(1,2) ORDER BY 1 ASC, 2 ASC"></asp:SqlDataSource> <asp:SqlDataSource DataSourceMode="DataReader" ID="SqlDataSourceVendedores" runat="server" ConnectionString="<¬$ ConnectionStrings:independenciaConnectionString ¬>" SelectCommand="SELECT SUM(MI.vl_produto) as total FROM MI WHERE MI.dt_emissao = @dt_emissao AND MI.cd_vendedor = @cd_vendedor"> <SelectParameters> <asp:Parameter Name="dt_emissao" DefaultValue="" Type="DateTime" /> <asp:Parameter Name="cd_vendedor" DefaultValue="" Type="String" /> </SelectParameters> </asp:SqlDataSource> <p> </p> </form>
Ou seja,
Tenho os componentes Repeater1 (Pai) e Repeater2 (Filho).
Para o Repeater1 tenho o data source -> SqlDataSourcePeriodo
Para o Repeater2 tenho o data source -> SqlDataSourceVendedores
O Repeater1 tem o evento [b:edc2515f91]OnItemDataBound=´rptSqlDataSourcePeriodo_ItemDataBound´[/b:edc2515f91]
E agora vamos ao aspx.cs
[/code]
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
//using Accessibility;
public partial class Data_EvolucaoVendedores : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void rptSqlDataSourcePeriodo_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
{
//sender.GetType();
DbDataRecord dbr = (DbDataRecord)e.Item.DataItem;
[b:edc2515f91]SqlDataSourceVendedores.SelectParameters[´dt_emissao´].DefaultValue = Convert.ToDateTime(DataBinder.Eval(dbr, ´dt_emissao´).ToString()).ToString(´s´).Substring(0,10);
SqlDataSourceVendedores.SelectParameters[´cd_vendedor´].DefaultValue = DataBinder.Eval(dbr, ´cd_vendedor´).ToString();
[/b:edc2515f91]
// @@@ SOMENTE PARA DEPURACAO
Label1.Text += ´ ´ + Convert.ToDateTime(DataBinder.Eval(dbr, ´dt_emissao´).ToString()).ToString(´s´).Substring(0, 10) + ´ ´ + DataBinder.Eval(dbr, ´cd_vendedor´).ToString() + ´ \n´;
//SqlDataSourceVendedores.DataBind();
}
}
protected void SqlDataSourcePeriodo_DataBinding(object sender, EventArgs e)
{
}
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
}
}
Isso reproduz a seguinte saída:
1/10/2008 0:00:00
1
[b:edc2515f91]685566,1800 ???? PORQUÊ[/b:edc2515f91]
1/10/2008 0:00:00
4
[b:edc2515f91]685566,1800 ???? PORQUÊ são iguais e a 4 digitos de precisao? [/b:edc2515f91]
1/10/2008 0:00:00
6
685566,1800
1/10/2008 0:00:00
65
685566,1800
1/10/2008 0:00:00
195
685566,1800
1/10/2008 0:00:00
450
685566,1800
1/10/2008 0:00:00
456
685566,1800
1/10/2008 0:00:00
458
685566,1800
1/10/2008 0:00:00
462
685566,1800
1/10/2008 0:00:00
463
685566,1800
1/10/2008 0:00:00
464
685566,1800
1/10/2008 0:00:00
465
685566,1800
1/10/2008 0:00:00
470
685566,1800
1/10/2008 0:00:00
482
685566,1800
2/10/2008 0:00:00
1
685566,1800
2/10/2008 0:00:00
4
685566,1800
2/10/2008 0:00:00
6
685566,1800
2/10/2008 0:00:00
65
685566,1800
2/10/2008 0:00:00
195
685566,1800
2/10/2008 0:00:00
450
685566,1800
2/10/2008 0:00:00
456
685566,1800
2/10/2008 0:00:00
458
685566,1800
2/10/2008 0:00:00
462
685566,1800
2/10/2008 0:00:00
463
685566,1800
2/10/2008 0:00:00
464
685566,1800
2/10/2008 0:00:00
465
685566,1800
2/10/2008 0:00:00
470
685566,1800
2/10/2008 0:00:00
482
685566,1800
A minha impressão é que a cada iteração no laço de repetição do Repeater pai é como se o filho pegasse a mesma data do dt_emissao e código do vendedor. Desde já agradeço imensamente quem se dispuser a dar uma luz nesse caso.
Sorvete
Curtir tópico
+ 0
Responder