none
Informe de Crystal sólo muestra algunos datos (sobre un procedimiento almacenado) RRS feed

  • Pregunta

  • Saludos a todos.

    Voy al grano: de diseñado un informe en Crystal que se basa en un procedimiento almacenado sobre un join de tablas. Todas las tablas secundarias tienen una relación inner join con la tabla principal. El procedimiento está probado y devuelve datos. El informe devuelve todos los datos cuando trabaja contra la BD.

    Hasta aquí, bien. Y viene el pero: siguiendo los (buenos) consejos de Leandro y algún otro compañero de este foro, por los problemas repetidos de no poder redirigir el informe hacia la BD de producción, una vez tengo completado el informe, sigo la estrategia de basarlo en una tabla del dataset tipado que tengo en mi aplicación y pasarle la tabla tipada como fuente de datos.

    Pues bien, una vez hago esto, el informe sólo muestra los datos de la tabla principal del procedimiento. Los campos provenientes del resto de las tablas no se muestran. ¿Alguien sabe decirme por qué?

    Gracias anticipadas por las posibles respuestas.


    Miguel Ángel Muñoz
    • Cambiado Enrique M. Montejo lunes, 25 de julio de 2011 14:58 Crystal Reports (De:Lenguaje VB.NET)
    martes, 22 de junio de 2010 8:44

Todas las respuestas

  • hola

    lo primero que podrias ahcer es validar que todas las tablas tengan info, para eso pon un breakpoint en el codigo luego de cargar el dataset tipado y usa la tool DataSet Visualizer para inspeccionar si esta todo correcto

    luego podrias validar las relaciones que crea Crystal entre los datatable imagen

    revisa la opcion del database expert para ver si creo una relacion entee las tablas que no es correcta

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 22 de junio de 2010 12:58
  • Gracias, Leandro.

    Siguiendo tus instrucciones, desde hace un tiempo sigo estas pautas: diseño el informe sobre la BD. Después de probarlo y asegurarme que funciona, cambio su fuente de datos al dataset que está en mi proyecto.

    En este caso concreto, en primera instancia, el report se basa en un procedimiento que está en la BD, y a continuación, el origen es el dataset de mi aplicación. En el procedimiento hay una relación LEFT OUTER JOIN de todas las tablas secundarias con la principal.

    Además, insisto en que cuando trabaja contra la BD se muestra todo correctamente. Intento cargar el mismo registro pasándole el datatable generado desde el mismo procedimiento almacenado en el dataset, y sólo veo los datos de la tabla principal.

    Por eso pregunto: ¿por qué en el primer caso funciona bien y no en el segundo?


    Miguel Ángel Muñoz
    martes, 22 de junio de 2010 17:02
  • hola

    revisa este link

    [Crystal Reports] - Exportar DataGridView a Crystal

    veras alli los dialogos del Database Export, has validado alli que no se creara la relacion entre las tablas, por ahi una union alli podria hacer que filtre los datos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 22 de junio de 2010 17:05
  • Sorprendentemente, he encontrado la solución. (posiblemente vaya a extrañar a muchos, pero es como explico a continuación).

    Lo único que he tenido que hacer para conseguir que el report devuelva todos los datos es hacer que la DataTable que le paso como argumento al informe no esté tipada. Mejor que cualquier explicación, aquí va literalmente el código:

    Dim Informe As New rptMiInforme

    Dim daRecibo As New MiDataSet.MiProcedimientoAlmacenado ----->>>> el dataadapter

    Dim tbRecibo As New DataTable ----->>>> la datatable genérica

    tbRecibo = daRecibo.GetData(MiParametro) ----->>>> en este paso, la datatable se vuelve tipada

    With Informe

    .SetDataSource(CType(tbRecibo, DataTable)) ----->>>> este es el milagro (revierto la tabla a una datatable sin tipo)

    Me.CrystalReportViewer1.DisplayGroupTree = False

    Me.CrystalReportViewer1.ReportSource = Informe

    End With

    Y ahora devuelve todos los campos.

    Leandro, muchas gracias por tu inestimable ayuda, pero por favor, alguna explicación a esto porque estoy perplejo de momento.

     


    Miguel Ángel Muñoz
    martes, 22 de junio de 2010 17:44
  • hola

    de casualidad el Datset tipado tenia definido algun DataRelation, o sea uan relacion entre los datatable ?

    esto podria explicarlo, ya que al usarlo aplcia la relacion y esta hace que no se devuelvan registros, es como hacer un join en dondeel cruce no devuelve registros

    el que uses un dataset normal puede estar quitando esta relacion del medio, esto es lo que se me courre podria estar pasando

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 22 de junio de 2010 17:52
  • Bueno, no creo que sea ese el problema. Me baso en lo siguiente: creo un procedimiento en la base de datos, que es un join de tablas en la que la tabla principal predomina (LEFT OUTER JOIN) sobre todas las demás. Creo el informe basando sus datos en este procedimiento. El informe devuelve registros.

    Arrastro el procedimiento de la BD a mi dataset tipado (que genera un dataadapter, etc.). Vuelvo al informe y cambio la ubicación del origen de datos a este dataset tipado. Intento cargarlo usando para las pruebas los mismos registros que he usado en la primera versión del informe, y ahora sólo veo los datos de la tabla principal.

    Sinceramente, no creo que haya problemas con la relación entre las tablas. Pero ya puesto a probar, decidí intentarlo con una tabla genérica, sin un porqué concreto, sólo fue intuición, y para mi sorpresa, sí funciona.

    Cuando menos, desconcertante, compañeros. Lo de hoy tendré que etiquetarlo como ciencia de la "Informagia".

    En fin, de nuevo gracias, Leandro.


    Miguel Ángel Muñoz
    martes, 22 de junio de 2010 18:28
  • hola

    Vuelvo al informe y cambio la ubicación del origen de datos a este dataset tipado

    como qeu cambias el orige de datos ? o sea el diseño original del reporte no lo hacias directo con el dataset tipado

    digo no seria un cambio, deberias diseñar el reporte en base al dataset, no cambiarlo por otro, ya quee sto como comente podrias generar en el Database expert del reporte relaciones que filtren los datos incorrectamente

    - revisa el dataset expert (en re reporte), y valdia si hay relacion entre las tablas, si las has intenta quitarlas

    - intenta crear en reporte aunque sea uno nuevo dde prueba desde cerro usando el dataset tipado desde el principio del diseño

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 22 de junio de 2010 19:28
  • Gracias Leandro por el interés que te tomas, de verdad.

    Aunque sólo sea por salir de la duda, voy a hacerlo como dices. Mañana comento, que hoy ya es bastante tarde en España.

    Un saludo.


    Miguel Ángel Muñoz
    martes, 22 de junio de 2010 21:00
  • Bien, parece que tienes razón, pero tampoco a mi me falta.

    He diseñado el informe de cero partiendo del dataset tipado como fuente de datos y funciona perfectamente.

    Y también he vuelto a crear el informe basándolo en le procedimiento de la BD para luego establecer el dataset como origen de datos y... también funciona.

    La verdad, no sé qué ha pasado aquí. De todas formas, para no alargar este hilo innecesariamente, opto porque terminemos en este punto, salvo que tengas algo nuevo que aportar.

    Saludos desde Écija.


    Miguel Ángel Muñoz
    miércoles, 23 de junio de 2010 9:10
  • entiendo que el caso está cerrado, pero me sucedió lo mismo y el problema era que uno de los parametros que enviaba al store procedure no tenia la información correcta (estaba con NULL en la aplicacion vb.net). Yo tengo el sp con 2 join, el primero mostraba la informacion correcta pero el otro join no jalaba la informacion a pesar que no tenía nada que ver con el parametro mal ingresado. cambié el valor del parametro y ahora me muestra todos los datos completos en CR.

    viernes, 22 de julio de 2011 15:44