none
Master Page - Executando função indevidamente RRS feed

  • Pergunta

  • Bom dia, 

    Depois de anos voltei a trabalhar com VS[2005], vou tentar explicar o problema, sendo que nem eu sei como descreve-lo xD, vamos lá.

    Tenho uma Master Page e todo o conteúdo do sistema roda dentro do ContentPlaceHolder, na pagina licFornecedor.aspx tem um botão que pega o valor na tela [CNPJ], segura na sessão e da um Response para a pagina relatorio.aspx, segue código abaixo:

    protected void btnPesquisar_Click(object sender, EventArgs e)
    
        {
            Fornecedor fornecedor = new Fornecedor();
            fornecedor.Cnpj = txtCNPJ.Text;
            Session["CNPJ"] = fornecedor.Cnpj;
            Response.Redirect("relatorio.aspx");
    
        }

    Já no relatorio.aspx, instancia a classe Relatórios, chama o método do Relatório especifico e da o DataBind do ReportView, código abaixo:

     protected void Page_Load(object sender, EventArgs e)
        {
            Relatorios rel = new Relatorios();
            DSRelatorios dsr = rel.Lic_Fornecedor(Session["CNPJ"].ToString());
            RV.DataBind();
        }

    Nota: DSRelatorios dsr é o DataSet do meu Relatorio, estou usando o FireBird1.5

    Segue o código do método Lic_Fornecedor:

    public DSRelatorios Lic_Fornecedor(string CNPJ)
        {
    
            DSRelatorios dsr = new DSRelatorios();
            try
            {
                Conectar();
                fbCmm = new FbCommand(@"SELECT
                    case pl.id_modalidade
                    when '0001' then 'PE'
                    when '0002' then 'PP'
                    when '0003' then 'CP'
                    when '0004' then 'TP'
                    when '0005' then 'CC'
                    else 'ND' END || SUBSTRING(PL.id_pregao FROM 4 FOR 3)|| '/' || PL.ano AS NUM_PREGAO,
                    PL.n_lote AS NUM_LOTE, (SELECT (SELECT OG.sigla FROM ORGAO OG
                    WHERE OG.id_orgao=PE.id_orgao)
                    FROM pregao PE
                    WHERE PE.id_pregao=PL.id_pregao AND PE.id_modalidade=PL.id_modalidade AND PE.ano=PL.ano) AS SIGLA,
                    (SELECT (SELECT AV.descricao FROM ATIVIDADE AV WHERE AV.id_atividade=PE.id_atividade)
                    FROM pregao PE WHERE PE.id_pregao=PL.id_pregao AND PE.id_modalidade=PL.id_modalidade
                    AND PE.ano=PL.ano) AS RAMO_ATIVIDADE, PL.d_adj_homo, PL.vl_arrematado*PL.qtd TOTAL_LOTE,
                    (select fn.RAZAO_SOCIAL from fornecedor fn where fn.id_cnpj = pl.id_cnpj) as RAZAO_SOCIAL
                    FROM PREGAO_LOTE PL WHERE PL.id_cnpj = '"+CNPJ+"'", fbCnn);
                FbDataAdapter fda = new FbDataAdapter(fbCmm);
                fda.Fill(dsr, "Licitacao_Fornecedor");
    
                return dsr;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

    O problema[ufa!] é, o fluxo do sistema funciona normal ate o "RV.DataBind();", depois dai a Master Page da o Page_Load e logo em seguida, volta pra classe Relatórios, passa pelo Construtor, que não tem código, e depois executa o método Lic_Fornecedor de novo, mas dessa passando o parâmetro null resultando em um relatório em branco. Procurei onde Relatorios esta sendo instanciada e é apenas no relatorio.aspx, o método a mesma coisa.

    Se falei de mais e expliquei de menos, me avisem.

    terça-feira, 26 de junho de 2012 11:56

Respostas

  • Conseguir!

    Me deu um estalo aqui e lembrei que o componente ReportViewer, escolhe um arquivo .rdlc, que esse arquivo se conectava através de um ObjectDataSource ligando o SELECT do DataSource ao método Lic_Fornecedor, ai quando a pagina relatorio.aspx executava o método trazia os valores corretamente e depois quando instanciava o componete, ele também chamava o método, mas dessa vez sem parâmetro, resultando em um relatório vazio.

    E pra resolver isso, retirei o vinculo do arquivo.rdlc com qualquer ObjectDataSource e instancia em tempo de execução, segue abaixo os códigos com as mudanças:

    relatorio.aspx:

    protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Relatorios rel = new Relatorios();
                DSRelatorios.Licitacao_FornecedorDataTable dsr = rel.Lic_Fornecedor(Session["CNPJ"].ToString());
                ReportDataSource rds = new ReportDataSource("DSRelatorios_Licitacao_Fornecedor", dsr);
                RV.LocalReport.DataSources.Add(rds);
                RV.DataBind();
            }
        }

    e o método Lic_Fornecedor:

    public DSRelatorios.Licitacao_FornecedorDataTable Lic_Fornecedor(string CNPJ)
        {
            DSRelatorios.Licitacao_FornecedorDataTable dsr = new DSRelatorios.Licitacao_FornecedorDataTable();
            if (CNPJ != null)
            {
                
                try
                {
                    Conectar();
                    fbCmm = new FbCommand(@"SELECT
                    case pl.id_modalidade
                    when '0001' then 'PE'
                    when '0002' then 'PP'
                    when '0003' then 'CP'
                    when '0004' then 'TP'
                    when '0005' then 'CC'
                    else 'ND' END || SUBSTRING(PL.id_pregao FROM 4 FOR 3)|| '/' || PL.ano AS NUM_PREGAO,
                    PL.n_lote AS NUM_LOTE, (SELECT (SELECT OG.sigla FROM ORGAO OG
                    WHERE OG.id_orgao=PE.id_orgao)
                    FROM pregao PE
                    WHERE PE.id_pregao=PL.id_pregao AND PE.id_modalidade=PL.id_modalidade AND PE.ano=PL.ano) AS SIGLA,
                    (SELECT (SELECT AV.descricao FROM ATIVIDADE AV WHERE AV.id_atividade=PE.id_atividade)
                    FROM pregao PE WHERE PE.id_pregao=PL.id_pregao AND PE.id_modalidade=PL.id_modalidade
                    AND PE.ano=PL.ano) AS RAMO_ATIVIDADE, PL.d_adj_homo, PL.vl_arrematado*PL.qtd TOTAL_LOTE,
                    (select fn.RAZAO_SOCIAL from fornecedor fn where fn.id_cnpj = pl.id_cnpj) as RAZAO_SOCIAL
                    FROM PREGAO_LOTE PL WHERE PL.id_cnpj = '" + CNPJ + "'", fbCnn);
                    FbDataAdapter fda = new FbDataAdapter(fbCmm);
                    /*         (DataSet, "Nome da tabela dentro do DataSet")
                     * fda.Fill(dsr, "Licitacao_Fornecedor");
                     */
                    fda.Fill(dsr);
    
                    return dsr;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
            else
                return dsr;
        }

    Espero que isso possa ajudar alguém mais a frente.

    E vlw Robson pelo o toque do Page.isPostBack, foi muito útil ;)

    • Marcado como Resposta Ayslan Dielf terça-feira, 26 de junho de 2012 14:34
    terça-feira, 26 de junho de 2012 14:33

Todas as Respostas

  • Experimenta inserir o teste de post back

    protected void Page_Load(object sender, EventArgs e) {

    if(!Page.IsPostBack)

    { Relatorios rel = new Relatorios(); DSRelatorios dsr = rel.Lic_Fornecedor(Session["CNPJ"].ToString()); RV.DataBind();

    } }


    Caso a resposta seja útil ou responda sua questão, colabore marcando-a como resposta ou como útil.

    • Sugerido como Resposta RobsonGmack terça-feira, 26 de junho de 2012 12:32
    terça-feira, 26 de junho de 2012 12:32
  • Não surtiu efeito, na primeira vez que ele passou, ele verificou o PostBack, estava como false e executou os comandos, depois que deu o Page_Load da Master Page novamente, ele seguiu já pra dentro da classe Relatorios indo pro construtor e em seguida dentro da método Lic_Fornecedor
    terça-feira, 26 de junho de 2012 12:53
  • Conseguir!

    Me deu um estalo aqui e lembrei que o componente ReportViewer, escolhe um arquivo .rdlc, que esse arquivo se conectava através de um ObjectDataSource ligando o SELECT do DataSource ao método Lic_Fornecedor, ai quando a pagina relatorio.aspx executava o método trazia os valores corretamente e depois quando instanciava o componete, ele também chamava o método, mas dessa vez sem parâmetro, resultando em um relatório vazio.

    E pra resolver isso, retirei o vinculo do arquivo.rdlc com qualquer ObjectDataSource e instancia em tempo de execução, segue abaixo os códigos com as mudanças:

    relatorio.aspx:

    protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Relatorios rel = new Relatorios();
                DSRelatorios.Licitacao_FornecedorDataTable dsr = rel.Lic_Fornecedor(Session["CNPJ"].ToString());
                ReportDataSource rds = new ReportDataSource("DSRelatorios_Licitacao_Fornecedor", dsr);
                RV.LocalReport.DataSources.Add(rds);
                RV.DataBind();
            }
        }

    e o método Lic_Fornecedor:

    public DSRelatorios.Licitacao_FornecedorDataTable Lic_Fornecedor(string CNPJ)
        {
            DSRelatorios.Licitacao_FornecedorDataTable dsr = new DSRelatorios.Licitacao_FornecedorDataTable();
            if (CNPJ != null)
            {
                
                try
                {
                    Conectar();
                    fbCmm = new FbCommand(@"SELECT
                    case pl.id_modalidade
                    when '0001' then 'PE'
                    when '0002' then 'PP'
                    when '0003' then 'CP'
                    when '0004' then 'TP'
                    when '0005' then 'CC'
                    else 'ND' END || SUBSTRING(PL.id_pregao FROM 4 FOR 3)|| '/' || PL.ano AS NUM_PREGAO,
                    PL.n_lote AS NUM_LOTE, (SELECT (SELECT OG.sigla FROM ORGAO OG
                    WHERE OG.id_orgao=PE.id_orgao)
                    FROM pregao PE
                    WHERE PE.id_pregao=PL.id_pregao AND PE.id_modalidade=PL.id_modalidade AND PE.ano=PL.ano) AS SIGLA,
                    (SELECT (SELECT AV.descricao FROM ATIVIDADE AV WHERE AV.id_atividade=PE.id_atividade)
                    FROM pregao PE WHERE PE.id_pregao=PL.id_pregao AND PE.id_modalidade=PL.id_modalidade
                    AND PE.ano=PL.ano) AS RAMO_ATIVIDADE, PL.d_adj_homo, PL.vl_arrematado*PL.qtd TOTAL_LOTE,
                    (select fn.RAZAO_SOCIAL from fornecedor fn where fn.id_cnpj = pl.id_cnpj) as RAZAO_SOCIAL
                    FROM PREGAO_LOTE PL WHERE PL.id_cnpj = '" + CNPJ + "'", fbCnn);
                    FbDataAdapter fda = new FbDataAdapter(fbCmm);
                    /*         (DataSet, "Nome da tabela dentro do DataSet")
                     * fda.Fill(dsr, "Licitacao_Fornecedor");
                     */
                    fda.Fill(dsr);
    
                    return dsr;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
            else
                return dsr;
        }

    Espero que isso possa ajudar alguém mais a frente.

    E vlw Robson pelo o toque do Page.isPostBack, foi muito útil ;)

    • Marcado como Resposta Ayslan Dielf terça-feira, 26 de junho de 2012 14:34
    terça-feira, 26 de junho de 2012 14:33