Hola. Tengo definida una conexión ODBC que apunta a una base MySQL llamada SUELDOS. En VB estoy haciendo un query SQL para quedarme con ciertos registros para los cuales tengo que imprimir recibos (en Crystal Reports), uso la referencia CRAXDRT para invocar al Crystal e imprimirlos y luego, desde VB y también con SQL, grabo un campo de la base con un 1 para indicar los registros que fueron impresos.
Sin embargo, no he sabido conectar el reporte Crystal con esa tabla que tengo en memoria producto del query SQL, entonces me conecto a la base SUELDOS completa, y hago en Crystal el mismo query SQL que en VB para quedarme sólo con los registros a imprimir. Esto me suena muy poco eficiente, pero no supe hacerlo mejor. ¿Alguien me puede ayudar?
1 Respuesta
Respuesta de jrpgnr
1
1
jrpgnr, Redes, un poco de Linux, conocimientos de hardware, algo VB6 con...
Yo utilizo el CRViewer para mostrar los reportes Dim sentencia as String Dim crSecs As CRAXDRT.Sections Dim crSec As CRAXDRT.Section Dim crRepObjs As CRAXDRT.ReportObjects Dim rs As New ADODB.Recordset Dim crpDatabase As CRAXDRT.Database Dim crpTables As CRAXDRT.DatabaseTables Dim crpTable As CRAXDRT.DatabaseTable sentencia = "Mi sentencia SQL" Set rs1 = cn.Execute(sentencia) Screen.MousePointer = vbHourglass Set crxReport = crxApplication.OpenReport(App.Path & "\Mi reporte.rpt") crxReport.DiscardSavedData Set crxDatabase = crxReport.Database Set crxDatabaseTables = crxDatabase.Tables crxReport.Database.SetDataSource rs 'Aqui le asigno los datos del recordset al reporte crxReport.PrinterSetup Me.hWnd CRViewer1.ReportSource = crxReport CRViewer1.EnableExportButton = True CRViewer1.DisplayGroupTree = False CRViewer1.EnablePopupMenu = False CRViewer1.EnableDrillDown = False CRViewer1.EnableSelectExpertButton = False CRViewer1.ViewReport ReportViewerFrm.WindowState = vbMaximized CRViewer1.Zoom 100 Screen.MousePointer = vbDefault Esta es una forma siquieres meter datos que no son de la BD puedes hacerlo asi Declaras un recordset Dim RsSR1 As ADODB.Recordset 'Luego por ejemplo si quiero agregarle un campo al recorset que esta arriba que no es de BD hago esto sentencia = "Mi sentencia SQL" Set rs1 = cn.Execute(sentencia) Set RsSR1 = New ADODB.Recordset RsSR1. Fields. Append "camponumerico", adInteger RsSR1. Fields. Append "campochar", adChar, 80 RsSR1. Fields. Append "camponumerodecimal", adDouble RsSR1. Fields. Append "camponumerico2", adInteger RsSR1. Fields. Append "CampoFicticio", adInteger RsSR1. Open If Not rs1.EOF Then 'Asigo lo que tenia mi recorset anterior While Not rs1.EOF sentencia = "select vale.kilometraje from vale left join vehiculo on(vale.idvehiculo=vehiculo.idvehiculo)where vale.status<>'Cancelado' and vale.idvehiculo=" & rs1(0) Set rstemp = cn.Execute(sentencia) RsSR1.AddNew RsSR1(0) = rs1(0) RsSR1(1) = rs1(1) RsSR1(2) = rs1(2) RsSR1(3) = rs1(3) RsSR1(4) = (5*8)/10 'Este es el campo que agrego que no esta en mi BD rs1.MoveNext Wend End If Screen.MousePointer = vbHourglass Set crxReport = crxApplication.OpenReport(App.Path & "\Mi reporte.rpt") crxReport.DiscardSavedData Set crxDatabase = crxReport.Database Set crxDatabaseTables = crxDatabase.Tables crxReport.Database.SetDataSource RsSR1 'Asigno el segundo recordset crxReport.PrinterSetup Me.hWnd CRViewer1.ReportSource = crxReport CRViewer1.EnableExportButton = True CRViewer1.DisplayGroupTree = False CRViewer1.EnablePopupMenu = False CRViewer1.EnableDrillDown = False CRViewer1.EnableSelectExpertButton = False CRViewer1.ViewReport ReportViewerFrm.WindowState = vbMaximized CRViewer1.Zoom 100 Screen.MousePointer = vbDefault