Usuário com melhor resposta
Master Page - Executando função indevidamente

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