说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB通用数据表格输出程序的设计

HTML文档下载 WORD文档下载 PDF文档下载
VB通用数据表格输出程序的设计
淮北市社会保障局计算中心
沙顺义
---- 做为一种简捷、系统的 Windows应用程序开发工具,Visual Basic 5 具有强大的数据处理能力,提供了多种数据访问方法,可以方便地存取Microsoft SQL Server、Oracle、XBase等多种数据库,被广泛应用于建立各种信息管理系统。但是,VB缺乏足够的、符合中文习惯的数据表格输出功能。虽然使用Crystal Report控件及 Crystal Reports程序可以输出报表,但操作很麻烦,中文处理能力也不理想,特别是不能够用来制作不确定内容的表格。笔者在用VB开发淮北市医疗保险信息管理系统时,需要对任意的查询结果进行表格输出,为此,编制了一个通用的数据表格输出控件,能够根据查询的结果自动生成二维中文表格,并打印输出,在此介绍给大家,共同探讨。

一.VB 5中的结果集
---- VB 5提供的数据访问方法有数据询问对象(DAO)、Data控件、远程数据对象(RDO)、RemoteData控件 (RDC)、ODBC API、VB SQL等,其中ODBC API比较复杂,开发、调试和支持非常困难;VB SQL是针对Microsoft SQL Server的,这两种方法使用的比较少,这里不做讨论。比较常用的方法是DAO、Data控件、RDO、RDC,其中DAO和Data控件使用的结果集 (又叫纪录集) 包含在Recordset对象中,RDO和RDC使用的结果集包含在rdoResultset对象中。通用表格输出的实现方法就是根据任意的Recordset对象或rdoResultset对象自动生成表格并输出。
二.表格的自动生成
---- 1. Recordset对象
---- 下面以Data控件为例,介绍 Recordset对象的表格自动生成方法。

---- 假设有Data控件名称为MyData,首先说明相关的内容及用法:

---- (1) Data控件的结果集包含在它的 Recordset对象中,引用方法为: MyData.Recordset。

---- (2) Recordset 对象的 RecordCount属性为结果集的行数,它决定了表格的长度,该属性引用方法为: MyData.Recordset.RecordCount。

---- (3) Recordset 对象包含一个Fields集合,通过Fields集合的 Count属性可以得到结果集中字段的个数,用做表格的列数,该属性引用方法为: MyData.Recordset.Fields.Count。

---- (4) Fields集合包括结果集合全部 Field对象,这些 Field对象引用方法为: MyData.Recordset.Fields(i),其中 i是该 Field对象在中的位置序号,从 0开始计数。

---- (5) Field 对象的Name属性是该字段的名称,用做表格对应列的名称,引用方法为:MyData.Recordset.Fields(i).Name。

---- (6) Field 对象的Size属性是该字段数据的最大尺寸,引用方法为:MyData.Recordset.Fields(i).Size。

---- (7) Field 对象的Type属性是该字段数据的类型,引用方法为:MyData.Recordset.Fields(i).Type。

---- 用Field 对象的Size和Type属性可以计算出表格对应列的宽度。

---- (8) Field 对象的 Value属性是该字段的值,这是表格对应列的内容,引用方法为:MyData.Recordset.Fields(i).Value。

---- 以上引用在VB中都可有多种引用方法,这里使用的是比较明了的一种,便于说明问题。

---- 表格的自动生成可分为两个步骤:

---- 第一步,根据结果集中各字段的Size和Type属性,生成表格各对应列的宽度,用Format函数使用的格式字符串表示。

---- 下面的 Function getFmt()用来生成表格各列的格式字符串,调用时把Field 对象的Type和Size属性值分别赋给形式参数intType和logSize。

Private Function getFmt(intType As Integer,
logSize As Long) As String
Dim i As Integer
getFmt = ""
'返回的结果串初始置空
Select Case intType
Case dbBoolean
getFmt = getFmt & "\ \ \ \0;\ \ \ \1"
'Boolean 型值转换为0、1,
Case dbByte
getFmt = "@@@@"
Case dbInteger
getFmt = "@@@@@@"
Case dbLong
getFmt = "@@@@@@@@@@"
Case dbCurrency
getFmt = "@@@@@@@@@@"
Case dbSingle
getFmt = "@@@@@@@@@@"
Case dbDouble
getFmt = "@@@@@@@@@@"
Case dbDate
getFmt = "@@@@@@@@@@"
Case dbBinary
getFmt = "@@@@"
Case dbText
If logSize >= 40 Then
'限制一列最多打印40个半角字符
getFmt = "@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@"
Else
For i = 0 To CInt(logSize / 2) * 2 - 1
getFmt = getFmt & "@"
Next '调整数值长度为偶数,
以适应汉字制表符
End If
Case dbLongBinary
getFmt = "@@@@"
Case dbMemo
getFmt = "@@@@@@@@@@@@@@@@"
Case dbGUID
getFmt = "@@@@"
Case dbBigInt
getFmt = "@@@@@@@@@@"
Case dbVarBinary
getFmt = "@@@@"
Case dbChar
For i = 0 To CInt(logSize / 2) * 2 - 1
getFmt = getFmt & "@"
Next
Case dbNumeric
For i = 0 To CInt(logSize / 2) * 2 - 1
getFmt = getFmt & "@"
Next
Case dbDecimal
For i = 0 To CInt(logSize / 2) * 2 - 1
getFmt = getFmt & "@"
Next
Case dbFloat
getFmt = "@@@@@@@@@@"
Case dbTime
getFmt = "@@@@@@@@"
Case dbTimeStamp
getFmt = "@@@@@@@@@@"
End Select
End Function
---- 第二步,取结果集的内容并根据各列的格式字符串生成表格,生成的表格存放在字符串数组 strDy()中,下面用Sub Dy()例示这一步骤。
Dim strDy() As String
'存放格式化后的表格内容
Dim Fmt() As String
'存放表格各列的格式字符串
'以上二个数组变量的元素个数根
据结果集的行数和列数在程序中设定
Dim str,str0,str1,str2 As String
'临时使用的串变量
Dim i,j As Integer
'临时使用的整型变量
Dim intDc As Integer '存放表格行数,
实际上即是strDy()的元素个数

Private Sub Dy()
With MyData.Recordset
.MoveLast
ReDim strDy(.RecordCount + 8)
'需存放标题、表框等,所以加8
ReDim Fmt(.Fields.Count)
For i = 0 To .RecordCount + 7
strDy(i) = "" '初始置空
Next
For i = 0 To .Fields.Count - 1
Fmt(i) = getFmt(.Fields(i).Type, .Fields(i).Size)
'生成表格各列的格式字符串
j = Len(.Fields(i).Name)
If j > Len(Fmt(i)) Then
Fmt(i) = String$(Int((j / 2) + 0.5) * 2, "@")
'标题 (字段名) 字多则增大列宽
End If
Next
str = "┃"
str0 = "┏"
str1 = "┠"
str2 = "┗" '设定表格为粗框细线,
可根据需要改变
For i = 0 To .Fields.Count - 1
For j = 1 To Len(Fmt(i)) / 2
str0 = str0 & "━"
str1 = str1 & "─"
str2 = str2 & "━"
Next
If (i = .Fields.Count - 1) Then
str = str & Format(.Fields(i).Name, Fmt(i)) & "┃"
Else
str = str & Format(.Fields(i).Name, Fmt(i)) & "│"
End If
If (i = .Fields.Count - 1) Then
str0 = str0 & "┓"
str1 = str1 & "┨"
str2 = str2 & "┛"
Else
str0 = str0 & "┯"
str1 = str1 & "┼"
str2 = str2 & "┷"
End If
Next
strDy(0) = "表格标题"
'通过在标题前增加空格可使标题居中
strDy(1) = ""
strDy(2) = Format(Now, " 打印日期:
yyyy年 m月 d日")
strDy(3) = str0
strDy(4) = str
strDy(5) = str1
intDc = 6
.MoveFirst
Do While Not .EOF
str = "┃"
For i = 0 To .Fields.Count - 1
If IsNull(.Fields(i).Value) Then
'处理 Null 值
If i = .Fields.Count - 1 Then
str = str & Format(" ", Fmt(i)) & "┃"
Else
str = str & Format(" ", Fmt(i)) & "│"
End If
Else
If i = .Fields.Count - 1 Then
str = str & Format(Left$(.Fields(i).
Value, Len(Fmt(i))), Fmt(i)) & "┃"
Else
str = str & Format(Left$(.Fields(i).
Value, Len(Fmt(i))), Fmt(i)) & "│"
End If
End If
Next
strDy(intDc) = strDy(intDc) & str
intDc = intDc + 1
.MoveNext
Loop
strDy(intDc) = str2
End With
End Sub
---- 在实际编程中还要排除二进制数据字段,全角与半角字符的匹配调整,处理数据中出现的换行符、回车符、制表符,等等,限于篇幅,这里不于介绍。
---- 2.rdoResultset对象

---- rdoResultset对象的表格自动生成方法与Recordset对象的方法相似,在处理过程中把Recordset对象的RecordCount属性用rdoResultset对象的RowCount属性替换,Fields集合用rdoColumns替换,Field对象用rdoColumn替换,其余相同。例如:

---- 引用Data控件MyData结果集中第三个字段的名称用:MyData.Recordset.Fields(3).Name。

---- 引用RDC控件MyRDC相应字段的名称用: MyRDC.Resultset.rdoColumns(3).Name。

三.表格的输出
---- 表格的输出包括二个部分,一是屏幕预览,二是打印机输出。屏幕预览是把存放在数组中的表格通过在PictureBox控件上调用 Print方法显示出来而实现的。打印输出是把同样的内容通过 Printer对象的 Print方法实现的。下面例示打印机输出的实现方法:
Printer.Font.Name = "黑体"
'设置标题字体
Printer.Font.Size = 18
'设置标题字体大小
Printer.Print strDy(0)
'打印标题
Printer.Print strDy(1)
'打印空行
Printer.Font.Name = "楷体_GB2312"
'设置日期字体
Printer.Font.Size = 16
'设置日期字体大小
Printer.Print strDy(2)
'打印日期
Printer.Font.Name = "宋体"
'设置表格字体
Printer.Font.Size = 11
'设置表格字体大小
Printer.Print strDy(3)
'以下打印表格内容
Printer.Print strDy(4)
For i = 6 To intDc
If i < intDc Then
Printer.Print strDy(5)
Printer.Print strDy(i)
Else
Printer.Print strDy(i) '表尾
End If
Next
Printer.EndDoc
'打印完成

---- 该控件在中文Windows 95、VB 5下运行通过。
用Delphi实现自定义颜色对话框及其构件 用DEPHI 3.0实现动画ABOUT窗口-Delphi资料 用鼠标拖动无标题窗口-Delphi资料 在Delphi编程中创建一个启动闪现窗口 在form中想用enter来代替tab,请问如何实现?-Delphi资料 在Listboxes中加背景图-Delphi资料 在Window右下角的添加图标-Delphi资料 在程序中使用自定义的鼠标-Delphi资料 怎样建立简单的任务栏应用程序-Delphi资料 增强DelphiTStatusBar控制 制作Delphi的竖排标签 自适应表单的实现-Delphi资料 COM/DCOM的区别与联系-Delphi资料 CoolBar上控件的排列顺序-Delphi资料 Delphi 4 WebBroker Delphi 中自做动态显示的控件 Delphi3的DBGrid中的下拉列表和查找字段编程方法 DELPHI常见问题 Delphi的竖排标签 DELPHI构件制作方法 DELPHI控件Tweblabel的编制 DELPHI中MEMO组件的光标定位 Delphi中RichEdit的奥妙 Delphi中TApplication类 Delphi中日期时间输入的简洁方法 delphi中怎么调用interbase数据库? Memo的Undo功能-Delphi资料 RECT在Delphi中的灵活使用 StringGrid制作只读列-Delphi资料 TADOQuery下主明细表其属性关系如何设置,如何保存主表和明细表?-Delphi资料 TBatchMove用法-Delphi资料 软件发布:绿幽灵高速多功能浏览器 软件发布:辟邪脸谱 软件发布:邮件群发机 软件发布:拯救地球 软件发布:九城的修行器 软件发布:龙飞定时器 软件发布:加密vfp的exe,防止反编译 软件发布:“破解注册表编辑器” 软件发布:神奇注册表 软件发布:CDWizard(光驱精灵.NET) 软件发布:神通 2001 豪华版 软件发布:VB6历史文件清理器 菜单问题!!送分哟! 请问PB7.0中,Freeform格式的数据窗口中,为何按滚动条,数据不是滚动到第一页就是最后一页?如何实现自由滚动? B/S结构用何东东编最快? 关于mpeg-4 请问各位大虾:CBitmap对象如何写入一个BMP文件? 对面的大哥看过来!高分征解有关SetWindowPos的问题。 如何刷新文件内容的缓冲? 昨天一夜星际~~~后 一个捉摸的问题,、高分请解决! 在WEBLOGIC5.1上发布EJB1.1的一个小问题 请教,如何用jbuilder 写midas的服务器, 我们公司一个程序员的头式太难看了,我每次见他就恨不得拿剃头的推子给他剃光光! 寻最好的ftp软件 autoCAD的问题 找本站里面《程序员测试软件》的注册码 刚毕业的不能报? .lib 文件到底是怎么回事?如何查看它的内容? 请问,下面的警告提示什么意思(关于sybase) 那位可以给我描述一下“代表”? 请问有WINsock编程高手么,帮我看一下下面的程序 紧急招聘PB程序员(成都) 关于产品序列号的问题……想了很久了。 这里有几个问题,能者请进! 请教VC项目开发经验 如何让下载的程序变成免费的? 请问有Pdf到Text的转化的源代码么? 能否让下载的程序变成免费的? 请问怎样才能自动复制文本框中的文本到剪贴板? 是否可用简体中文的VB开发翻体中文的应用程序? 使用JavaMail转发邮件 在servlet中是不是不可以引用其它的类中的函数.(这个类不是派生于HttpServlet) 为什么买书配送的光盘文件在BCB工程中打开后不让修改(打开前已转换为存档文件了)? 请教使用OPEN CLIENT 的一个小问题 索求算法 请问能否将下载的程序变成免费的? 现在学习C#不晚吧,:P 关于VB中控制运行实例的问题 请教关于DBGRid的问题。 请问在Java下如何实现文件压缩?有没有现成的接口或者压缩算法代码?多谢 小丽计划三天看完一本280页的书,第一天看了全书的七分之二,第二天看了第一天的五分之三,第三天小丽应从第 王大伯家购进2分之1吨煤,第一天用去总数的4分之1,第二天用去总数的5分之1,剩下的占总数的几分之几? 王师傅加工一批零件,第一天加工了44个,第二天加工总数8分之3,这时两天已加工的零件个数与未加工的零件个数比13:7,这批零件一共有多少个?算术解 小丽看一本书,三天看完.第一天看全书的18分之7,第二天看了全书的9分之4.第三天看了全书的几分之几 有7/8吨煤,第一天用去1/3,第二天用去2/5,还剩下几分之几?1-(1/3+2/5)=4/15对吗? 李师傅加工一批零件,第一天加工了全部零件的三分之一,第二天加工了15个零件,两天已加工的零件盒剩下加工的零件个数比是1:1,这批零件一共有多少个? 小丽计划三天看完一本书,第一天看了全书的7分之2,第二天看了全书的5分之3.如果她第三天实际看了16页那么第一天看了多少页? 张师傅加工一批零件第一天完成了总数的15分之7第二天比第一天多加工了18个这批零一共多少个 王师傅加工一批零件,第一天完成这批零件的25% 第二天完成了35%,还剩360个零件没加工.问这批零件共有多少个? 小丽计划三天看完一本书,第一天看了全书的7分之2,第二天看了第一天的5分之4,那么小丽前两天看了全书的几分之几?第三天小丽应看完全书的几分之几? 秦师父两天加工完一批零件,第一天完成了总数的十五分之七,第二天比第一天多加工了18个.这批零件有多少个 车间要生产一批零件,第一天完成总量的1/4,第二天350个,剩下的与已做的比是2:3,共有零件多少 有一本故事书90页,小林计划18天读完,平均每天看这本书的几分之几? 王师傅加工一批零件,第一天完成的个数是未完成个数的2分之1,如果再加工240个,就可以成这批零件的50%,这批零件有多少个 某车间生产一批零件,第一天完成总数的3/1,第二天做了400个,这时剩下的零件与做的零件的个数的比是2比3这批零件有多少个? 一本300页的故事书,小华计划30天看完,那么他6天能看这本书的几分之几 王师傅加工一批零件,第一天加工了总数的5分之1,第二天加工总数的15分之2,还剩下160个,这批零件共有多 某车间做一批机器零件,8天做了360个,还剩下3/11,照这样计算,剩下的还要几天完成? 小宁看一本书故事书,9天看了这本书的一半.照这样的速度,他6天看了这本书的几分之几?.我家小学生用我的百度号问的.我现在才知道.无语了, 王师傅加工一批零件 第一天加工了总数的3分之1,第二天加工的个数是第一天的2分之1第二天加工了总数的几分之几? 王师傅要加工360个零件,第一天加工了6分之1,根据算式补充条件(1) 360×6分之1【 】?(2)360×(6分之1+10分之3)【 】?(3)360×(10分之3-6分之1)【 小明15天看完一本故事书,平均每天看这本书的几分之几?4天呢?6天呢? 王师傅加工一批零件,第一天完成总数的1/4又7第二天完成余下的2/5多2个,还剩全部的5/18,共多少零件? 王师傅接了加工360个零件的任务,第1天完成任务的9分之1,第2天完成啦18%.第2天加工啦多少. 小强看完一本故事书要6天时间,平均每天看几分之几?3天看几分之几?5天呢? 王师傅加工一批零件 第一天完成总数的1/4又7第二天完成余下的2/5多2个,还剩19个,共多少零件? 王师傅计划加工360个零件,结果第一天完成了任务的6分之1,第二天完成的是第一天的3分之2,还有多少个零件没有完成? 一本150页发故事书,第一天读了五分之二,第二天读了余下的三分之一.第二天读了多少页? 加工一批零件,第一天完成总数的的1/4多7个、第二天完成余下的2/5多2个,还剩全部的5/18,共多少零件? 刘师傅要加工360个零件,第一天加工了总数的20%,第2天又加工了总数的30%.还剩下多少个 一本故事书,第一天看了总页数的3分之一,第2天看了总页数的4分只一,这本故事书共有多少页? 李师傅加工一批零件,第一天加工了总数的四分之一,第二天比第一天多加工20个,还剩下100个没有加工,这批零件共有多少个 方程解 小王加工360个零件,其中有4个不合格,合格的零件占加工零件总数的几分之几? 一本故事书240页,小华4天看了全书的3分之2,他平均每天看多少页 某车间加工一批零件,第一天加工225个,占总数的3/10,第二天加工的是第一天的4/5还有多少个零件没加工? 计划生产1800个零件,第一天生产了计划的1/4,第二天生产了计划的1/6.还剩下计划的几分之几没生产?还剩下多少个没生产? 小丽,计划四天看完一本书,第一天看了全书的2/9第二天看了全书的25%,第三天看了全书的1/6.第四天应看完书的几分之几?②若小丽第三天看了16页,那么第二天看了多少页? 一本168页的故事书,小华4天读了96页.照这样计算,小华读完这本书一共需要多少天?急 某工厂加工一批零件,第一天加工了总数的20%,第二天比第一天多加工了120个?问他在下面某工厂加工一批零件,第一天加工了总数的20%,第二天比第一天多加工了120个,第三天加工的零件相当于前 小丽看一本书120页,第一天看了它的六分之一,第二天看了全书的六分之五少15页,第三天应从第几页开始看 小明看一本120页的故事书,每天看十分之一,已经看了3天,还有几分之几没有看? 工厂加工一批零件,第一天加工总数的20%,第二天比第一天多加工120个,第三天加工的相当于前两天的和,这时还剩下100个没加工.这批零件一共有多少个?请列出详细算式.歇歇. 小丽看一本书,第一天看了全书的8分之1再加16页,第二天看了全书的6分之1少2页,第三天看完余下的88页.请问这本书有多少页?不要给我列方程做! 小明看一本120页的故事书,每天看十分之一,已经看了3天,还有几分之几没看?还有多少页没看? 1.某工厂加工一批零件,第一天加工了总数的20%,第二天比第一天多加工了120个,第三天加工的零件数相当于天两天加工个数的总和,这时还剩下100个没加工.这批零件一共有多少个? 一本故事书有320页,小丽的一天看了8分之3,第二天看了5分之1.第三天应从第几页开始看. 小东看一本故事书120页每天看十分之一已经看了3天还有几分之几没看 雷锋车间三天生产了一批零件,第一天生产了总数的七分之二,第二天比第一天多生产了十五个,第三天生产了六十个,这批零件共有多少个? 一本故事书有120页,小丽第一天读了全书的1/6,第二天读了余下的1/4,第三天应从第几页读起?求.大哥大姐们 小明看一本120页的故事书,每天看1/10,已经看了3天,还有几分之几没有看? 某工厂加工一批零件第一天完成了零件总数的三分之一多24件,第二天完成了零件总数的三分之1少12件,第3天完成了剩下的60件,求这批零件的总数.用设x的方程 小丽读一本故事书,第一天读了全书的1/12还多18页,第二天读了全书的1/5少5页这时还剩下73页.这本故事书共有多少页? 一本本故事书,小飞每天看100页.他每天看这本书的几分之几?四天呢? 某工厂加工一批零件第一天完成了零件总数的三分之一多24件,第二天完成了零件总数的三分之1少12第3天完成了剩下的64件,求这批零件的总数.用方程 小丽看一本故事书,第一天看了20%,第二天看了剩下的30%,还剩112页,全书共多少页 一本100页的故事书,小飞,每天看20页.他每天看这本书的几分之几?四天呢? 某工厂加工一批零件,第一天完成总零件数的1三分之一又25件,第二天完成的是剩下零件数的三分之二少12件第三天完成了剩下的64件,求总数 小丽读一本书,第一天读了全书的六分之一,第二天读了全书的四分之一,第三天她正好应从第151页读起,这本书有多少页? 一本故事书,小飞要10天看完,前4天每天看书20页,后6天每天看25页,这本书有多少页 某工厂加工一批零件第一天完成了零件总数的三分之一多24件,第二天完成了零件总数的三分之1少12件,第3天完成了剩下的60件,求这批零件的总数.用设x的方程
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn