Crystal Reports - SQL

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?
Respuesta
1
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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas