none
Parámetros en informe Crystal Report RRS feed

  • Pregunta

  •  

    Hola a todos!

     

    Tengo una aplicación hecha en visual studio 2008 que imprime una serie de informes (unos 50: artículos, clientes, proveedores, etc). Imaginaros que todos tienen declarado un campo de parámetro, que reciben desde código con algo como esto:

    Informe.SetParameterValue("Parametro1", "Cadena de Prueba")

     

    Ahora se me da el caso que para un informe en concreto necesito un segundo parámetro (y en el futuro serán más informes). Si añado una segunda línea en la función de imprimir (es única para todos los informes)

     

    Informe.SetParameterValue("Parametro2", "Cadena de Prueba 2")

     

    este segundo informe me funcionará bien, pero los 50 anteriores me dan error porque les estoy enviando 2 parámetros cuando en el diseño del informe sólo tienen 1.

    -¿Tengo que abrir todos los informes y añadirle el segundo parámetro? ¿O existe alguna manera de que si no tiene parámetro no me dé error? Es que si ahora me pongo a editarlos todos y mañana me aparece un nuevo parámetro, la vuelvo a liar...


    Saludos y gracias de antemano!

    lunes, 18 de abril de 2011 14:35

Todas las respuestas

  • Buenas JavierRomero.

    No entiendo muy bien el problema.

    Los .SetParameterValue debes aplicarlos cuando creas el tipo rpt, no entiendo el error que te puede estar ocasionando.

    Cada rpt necesitará tantos Parámetros como tenga creados anteriormente.

    Es normal que te de un error si sólo espera un parámetro.

    Creo que el problema está en que debes antes de crear un nuevo rpt, tener claro cuántos parámetros necesitas posteriormente para evitar que falle.

    Un saludo.


    http://www.lopezatienza.es
    lunes, 18 de abril de 2011 14:47
  • Lo que puedes hacer es crear varios metodos para el llenado de reportes, y con el uso de un radio button que el usuario seleccione que tipo de reporte es el que quiere generar, por ejemplo, si  esta chekeado el radio button 1, entonses el metodo de llenado para el reporte sea El metodo1 y asi con los demas.

    Espero te ayude mi idea. suerte

    lunes, 18 de abril de 2011 14:55
  • hola

    y no podrias por medio de configuracion definir que parametros debe recibir cada reporte

    no creo que sea bueno enviar parametros a los reportes cuando estos no lo necesitan

    pero podrias crear una lista en memoria para definri que parametros requiere

     

    podrias crear una clase como esta

    Public Class ReportesInfo

        Public Sub New(String nombre, Integer cant)
            Reporte = nombre
            CantParametros = cant
        End Sub
       
        Public String Reporte
        Public Integer CantParametros

    End Class

    y luego cargarla

    Dim listareportes As New List(Of ReportesInfo)

    listareportes.Add(New ReportesInfo("reporte1.rpt", 1))
    listareportes.Add(New ReportesInfo("reporte2.rpt", 1))
    listareportes.Add(New ReportesInfo("reporte3.rpt", 2))

     

    entonces solo queda recorrer la lista y validar cuandos parametros define que le pases

    es mas podrias usar algo mas avanzado

     

    crearias estas clases

     

    Public MustInherit Class ReportesInfo

        Public Sub New(String nombre)
            Reporte = nombre
        End Sub
       
        Public String Reporte

        Public MustOverride Function Ejecutar() As ReportDocument
       
    End Class

    Public Class ReportUnParametro Inherits ReportesInfo

        Public Overrides Function Ejecutar() As ReportDocument
       
            Dim _report As New ReportDocument
            _report.SetParameterValue("Parametro1", "Cadena de Prueba 1")
       
        End Function

    End Class

    Public Class ReportDosParametro Inherits ReportesInfo

        Public Overrides Function Ejecutar() As ReportDocument
       
            Dim _report As New ReportDocument
            _report.SetParameterValue("Parametro1", "Cadena de Prueba 1")
            _report.SetParameterValue("Parametro2", "Cadena de Prueba 2")
       
        End Function

    End Class

    como veras cada clase concreta define sis e le apsa 1 o 2 parametros, por eso ReportUnParametro y ReportDosParametro que heredadn de ReportesInfo

    lusgo harias

     

    Dim listareportes As New List(Of ReportesInfo)

    listareportes.Add(New ReportUnParametro("reporte1.rpt"))
    listareportes.Add(New ReportUnParametro("reporte2.rpt"))
    listareportes.Add(New ReportDosParametro("reporte3.rpt"))


    entonces lo lanzas usando

    Dim report As ReportDocument = listareportes(0).Ejecutar()

     

    como veras en la lista creas la instancia segun corresponda y tomas de alli la ejecucion

    alli toma solo un elemento de la lista

    pero puedes hacerlo en un for each si lo necesitas

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 18 de abril de 2011 14:58
  •  

     

    Gracias por las respuestas. A ver si me explico mejor ahora:

     

    en mi aplicación tengo una única función de impresión, en la que dependiendo de en que parte esté, imprimirá un rpt u otro (artículos, clientes, etc). Todos estes informes reciben un parámetro que yo mando como indicaba en el primer post.

     

    El problema es que ahora necesito que un informe reciba dos parámetros. Las soluciones que se me ocurren es que tenga dos funciones de impresión (una que envíe 1 parámetro y otra que envíe 2 y seleccione una u otra en función del informe), o bien abrir todos los informes y ponerle 2 parámetros (para así usar una única función)

     

    La duda es si hay otra manera y evitar estas dos, porque ambas son muy laboriosas y no me solucionarán mucho (porque mañana aparecerá un informe que necesite tres parámetros y tendré que volver a crear otra función o volver a editar todos los informes, y a lo mejor ya tengo 200...)

     

    Saludos!

    lunes, 18 de abril de 2011 15:03
  • La duda es si hay otra manera y evitar estas dos, porque ambas son muy laboriosas y no me solucionarán mucho (porque mañana aparecerá un informe que necesite tres parámetros y tendré que volver a crear otra función o volver a editar todos los informes, y a lo mejor ya tengo 200...)

    si analzia la solucion que propuse, la segunda, no tendrias problemas porque si aprce un reporte de 3 parametros solo creas una clase del tipo

     

    Public Class ReportDosParametro Inherits ReportesInfo

        Public Overrides Function Ejecutar() As ReportDocument
       
            Dim _report As New ReportDocument
            _report.SetParameterValue("Parametro1", "Cadena de Prueba 1")
            _report.SetParameterValue("Parametro2", "Cadena de Prueba 2")

           _report.SetParameterValue("Parametro3", "Cadena de Prueba 3")
       
        End Function

    End Class

     

    y eso es todo, en la lista solo añades este nuevo reporte, peor es la clase quien decide cuantos reportes requiere ese reporte y evitas hacer un Selcte Case enorme

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 18 de abril de 2011 15:07