作者在 2010-06-12 12:08:51 发布以下内容
本文非粘贴或抄袭,但技术主要学习自阿泰的文章:(向阿泰致谢)。
水晶报表比VB6自带的报表工具DataReport要好的多,无论从功能或是界面上都有很大的优越性。VS.NET中已经集成了CrystalReport,本文则主要说明如何在VB6中使用CrystalReport.
测试环境:VB6.0中文企业版+CrystalReport11.5(XI Release2),在VB6中引用Crystal ActiveX Report Viewer Library 11.5。添加报表控件。
水晶报表获取数据据的方法有两种,称为拉模式和推模式。拉模块是直接连接数据库并把数据传给报表控件,推模式是指使用数据对象如ADO生成记录集,然后将记录集传给报表控件。使用推模式报表不必依赖于数据源,更灵活一些。在编写代码之前,可以先设计报表的模板。
模板设计:
打开CrystalReport,新建空白报表,出现数据库专业对话框/创建新连接/仅字段定义,在出现的对话框中可以选择字段定义文件,或者定义新文件。(也可以以同样的结构,用记录本创建该TTX文件)。剩下的操作就是设置模板中字段的布局,合理使用组专家、节专家和排序专业工具对生成的报表进行定义。
需要注意的是,定义的TTX字段结构,应与要传递数据的记录集的结构保持一致。
保存报表模板和TTX字段定义文件。下面的代码演示了如何用ADO数据集生成报表。
Option Explicit
Private objCRApp As New CRAXDRT.Application '水晶报表应用程序对象
Private objCRReport As New CRAXDRT.Report '报表对象
'======================================================
Private Sub Form_Load()
Dim i As Integer
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim strsql As String
Dim str1 As String
Dim str2 As String
Dim str3 As String
str1 = "Provider=Microsoft.Jet.OLEDB.4.0;"
str2 = "Data Source=" & fname & ";"
str3 = "Jet OLEDB:Database Password="
conn.Open str1 & str2 & str3
strsql = "select 单位,姓名,性别 from student"
rst.CursorLocation = adUseClient
rst.Open strsql, conn, 3, 3 '记录集已打开
Dim props As CRAXDRT.ConnectionProperties '报表数据源参数集
Dim prop As CRAXDRT.ConnectionProperty '报表数据源参数
'--------------------------------------------------
'创建报表
'--------------------------------------------------
'加载报表模板
Set objCRReport = objCRApp.OpenReport(App.Path & "\rpt1.rpt", 1)
'加载报表字段定义文件
Set props = objCRReport.Database.Tables(1).ConnectionProperties
For Each prop In props
If InStr(prop.Name, "Field Definition File") > 0 Then
prop.Value = App.Path & "\test1.ttx"
Exit For
End If
Next
Set props = Nothing
'清除报表中保持的数据
objCRReport.DiscardSavedData
'赋给报表数据
objCRReport.Database.SetDataSource rst
'--------------------------------------------------
'进行报表显示外观设置
'--------------------------------------------------
objCRReport.LeftMargin = 10
objCRReport.RightMargin = 10
CRViewer91.EnableExportButton = True '导出按钮
' CRViewer91.EnableSelectExpertButton = False
' CRViewer91.DisplayGroupTree = False '不显示组树
' CRViewer91.EnableAnimationCtrl = False
' CRViewer91.EnableCloseButton = False
' CRViewer91.EnableGroupTree = False
' CRViewer91.EnableHelpButton = False
CRViewer91.EnableRefreshButton = False
' CRViewer91.EnableNavigationControls = False
' CRViewer91.EnablePopupMenu = False
' CRViewer91.EnableSearchControl = False
' CRViewer91.EnableSearchExpertButton = False
' CRViewer91.EnableSelectExpertButton = False
' CRViewer91.DisplayTabs = False
'指定报表来源
CRViewer91.ReportSource = objCRReport
'显示报表
CRViewer91.ViewReport
Set rst = Nothing
End Sub
'截获打印事件
Private Sub CRViewer91_PrintButtonClicked(UseDefault As Boolean)
Dim lngRet As Long
'不使用默认设置
UseDefault = False
'进行打印机设置
objCRReport.PrinterSetup Me.hWnd
'直接打印(注意True/False的设置,主要是为了控制前一对话框取消的情况)
objCRReport.PrintOutEx True
End Sub
Private Sub Form_Resize()
On Error Resume Next
CRViewer91.Left = 200
CRViewer91.Width = Me.Width - 500
CRViewer91.Height = Me.Height
End Sub
加载图片:Private objCRApp As New CRAXDRT.Application '水晶报表应用程序对象
Private objCRReport As New CRAXDRT.Report '报表对象
'======================================================
Private Sub Form_Load()
Dim i As Integer
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim strsql As String
Dim str1 As String
Dim str2 As String
Dim str3 As String
str1 = "Provider=Microsoft.Jet.OLEDB.4.0;"
str2 = "Data Source=" & fname & ";"
str3 = "Jet OLEDB:Database Password="
conn.Open str1 & str2 & str3
strsql = "select 单位,姓名,性别 from student"
rst.CursorLocation = adUseClient
rst.Open strsql, conn, 3, 3 '记录集已打开
Dim props As CRAXDRT.ConnectionProperties '报表数据源参数集
Dim prop As CRAXDRT.ConnectionProperty '报表数据源参数
'--------------------------------------------------
'创建报表
'--------------------------------------------------
'加载报表模板
Set objCRReport = objCRApp.OpenReport(App.Path & "\rpt1.rpt", 1)
'加载报表字段定义文件
Set props = objCRReport.Database.Tables(1).ConnectionProperties
For Each prop In props
If InStr(prop.Name, "Field Definition File") > 0 Then
prop.Value = App.Path & "\test1.ttx"
Exit For
End If
Next
Set props = Nothing
'清除报表中保持的数据
objCRReport.DiscardSavedData
'赋给报表数据
objCRReport.Database.SetDataSource rst
'--------------------------------------------------
'进行报表显示外观设置
'--------------------------------------------------
objCRReport.LeftMargin = 10
objCRReport.RightMargin = 10
CRViewer91.EnableExportButton = True '导出按钮
' CRViewer91.EnableSelectExpertButton = False
' CRViewer91.DisplayGroupTree = False '不显示组树
' CRViewer91.EnableAnimationCtrl = False
' CRViewer91.EnableCloseButton = False
' CRViewer91.EnableGroupTree = False
' CRViewer91.EnableHelpButton = False
CRViewer91.EnableRefreshButton = False
' CRViewer91.EnableNavigationControls = False
' CRViewer91.EnablePopupMenu = False
' CRViewer91.EnableSearchControl = False
' CRViewer91.EnableSearchExpertButton = False
' CRViewer91.EnableSelectExpertButton = False
' CRViewer91.DisplayTabs = False
'指定报表来源
CRViewer91.ReportSource = objCRReport
'显示报表
CRViewer91.ViewReport
Set rst = Nothing
End Sub
'截获打印事件
Private Sub CRViewer91_PrintButtonClicked(UseDefault As Boolean)
Dim lngRet As Long
'不使用默认设置
UseDefault = False
'进行打印机设置
objCRReport.PrinterSetup Me.hWnd
'直接打印(注意True/False的设置,主要是为了控制前一对话框取消的情况)
objCRReport.PrintOutEx True
End Sub
Private Sub Form_Resize()
On Error Resume Next
CRViewer91.Left = 200
CRViewer91.Width = Me.Width - 500
CRViewer91.Height = Me.Height
End Sub
如果在数据库中存储了图片,如ACCESS中,用OLE对象(二进制),或SQL数据库中的image,可以在TTX字段定义文件中用BLOB(二进制大型对象) 定义相应的字段,那么在模板中可以直接把这个字段以照片的格式拖出来。生成记录集的时候该字段的查询与其它类型的字段是一样的。