Array
(
)

Componentes Repeater aninhados

Sorvete
   - 26 nov 2008

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:

#Código


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:

#Código

----------------------+-----------------+
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.


#Código

<¬@ 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>
&nbsp;<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>
&nbsp;</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 OnItemDataBound=´rptSqlDataSourcePeriodo_ItemDataBound´

E agora vamos ao aspx.cs

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;
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();

// @@@ 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)
{

}
}
#Código


Isso reproduz a seguinte saída:


1/10/2008 0:00:00
1

685566,1800 ???? PORQUÊ


1/10/2008 0:00:00
4

685566,1800 ???? PORQUÊ são iguais e a 4 digitos de precisao?


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

#Código


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.