none
Como ordenar en Crystal Report utilizando Visual Studio 2005 RRS feed

  • Pregunta

  • Hola a todos

    Estoy realizando un sistema que ya casi termino pero al comenzar a generar todos los reportes que contiene el sistema, me estoy encontrando sobre todo en los catalogos con el siguiente problema:

    Ya genere el reporte pero necesito que este mismo reporte se pueda presentar ordenado por el ID que es numerico o por la Descripcion que es alfanumerico.

    No he encontrado ninguna propiedad o metodo con el cual pueda hacer esto. Tal vez lo mas sencillo es hacer 2 reportes pero no seria lo mas optimo.

    Si alguien puede ayudarme se lo agradecere.

     

    Salu2 :)

    lunes, 9 de marzo de 2009 23:40

Respuestas

  • Hola Lenadro

    Gracias por tu apoyo, ya probe los tips que vienen en el link que me enviaste y tuve que hacer algunos ajustes para que me funcionara como lo necesitaba, de hecho asi como aparece el código en el link genera un error, te pongo el codigo de la rutina de imprimir tal y como la deje finalmente.

        Private Sub sb_Imprime()  
            Beep()  
            strSQL = UCase(InputBox("A - Alfabético" & Chr(13) & "N - Numérico", "Tipo de Ordenamiento", "A"))  
            If strSQL = "A" Then  
                strSQL = "ke_NomEmp" 
            Else  
                strSQL = "ke_NumEmp" 
            End If  
            Reportes.Text = "Impresión del " & Me.Text  
            Dim objReporte As New ReportDocument  
            objReporte.Load(MiPath & "\Reportes\ListadoEmpresas.rpt")  
            Dim objSort As FieldDefinition = objReporte.Database.Tables(0).Fields(strSQL)  
            objReporte.DataDefinition.SortFields(0).Field = objSort 
            Reportes.CrystalReportViewer1.ReportSource = objReporte 
            Reportes.ShowDialog()  
        End Sub  
     
     
    Nuevamente gracias, voy a tratar de acompletar la rutina para que reciba paramteros, el selectionformula, etc. poner todo lo que requiera para que sea una rutina global y que funcione para cualquier tipo de reporte, ya te avisare cuando la tenga lista

    Salu2:)

    P.D. lo que no se es como marcar que el problema que planteé ya fué solucionado si puedes decirme como te lo agradeceré para que en futuras consultas las pueda marcar con el estatus correcto
    • Marcado como respuesta Paco Miranda jueves, 19 de marzo de 2009 23:16
    jueves, 19 de marzo de 2009 23:15

Todas las respuestas

  • hola,

    lo que se me ocurre es que podrias proporcionar a tu reporte los datos ya ordenados.

    no se si usas DataSet, o alguna clases custom, igualmente sea cual fuere como cargas el reporte, podrias proporcionarles los datos ya ordenados.

    o sino por ahi esto tambien podrias ayudar:

    Personalizar campos de ordenación en tiempo de ejecución


    aunque la verdad viendo el ejemplo no lo entendi, (y lo raro es que esta en el msdn), pero cuando explica el ejemplo en el codigo hace uso de un combo que me desconcierta, pero bueno puede que al menos te de una pista donde mirar y resolver el problema


    Saludos

    Leandro Tuttini
    martes, 10 de marzo de 2009 2:47
  • Gracias por tu atencion Leandro,

    Dejame te explico un poco mas mi problema, tengo un reporte hecho en Crystal Report fura del ambiente de Visual Studio, esto es, lo genere directamente en Crystal. Es la impresion de un catalogo que debe ser ordenado por la Clave (campo numerico) o por la Descripcion (campo alfanumerico).

    En mi aplicacion tengo una forma llamada Reportes que es la que contiene el control 
    CrystalReportViewer llamado CrystalReportViewer1, desde la forma del catalogo llamada catEmpresas llamo el reporte en el evento clic del boton imprimir, no tengo problemas para presentar el reporte pero no encuentro un metodo que pueda ordenar la informacion, mi codigo es el siguiente:

     

    En la Forma catEmpresas: 
     
        Private Sub btnImprimir_Click(ByVal sender As ObjectByVal e As System.EventArgs) Handles btnImprimir.Click  
            Beep()  
            strSQL = UCase(InputBox("A - Alfabético" & Chr(13) & "N - Numérico""Tipo de Ordenamiento""A"))  
    '-- Lineas comentadas porque no encontre donde asignarle la sentencia SQL  
    '        If strSQL = "A" Then  
    '            strSQL = "SELECT * FROM kEmpresa ORDER BY ke_NomEmp"  
    '        Else  
    '            strSQL = "SELECT * FROM kEmpresa ORDER BY ke_NumEmp"  
    '        End If  
    '-- Fin de lineas comentadas  
            Reportes.Text = "Impresión del " & Me.Text  
            Reportes.CrystalReportViewer1.ReportSource = MiPath & "\Reportes\ListadoEmpresas_11.rpt" 
            Reportes.CrystalReportViewer1.ParameterFieldInfo.Clear()  
            Call gs_CargaParametros("Titulo"Me.Text, "string")  
            Reportes.CrystalReportViewer1.SelectionFormula = "{kEmpresas.Id_Estado} = " & intIdEstado  
            Reportes.ShowDialog()  
        End Sub   
     
     
    Como Rutina Global en el archivo de funciones:  
     
        Public Sub gs_CargaParametros(ByVal Campo As StringByVal Valor As StringByVal Tipo As String)  
        '****************************************************************************  
        ' Función : gs_CargaParametros   
        ' Descripción : Carga los Parámetros al reporte   
        ' Parámetros  :   
        '       Campo : Variable donde llega el nombre del parámetro   
        '       Valor : Valiable donde llega el contenido del parámetro
        '  
          Tipo : Variable donde llega el tipo del parámetro
        ' Valor Devuelto :  
        ' Desarrolló : Francisco Miranda Angel  
        ' F. Creación : 14 de Octubre de 2008  
        '****************************************************************************  
            Dim myParameterDiscreteValue As New ParameterDiscreteValue  
            myParameterDiscreteValue.Value = Valor  
            Dim myParameterValues As New ParameterValues  
            myParameterValues.Add(myParameterDiscreteValue)  
            Select Case Tipo  
                Case "currency" 
                    Reportes.CrystalReportViewer1.ParameterFieldInfo.Add(Campo, ParameterValueKind.CurrencyParameter, DiscreteOrRangeKind.DiscreteValue)  
                Case "date" 
                    Reportes.CrystalReportViewer1.ParameterFieldInfo.Add(Campo, ParameterValueKind.DateParameter, DiscreteOrRangeKind.DiscreteValue)  
                Case "int" 
                    Reportes.CrystalReportViewer1.ParameterFieldInfo.Add(Campo, ParameterValueKind.NumberParameter, DiscreteOrRangeKind.DiscreteValue)  
                Case "string" 
                    Reportes.CrystalReportViewer1.ParameterFieldInfo.Add(Campo, ParameterValueKind.StringParameter, DiscreteOrRangeKind.DiscreteValue)  
            End Select 
            Reportes.CrystalReportViewer1.ParameterFieldInfo.Item(Campo).CurrentValues = myParameterValues  
        End Sub 
     
     
     

    Como podras ver al control CrystalReportViewer le indico el nombre del reporte que debe presentar, le envio un parametro que en este caso es el titulo, y le aplico un filtro de acuerdo al estado que haya seleccionado el usuario de antemano.

    No se si exista otro metodo para presentar los reportes, si pudieras darme algun tip, pero lo que tengo que cuidar es que mi acceso a la base de datos lo hago atraves de ODBC ya que es una aplicacion que se instala en diferentes lugares y cada lugar tiene su servidor, y este metodo del ODBC me da la facilidad de cambiar de servidor sin tener que modificar nada del codigo.

    Ojala tengas algo en la manga que me pueda ayudar.

    Salu2 :)

     

    martes, 10 de marzo de 2009 22:51
  • Hola bueno en mi caso lo que yo hago es crear una consulta segun sea el caso y ordenar ahi mismo por lo que necesito,
    lleno un DataSet con la consulta y paso esos datos a un XML con Dataset.WriteXml.
    ya en el reporte le indico que este archivo Xml va ser el origen de datos.
    en mi caso me a funcionado perfectamente ya que la consulta puede variar tanto como yo quiera (claro manteniendo los mismo campos del reporte si no marcaria error).
    de esta forma no manejas tanto codigo mas que la creacion de la consulta.
    aunque no creo que te sea de mucha  ayuda ya que indicas que estas por terminar el sistema , pero le puede servir a otras personas.
    Saludos.
    jueves, 12 de marzo de 2009 21:04
  • hola,

    si entiendo no asignas tu el DataSource que tendras el reporte, sino que estos estas vinculados a la db directamente por medio del odbc, por lo que no puedes manupular los datos previamente antes de cargarlos.


    mira encontre este link que creo tiene la soluciona tu problema:

    Sorting the fields in crystal report programmatically

    como veras deberias recargar el reporte si cambias el campo de ordenacion, o sea deberias volver a realizar el load en el report viewer, aunque puedes probar con algun refresh por ahi tambien funciona.


    Espero te sea de utilidad
    Saludos

    Leandro Tuttini
    jueves, 12 de marzo de 2009 21:23
  • Hola Lenadro

    Gracias por tu apoyo, ya probe los tips que vienen en el link que me enviaste y tuve que hacer algunos ajustes para que me funcionara como lo necesitaba, de hecho asi como aparece el código en el link genera un error, te pongo el codigo de la rutina de imprimir tal y como la deje finalmente.

        Private Sub sb_Imprime()  
            Beep()  
            strSQL = UCase(InputBox("A - Alfabético" & Chr(13) & "N - Numérico", "Tipo de Ordenamiento", "A"))  
            If strSQL = "A" Then  
                strSQL = "ke_NomEmp" 
            Else  
                strSQL = "ke_NumEmp" 
            End If  
            Reportes.Text = "Impresión del " & Me.Text  
            Dim objReporte As New ReportDocument  
            objReporte.Load(MiPath & "\Reportes\ListadoEmpresas.rpt")  
            Dim objSort As FieldDefinition = objReporte.Database.Tables(0).Fields(strSQL)  
            objReporte.DataDefinition.SortFields(0).Field = objSort 
            Reportes.CrystalReportViewer1.ReportSource = objReporte 
            Reportes.ShowDialog()  
        End Sub  
     
     
    Nuevamente gracias, voy a tratar de acompletar la rutina para que reciba paramteros, el selectionformula, etc. poner todo lo que requiera para que sea una rutina global y que funcione para cualquier tipo de reporte, ya te avisare cuando la tenga lista

    Salu2:)

    P.D. lo que no se es como marcar que el problema que planteé ya fué solucionado si puedes decirme como te lo agradeceré para que en futuras consultas las pueda marcar con el estatus correcto
    • Marcado como respuesta Paco Miranda jueves, 19 de marzo de 2009 23:16
    jueves, 19 de marzo de 2009 23:15