Componentes Repeater aninhados

26/11/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:

SELECT 
  DISTINCT 
  _A.[dt_emissao&93;,
  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&91;color=blue&93; ID="Repeater1"&91;/color&93; runat="server" DataSourceID="SqlDataSourcePeriodo" &91;color=red&93;OnItemDataBound="rptSqlDataSourcePeriodo_ItemDataBound"&91;/color&93;>
        <ItemTemplate>
            <¬ DataBinder.Eval(Container, "DataItem.dt_emissao") ¬>
            <¬ DataBinder.Eval(Container, "DataItem.cd_vendedor") ¬>
            <asp:Repeater &91;color=blue&93;ID="Repeater2"&91;/color&93; 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.&91;dt_emissao&93;,
  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 [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.
[/quote]


Sorvete