none
reportes en wpf RRS feed

  • Pregunta

  • Buen dia foro.

    tengo un aplicativo en wpf c# (visual studio 2013), tengo una ventana donde he insertado un control CrystalReportViewer y necesito cargar mi reporte por medio de un procedimiento almacenado con tres paramatros de entrada, el codigo fuente para cargar este reporte es el siguiente:

    void CargarReporteImpresion()

    {

       rptReporteImpresion reporte = new rptReporteImpresion();

       reporte.SetParameterValue("@usuario", usuarioReporte);

       reporte.SetParameterValue("@fechaInicio", fechaInicio);

       reporte.SetParameterValue("@fechaFinal", fechaFinal);

       visorReporte.ViewerCore.ReportSource = reporte;

    }

    pero a la hora de mostrarlo en tiempo de ejecucion no me muestra nada, si ejecuto el procedimiento alamacenado desde el sql server, ahi si me muestra los datos.

    que estoy haciendo mal en mi codigo???


    jorge duran

    viernes, 29 de mayo de 2015 13:14

Respuestas

  • Hola ing.Jorge como te mencionaba aveces los parámetros que se definen desde el mismo sql, no siempre tendrán el mismo formato que los valores que se emiten desde C#.

    Podrías codificarlo de la siguiente manera:

    fecha =Convert.ToDateTime(dtpFechaFinal.Text);
    
    //Aquí deberías de especificarle el formato que esta usando tu gestor de base de datos para que no tenga problemas
    txtFechaFinal.Text = fecha.ToString("dd-MM-yyyy");

    De ser posible podrías mostrarnos el formato de fecha que usa tu gestor de base de datos.

    Espero haberte ayudado.

    • Marcado como respuesta ing.Jorge lunes, 1 de junio de 2015 0:57
    lunes, 1 de junio de 2015 0:11

Todas las respuestas

  • Hola ing.Jorge una de las maneras mas sencillas y efectivas de trabajar los reportes seria usando dataset, puesto que tu ejecutas tu función que va a ir a la base de datos y este datatable almacenara datos de la consulta de la base de datos y pues ya tendrías una tabla cargada de datos, solo quedaría asociar al dataset y todo estaría completo, seria mas sencillo cosa que cuando depuras el código ahí te fijas si el datatable almaceno dichos datos que retorna la consulta, examina el siguiente articulo:

    Crystal Report with DataSet and DataTable using C#

    Espero haberte ayudado.

    sábado, 30 de mayo de 2015 23:20
  • hola

    pero donde asignas el SetDataSource() para asignar los datos al reporte

    Creación de Reportes con Crystal Reports en Visual Studio 2005/2008

    porque el procedure no se invoca solo, sino que debes ejecutarlo mediante codigo usando ado.net

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 31 de mayo de 2015 6:07
  • Muhas gracias por sus aportes a mi problema, cuando usaba vb.net realizaba el llamado de mi reporte con parametros de esta manera:

    PrivateSubreportVentasPorFechas_Load(sender AsObject, e AsEventArgs) HandlesMe.Load

    Dimreporte AsNewrptVentasPorFechas

    Try

    Me.Proc_ventasPorFechasTableAdapter.Fill(Me.DsVentasPorFechas.proc_ventasPorFechas, fechaVenta:=txtFecha1.Text, fechaVenta1:=txtFecha2.Text)

    reporte.SetDataSource(DsVentasPorFechas)

    CrystalReportViewer1.ReportSource = reporte

    Catchex AsException

    'MessageBox.Show("ERROR..................!!!" & Chr(13) & Chr(13) & "se ha producido el siguiente error: " & ex.Message.ToString & ".", "Ready AppPOS", MessageBoxButton.OK, MessageBoxImage.Error)

    reporte.SetDataSource(DsVentasPorFechas)

    CrystalReportViewer1.ReportSource = reporte

    EndTry

    EndSub

    en donde creaba primero un conjunto de datos (DataSet) basandome en el procedimiento alamacenado de mi base de datos, despúes creaba el reporte en blanco, despues escogia como oriegen de datos el DataSet creado anteriormente, en el formulario donde se mostrará el reporte primero arrastraba desde la toolbox "DataSource" el procedimiento creado, lo cual me generaba en el form un datagrid, un dataTabla y otras cosas, ya en el codigo coloco el las lineas que pegue al principio.

    como ven no necesito mucho codigo, no necesito volver a crear un Select......., pues este ya esta en mi procedimiento alamacenado,

    pero ahora en c# wpf, puedo hacerlo de la misma manera o como puedo hacerlo sin muchas lineas de codigo


    jorge duran

    domingo, 31 de mayo de 2015 13:11
  • Hola ing.Jorge dentro de minutos mostrare un ejemplo que hice en reporte con parámetros en WPF, de momento quizá tu store procedure ha sido modificado y no has vuelto a generar el reporte que instancias en el crystal report, deberías verificar esa parte.

    Saludos.

    domingo, 31 de mayo de 2015 16:15
  • hola Aldair, muchas gracias y esperare tu ayuda, respecto a si he modificado mi procedimiento almacenado, no lo he hecho.

    gracias


    jorge duran

    domingo, 31 de mayo de 2015 16:41
  • Hola ing.Jorge este es el ejemplo que te menciono, el procedimiento almacenado se encarga de filtrar los IdClientes que contengan lo que el usuario especifique en este caso "AL":

    ReportDocument cReport; void CargarReporte(string cadena) {

    //"Reporte" es el nombre de mi archivo .rpt cReport = new Reporte();

    //Especificando parametro de entrada que necesita el store procedure cReport.SetParameterValue("@Texto", cadena); //Cargando al Control viewer el reporte a visualizar crystalReportsViewer1.ViewerCore.ReportSource = cReport; } private void button1_Click(object sender, RoutedEventArgs e) { CargarReporte(textBox1.Text); }


    Espero haberte ayudado.


    domingo, 31 de mayo de 2015 17:21
  • Hola Aldair, gracias por tu aporte.

    he realizado el mio tal y como esta el de tu ejemplo, pero lamentablemente no corre y no se porque.

    este es el error que me da

    Additional information: Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))

    este error me da en esta linea:

    reporte.SetParameterValue("@usuario", nombreUsuario);

    parece que no reconoce el nombre del parametro.

    por favor me ayudas, gracias


    jorge duran

    domingo, 31 de mayo de 2015 20:15
  • Hola ing.Jorge podrías mostrarnos la imagen donde estas asociando el archivo .rpt con el store procedure de tu base de datos?.Posiblemente estés especificando mal el nombre de tus parámetros o faltan especificar mas parámetros, trata de hacerlo especificando con indices los parámetros de tu reporte:

    //El indice 0 especifica el primer parametro de tu store procedure, dependiendo del tipo de dato del parametro le pones en el valor si es integer,string,etc.
    
    reporte.SetParameterValue(0, nombreUsuario);
    Espero haberte ayudado.

    domingo, 31 de mayo de 2015 20:45
  • Hola Aldair creo que esto es lo que me pides, lo hice colocando el indice del parametro pero tampo corre.

    no se como enviarte la imagen de mi pantalla


    jorge duran

    domingo, 31 de mayo de 2015 21:10
  • Hola ing.Jorge captura la pantalla y muéstranos la imagen del reporte y del código C# para poder ayudarte de una mejor manera.

    Saludos.

    domingo, 31 de mayo de 2015 21:17

  • jorge duran

    domingo, 31 de mayo de 2015 21:22
  • este es el procedimiento almacenado:

    ALTERprocedure[dbo].[proc_reportUsuarioFecha]

    @usuario varchar(50),

    @fechaInicio varchar(50),

    @fechaFinal varchar(50)

    as

    SELECTusuarios.nombre,informacion.fecha,informacion.serie,informacion.cartonInicial,informacion.cartonFinal,

    establecimientos.nombre ASnegocio,establecimientos.nit,establecimientos.direccion,establecimientos.telefono,

    establecimientos.ciudad,establecimientos.regimen

    FROMusuarios INNERJOIN

    informacion ONusuarios.ident_usuario =informacion.ident_usuario CROSSJOIN

    establecimientos

    WHEREinformacion.fecha>=@fechaInicio andinformacion.fecha<=@fechaFinal andinformacion.ident_usuario=@usuario

    en c# primero creo el dataset en base a este procedimiento, despues conecto el dataset con el reporte por medio de una opcion que hay en la pantalla del reporte que se llama: "database Field", despues en "Database Expert" y allie busco mi dataset


    jorge duran

    domingo, 31 de mayo de 2015 21:25
  • no me deja pegar la imagen de mi pantalla, es muy grande para enviar por aqui!!

    jorge duran

    domingo, 31 de mayo de 2015 21:37
  • Hola ing.Jorge me da gusto que hayas tomado la opción de usar dataset, ahora en tu procedimiento almacenado te recomendaría usar Between para filtrar por un rango de fechas, debido a que la manera que estas realizando no es la adecuada.

    Con respecto a la imagen, publicala en internet y nos brindas el enlace.

    Saludos.

    domingo, 31 de mayo de 2015 21:47
  • Hola Aldair te dejo el link a la imagen.

    http://subefotos.com/ver/?810f9f1fc2a5f8af0c85aaab9260b18do.png


    jorge duran

    domingo, 31 de mayo de 2015 22:01
  • Hola ing.Jorge ahí solo puedo que esta asociado a un dataset es mas ahora deberías de mostrar la parte donde cargas tus datos hacia el dataset, ahora también deberías de verificar que tu store procedure obtenga datos con los datos que emites desde C#.

    Ahora una cosa mas es que ese Store Procedure no contiene parámetros de entrada, osea que entiendo que por eso era el motivo de que te salia dicho error estabas especificando parámetros cuando tu store procedure asociado a tu Reporte no solicita parámetros.

    Esta imagen muestra el parámetro que solicita el store procedure del ejemplo que te mostré.

    Saludos.



    domingo, 31 de mayo de 2015 22:05
  • la verificación del procedimiento la he realizado desde el sql server (si tiene parametros de entrada: @usuario,@fechaIncio,@fechaFinal), la prueba la hago con datos que ya tengo como registro en la base de datos, en c# los parametros de entrada se extraen desde tres cajas de texto. Lo que mencionas de cargar el dataset creo que es lo que falta, pero no se como hacerlo, pues si mal no estoy deberia de hacer primero un sqldataAdapter (una consulta Select), pero eso es lo que ya tengo en mi procedimiento, entonces si es asi, como hago??


    jorge duran

    domingo, 31 de mayo de 2015 22:14
  • Esta es la imagen del DataSet, el cual es el procedimiento almacenado

    http://subefotos.com/ver/?d79e0404502e0d0a62bc37ea3d2e0d62o.png


    jorge duran

    domingo, 31 de mayo de 2015 22:24
  • Aldair disculpa mi intensidad pero cuales son los pasos que haces a la hora de crear tu reporte?

    jorge duran

    domingo, 31 de mayo de 2015 22:32
  • Hola ing.Jorge es que creo que de la manera anterior también debería de salir lo que pasa es que el store procedure que esta usando tu reporte no lo has actualizado es por eso que tu le especificas parámetros pero en realidad para el reporte no existen, pero en sql si, deberías de actualizar el store procedure de tu Reporte creo que debería de salir con normalidad si es que lo actualizas.

    Si estas usando ahora dataset, deberías de crear un objeto que instancia el dataset y  deberías de guardar los datos que retorna tu SqldataAdaptar en un datatable luego guardarlo en una de las tablas que tiene el dataset y listo estaría completo el proceso.

    Saludos.

    domingo, 31 de mayo de 2015 22:33
  • Tu reporte lo creas de la siguiente manera:

    - lo creas enblanco

    - despues vas a Database Fields

    - despues database Expert

    - escoges la opcion crear nueva conexion

    - despues OLE DB (ADO)

    - despues en esa nueva venta escoges SQL server native client

    - despues escoges el servidor y la base de datos


    jorge duran

    domingo, 31 de mayo de 2015 22:43
  • Hola ing.Jorge me refiero a que tu store procedure de SQL si te pide parámetros, pero el store procedure que tienes en el archivo rpt no contiene parámetros esto crear una confusión, lo que debes de hacer es actualizar o refrescar el store procedure de la forma en al que te explico con esa imagen del anterior post.

    Saludos.

    domingo, 31 de mayo de 2015 22:47
  • Hola Aldair, cree un nuevo reporte igualito al que tu realizaste, ahora el visor de informe ya se ve pero sin datos, solo se ve la cabecera de las columnas a mostrar

    jorge duran

    domingo, 31 de mayo de 2015 22:58
  • Aldair en la parte izquierda del diseñador del reporte donde aparece el origen de los datos existe una opcion que dice ver la sentencia SQL y me muestra esto:

    "Bingos_del_Caribe"."dbo"."proc_reportUsuarioFecha";1 NULL, NULL, NULL

    Es normal que esten en NULL los parametros??


    jorge duran

    domingo, 31 de mayo de 2015 23:04
  • Este fue el nuevo reporte que realice:

    http://subefotos.com/ver/?0bbef1c6f6e0804f2b50e1896a43a7d4o.png


    jorge duran

    domingo, 31 de mayo de 2015 23:22
  • Hola ing.Jorge si le dijiste que permitan aceptar valores nulos si, pero eso sucede cuando esta en modo diseñador nada mas, cuando ejecutas especificándole los parámetros debería de mostrar datos, claro si es que tu store procedure  esta realizado correctamente caso contrario ejecutara sin problemas pero no mostrara data debido a que el problema ya no se encuentra en el crystal report ahora estaría en tu store procedure de sql.

    Entonces queda claro de que puedes especificar tus parámetros de tu crystal report de las siguiente maneras pues ambas son validas:

    //Especificando el valor de un parametro definido en el store procedure
    cReport.SetParameterValue("@Texto", cadena);
    
    //Especificando el indice de un parametro definido en el store procedure
    cReport.SetParameterValue(0, cadena);

    Una consulta mas ahora ya no te sale error que te salia al inicio sobre el indice de los parametros especificados verdad?.

    Saludos.

    domingo, 31 de mayo de 2015 23:27
  • Hola Aldair, en efecto ese error ya no aparece, respecto a lo que dices que puede que el procedimiento almacenado sea el del problema, creo que no porque entonces no correria cuando lo ejecuto desde el SQL, la verdad yo no se que pueda ser

    jorge duran

    domingo, 31 de mayo de 2015 23:33
  • Hola ing.Jorge los datos que le pongas manualmente no siempre van a ser identicos a los datos que envies desde el C#, digamos que si usas fechas, en SQL los especificas con el siguiente formato 'yyyy-mm-dd' pero en C# los datos tipo fecha se emiten en un formato distinto y esto hace de que no emita los datos que si emiten con el formato que tiene sql, deberías de probar con los datos que emite el C# en el sql, ahí te darás cuenta si en realidad esta funcionando todo correctamente.

    Como ultimo recurso envíale en duro los valores de los parámetros de sql que te están retornando registros, esos valore emitelos en el codigo C#.

    Ejemplo:

    reporte.SetParameterValue("@Fecha01", ValorUsadoEnSQL);
    Saludos.
    domingo, 31 de mayo de 2015 23:40
  • Bueno Aldair hay un dato bien interesante, pasandole los datos en duro que ya existen en la base de datos (los que le paso desde el c#), de esa manera me muestra el reporte completo (con datos).

    Los datos de las fecha los capturo desde un control DatePicker de la siguiente manera:

    fecha =Convert.ToDateTime(dtpFechaFinal.Text);

    txtFechaFinal.Text =string.Format("{0: dd-MM-yyyy}", fecha);

    sera que hay algun error en ello?


    jorge duran

    domingo, 31 de mayo de 2015 23:48
  • Hola ing.Jorge como te mencionaba aveces los parámetros que se definen desde el mismo sql, no siempre tendrán el mismo formato que los valores que se emiten desde C#.

    Podrías codificarlo de la siguiente manera:

    fecha =Convert.ToDateTime(dtpFechaFinal.Text);
    
    //Aquí deberías de especificarle el formato que esta usando tu gestor de base de datos para que no tenga problemas
    txtFechaFinal.Text = fecha.ToString("dd-MM-yyyy");

    De ser posible podrías mostrarnos el formato de fecha que usa tu gestor de base de datos.

    Espero haberte ayudado.

    • Marcado como respuesta ing.Jorge lunes, 1 de junio de 2015 0:57
    lunes, 1 de junio de 2015 0:11
  • El formato como lo mando a guardar lo especifico en esta linea:

    txtFechaFinal.Text =string.Format("{0: dd-MM-yyyy}", fecha);

    el formato como esta guarado en la BD es "dd-MM-yyyy"


    jorge duran

    lunes, 1 de junio de 2015 0:23
  • Hola Aldair, ya esta funcionando, cambie mi línea de codigo donde asignaba valor al textBox de la fecha por el que tu me colocaste.

    ahora una ultima consulta, sabes como por medio de codigo o de diseño ocultar el panel de la ixquierda del visor (el que se llama gruop tree ?


    jorge duran

    lunes, 1 de junio de 2015 0:39
  • Hola ing.Jorge has depurado tu código, prueba la conversión al formato de fecha como menciono anteriormente, deberías de probar el store procedure con el valor que obtienes desde C#.

    Saludos.

    lunes, 1 de junio de 2015 0:40
  • ing.Jorge perdona no leí tu mensaje, si se puede de la siguiente manera:

    crystalReportsViewer1.ToggleSidePanel = SAPBusinessObjects.WPF.Viewer.Constants.SidePanelKind.None;
    Espero haberte ayudado.
    lunes, 1 de junio de 2015 1:28
  • Hola Aldair, de nuevo mil gracias, ahora de nuevo te molesto con una ultima consulta:

    como seria el codigo para realizar otro reporte de igual manera con procedimiento almacenado pero que este sea un select a una sola tabla de mi BD, seria algo como asi:

    ReportDocument reporte;

    reporte = new rptReporte();

    visorReporte.ViewerCore.ReportSource = reporte


    jorge duran

    lunes, 1 de junio de 2015 13:36
  • Hola ing.Jorge si el store procedure no aplica parámetros, esta correcto lo que has realizado.

    Si llegase a modificarse para tener parámetros no olvides que lo puedes especificar de dos maneras:

    //Especificando el valor de un parametro definido en el store procedure
    cReport.SetParameterValue("@Texto", cadena);
    
    //Especificando el indice de un parametro definido en el store procedure
    cReport.SetParameterValue(0, cadena);

    Y también no olvidar que cuando alterar el procedimiento almacenado desde SQL no se altera automáticamente para el CrystalReport debes actualizarlo/refréscalo para que surta efecto.

    Saludos.

    lunes, 1 de junio de 2015 16:36
  • Hola Aldair, que pena molestarte de nuevo pero respecto al nuevo reporte que te pregunte (el que va sin parametros) no me muestra nada asi como mencionamos que se hace, por favor me colaboras.

    mil gracias.


    jorge duran

    lunes, 1 de junio de 2015 22:52
  • El procedimiento almacenado funciona por que los estoy probando, llamando al reporte desde un windows form

    jorge duran

    lunes, 1 de junio de 2015 22:56