none
Como puedo automatizar crystal report ? RRS feed

  • Pregunta

  • saludos amigos del foro, les traigo un incoveniente, tengo que hacer cuando sean las 18:00:00 enviar un correo al cliente para que vea el registro de ventas generado en pdf.

    Para esto necesito automatizar Crystal Report, estoy usando la version para visual studio 2013 vb.net, necesito que me ayuden por favor se los agradeceria es urgente:

    la ruta y el nombre del reporte es: "\Reportes\Ventas\reporte_vregistro.rpt"
    la ruta final del reporte generado seria "D:\Descargas\Registro_de_Ventas.pdf"

    Porfavor ayudenme y gracias de antemano,

    rudolf heiner.

    Estoy utilizando SQL Server 2012 Express como motor de base de datos.
    martes, 5 de abril de 2016 23:52

Respuestas

  • Hola:

    Bueno, yo desde luego ,lo partiría ese código por los menos en dos partes, una ataca a las conexiones, rellenos de datos, etc. y otra específicamente para mostrar el reporte. Es mejor y más fácil de leer de esta manera.

    Por otro lado y como consejo general, también te diría que vayas documentando el código que vas haciendo, ese código que tienes si de aquí dos meses te quieres acordar de donde salen las cosas, no te acordarás, ahora bien, si tu algunas líneas de código que creas importan, le pones encima un comentario: 'comentario.... será mas fácil de interpretar.

    Un cordial saludo.

    Gemma

    'Si la respuesta te ha servido, por favor márcala como correcta, así otros usuarios se podrán beneficiar de la misma.!

    • Marcado como respuesta Rudolf Heiner miércoles, 6 de abril de 2016 18:20
    miércoles, 6 de abril de 2016 17:43

Todas las respuestas

  • Este es mi sub de impresion:

        Public Sub Imprimir(ByVal FechaInicial As Date, ByVal FechaFinal As Date)

            nue_var.consulta = _
                "SELECT id, fecha, idcli, nomcli, moneda, tc," & _
                " IIF(anulado = 1, 0, subtotmn2) AS subtotmn2, IIF(anulado = 1, 0, impuestomn) AS impuestomn, IIF(anulado = 1, 0, totmn) AS totmn," & _
                " anulado, 'FAC' AS Documento" & _
                " FROM vfacturasc WHERE fecha BETWEEN @FechaInicial AND @FechaFinal AND pais = '" & Sys_Pais & "' AND empresa = '" & Sys_Cia & "'" & _
                " UNION " & _
                "SELECT id, fecha, idcli, nomcli, moneda, tc," & _
                " IIF(anulado = 1, 0, subtotmn2) AS subtotmn2, IIF(anulado = 1, 0, impuestomn) AS impuestomn, IIF(anulado = 1, 0, totmn) AS totmn," & _
                " anulado, 'BOL' AS Documento" & _
                " FROM vboletasc WHERE fecha BETWEEN @FechaInicial AND @FechaFinal AND pais = '" & Sys_Pais & "' AND empresa = '" & Sys_Cia & "'" & _
                " UNION " & _
                "SELECT id, fecha, idcli, nomcli, moneda, tc," & _
                " IIF(anulado = 1, 0, -subtotmn2) AS subtotmn2, IIF(anulado = 1, 0, -impuestomn) AS impuestomn, IIF(anulado = 1, 0, -totmn) AS totmn," & _
                " anulado, 'NCR' AS Documento" & _
                " FROM vncc WHERE fecha BETWEEN @FechaInicial AND @FechaFinal AND pais = '" & Sys_Pais & "' AND empresa = '" & Sys_Cia & "'" & _
                " UNION " & _
                "SELECT id, fecha, idcli, nomcli, moneda, tc," & _
                " IIF(anulado = 1, 0, subtotmn2) AS subtotmn2, IIF(anulado = 1, 0, impuestomn) AS impuestomn, IIF(anulado = 1, 0, totmn) AS totmn," & _
                " anulado, 'NDE' AS Documento" & _
                " FROM vndc WHERE fecha BETWEEN @FechaInicial AND @FechaFinal AND pais = '" & Sys_Pais & "' AND empresa = '" & Sys_Cia & "'" & _
                " ORDER BY Documento, Fecha, Id"

            Try

                nue_conexion.conectar()
                nue_var.cmd = New SqlCommand(nue_var.consulta, nue_conexion.conex())
                nue_var.cmd.Parameters.Add("@FechaInicial", SqlDbType.Date).Value = FechaInicial
                nue_var.cmd.Parameters.Add("@FechaFinal", SqlDbType.Date).Value = FechaFinal
                Dim Table As New DataTable()
                nue_var.dt = New DataTable("vregistro")
                nue_var.da = New SqlDataAdapter(nue_var.cmd)
                nue_var.da.Fill(nue_var.dt)
                nue_conexion.desconectar()
                Table = nue_var.dt

                Dim RepCrystal As New reporte_vregistro
                RepCrystal.SetDataSource(Table)
                RepCrystal.SetParameterValue("Usuario", Sys_Usuario)
                RepCrystal.SetParameterValue("Cia", Sys_Cia)
                RepCrystal.SetParameterValue("SimboloImpuesto", Sys_SimboloImpuesto)
                RepCrystal.SetParameterValue("Simbolo", Sys_Simbolo)

                Dim f As New frm_Reporte
                f.IniciaReporte(RepCrystal)

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

        End Sub

    miércoles, 6 de abril de 2016 4:50
  • Hola Rudolf:

    Tendrías por ejemplo que poner un "timer" y cuando llegue la hora que solicitas, automàticamente disparas el evento "Imprimir", simplemente con eso lo puedes solucionar.

    Un saludo.

    Gemma


    miércoles, 6 de abril de 2016 6:27
  • saludos y gracias por responder Gemma, el timer ya esta hecho y el envío del mail también, lo que pasa es que el cliente no quiere que el usuario vea cuando se manda, el usuario no tiene que hacer nada.

    tiene que estar invisible para el usuario,

    ojala me puedas ayudar,

    saludos, quedo de ti,

    rudolf heiner.

    miércoles, 6 de abril de 2016 9:17
  • Hola:

    Cuando dices que el usuario no tiene que ver nada, te refieres a que no loe salga la ventana del visor de informes?. Entonces lo que puedes hacer el mandar directamente el informe a la impresora cuando llegue el momento, para ello solamente tienes que poner :

    CrReport.PrintToPrinter(1, False, 0, 0)

    Es a eso a lo que te refieres, o es otra cosa.

    Un saludo.

    Gemma

    miércoles, 6 de abril de 2016 9:28
  • Hola Gemma, cuando me refiero que el usuario no vea nada es que no lo debo mandar a la impresora sino a un archivo pdf en el disco, mira te muestro este codigo que encontre:

    pero falta aun agregarle cosas para que pueda funcionar:

    no se si me podras ayudar porfavor ?

    Imports EASendMail
    Imports CrystalDecisions.CrystalReports.Engine
    Imports CrystalDecisions.Shared

    Imports System.Data
    Imports System.Data.SqlClient

    Public Class AutomatizacionCrystalReport

        Dim nue_conexion As New conexion
        Dim nue_var As New variables

        Public Sub Reporte()

            nue_var.consulta = _
                "SELECT id, fecha, idcli, nomcli, moneda, tc," & _
                " IIF(anulado = 1, 0, subtotmn2) AS subtotmn2, IIF(anulado = 1, 0, impuestomn) AS impuestomn, IIF(anulado = 1, 0, totmn) AS totmn," & _
                " anulado, 'FAC' AS Documento" & _
                " FROM vfacturasc WHERE fecha BETWEEN @FechaInicial AND @FechaFinal AND pais = '" & Sys_Pais & "' AND empresa = '" & Sys_Cia & "'" & _
                " ORDER BY Documento, Fecha, Id"

            Try

                nue_conexion.conectar()
                nue_var.cmd = New SqlCommand(nue_var.consulta, nue_conexion.conex())
                nue_var.cmd.Parameters.Add("@FechaInicial", SqlDbType.Date).Value = Format(Date.Now, "dd/MM/yyyy")
                nue_var.cmd.Parameters.Add("@FechaFinal", SqlDbType.Date).Value = Format(Date.Now, "dd/MM/yyyy")
                Dim Table As New DataTable()
                nue_var.dt = New DataTable("vregistro")
                nue_var.da = New SqlDataAdapter(nue_var.cmd)
                nue_var.da.Fill(nue_var.dt)
                nue_conexion.desconectar()
                Table = nue_var.dt

                Dim RepCrystal As New reporte_vregistro
                RepCrystal.SetDataSource(Table)
                RepCrystal.SetParameterValue("Usuario", Sys_Usuario)
                RepCrystal.SetParameterValue("Cia", Sys_Cia)
                RepCrystal.SetParameterValue("SimboloImpuesto", Sys_SimboloImpuesto)
                RepCrystal.SetParameterValue("Simbolo", Sys_Simbolo)

                Dim f As New frm_Reporte
                f.IniciaReporte(RepCrystal)

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

        End Sub

        Private Sub EnviarEMail()

            Dim cryRpt As New ReportDocument

            cryRpt.Load("Reportes\Ventas\reporte_vregistro.rpt")
            CrystalReportViewer1.ReportSource = cryRpt
            CrystalReportViewer1.Refresh()

            Try
                Dim CrExportOptions As ExportOptions
                Dim CrDiskFileDestinationOptions As New DiskFileDestinationOptions()
                'Dim CrFormatTypeOptions As New ExcelFormatOptions
                Dim CrFormatTypeOptions As New PdfFormatOptions
                CrDiskFileDestinationOptions.DiskFileName = "D:\Descargas\Registro_de_Ventas.pdf"
                CrExportOptions = cryRpt.ExportOptions
                With CrExportOptions
                    .ExportDestinationType = ExportDestinationType.DiskFile
                    '.ExportFormatType = ExportFormatType.Excel
                    .ExportFormatType = ExportFormatType.PortableDocFormat
                    .DestinationOptions = CrDiskFileDestinationOptions
                    .FormatOptions = CrFormatTypeOptions
                End With

                cryRpt.Export()

            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try

            'Preparamos el envio del email --------------------------------------------------------------------------------------------------
            Dim oMail As New SmtpMail("TryIt")
            Dim oSmtp As New SmtpClient()

            ' Your gmail email address
            oMail.From = "rudolf_heiner@hotmail.com"

            ' Set recipient email address, please change it to yours
            oMail.To = "rudolfheiner@gmail.com"

            ' Set email subject
            oMail.Subject = "test email from gmail account"

            ' Set email body
            oMail.TextBody = "this is a test email sent from VB.NET project with gmail"

            ' Set email body
            oMail.AddAttachment("D:\Descargas\Registro_de_Ventas.pdf")

            'Gmail SMTP server address
            Dim oServer As New SmtpServer("smtp.live.com")

            ' set 25 port, if you want to use 587 port, please change 25 to 587
            oServer.Port = 587

            ' detect SSL/TLS automatically
            oServer.ConnectType = SmtpConnectType.ConnectSSLAuto

            ' Gmail user authentication should use your 
            ' Gmail email address as the user name. 
            ' For example: your email is "gmailid@gmail.com", then the user should be "gmailid@gmail.com"
            oServer.User = "rudolf_heiner@hotmail.com"
            oServer.Password = ""

            Try
                oSmtp.SendMail(oServer, oMail)
                MsgBox("Se envio correctamente el Email", MsgBoxStyle.Information, "Email")
            Catch ep As Exception
                MsgBox("Falla en enviar el Email: " & ep.Message, MsgBoxStyle.Critical, "Email")
            End Try

        End Sub

        Private Sub AutomatizacionCrystalReport_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            EnviarEMail()
        End Sub

    miércoles, 6 de abril de 2016 15:59
  • Hola Rudolf:

    Te paso código y lo adaptas, es para exportar a pdf desde el Crystal Reports.

    Private Sub Button2_Click (ByVal sender As System.Object, _
    
        ByVal e As System.EventArgs) Handles Button2.Click
    
            try
    
                Dim CrExportOptions As ExportOptions
    
                CrDiskFileDestinationOptions Dim As New _
    
                DiskFileDestinationOptions ()
    
                CrFormatTypeOptions Dim As New PdfRtfWordFormatOptions ()
    
                CrDiskFileDestinationOptions.DiskFileName = _
    
                                            "C: \ crystalExport.pdf"
    
                CrExportOptions = cryRpt.ExportOptions
    
                With CrExportOptions
    
                    .ExportDestinationType = ExportDestinationType.DiskFile
    
                    .ExportFormatType = ExportFormatType.PortableDocFormat
    
                    .DestinationOptions = CrDiskFileDestinationOptions
    
                    .FormatOptions = CrFormatTypeOptions
    
                End With
    
                cryRpt.Export ()
    
            Catch ex As Exception
    
                MsgBox (ex.ToString)
    
            End Try
    
        End Sub
    

    Sustituye los nombres y le das un nombre al procedimiento de forma que lo dispare cuando quieras con el timer.

    Un saludo.

    Gemma

    miércoles, 6 de abril de 2016 16:51
  • Saludos Gemma, mira el codigo lo he agregado al reporte esta bien asi o lo tengo que poner en otro lugar:

        Public Sub Reporte()

            nue_var.consulta = _
                "SELECT id, fecha, idcli, nomcli, moneda, tc," & _
                " IIF(anulado = 1, 0, subtotmn2) AS subtotmn2, IIF(anulado = 1, 0, impuestomn) AS impuestomn, IIF(anulado = 1, 0, totmn) AS totmn," & _
                " anulado, 'FAC' AS Documento" & _
                " FROM vfacturasc WHERE fecha BETWEEN @FechaInicial AND @FechaFinal AND pais = '" & Sys_Pais & "' AND empresa = '" & Sys_Cia & "'" & _
                " ORDER BY Documento, Fecha, Id"

            Try

                nue_conexion.conectar()
                nue_var.cmd = New SqlCommand(nue_var.consulta, nue_conexion.conex())
                nue_var.cmd.Parameters.Add("@FechaInicial", SqlDbType.Date).Value = Format(Date.Now, "dd/MM/yyyy")
                nue_var.cmd.Parameters.Add("@FechaFinal", SqlDbType.Date).Value = Format(Date.Now, "dd/MM/yyyy")
                Dim Table As New DataTable()
                nue_var.dt = New DataTable("vregistro")
                nue_var.da = New SqlDataAdapter(nue_var.cmd)
                nue_var.da.Fill(nue_var.dt)
                nue_conexion.desconectar()
                Table = nue_var.dt

                Dim RepCrystal As New reporte_vregistro
                RepCrystal.SetDataSource(Table)
                RepCrystal.SetParameterValue("Usuario", Sys_Usuario)
                RepCrystal.SetParameterValue("Cia", Sys_Cia)
                RepCrystal.SetParameterValue("SimboloImpuesto", Sys_SimboloImpuesto)
                RepCrystal.SetParameterValue("Simbolo", Sys_Simbolo)

                'Dim f As New frm_Reporte
                'f.IniciaReporte(RepCrystal)

                Dim cryRpt As New ReportDocument
                Dim CrExportOptions As ExportOptions
                Dim CrDiskFileDestinationOptions As New DiskFileDestinationOptions()
                Dim CrFormatTypeOptions As New PdfRtfWordFormatOptions()
                CrDiskFileDestinationOptions.DiskFileName = "D:\Descargaa\crystalExport.pdf"
                CrExportOptions = cryRpt.ExportOptions
                With CrExportOptions
                    .ExportDestinationType = ExportDestinationType.DiskFile
                    .ExportFormatType = ExportFormatType.PortableDocFormat
                    .DestinationOptions = CrDiskFileDestinationOptions
                    .FormatOptions = CrFormatTypeOptions
                End With

                cryRpt.Export()

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

        End Sub

    Dame una ayuda por favor son no tan novato pero estoy aprendiendo y gracias!

    miércoles, 6 de abril de 2016 17:34
  • Hola:

    Bueno, yo desde luego ,lo partiría ese código por los menos en dos partes, una ataca a las conexiones, rellenos de datos, etc. y otra específicamente para mostrar el reporte. Es mejor y más fácil de leer de esta manera.

    Por otro lado y como consejo general, también te diría que vayas documentando el código que vas haciendo, ese código que tienes si de aquí dos meses te quieres acordar de donde salen las cosas, no te acordarás, ahora bien, si tu algunas líneas de código que creas importan, le pones encima un comentario: 'comentario.... será mas fácil de interpretar.

    Un cordial saludo.

    Gemma

    'Si la respuesta te ha servido, por favor márcala como correcta, así otros usuarios se podrán beneficiar de la misma.!

    • Marcado como respuesta Rudolf Heiner miércoles, 6 de abril de 2016 18:20
    miércoles, 6 de abril de 2016 17:43
  • ya me funciona el programa exporta y manda el mail, muchas gracias Gemma,

    bueno saludos,

    rudolf heiner.

    miércoles, 6 de abril de 2016 18:20
  • Hola Rudolf:

    Me alegro que te haya funcionado.

    Si tienes tiempo y ganas tendrías que ver el funcionamiento de tu aplicación en capas. Hay bastante información en Internet, pero eso facilitará el trabajo, ya que los formularios lo único que harán serán presentar los datos, los cálculos, relleno de propiedades, etc., se harán en una capa intermedia. Si lo haces así, en un futuro cuando quieras migrar tu aplicación, puede aprovechar tus capas ya que funcional con cualquier programa de Net.Framework, aparte de que tu código quedará mucho mejor estructurado. Por otra parte, para rellenar tus datos en el rpt, utiliza los datasets tipados, ya que estos son independientes de la conexión a la base de datos, es decir, trabajas a través del contenido de los mismos.

    Bueno, son cosas que te facilitarán el trabajo y la robustez de tu aplicación.

    Un cordial saludo.

    Gemma

    miércoles, 6 de abril de 2016 18:28
  • Ok vale, gracias Gemma, lo tendre presente,

    saludos,

    rudolf heiner.

    miércoles, 6 de abril de 2016 18:32