none
Download de relatorios Erro no metodo .Render() RRS feed

  • Pergunta

  • Olá pessoal, boa tarde, estou com um problema ne geração de um relatorio, eu criei um relatorio mais um sub relatorio, ai no metodo load do relatorio principal eu tento renderizar ele e é gerado um erro:

    Eu preciso renderizá-lo pois eu quero fazer o download dele ao invés de exibir ele no Browser, se eu exibo ele no Browser não dá erro:

    Metodo de Renderização:
    ReportViewer1.LocalReport.Render("PDF");

    Erro Gerado:
    {"An error occurred during local report processing."}

    Alguem poderia me ajudar ?

    Obrigado !

    anderson magri

    quinta-feira, 5 de julho de 2012 13:58

Respostas

  • Consegui Resolver o meu problema, o Rafael Zaccanini, mostrou 2 propriedades que tenho que modificar no arquivo .rdlc, são elas: "Build Action= Content " e "Copy to outpu directory = Copy Always" !

    Ai eu publiquei novamente a aplicação e funcionou certinho !

    Lembrando que tem que fazer isso com todos os arquivos .rdlc !

    Abraços pessoal ! Obrigado pela ajuda !


    anderson magri

    • Marcado como Resposta Anderson Magri quarta-feira, 11 de julho de 2012 13:34
    quarta-feira, 11 de julho de 2012 13:34

Todas as Respostas

  • Olá Anderson, tudo bem?

    Eu tenho um exemplo que se enquadra no que precisa no meu PasteBin (http://pastebin.com/amriTVbE).

    É um método que você passa o objeto ReportViewer e ele lhe retorna um array de byte do PDF gerado.

    Segue o código abaixo:

    public static byte[] ExportReportViewer2Pdf(ReportViewer rpt)
    {
    	try
    	{
    		Warning[] warnings;
    		string[] streamids;
    		string mimeType;
    		string encoding;
    		string extension;
    		string deviceInfo = "<DeviceInfo><OutputFormat>PDF</OutputFormat></DeviceInfo>";
    		return rpt.LocalReport.Render("PDF", deviceInfo, out mimeType, out encoding, out extension, out streamids, out warnings) as byte[];
    	}
    	catch (Exception ex)
    	{
    		throw (ex);
    	}
    }


    Atenciosamente,
    Raphael A. F. Cardoso
    Blog: www.csharpbrasil.com.br
    Twitter: @csharpbrasil / @ferronicardoso

    “Se um dia você tiver que escolher entre o mundo e o amor, lembre-se: Se escolher o mundo ficará sem amor, mas se você escolher o amor, com ele conquistará o mundo” (Albert Einstein)

    sexta-feira, 6 de julho de 2012 15:11
  • Olá Raphael, obrigado pela ajuda, mas foi exatamente dessa forma que eu consegui fazer, tenho outra dúvida, tem como saber se o relatório ja está pronto, ou seja, se ja está renderizado ?

    Veja meu cenário:
    Tenho uma página onde o usuário escolhe os parâmetros que vai para o relatório, depois de escolhido ele clica em gerar, ai eu redireciono para uma nova página onde tem o relatório em si, ai eu pego os parametros e monto o meu relatorio, até ai tudo bem, só que essa página é exibida no browser, e eu não quero exibir no Browser o meu relatório eu quero que ele seja disponibilizado para download, o jeito que eu achei de fazer, foi o seguinte, deixei as propriedades "Mostrar ToolBox" e "Mostrar Body" do relatório como "false", e deixei apenas um botão na página para fazer o download, ou seja eu tenho esse botão que  quando clicado eu renderizo ele exatamente da mesma forma que você mostrou, e é disponibilizado para download, mas o problema é que se for um relatório muito grande o usuário vai clicar no botão assim que abrir a página, e o relatório não vai estar totalmente pronto, baixando pela metade, por isso que gostaria de saber se tem algum metodo ou propriedade que eu possa verificar se ele está totalmente renderizado ! 

    Fico no aguardo !

    Att Anderson Magri


    anderson magri

    sexta-feira, 6 de julho de 2012 17:31
  • Olá Anderson

    O que você pode fazer é forçar o download do relatório.

    Faça o seguinte. Em um webform, crie o ReportViewer dinamicamente pelo Code Behind no Page_Load passando os parâmetros necessários, chame o método que gera o PDF e o array de byte do PDF você força o download. Veja um exemplo abaixo:

    protected void Page_Load(object sender, EventArgs e)
    {
        ReportViewer rpt = new ReportViewer();
        // TODO: Passa todos os parametros necessarios
    
        rpt.LocalReport.Refresh();
    
        byte[] pdf = ExportReportViewer2Pdf(rpt);
        DownloadArquivo("meu_relatorio.pdf", pdf);
    }
    
    protected void DownloadArquivo(string NomeArquivo, byte[] Arquivo)
    {
        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment; filename=" + NomeArquivo);
        Response.AddHeader("Content-Length", Arquivo.Length.ToString());
        Response.ContentType = "application/octet-stream";
        Response.BinaryWrite(Arquivo);
        Response.End();
    }
    Eu faria mais ou menos assim. Veja se lhe ajuda e dá um retorno.


    Atenciosamente,
    Raphael A. F. Cardoso
    Blog: www.csharpbrasil.com.br
    Twitter: @csharpbrasil / @ferronicardoso

    “Se um dia você tiver que escolher entre o mundo e o amor, lembre-se: Se escolher o mundo ficará sem amor, mas se você escolher o amor, com ele conquistará o mundo” (Albert Einstein)

    sábado, 7 de julho de 2012 15:33
  • Olá Raphael, consegui resolver esse problema, agora estou com outro, que parece que uma boa parte da comunidade também tem, eu publiquei minha aplicação no meu servidor de aplicação (IIS 6) só que adivinha o que aconteceu ? o relatorio simplesmente não carrega, ai descobri que tem que ter o ReportViewer Redistributable no servidor, ai eu baixei e instalei, e continua mesmo assim não funcionando meu relatorio, da um erro dizendo que não foi possível localizar o recurso, ai eu ja não sei mais o que eu posso fazer, tens alguma ideia para me ajudar ?

    Eu li algo sobre deixar os arquivos .rdlc na pasta bin da aplicação mas mesmo assim, continua dizendo que não foi possível localizar o recurso.

    Fico no aguardo ai cara, e todo o pessoal da comunidade que ja passou por esse problema se possível dar um help ai !

    Att Anderson Magri


    anderson magri

    terça-feira, 10 de julho de 2012 20:34
  • Consegui Resolver o meu problema, o Rafael Zaccanini, mostrou 2 propriedades que tenho que modificar no arquivo .rdlc, são elas: "Build Action= Content " e "Copy to outpu directory = Copy Always" !

    Ai eu publiquei novamente a aplicação e funcionou certinho !

    Lembrando que tem que fazer isso com todos os arquivos .rdlc !

    Abraços pessoal ! Obrigado pela ajuda !


    anderson magri

    • Marcado como Resposta Anderson Magri quarta-feira, 11 de julho de 2012 13:34
    quarta-feira, 11 de julho de 2012 13:34