none
Crystal Reports y VB .net 2010

    Pregunta

  • Hola

    Tengo inconveniente al ejecutar un reporte en CR desde vb.net 2010.

    Quiero usar un visor de CR para mostrar los reportes allí y como es natural tengo que darle el nombre del archivo .rpt con su ruta.

    Los reportes .rpt los tengo en un proyecto de mi solución llamado Marketing.Reports así que en el formulario que contiene el visor debo cargar el archivo ubicado en este proyecto: rpt.Load(file), donde file es la ruta+el nombre del reporte .rpt

    Leandro me sugirió que utilizara la instrucción Path.Combine así: 

    Dim vPath As String = Path.Combine(Application.StartupPath, "Marketing.Reports\")

    pero no me funciona cuando publico la solución, no localiza el reporte .rpt.

    Abrí esta nueva pregunta debido a que el tema anterior fue cerrado. 

    Dejo la imagen quizás me explique mejor lo que deseo:

    Luego llamo al formulario que contiene el CrystalReportViewer y paso el archivo

    Dim frm As New frmCR_Visor(vRpt)
    
    frm.ShowDialog()
    
    'Allí tengo esto:
    
      Private Sub frmCR_Visor_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            rpt.Load(file)
            crVisor.ShowRefreshButton = False
            crVisor.ShowCloseButton = False
            crVisor.ShowGroupTreeButton = False
    
            crVisor.ReportSource = rpt
        End Sub

    Pero sale error pues no encuentra el archivo...

    ¿Qué es lo que tengo errado?

    Agradezco su colaboración.


    Saludos, Solph.

    viernes, 29 de marzo de 2013 16:05

Respuestas

  • Hola Solph:

    EN mi aplicación pongo todos los informes en una carpeta "Informes" situada dentro de la carpeta "Debug" de la aplicación, por lo que los informes siempre están en la tura donde se encuentre el ejecutable de la misma. Te comento que trabajo con vb 2010, con el crystal reports para esa versión y con Access 2007.

    El informe está enlazado a un dataset.

    Te pongo resumidas las características del informe pero sobre todo como llama la aplicación al report (en negrita) y como lo muestro en el CrViewer.

    La llamada al report la hago de la siguiente forma:

    Imports CrystalDecisions.CrystalReports.Engine
    Imports CrystalDecisions.ReportSource
    Imports CrystalDecisions.Shared
    
     Public Sub Imprimir()
           Dim dsInformes As New DataSet("dsInformes")
    
    
            Using Cnn As New OleDbConnection(strConexion)
                Cnn.Open()
    
               'Creamos el dataAdapter y la sql de selección
                    Dim cmd As New OleDbCommand("SELECT  Descripcion, Ejer_01, Ejer_02, Ejer_03, Ejer_04, Ejer_05, PorcTot1, PorcTot2, PorcTot3, PorcTot4, PorcTot5, PorcDesv1, PorcDesv2, PorcDesv3, PorcDesv4 " & _
                                                      "FROM Varios WHERE Cod_Empresa = @empresa AND Balance = 'FLUCAJA' ORDER BY Orden", Cnn)
    
                    cmd.Parameters.AddWithValue("@empresa", m_strCod_Empresa)
                    Dim daInformes As New OleDbDataAdapter(cmd)
     
    'Poblar las tablas del dataset desde los dataAdaperts
                    daInformes.Fill(dsInformes, "Informe")
                    daGraficos.Fill(dsInformes, "GraficoValores")
                    daPorcGraficos.Fill(dsInformes, "GraficoPorcentajes")
                    daDesvGraficos.Fill(dsInformes, "GraficoDesviaciones")
                    daTotalesGraficos.Fill(dsInformes, "TotalesGraficos")
    
     End Using
    
            Try
    
                Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
    
                '// Asigno el tipo de papel a imprimir: Carta o A4
                modInicio.MostrarTipoPapel()
                If strTipoPapel = "A4" Then
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4
                Else
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperLetter
                End If
    
                ''// Asigno el nombre del reporte 
                CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
                CrReport.Load(Application.StartupPath & "\Informes\infFlujoDeCaja_5ej.rpt")
    
    'Asignamos el data adapter al objeto crReport
                CrReport.SetDataSource(dsInformes)
    
     '//Llamamos al visor de informes y vemos el informe
                Dim VisorInforme As frmCrViewer = New frmCrViewer
                VisorInforme.crViewer1.ReportSource = CrReport
                VisorInforme.Text = "Informe del Flujo de Caja"
    
                VisorInforme.ShowDialog()
    
            Catch ex As Exception
                MessageBox.Show("Error: " & ex.Message, "Informe Flujo de Caja.")
            End Try
        End Sub
    sábado, 30 de marzo de 2013 8:08
  • Cuando generas el instalador añade una carpeta  por ejemplo Reports en  Application Folder y añade los .rpt ahí en el File System during the deployment process. Una vez 
    que se despliegue la carpeta  estara en el  bin.

    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    sábado, 30 de marzo de 2013 10:23

Todas las respuestas

  • Hola:

    EL archivo rpt que no encuentra es el CR_pagos.rpt?. Si es así en tu proyecto "Marketing.Reports" no figura. A ver si es que lo tienes en otro sitio.

    Un saludo.

    Gemma

    viernes, 29 de marzo de 2013 19:01
  • Gracias Gemma por responder...

    Por casualidad está CR_Pagos, porque aún no lo he diseñado. El error que sale es cuando publico y ejecuto los reportes que sí están diseñados,

    como CR_Ctas_Pend.rpt, por ejemplo y todos los demás.  Antes de realizar la publicación de la solución funciona bien, pero si corro la aplicación que ya está publicada sale el error, por que la ruta no la encuentra, ya que no es la misma que encuentra en tiempo de diseño.

    Ya publicada, la ruta es: C:\Users\...\AppData\Local\Apps\2.0\357HL2HH.R88 ... y sigue más carpetas con nombres así....

    y sin publicar la ruta es:  C:\Users\...\Documents\Visual Studio 2010\Projects\Marketing\Marketing.UI\bin\Debug\Marketing.Reports\

    lo que está en negrita es por causa del path.combine: 

    Le agradecería que alguien me ayudara a realizar un path de acuerdo a lo explicado y a la imagen. Un path que me localice los reportes CR cuando realice la publicacion de la solucion.

    Dim vPath As String = Path.Combine(Application.StartupPath, "Marketing.Reports\")

    Gracias


    Saludos, Solph.

    viernes, 29 de marzo de 2013 21:37
  • Hola Solph:

    EN mi aplicación pongo todos los informes en una carpeta "Informes" situada dentro de la carpeta "Debug" de la aplicación, por lo que los informes siempre están en la tura donde se encuentre el ejecutable de la misma. Te comento que trabajo con vb 2010, con el crystal reports para esa versión y con Access 2007.

    El informe está enlazado a un dataset.

    Te pongo resumidas las características del informe pero sobre todo como llama la aplicación al report (en negrita) y como lo muestro en el CrViewer.

    La llamada al report la hago de la siguiente forma:

    Imports CrystalDecisions.CrystalReports.Engine
    Imports CrystalDecisions.ReportSource
    Imports CrystalDecisions.Shared
    
     Public Sub Imprimir()
           Dim dsInformes As New DataSet("dsInformes")
    
    
            Using Cnn As New OleDbConnection(strConexion)
                Cnn.Open()
    
               'Creamos el dataAdapter y la sql de selección
                    Dim cmd As New OleDbCommand("SELECT  Descripcion, Ejer_01, Ejer_02, Ejer_03, Ejer_04, Ejer_05, PorcTot1, PorcTot2, PorcTot3, PorcTot4, PorcTot5, PorcDesv1, PorcDesv2, PorcDesv3, PorcDesv4 " & _
                                                      "FROM Varios WHERE Cod_Empresa = @empresa AND Balance = 'FLUCAJA' ORDER BY Orden", Cnn)
    
                    cmd.Parameters.AddWithValue("@empresa", m_strCod_Empresa)
                    Dim daInformes As New OleDbDataAdapter(cmd)
     
    'Poblar las tablas del dataset desde los dataAdaperts
                    daInformes.Fill(dsInformes, "Informe")
                    daGraficos.Fill(dsInformes, "GraficoValores")
                    daPorcGraficos.Fill(dsInformes, "GraficoPorcentajes")
                    daDesvGraficos.Fill(dsInformes, "GraficoDesviaciones")
                    daTotalesGraficos.Fill(dsInformes, "TotalesGraficos")
    
     End Using
    
            Try
    
                Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
    
                '// Asigno el tipo de papel a imprimir: Carta o A4
                modInicio.MostrarTipoPapel()
                If strTipoPapel = "A4" Then
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4
                Else
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperLetter
                End If
    
                ''// Asigno el nombre del reporte 
                CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
                CrReport.Load(Application.StartupPath & "\Informes\infFlujoDeCaja_5ej.rpt")
    
    'Asignamos el data adapter al objeto crReport
                CrReport.SetDataSource(dsInformes)
    
     '//Llamamos al visor de informes y vemos el informe
                Dim VisorInforme As frmCrViewer = New frmCrViewer
                VisorInforme.crViewer1.ReportSource = CrReport
                VisorInforme.Text = "Informe del Flujo de Caja"
    
                VisorInforme.ShowDialog()
    
            Catch ex As Exception
                MessageBox.Show("Error: " & ex.Message, "Informe Flujo de Caja.")
            End Try
        End Sub
    sábado, 30 de marzo de 2013 8:08
  • Cuando generas el instalador añade una carpeta  por ejemplo Reports en  Application Folder y añade los .rpt ahí en el File System during the deployment process. Una vez 
    que se despliegue la carpeta  estara en el  bin.

    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    sábado, 30 de marzo de 2013 10:23
  • Gracias Sergio por tu colaboración,

    me interesa lo que dices... 

    Ahora bien, cómo hago para hacer referencia a esa carpeta desde mi codigo en formulario?

    ¿Significa que sería mejor no crear un proyecto de Reportes de Crystal Reports?

    Agradecería tus comentarios


    Saludos, Solph.

    sábado, 30 de marzo de 2013 12:51
  • Gracias Gemma,

    me es muy útil lo que dices...

    Eso quiere decir que no usas un proyecto por separado para Reportes sino una carpeta en tu capa de UI.

    o creas la carpeta independiente? podrías explicarme por favor?

    Gracias


    Saludos, Solph.

    sábado, 30 de marzo de 2013 13:08
  • Hola:

    No, no uso un proyecto por separado. Lo que hago es crear la subcarpeta "Informes" dentro de la carpeta "Debug" así no hay problemas de rutas.

    El ejecutable siempre la buscará ahí.

    Tu proyecto

    > Referencias

    > Bin

           > Debug

                 > Informes

                           >Tu informe.rpt

    Un saludo.

    Gemma



    • Editado gemma_campillo sábado, 30 de marzo de 2013 14:36 FALTAN COMENTARIOS
    sábado, 30 de marzo de 2013 14:33
  • Hola Gemma

    Ya hice los cambios y sigue igual. No sé qué qué tengo mal...

    Antes de publicarla me funciona bien todo.

    pero después de publicada e instalada mi aplicación, busca otra ruta... 

    C:\Users\miUsuario\AppData\Local\Apps\2.0\357HL2HH.R88\AQQMXM1W.6BJ\mark...exe_0943bc29e97d4242_0001.0000_none_99bd2e2a99f3fc74

    Esa es la ruta donde está el archivo  .exe de mi aplicacion

    y el de configuración XML  miAplicacion.exe.config

    Incluso Gemma, veo que en este último archivo está el usuario y contraseña de la base de datos.

    (Cuando resuelva lo de la ruta de los informes, me gustaría que me dieras algunas recomendaciones en cuanto a la seguridad de la aplicacion.)


    Saludos, Solph.



    • Editado Solp sábado, 30 de marzo de 2013 18:09
    sábado, 30 de marzo de 2013 18:06
  • \ :) /

                Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

               
    '// Asigno el tipo de papel a imprimir: Carta o A4
                modInicio.MostrarTipoPapel()
                If strTipoPapel = "A4" Then
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4
                Else
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperLetter
                End If

               
    ''// Asigno el nombre del reporte 
               
     ''//   CrReport.Load(Application.StartupPath & "\Informes\infFlujoDeCaja_5ej.rpt")

                CrReport = New infFlujoDeCaja_5ej

    martes, 24 de mayo de 2016 15:45
  • \ :) /

                Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

               
    '// Asigno el tipo de papel a imprimir: Carta o A4
                modInicio.MostrarTipoPapel()
                If strTipoPapel = "A4" Then
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4
                Else
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperLetter
                End If

               
    ''// Asigno el nombre del reporte 
               
     ''//   CrReport.Load(Application.StartupPath & "\Informes\infFlujoDeCaja_5ej.rpt")

                CrReport = New infFlujoDeCaja_5ej

    martes, 24 de mayo de 2016 15:45
  • \ :) /

                Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

               
    '// Asigno el tipo de papel a imprimir: Carta o A4
                modInicio.MostrarTipoPapel()
                If strTipoPapel = "A4" Then
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4
                Else
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperLetter
                End If

               
    ''// Asigno el nombre del reporte 
               
     ''//   CrReport.Load(Application.StartupPath & "\Informes\infFlujoDeCaja_5ej.rpt")

                CrReport = New infFlujoDeCaja_5ej

    martes, 24 de mayo de 2016 15:46
  • \ :) /

                Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

               
    '// Asigno el tipo de papel a imprimir: Carta o A4
                modInicio.MostrarTipoPapel()
                If strTipoPapel = "A4" Then
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4
                Else
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperLetter
                End If

               
    ''// Asigno el nombre del reporte 
               
     ''//   CrReport.Load(Application.StartupPath & "\Informes\infFlujoDeCaja_5ej.rpt")

                CrReport = New infFlujoDeCaja_5ej

    martes, 24 de mayo de 2016 15:46
  • \ :) /

                Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

               
    '// Asigno el tipo de papel a imprimir: Carta o A4
                modInicio.MostrarTipoPapel()
                If strTipoPapel = "A4" Then
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4
                Else
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperLetter
                End If

               
    ''// Asigno el nombre del reporte 
               
     ''//   CrReport.Load(Application.StartupPath & "\Informes\infFlujoDeCaja_5ej.rpt")

                CrReport = New infFlujoDeCaja_5ej

    martes, 24 de mayo de 2016 15:46
  • \ :) /

                Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

               
    '// Asigno el tipo de papel a imprimir: Carta o A4
                modInicio.MostrarTipoPapel()
                If strTipoPapel = "A4" Then
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4
                Else
                    CrReport.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperLetter
                End If

               
    ''// Asigno el nombre del reporte 
               
     ''//   CrReport.Load(Application.StartupPath & "\Informes\infFlujoDeCaja_5ej.rpt")

                CrReport = New infFlujoDeCaja_5ej


    Enrique Contreras 3118553389 Bogotá, Colombia

    martes, 24 de mayo de 2016 15:48
  • GEMA POR FAVOR SU AYUDA: Me funciona el reporte casi perfectamente, el tema es que no me esta balidando el parametro, este es mi codigo:

    Dim dsInformes As New DataSet("dsInformes")

            Using cn
                'cn.Open()
                'Creamos el DataAdapter y la sql de seleccion
                Dim cmd As New OleDbCommand("SELECT DetalleFactura.Cantidad ,DetalleFactura.PreUnitario, DetalleFactura.Total, DetalleFactura.Descripcion, DetalleFactura.UnidMedida, Factura.Fecha, Factura.GuiaRemisionR, Factura.RucCliente, Factura.DireccionC, Factura.RazonSocialC, Factura.IdFactura, DetalleFactura.Codigo, Factura.Total, Factura.IGV, Factura.SubTotal, Factura.Letras " & _
                                                     "FROM DetalleFactura INNER JOIN Factura ON DetalleFactura.IdFactura=Factura.IdFactura" & _
                                                    " WHERE Factura.IdFacturA=@IdFactura", cn)
                cmd.Parameters.AddWithValue("@IdFactura", Val(LblNumero.Text)) 
                Dim DaInformes As New OleDbDataAdapter(cmd)
                DaInformes.Fill(dsInformes, "Informe")
            End Using
            Try
                Dim CrReporte As New CrystalDecisions.CrystalReports.Engine.ReportDocument

                'Le decimos como se llama y donde esta nuestro reaporte
                CrReporte = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
                CrReporte.Load(Application.StartupPath & "\Informes\RptFacturaaa.rpt")

                'Asignamos el data adapter al objeto crReport
                CrReporte.SetDataSource(dsInformes)

                'Llamamos al visor de Informes y vemos el Informe
                Dim VisorInforme As frmCrViewer = New frmCrViewer
                VisorInforme.CrystalReportViewer1.reportsource = CrReporte
                VisorInforme.Text = "ooooooooooooooooooooooooooooo"
                VisorInforme.showdialog()

            Catch ex As Exception
                MessageBox.Show("Error: " & ex.Message, "FACTURA")
            End Try

    Como ve en la linea de código que contiene el parámetro, YO LE DOY EL VALOR DE Val(LblNumero.Text) Que en mi caso el el numero de la factura actual, pero no lo valida, el reporte me aparece pero con el numero de la factura con el cual se guardo el reporte en crystal Report por última vez. 

    espero ayudaaaaaaa. muchas gracias GEMMA.

    miércoles, 12 de septiembre de 2018 21:52
  • Hola:

    Cierra el dataset antes de volver a operar con el. Debajo de "Dim dsInformes as New Dataset("dsInformes")

    pon  dsInformes.Clear().

    Después pon un punto de interrupción donde asignas el valor al parámetro. "cmd.Parameters.AddWithValue("@IdFactura", Val(LblNumero.Text))"  y mira que valor lleva lblNumeroText a ver si es el correcto.

    Un saludo.

    Gemma

    Si la respuesta te ha ayudado a solucionar el problema, por favor márcala como correcta.

    jueves, 13 de septiembre de 2018 6:02
  • MUY BUENAS TARDES GEMMA. MIRE YA PUSE dsInformes.Clear(). En varias partes del código pero aun persiste el problema, hago la interrupción que me indica y efectivamente es correcto el valor de LblNumero.tex es 585 (factura actual que quiero imprimir) pero el reporte aparece con la factura 582, que es la que guarde la ultima ves que abrí el reporte con CRYSTAL Report. 

    FAVOR SOLICITO SU AYUDA GEMMA. Deverdad se lo agradezco por anticipado.

    viernes, 14 de septiembre de 2018 20:06
  •   Dim dsInformes As New DataSet("dsInformes")

            Using cn
                'cn.Open()
                'Creamos el DataAdapter y la sql de seleccion
                Dim cmd As New OleDbCommand("SELECT DetalleFactura.Cantidad ,DetalleFactura.PreUnitario, DetalleFactura.Total, DetalleFactura.Descripcion, DetalleFactura.UnidMedida, Factura.Fecha, Factura.GuiaRemisionR, Factura.RucCliente, Factura.DireccionC, Factura.RazonSocialC, Factura.IdFactura, DetalleFactura.Codigo, Factura.Total, Factura.IGV, Factura.SubTotal, Factura.Letras " & _
                                                     "FROM DetalleFactura INNER JOIN Factura ON DetalleFactura.IdFactura=Factura.IdFactura" & _
                                                    " WHERE Factura.IdFactura=@IdFactura", cn)


                cmd.Parameters.AddWithValue("@IdFactura", LblNumero.Text.Trim)

                Dim DaInformes As New OleDbDataAdapter(cmd)

                DaInformes.Fill(dsInformes, "Informe")
            End Using

            Try
                Dim CrReporte As New CrystalDecisions.CrystalReports.Engine.ReportDocument

                'Le decimos como se llama y donde esta nuestro reaporte
                CrReporte = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
                CrReporte.Load(Application.StartupPath & "\Informes\RptFacturaaa.rpt")

                'Asignamos el data adapter al objeto crReport
                CrReporte.SetDataSource(dsInformes)

                'Llamamos al visor de Informes y vemos el Informe
                Dim VisorInforme As frmCrViewer = New frmCrViewer
                VisorInforme.CrystalReportViewer1.ReportSource = CrReporte
                VisorInforme.Text = "ooooooooooooooooooooooooooooo"
                VisorInforme.ShowDialog()

            Catch ex As Exception
                MessageBox.Show("Error: " & ex.Message, "FACTURA")
            End Try
        End Sub
    viernes, 14 de septiembre de 2018 22:12