Como Pasar Parametros/Variables a un Crystal Reports


 

Como pasar un Valor, parametro o variable a Crytal Reports

En esta ocasión compartiré con ustedes una manera fácil de pasar un valor, parámetro o variable a un reporte de Reporte de Cyrstal Reports desde codigo de C# .net.

Si te has preguntado la manera de pasar un valor, o variable a un reporte de Crystal Reports, sin la necesidad de crear una columna en la Base de Datos, pues que no tendría sentido hacerlo para un solo valor.
La forma de hacerlo es:

Declarar un parámetro del tipo Parameter Field dentro de nuestro Reporte.
Para esto, en Field Explorer hacer clic derecho sobre Parameter Field y elegir New

Definir el Nombre y el tipo del parametro.

Para el ejemplo, Nombre: ParametroEjemplo, Tipo: String


Listo, ahora ya tenemos el elemento ParametroEjemplo disponible para arrastrarlo y acomodarlo dentro del reporte.

Para pasar el valor/variable al Reporte de Crystal Reports desde código C#.
En caso de que estemos agregando el Reporte al CrystalReportViewer de manera automática, tenemos que poner el código de paso de parámetros  antes de llamar el Reporte.

En caso de que estemos agregando el Reporte al CrystalReportViewer desde código, tenemos que poner el código de paso de parámetros antes de asignar el ReportSource.

El Código de paso de Parámetros

 // Pasando una caneda/valor
 rpt.SetParameterValue("ParametroEjemplo", "Hola Mundo");
 // Pasando una variable
 string var1 = "Hola Mundo";
 rpt.SetParameterValue("ParametroEjemplo", var1);

Espero les sea de utilidad el post, y como siempre, se agradecerán todos los comentarios.

About these ads

42 thoughts on “Como Pasar Parametros/Variables a un Crystal Reports

  1. Buen dia, una pregunta como puedo pasar un paramtro de tipo imagen, quiero mostrar en el reporte una imagen, pero q no se estatica si no q pueda cambiar, talvez mandarle la ruta de la imagen o la imagen misma no se como hacerlo, si me pudrieras ayudar estaria perfecto de antemano gracias

    • Hola jbslaider.

      La verdad es que nunca he utilizado imágenes dinámicas, lo que de primera mano se me ocurre es que pudieras poner en tu dataset una columna del tipo Binary, y para llenarlo con la imágenes utilizas el comando ImageToBinary.

      Otra opción seria buscar en Google sobre Crystal Reports e Imágenes Dinámicas, seguro encuentras miles de sugerencias de conocedores en el tema.

      Gracias por tu visita

    • Podrias guardar tu imagen en labase de datos y segun un identificador el conjunto de datos devuelve un imagen u otra, e insertas la imagen de tipo database
      Saludos.

  2. Hola,

    He seguido los pasos que ha indicado, pero cuando ejecuto el programa me da un error en el código: rpt.SetParameterValue(“Valor”,valor) y el error es el siguiente:

    “El índice no es valido. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))”

    porque me sucede esto?

    Espero vuestras respuestas.
    Muchas gracias!!

    • Hola rm123
      Seguramente estas usando VS 2005 vrdd?

      Ese error es comun en VS 2005 y Crystal Reports 10, lo unico que tienes que hacer es mandar el Indice del parametro, no el nombre.

      Esto seria: rpt.SetParameterValue(0,valor).

      También recomiendo actualizar el vs 2005 al SP 1.

      Gracias por la visita.

      • Hola, a mi tambien me salio el mismo error, porque estoy indicando que es un control ComboBox, si le asigno el índice como indicas,me va a salir siempre el primer item, pero lo que necesito es que me visualice el item selecccionado. ¿Como haría porfavor?.
        Agradezco de antemano tu repuesta.

  3. Hola, excelente el aporte. Implemente el codigo con un datatable aparte. Pero me genera un error, el cual es Faltan valores de parámetro:

    El codigo es el siguiente:

    Dim datos As DataTable = creaTablaPruebas.Tables(0) ‘Crea una tabla con 4 campos: id, valor1, valor2 y valor3

    reporte.Load(“nombreReporte”)
    reporte.SetParameterValue(“ParametroExterno”, “Hola a todos”)
    reporte.SetDataSource(datos)
    reporte.ExportToHttpResponse(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, Response, True, “BaseReporte”) ‘Aqui me genera el error
    Response.Clear()
    Response.BufferOutput = False
    Response.Buffer = False
    Response.ContentType = “application/pdf”
    nombreReporte &= “.pdf”
    Response.AddHeader(“Content-Disposition”, “attachment;filename=” & nombreReporte)
    Response.Flush()
    Response.Close()

    Algo me falta ??? o que podria hacer ???

    En el RPT tengo referenciado los nombres del DataTable por el XSD y el parametroExterno como parametro.

    Te agradeceria mucho tu apoyo.

    Gracias.

    • Hola.

      Intenta intercambiando de posición las lineas
      reporte.SetParameterValue(“ParametroExterno”, “Hola a todos”)
      reporte.SetDataSource(datos)

      de tal manera que quede así:

      reporte.SetDataSource(datos)
      reporte.SetParameterValue(“ParametroExterno”, “Hola a todos”)

  4. Tengo un problema al mandar a ejecutar la aplicacion q soty desarrolando en c# 2010, el error q sale es:
    Error 18 No se puede encontrar el tipo o el nombre de espacio de nombres ‘ReportClass’ (¿falta una directiva using o una referencia de ensamblado?)
    el mismo error me sale para el Enginer, Shared, Report Source, IcachedReport, ReportClass y RequestContext.
    que puedo hacer. Es de suma urgencia

      • tengo instalado el crystal reports 13, en mi aplicacion estoy haciendo referencia al:
        using crystaldecisions.enginer
        using crystaldecisions.shared
        using crystaldecisions.ReportSource
        tambien agerge referencia mediane las dll

  5. buenas hermano tengo mi envio asi y me da error El índice no es valido. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX)) y a todo le ah funcionado

    Dim reporte As CrystalReport1 = New CrystalReport1()
    reporte.SetParameterValue(“nombre1″, nom.Text)

    que error tengo estoy usando vb.net 2005

    • Estas usando VS 2005 vrdd?

      Ese error es comun en VS 2005 y Crystal Reports 10, lo unico que tienes que hacer es mandar el Indice del parametro, no el nombre.

      Esto seria: rpt.SetParameterValue(0,valor).

      También recomiendo actualizar el vs 2005 al SP 1.

      Gracias por la visita.

  6. Hola estoy haciendo un sistema en vs 2008 en Cshart y quiero sacar un reporte con Cristal Report pero no se como pasarle un parametro yo, cree un dataset y a este le adñadi un query con un filtro pero no se como hacer mas nada tengo algunos manuales pero no he podido resolver mi problema

  7. Hola no he recibido ninguna respuesta y me gustaria que me ayuden mira yo tengo un dataset de visitas donde a este le adñadi un query con un filtro fecha pues me interesa obtener todas las visitas de una fecha dada pero no se como poder mostrar este resultado en un reporte estoy trabajando con vs 2008 en CShart y es una aplicacion destop. Ya lo he intentado de muchas maneras hasta creando un procedimiento almacenado y combirtiendolo en dataset pero al final cuando muestro el reporte no obtengo nada me pueden ayudar graciasssssssssssssss

    • Hola, Si tienes el DataSet con un filtro, no se si lo tengas que los datos siempre son filtrados o el DataSet tiene un query con el filtro.

      Quiero pensar que es la segunda opcion, entonces lo que tienes que hacer es tan facil como:

      1.- Obtener los datos filtrados:
      DataTable dtsFiltrados = new DataSet1TableAdapters.Table1().Query1();

      2.- Asignar los Datos al Reporte:
      Report1 rpt = new Report1();
      rpt.SetDataSource(rpt);

      3.- y ya esta listo el reporte para asignarlo al reportviewer o lo que desees hacer con el.

      1.- obtener los datos filtrados

      • Hola primero que todo gracias y disculpa pues usted debe de estar pensando que yo soy una mala agradecida pero es que no habia podido escribirte mira yo hize lo que me dijiste y de hecho este es mi codigo
        // TODO: This line of code loads data into the ‘dataSet2.Prueba’ table. You can move, or remove it, as needed.
        this.pruebaTableAdapter.Fill(this.dataSet2.Prueba);
        Sistema_Recepcion.DataSet2.PruebaDataTable rrr = new DataSet2.PruebaDataTable();
        DataSet2TableAdapters.PruebaTableAdapter ws = new Sistema_Recepcion.DataSet2TableAdapters.PruebaTableAdapter();
        FrmFecha frmFecha = new FrmFecha();
        ws.FillByFecha(rrr, “19 / 3 / 2012”);
        CrystalReport2 rpt = new CrystalReport2();
        rpt.SetDataSource(this.dataSet2);
        crystalReportViewer1.ReportSource = rpt;
        y este es mi dataset donde tengo el query con el dato filtrado

        Pero no me funciona ya que me devuelve todas las recepciones no las del 19/3/2012 que son las que me hacen falta me ayudas porfa estoy como loca.
        También intente haciendo un procedimiento almacenado donde ya yo obtengo los datos filtrados por esa fecha u otra y con el creo mi dataset pero tampoco funciona.
        Cuando usted me pone en el pazo 2
        2.- Asignar los Datos al Reporte:
        Report1 rpt = new Report1();
        rpt.SetDataSource(rpt);
        En la segunda línea o sea en rpt.SetDataSource(rpt); me da error pues yo no le puedo pasar un reporte cuando el me esta pidiendo un dataset espero su ayuda y gracias

  8. Hola no he recibido ninguna respuesta y necesito su ayuda porfa ya no se que hacer le agradeceria que me ayudaran lo antes posible saludos y gracias yusi

  9. Hola soy nueva y hice el codigo para pasar parametros pero cuando ejecuto me sale un apantalla y me pide que ingrese un texto y ese me aparece donde puse el parametro en el informe, yo quiero que me salga un nombre de cualquier persona que escoja de un combo

    • Es es por que en el reporte tienes parametros que deben ser pasados como cadena, que no toma del source de datos.

      por ejemplo si en el reporte tienes un parametro de NombreReporte.
      y llamas el reporte sin pasarle el parametro te pide que lo ingreses.

      para pasar el parametro, despues de donde asiganas el datasource (rpt.SetDataSource(x)) llamas a rpt.SetParameterValue(“NombreReporte”, strNombre);

    • Disculpa que no te respondiera pero en la lista de comentarios no me aparecia tu comentario tal vez por que le diste replay.

      En fin.
      Me parece un muy complicado tu codigo tan solo para obtener datos filtrados de una tabla.
      pero me parece mas complicado entenderlo asi en simple texto, te ajunto un ejemplo de como obtendo datos filtrados.
      y si quieres ayuda mas especifica enviame tu archivo de clase a inxunxa(arroba)gamil.com

      Asi obtengo datos filtrados de un DAtaSet y los asigno al reporte.

      Data.Recorrido rec = new Data.Recorrido();
      rec.EnforceConstraints = false; //opcional para que no marque error si hay problemas con un contraint
      new Data.RecorridoTableAdapters.RecorridosReal_PorUnidadTableAdapter().TodasUnidades_Fill(rec.RecorridosReal_PorUnidad, inicio, final);
      rpt.SetDataSource(rec.RecorridosReal_PorUnidad);

      y en el dataSource el la TableAdapter RecorridosReal_PorUnidadTableAdapter tengo el query TodasUnidades_Fill con el codigo:
      Select campo1, campo2,…,campoN from nombreTabla
      where fecha1 >= @inicio and fecha2<= @final

  10. Ok voy a probarlo y despues te digo deja ver si asi si, sino te mando mi archivo de clase aunque te soy sincera creo que no entiendo mucho lo que me mandastes jajaja pero cuando tu te refieres a mi archivo de clase es a alguno especifico pues mira tengo una clase para cada tabla y una principal que es la que maneja todo el negocio yo mañana pues estoy en el trabajo y ya voy de salida te envio lo que entienda para ver si me puedes ayudar ok saludos y gracias yusi

  11. tengo una consulta al respecto, tengo tres parametros en mi reporte pero estos son de un sp en la bd. el problema que tengo es se puede mandar el valor null al parametro desde vb. o como puedeo hacer por ejemplo si no mando ningun valor al parametro me tome null por defecto?…….

  12. Ayuda a la hora de correr mi aplicacion me manda un mensaje de que el informe solicitado requiere de informacion adicional y me pide usuario y contraseña no se como quitar ese error.. ayuda

  13. hola estoy iniciando me en programacion y uso de c#, logre programar un sistema solo me falta lo que refiere a impresiones. bien no se utilizar el crystal report. Lei info de la red pero no logro comprender el uso….estoy intentado conseguir que al presionar un boton este guarde en la base de datos e imprima el reporte pero no logro dar con un ejemplo de esto…

    segui el siguiente ejemplo con parametro y programe lo siguiente

    private CrystalReport2 reporte;
    private void button1_Click(object sender, EventArgs e)
    {

    reporte = new CrystalReport2();
    reporte.SetParameterValue(“IdCliente”, ncli);
    reporte.SetParameterValue(“TipoCliente”, tcli);
    reporte.SetParameterValue(“Antiguedad”, ant);
    reporte.SetParameterValue(“EstadoAnterior”, estado);

    ReporteFinal frm = new ReporteFinal();//este seria el form donde se presenta el crystal report
    frm.Show();

    las variables toman su valor de los textbox del form

    los textbox estan conectados a la base de datos atraves de un binding source (no creo que esto cause problemas al reporte)

    sucede que al lanzar el frm este me pide valores para los parametros del crystalReport2, cosa que deberia tomar de las variables pasadas por parametros

    una cosa que note en la creacion del CrystalReport2 es que cuando inserto las variables en las secciones estos toman valor

    ej:(nombre de la variable) IdCliente = IdCliente1(en el formulario)

    gracias por la paciencia

  14. Hola, como puedo hacer para que de una pagina asp net lea un campo TextBox y con ese dato
    pueda generar el reporte, ya que en mi procedimiento almacenado que llena el reporte le paso ese dato.

  15. Hola como puedo mostrar una lista de valores en un solo parámetro:

    por ejemplo

    reportesPersonalAdmon.SetParameterValue(“nombre”, “polo”);
    reportesPersonalAdmon.SetParameterValue(“nombre”, “abraham”);

    en este caso solo me esta llenando con el ultimo parámetro que entra obviamente.

    • Si por que estas sobreescribiendo el parametro.

      Deberias pasarle la lista como una cadena, y agregar \n para separar cada elemento, la veradda no lo he hecho, pero es por donde yo empezaria a probar

  16. Amigo yo tambien necesito ayuda, veras estoy trabajando con C#2010
    mi codigo es este
    DataTable res = new DataTable();
    ForwardDataSetTableAdapters.DataTable1TableAdapter lg = new ForwardDataSetTableAdapters.DataTable1TableAdapter();

    res = lg.GetData_OrdenDeTrabajo(Convert.ToInt32(textBox1.Text));
    R_Orden reporte = new R_Orden();
    reporte.SetParameterValue(“ipo”, textBox1.Text);
    reporte.SetDataSource(res);

    groupBox_BuscarOrdenPorNo.Visible = false;
    crystalReportViewer1.ReportSource = reporte;
    crystalReportViewer1.RefreshReport();

    bueno y todo va bien, pero al momento de cargar el resporte, me muestra una ventana en donde me pide el valor del campo “ipo”, me aparece 2 veces, lo relleno con el mismo valor que puse en el textbox1 y ya me da el reporte de manera correcta, como puedo solucionar eso?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s