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
[/tagcod]
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.