none
Erro na passagem de parâmetros no crystal Reports depois de publicado. RRS feed

  • Pergunta

  • Laercio bom dia.

     

    Resolvi a questão usando a dica que vc passou na video aula exibindo o relatório sem o print previewer (diga-se de passagem achei muito mais funcional).

    Agora surgiu algo insperado. Em tempo de projeto os relatórios funcionam normalmente, mas quando os publico o relatório não recebe os parâmetros. Por exemplo o codigo abaixo funciona em projeto normal, mais quando publico os parâmetros não são passados, Ou seja os valores que passo para os parametros não estão indo para o relatórios independente do tipo do dado.

    Linha 17 - tipo string 

    Linha 19 - tipo integer

    Linhas 21 e 23 - tipo date

     

    Fico muito grato se você ou alguem poder me ajudar.

     

    att,

    Genilson

     

     

    1- ReportDocument report = new ReportDocument();

    2- ParameterField prCodBandeira;

    3- ParameterField prCodEmpresa;

    4- ParameterField prDataInicial;

    5- ParameterField prDataFinal;

    6- ExportOptions exportOpts = new ExportOptions();

    7- DiskFileDestinationOptions diskOpts = ExportOptions.CreateDiskFileDestinationOptions();

    8- // LENDO O CAMINHO DO RELATORIO E DA PASTA TEMP

    9- string caminho_relatorio = ConfigurationSettings.AppSettings["pathRelPorBandeira"];

    10- string caminho_temp = ConfigurationSettings.AppSettings["pathFolderTemp"];

    11- // CARREGANDO O FORMULARIO

    12- report.Load(@"" + caminho_relatorio + "");

    13-

    14- // SETANDO O PARAMETRO DO FORMULARIO

    16- prCodBandeira = report.ParameterFields["paramCodBandeira"];

    17- prCodBandeira.CurrentValues.AddValue(codBandeira);

    18- prCodEmpresa = report.ParameterFields["paramCodEmpresa"];

    19- prCodEmpresa.CurrentValues.AddValue(codEmpresa);

    20- prDataInicial = report.ParameterFields["paramDataInicial"];

    21- prDataInicial.CurrentValues.AddValue(dti);

    22- prDataFinal = report.ParameterFields["paramDataFinal"];

    23- prDataFinal.CurrentValues.AddValue(dtf);

    segunda-feira, 22 de setembro de 2008 14:31

Respostas

  • Genilson,

     

    Ontem eu fiz alguns testes  para encontrar uma boa solução para o problema e acho que vc vai gostar:

     

    Como passar parâmetros para o Crystal Reports ? (parâmetros do tipo Parameter Fields)

     

    Code Snippet
    ReportDocument
    .SetParameterValue(
    "NOME_DO_PARAMETRO", VALOR_DO_PARAMETRO)

     

     

    Por exemplo, abrir o meu relatório do Crystal Reports dentro do .NET 2008, na toolbox "Field Explorer", adicionei um novo parâmetro chamado @color do tipo string, depois no item Select Expert adicione o parâmetro no meu filtro do relatório.

     

    No VB.NET como fica essa chamada:

    Code Snippet
    crReportDocument.SetParameterValue("@Color", "Black")

     

     

     

    Um exemplo completo em VB.NET

    Code Snippet

    Option Explicit On

    Option Strict On

     

    'referˆncias do crystal reports

    Imports CrystalDecisions.CrystalReports.Engine

    Imports CrystalDecisions.Shared

     

    Public Class wfmPrintPreviewCrystalReports

    Private Sub wfmPrintPreviewCrystalReports_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    'definindo o dataset do relat¢rio (o mesmo utilizado para fazer o designer do relat¢rio)

    '

    '

    'No wizard de cria‡Æo do TableAdapter (DataSet), no passo (Choose Methods to Generate),

    'deixe marcado TODOS os checkboxs "Fill DataTable" , "Return a DataTable" e "Create methods to send updates..."

    '

    'AWorks: Nome do meu Projeto em VB.NET (Windows Forms)

    'dsListProduct: Nome do meu DataSet criado no projeto (cotendo um TableAdapter com o nome Product)

    '

    Dim ta As New AWorks.dsListProductTableAdapters.ProductTableAdapter

    Dim dt As New AWorks.dsListProduct.ProductDataTable

    ta.Fill(dt)

    'carregando o relat¢rio

    Dim crReportDocument As New ReportDocument

    Dim strReportPath = String.Concat(Replace(My.Application.Info.DirectoryPath(), "\bin\Debug", ""), "\rptListProduct.rpt")

    crReportDocument.Load(strReportPath)

     

    'passando o dataset para o relat¢rio

    crReportDocument.SetDataSource(CType(dt, DataTable))

    Me.crPrintPreview.ReportSource = strReportPath

    Me.crPrintPreview.ReportSource = crReportDocument

     

    '

    'passando o parƒmetro para o relat¢rio @Color

    '

    crReportDocument.SetParameterValue("@Color", "Black")

     

    End Sub

    End Class

     

     

    Além disso, o seu código vai ficar bem mais simples.

     

    Espero ter ajudado!

     

     

     

     

    quinta-feira, 25 de setembro de 2008 13:38
    Moderador

Todas as Respostas

  • Genilson ,

     

    Dividi o seu post uma vez que trata de outro assunto (removi o outro post em duplicidade).

     

    Vamos lá:

     

    Passar parâmetros para Crystal Reports tem um detalhe, para funcionar tem que criar uma varíavel do tipo ParameterValues(), definir os valores dos parâmetros e no final atualizar os valores no relatório pelo método ApplyCurrentValues

     

    Um exemplo:

     

    Code Snippet

    ParameterValues pvValues = new ParameterValues();
    ParameterDiscreteValue pdvDiscreteValue = new ParameterDiscreteValue();
    pdvDiscreteValue.Value = "This is my first report caption.";
    pvValues.Add(pdvDiscreteValue);

     

    ParameterFieldDefinitions pfdDefinitions = this.m_rptParameterFields.DataDefinition.ParameterFields;
    ParameterFieldDefinition prdDefinition = pfdDefinitions["ReportCaption"];
    prdDefinition.ApplyCurrentValues(pvValues);
    this.m_crvCrystalReportViewer.Refresh();

     

     

    Um passo a passo:

    http://www.c-sharpcorner.com/UploadFile/john_charles/WorkingwithParameterFieldsinCrystalReports06232008102249AM/WorkingwithParameterFieldsinCrystalReports.aspx

     

    É por isso que eu faço da outra forma ;-)

     

    Espero ter ajudado.

     

    segunda-feira, 22 de setembro de 2008 20:27
    Moderador
  •  

    Lercio, muito grato.

     

    Vou testar e depois te dou um retorno.

    So tem uma coisa que gostaria de entender. Porque ele funciona em fase de projeto e quando publico temos esse problema quando publico?

     

    Genilson

    segunda-feira, 22 de setembro de 2008 20:59
  •  Genilson S. Santana wrote:

     

    Lercio, muito grato.

     

    Vou testar e depois te dou um retorno.

    So tem uma coisa que gostaria de entender. Porque ele funciona em fase de projeto e quando publico temos esse problema quando publico?

     

    Genilson

     

    Isso deve ocorrer pq o "runtime" do crystal reports não deve conter os mesmos componentes que são instalados junto ao Visual Studio .NET.

     

    Valeu!

     

     

     

    segunda-feira, 22 de setembro de 2008 21:49
    Moderador
  • Laercio, suas dicas estão sendo de grande utilidade, por isso só tenho a agradecer a você.

     

    Meus problemas estão quase solucionados. Fica somente essa questão que não consigo compreender. veja os dois trechos de código abaixo:

    Quando os valores são setados na mão os parâmetros são passados corretamente, mas quando passo através de variaveis eles estão indo em branco/nulo. Têm alguma ideia.

    Esses valores vem da aplicação;

    codBandeira = "PE";

    codEmpresa = 2;

    dti="200/08/01";

    dtf="2008/08/15";

    // SETANDO VALORES ATRAVÉS DE VARIÁVEIS

            pdvCodBandeira.Value = codBandeira;
            pvCodBandeira.Add(pdvCodBandeira);
            pdvCodEmpresa.Value = codEmpresa;
            pvCodEmpresa.Add(pdvCodEmpresa);
            pdvDataInicial.Value = dti;
            pvDataInicial.Add(pdvDataInicial);
            pdvDataFinal.Value = dtf;
            pvCodEmpresa.Add(pdvDataFinal);

     

    // SETANDO VALORES NA "MÃO"

    pdvCodBandeira.Value = "PE";

    pvCodBandeira.Add(pdvCodBandeira);

    pdvCodEmpresa.Value = 2;

    pvCodEmpresa.Add(pdvCodEmpresa);

    pdvDataInicial.Value = "2008/08/01";

    pvDataInicial.Add(pdvDataInicial);

    pdvDataFinal.Value = "2008/08/15";

    pvDataFinal.Add(pdvDataFinal);

     

    Atenciosamente e muito grato

    Genilson

    terça-feira, 23 de setembro de 2008 15:20
  • Genilson,

     

    A data em negrito não está errada?

     

     

    codBandeira = "PE";

    codEmpresa = 2;

    dti="200/08/01";

    dtf="2008/08/15";

     

     

    Além disso, vc está definindo o tipo de dados de cada variável?

     

    em VB.NET

     

    Code Snippet

    dim codBandeira as string ="PE"

    dim codEmpresa as integer = 2

    dim dti as string ="2000/08/01"

    dim dtf as string ="2008/08/15"

     

     

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

    terça-feira, 23 de setembro de 2008 20:11
    Moderador
  • Laercio, a data é nesse formato mesmo, observe que elas passadas nanualmente funcionam. As variaveis estão declaradas. (string, int etc). Se tiver alguma ideia, agradeço.

     

    Genilson

     

    terça-feira, 23 de setembro de 2008 20:43
  • Opa,

     

    Testa assim:

    Code Snippet

     

            pdvCodBandeira.Value = codBandeira.ToString();

            pvCodBandeira.Add(pdvCodBandeira);

           

            pdvCodEmpresa.Value = codEmpresa.ToString();
            pvCodEmpresa.Add(pdvCodEmpresa);

           

            pdvDataInicial.Value = dti.ToString();
            pvDataInicial.Add(pdvDataInicial);


            pdvDataFinal.Value = dtf.ToString();
            pvCodEmpresa.Add(pdvDataFinal);

     

     


     

     
    terça-feira, 23 de setembro de 2008 20:58
    Moderador
  •  

    Laercio, desculpa o incomodo.

     

    Fiz sua sugestão.

     

    pdvCodBandeira.Value = codBandeira.ToString();
    pvCodBandeira.Add(pdvCodBandeira);   
    pdvCodEmpresa.Value = codEmpresa.ToString();
    pvCodEmpresa.Add(pdvCodEmpresa);

    pdvDataInicial.Value = dti.ToString();
    pvDataInicial.Add(pdvDataInicial);

    pdvDataFinal.Value = dtf.ToString();
    pvCodEmpresa.Add(pdvDataFinal);

     

    Apresentou o seguinte erro.

     

    The types of the parameter field and parameter field current values are not compatible.

    ParameterFieldDefinition prdcodBandeira = pfdDefinitions["paramCodBandeira"];
    prdcodEmpresa.ApplyCurrentValues(pvCodEmpresa);

     

     

    semm utilizar a conversão não apresenta o erro, mas o valores vão para o relatório em branco.

     

    Grato pela sua ajuda

    Genilson

    quarta-feira, 24 de setembro de 2008 15:57
  • Genilson,

     

    Desculpe,

     

    Eu vi tudo string e neste caso, o parâmetro  codEmpresa fica dessa forma:

     

    Code Snippet

    pdvCodEmpresa.Value = codEmpresa;
    pvCodEmpresa.Add(pdvCodEmpresa);

     

     

    Veja se funciona.

    quarta-feira, 24 de setembro de 2008 16:03
    Moderador
  • Laercio to te alugando.

    Vou postar o código todo, talvez fique mais fácil de entender. (o código ta um tanto "sujo" devido a quantidade de testes que fiz.Obs.: Se ao invés de passar  para os parâmetros os valores da sessão utilizar o trecho de código comentado que tá marcado de ** o relátorio funciona perfeitamente, ou seja se por valores manualmente no código, caso venha das variaveis que recuperei da sessão, ele passo valores em branco para o relatório.

     

    Mais uma vez sou muito grato pela atenção e pelo tempo perdido com a minha questão.

     

    Genilson

     

    public partial class viewRelBandeiras : System.Web.UI.Page

    {

    string dataInicialStr, dataFinalStr,codBandeira;

    int codEmpresa;

    string dtiAmericana, dtfAmericana;

    int empresa;

    string bandeira, dateInicial, dateFinal;

    protected void Page_Load(object sender, EventArgs e)

    {

    //bandeira = "pe";

    //empresa = 2;

    //dataInicial = "2008/08/01";

    //dataFinal = "2008/08/30";

    DateTime dti, dtiConvertida, dtf, dataInicial, dataFinal;

    codBandeira = Convert.ToString(Session["codBandeira"]);

    codEmpresa = Convert.ToInt16(Session["codEmpresa"]);

    dataInicialStr = (string)Session["dataInicial"];

    dataFinalStr = (string)Session["dataFinal"];

    dti = Convert.ToDateTime(dataInicialStr);

    dtf = Convert.ToDateTime(dataFinalStr);

    dtiAmericana = dti.ToString("yyyy/MM/dd");

    dataInicial = Convert.ToDateTime(dtiAmericana);

    dtfAmericana = dtf.ToString("yyyy/MM/dd");

    dataFinal = Convert.ToDateTime(dtfAmericana);

    bandeira = codBandeira;

    empresa = codEmpresa;

    dateInicial = dtiAmericana;

    dateFinal = dtfAmericana;

    ExportToDisk();

    }

    private void ExportToDisk()

    {

    ReportDocument report = new ReportDocument();

    /*

    ParameterField prCodBandeira;

    ParameterField prCodEmpresa;

    ParameterField prDataInicial;

    ParameterField prDataFinal;

    * */

    //ParameterValues pvCodBandeira = new ParameterValues();

    ParameterValues pvCodBandeira = new ParameterValues();

    ParameterValues pvCodEmpresa = new ParameterValues();

    ParameterValues pvDataInicial = new ParameterValues();

    ParameterValues pvDataFinal = new ParameterValues();

    ParameterDiscreteValue pdvCodBandeira = new ParameterDiscreteValue();

    ParameterDiscreteValue pdvCodEmpresa = new ParameterDiscreteValue();

    ParameterDiscreteValue pdvDataInicial = new ParameterDiscreteValue();

    ParameterDiscreteValue pdvDataFinal = new ParameterDiscreteValue();

    ExportOptions exportOpts = new ExportOptions();

    DiskFileDestinationOptions diskOpts = ExportOptions.CreateDiskFileDestinationOptions();

    // LENDO O CAMINHO DO RELATORIO E DA PASTA TEMP

    string caminho_relatorio = ConfigurationSettings.AppSettings["pathRelPorBandeira"];

    string caminho_temp = ConfigurationSettings.AppSettings["pathFolderTemp"];

    // CARREGANDO O FORMULARIO

    report.Load(@"" + caminho_relatorio + "");

     

    pdvCodBandeira.Value = bandeira;

    pvCodBandeira.Add(pdvCodBandeira);

    pdvCodEmpresa.Value = empresa;

    pvCodEmpresa.Add(pdvCodEmpresa);

    pdvDataInicial.Value = dateInicial;

    pvDataInicial.Add(pdvDataInicial);

    pdvDataFinal.Value = dateFinal;

    pvDataFinal.Add(pdvDataFinal);

    ParameterFieldDefinitions pfdDefinitions = report.DataDefinition.ParameterFields;

    ParameterFieldDefinition prdcodBandeira = pfdDefinitions["paramCodBandeira"];

    prdcodBandeira.ApplyCurrentValues(pvCodBandeira);

    ParameterFieldDefinition prdcodEmpresa = pfdDefinitions["paramCodEmpresa"];

    prdcodEmpresa.ApplyCurrentValues(pvCodEmpresa);

    ParameterFieldDefinition prddti = pfdDefinitions["paramDataInicial"];

    prddti.ApplyCurrentValues(pvDataInicial);

    ParameterFieldDefinition prddtf = pfdDefinitions["paramDataFinal"];

    prddtf.ApplyCurrentValues(pvDataFinal);

     

     

    // SALVANDO O FORMULARIO TEMPORARIO EM PDF

    string fileName = caminho_temp + "\\" + Session.SessionID.ToString() + ".pdf";

    exportOpts.ExportFormatType = ExportFormatType.PortableDocFormat;

    exportOpts.ExportDestinationType = ExportDestinationType.DiskFile;

    diskOpts.DiskFileName = fileName;

    exportOpts.ExportDestinationOptions = diskOpts;

    report.Export(exportOpts);

    //ESCREVENDO O PDF NO BROWSE

    Response.ClearContent();

    Response.ClearHeaders();

    Response.ContentType = "application/pdf";

    Response.AddHeader("content-disposition", "inline; filename=ReportName.pdf");

    Response.WriteFile(fileName);

    Response.Flush();

    Response.Close();

    //REMOVER PDF DO SERVIDOR

    System.IO.File.Delete(fileName);

    }

     

    quarta-feira, 24 de setembro de 2008 18:57
  • Genilson,

     

    Ontem eu fiz alguns testes  para encontrar uma boa solução para o problema e acho que vc vai gostar:

     

    Como passar parâmetros para o Crystal Reports ? (parâmetros do tipo Parameter Fields)

     

    Code Snippet
    ReportDocument
    .SetParameterValue(
    "NOME_DO_PARAMETRO", VALOR_DO_PARAMETRO)

     

     

    Por exemplo, abrir o meu relatório do Crystal Reports dentro do .NET 2008, na toolbox "Field Explorer", adicionei um novo parâmetro chamado @color do tipo string, depois no item Select Expert adicione o parâmetro no meu filtro do relatório.

     

    No VB.NET como fica essa chamada:

    Code Snippet
    crReportDocument.SetParameterValue("@Color", "Black")

     

     

     

    Um exemplo completo em VB.NET

    Code Snippet

    Option Explicit On

    Option Strict On

     

    'referˆncias do crystal reports

    Imports CrystalDecisions.CrystalReports.Engine

    Imports CrystalDecisions.Shared

     

    Public Class wfmPrintPreviewCrystalReports

    Private Sub wfmPrintPreviewCrystalReports_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    'definindo o dataset do relat¢rio (o mesmo utilizado para fazer o designer do relat¢rio)

    '

    '

    'No wizard de cria‡Æo do TableAdapter (DataSet), no passo (Choose Methods to Generate),

    'deixe marcado TODOS os checkboxs "Fill DataTable" , "Return a DataTable" e "Create methods to send updates..."

    '

    'AWorks: Nome do meu Projeto em VB.NET (Windows Forms)

    'dsListProduct: Nome do meu DataSet criado no projeto (cotendo um TableAdapter com o nome Product)

    '

    Dim ta As New AWorks.dsListProductTableAdapters.ProductTableAdapter

    Dim dt As New AWorks.dsListProduct.ProductDataTable

    ta.Fill(dt)

    'carregando o relat¢rio

    Dim crReportDocument As New ReportDocument

    Dim strReportPath = String.Concat(Replace(My.Application.Info.DirectoryPath(), "\bin\Debug", ""), "\rptListProduct.rpt")

    crReportDocument.Load(strReportPath)

     

    'passando o dataset para o relat¢rio

    crReportDocument.SetDataSource(CType(dt, DataTable))

    Me.crPrintPreview.ReportSource = strReportPath

    Me.crPrintPreview.ReportSource = crReportDocument

     

    '

    'passando o parƒmetro para o relat¢rio @Color

    '

    crReportDocument.SetParameterValue("@Color", "Black")

     

    End Sub

    End Class

     

     

    Além disso, o seu código vai ficar bem mais simples.

     

    Espero ter ajudado!

     

     

     

     

    quinta-feira, 25 de setembro de 2008 13:38
    Moderador
  • Opa Laercio, tudo bom?

     

    Vou testar o codigo que você sugeriu, realmente ele vai deixar o código mais "enxuto". Assim que terminar te dou um feedback.

    Sobre o outro método descobrir uma coisa. O problema acontece com valores que "viajam" pelas sessão de uma página. Fiz o seguinte teste, passei os parâmetros para o relátorio e chamei na messa página e adivinha? Funciona.  Estranho né? Afinal quando eu resgato os valores dá sessão eu os coloco em seu devido formato, string, int etc.

     

    Vou testar seu código.

     

    E como sempre meu muito obrigado pela atenção e tempo dispensado não so com minhas dúvidas, mas como a de toda comunidade.

     

    atenciosamente,

     

    Genilson

    quinta-feira, 25 de setembro de 2008 13:50
  • E ai Laercio tudo bom?

     

    Estou "passando" aqui para dizer que usei suas dicas e está funcionando.

    Gostaria de parabenizá-lo e agradece-lo mais uma vez pela ajuda que atenção dispensada a comunidade, sua dicas tenha certeza que tem ajudado diversos desenvolvedores.

     

    Atenciosamente,

    Genilson

    terça-feira, 30 de setembro de 2008 12:20
  • Genilson,

     

    Fico feliz de fazer parte da equipe MSDN Brasil! Precisando é só postar!

     

     

    Obrigado.

     

    terça-feira, 30 de setembro de 2008 13:34
    Moderador