如何实现动态打印VB报表

houfuzhu 2004-04-05 06:41:28
我要实现的是用代码连接VB报表的数据源
以提高报表的移植性
  请各位大虾多指教,小弟先谢过了
...全文
29 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
houfuzhu 2004-04-06
  • 打赏
  • 举报
回复
谢谢各位
最迟七天后结贴
在此期间,欢迎各位大虾提供多多的例子
以供在下参考,感激不尽!!!
射天狼 2004-04-06
  • 打赏
  • 举报
回复

'------------------------------------------------------------------------
'以下可根据实际情况通过控制集合的元素来准确有效的控制这些元素所代表的控件。
'例如:
Dim i As Integer

Dim bFmt As StdDataFormat '定义布尔(Boolean)型字段的数据格式
Set bFmt = New StdDataFormat
bFmt.Type = fmtBoolean
bFmt.TrueValue = "是"
bFmt.FalseValue = "否"

For i = 0 To 6 '只打印前七个字段
'Shape(RptShape) 控件用来显示单元格

'页标头(PageHeader)区域:显示列表头(Caption)
With PHSec2_RptShp_Collection.Item(i + 1) '单元格
.Visible = True
If i = 0 Then
.Left = 0
Else
.Left = PHSec2_RptShp_Collection.Item(i).Left + PHSec2_RptShp_Collection.Item(i).Width
End If
.Top = 0
.Height = 400 '可根据字体设 单位:缇
'字体的高度(单位:缇)可使用 Form、PictureBox 的
'TextHeight 方法或 API 获得
.Width = 1500 '这里可根据实际情况分别设置各列的列宽
.BorderColor = vbRed
.BorderStyle = rptBSSolid
.Shape = rptShpRectangle
End With
With PHSec2_RptLbl_Collection.Item(i + 1) '列表头标题(Caption)
.Visible = True
.Left = PHSec2_RptShp_Collection.Item(i + 1).Left + 100
.Top = PHSec2_RptShp_Collection.Item(i + 1).Top + 100
.Height = PHSec2_RptShp_Collection.Item(i + 1).Height - 180
.Width = PHSec2_RptShp_Collection.Item(i + 1).Width - 200
.Caption = adoRecordsetX.Fields.Item(i).Name

.BorderStyle = rptBSSolid '调试用
.BorderColor = vbGreen '调试用
.BackStyle = rptBkOpaque '调试用
.BackColor = vbYellow '调试用


.Alignment = rptJustifyCenter
.Font.Name = ""

.Font.Size = 10
.Font.Bold = False
.Font.Italic = False
.Font.Strikethrough = False
.Font.Underline = False
.ForeColor = vbBlue
End With
'细节(Detail)区域显示:
With DSec1_RptShp_Collection.Item(i + 1) '单元格
.Visible = True
If i = 0 Then
DSec1_RptShp_Collection.Item(i + 1).Left = 0
Else
.Left = DSec1_RptShp_Collection.Item(i).Left + DSec1_RptShp_Collection.Item(i).Width
End If
.Top = 0
.Height = PHSec2_RptShp_Collection.Item(i + 1).Height
.Width = PHSec2_RptShp_Collection.Item(i + 1).Width
.BorderColor = PHSec2_RptShp_Collection.Item(i + 1).BorderColor
.BorderStyle = PHSec2_RptShp_Collection.Item(i + 1).BorderStyle
.Shape = PHSec2_RptShp_Collection.Item(i + 1).Shape
End With
With DSec1_RptTxt_Collection.Item(i + 1) '数据
.Visible = True
.Height = DSec1_RptShp_Collection.Item(i + 1).Height - 180
.Left = DSec1_RptShp_Collection.Item(i + 1).Left + 100
.Top = DSec1_RptShp_Collection.Item(i + 1).Top + 100
.Width = DSec1_RptShp_Collection.Item(i + 1).Width - 200

.Font.Name = PHSec2_RptLbl_Collection.Item(i + 1).Font.Name
.Font.Size = PHSec2_RptLbl_Collection.Item(i + 1).Font.Size
.Font.Bold = PHSec2_RptLbl_Collection.Item(i + 1).Font.Bold
.Font.Italic = PHSec2_RptLbl_Collection.Item(i + 1).Font.Italic
.Font.Strikethrough = PHSec2_RptLbl_Collection.Item(i + 1).Font.Strikethrough
.Font.Underline = PHSec2_RptLbl_Collection.Item(i + 1).Font.Underline
.ForeColor = PHSec2_RptLbl_Collection.Item(i + 1).ForeColor

.DataField = adoRecordsetX.Fields.Item(i).Name '重新绑定字段

Select Case adoRecordsetX.Fields.Item(i).Type '可根据字段数据类型设置数据格式
Case adBigInt, adInteger, adSmallInt
.DataFormat.Format = "###,##0" '数字
.Alignment = rptJustifyRight
Case adBoolean
Set .DataFormat = bFmt '布尔型字段设为自定义格式
.Alignment = rptJustifyCenter
Case adCurrency
.DataFormat.Format = "###,##0.00" '货币
.Alignment = rptJustifyRight
Case adDate, adDBDate, adDBTimeStamp
.DataFormat.Format = "Long Date" '日期、时间
.Alignment = rptJustifyRight
Case Else '其它,如:文本等
.Alignment = rptJustifyLeft
End Select

' .BorderStyle = rptBSSolid '调试用
' .BorderColor = vbGreen '调试用
' .BackStyle = rptBkOpaque '调试用
' .BackColor = vbYellow '调试用


End With
Next i

DataReport1.Sections.Item("Section2").Height = 400
DataReport1.Sections.Item("Section1").Height = 400

'VB6 提供的控制方法不利于编程分别控制各类控件:
Debug.Print Me.Sections.Item("Section2").Controls.Item("Label1").Caption
End Sub

Private Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
adoConnectionX.Close

Set adoConnectionX = Nothing
Set adoRecordsetX = Nothing
End Sub
射天狼 2004-04-06
  • 打赏
  • 举报
回复
Option Explicit

Dim adoConnectionX As New ADODB.Connection
Dim adoRecordsetX As New ADODB.Recordset

Private Sub DataReport_Initialize()
'printer.Orientation =
'以下准备数据源(记录集)
'要打印的数据源(记录集)必须是一个全局级别的,或者是本设计器模块级别的记录集

'数据库使用的是 Northwind.mdb
adoConnectionX.Open "dsn=sybase;uid=sa;pwd=abcd1234" '"Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" & App.Path & "\Northwind.mdb"
adoRecordsetX.Open "select * from STUDENTCARD", adoConnectionX

Set DataReport1.DataSource = adoRecordsetX '设置 DataReport 的数据源

'-------------------------------------------------------------------------
'以下根据控件所在区域(Sections)和所属控件类别等将它们分成若干集合

Dim PHSec2_RptLbl_Collection As New Collection '页标头(PageHeader)区域 Label(RptLabel) 控件集合
Dim DSec1_RptLbl_Collection As New Collection '细节(Detail)区域 Label(RptLabel) 控件集合
Dim PFSec3_RptLbl_Collection As New Collection '页注脚(PageFooter)区域 Label(RptLabel) 控件

Dim PHSec2_RptShp_Collection As New Collection '页标头(PageHeader)区域 Shape(RptShape) 控件集合
Dim DSec1_RptShp_Collection As New Collection '细节(Detail)区域 Shape(RptShape) 控件集合
Dim PFSec3_RptShp_Collection As New Collection '页注脚(PageFooter)区域 Shape(RptShape) 控件集合

Dim DSec1_RptTxt_Collection As New Collection '细节(Detail)区域 TextBox(RptTextBox) 控件集合
'TextBox (RptTextBox) 控件只能绘制到细节(Detail)区域

Dim PHSec2_RptImg_Collection As New Collection '页标头(PageHeader)区域 Image(RptImage) 控件集合
Dim DSec1_RptImg_Collection As New Collection '细节(Detail)区域 Image(RptImage) 控件集合
Dim PFSec3_RptImg_Collection As New Collection '页注脚(PageFooter)区域 Image(RptImage) 控件集合

Dim PHSec2_RptLine_Collection As New Collection '页标头(PageHead)区域 Line(RptLine) 控件集合
Dim DSec1_RptLine_Collection As New Collection '细节(Detail)区域 Line(RptLine) 控件集合
Dim PFSec3_RptLine_Collection As New Collection '页注脚(PageFooter)区域 Line(RptLine) 控件集合

Dim Ctl 'As Object

For Each Ctl In DataReport1.Sections.Item("Section2").Controls 'Section2
Select Case TypeName(Ctl)
Case "RptLabel"
PHSec2_RptLbl_Collection.Add Ctl
Ctl.Caption = ""
Case "RptShape"
PHSec2_RptShp_Collection.Add Ctl
Case "RptLine"
PHSec2_RptLine_Collection.Add Ctl
Case "RptImage"
PHSec2_RptImg_Collection.Add Ctl
End Select
Ctl.Left = 0
Ctl.Top = 0
Ctl.Height = 300
Ctl.Width = (Rnd + 1) * 600
Ctl.Visible = False
Next Ctl

For Each Ctl In DataReport1.Sections.Item("Section1").Controls 'Section1
Select Case TypeName(Ctl)
Case "RptLabel"
DSec1_RptLbl_Collection.Add Ctl
Ctl.Caption = ""
Case "RptShape"
DSec1_RptShp_Collection.Add Ctl
Case "RptTextBox"
Ctl.DataField = adoRecordsetX.Fields.Item(0).Name '先将所有TextBox(RptTextBox) 控件绑定到某一字段
'否则报错!
DSec1_RptTxt_Collection.Add Ctl
Case "RptLine"
DSec1_RptLine_Collection.Add Ctl
Case "RptImage"
DSec1_RptImg_Collection.Add Ctl
End Select
Ctl.Left = 0
Ctl.Top = 0
Ctl.Height = 400
Ctl.Width = 600
Ctl.Visible = False
Next Ctl

For Each Ctl In DataReport1.Sections.Item("Section3").Controls 'Section3
Select Case TypeName(Ctl)
Case "RptLabel"
PFSec3_RptLbl_Collection.Add Ctl
Ctl.Caption = ""
Case "RptShape"
PFSec3_RptShp_Collection.Add Ctl
Case "RptLine"
PFSec3_RptLine_Collection.Add Ctl
Case "RptImage"
PFSec3_RptImg_Collection.Add Ctl
End Select
Ctl.Left = 0
Ctl.Top = 0
Ctl.Height = 400
Ctl.Width = (Rnd + 1) * 600
Ctl.Visible = False
Next Ctl
houfuzhu 2004-04-06
  • 打赏
  • 举报
回复
能不能贴个实例出来给小弟参考!参考!
小弟感激不尽
wumylove1234 2004-04-06
  • 打赏
  • 举报
回复
射天狼~
不差我一个,给俺发一个呗~
wumylove123@163.com
houfuzhu 2004-04-06
  • 打赏
  • 举报
回复
谢谢了,射天狼,现在没空,有空就来结贴,给分
射天狼 2004-04-06
  • 打赏
  • 举报
回复
已经发完了,接收吧!!
射天狼 2004-04-06
  • 打赏
  • 举报
回复
我发给你的是在我可以运行的例子里拷出来的,不好用,难道非得把工程文件发给你,真是晕!!!!!
houfuzhu 2004-04-06
  • 打赏
  • 举报
回复
以上的那些代码我试了怎么不行啊
各位大虾,能不能发个完整的实例给小弟
邮箱地址:houfuzhu@21cn.com
hwmys 2004-04-06
  • 打赏
  • 举报
回复
用datareport还是crystal报表?
都可实现动态(不受安装目录的影响)
wxrwan 2004-04-06
  • 打赏
  • 举报
回复
MARK
wumylove1234 2004-04-06
  • 打赏
  • 举报
回复
MARK!!!!!!!!!!
讲的真不错!
iiboy 2004-04-05
  • 打赏
  • 举报
回复
我认为如果用VB内带报表做的话,它所要输出的字段是不能改变的。
你可以先做一个数据连接,而且分配好报表格式,做一下预览,
然后,就可以在程序中更改查询字符串,重做查询就可以了,如果不是设计时的字段的话,你可以使用 [字段名] AS [别名] 的方法使用其变成原来设计报表时的字段名就行了

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧