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

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下运行通过。
流程在企业内的作用及成熟度 Gartner:至2017年Chromebook销量将增2倍 后稀缺时代思考:机器横行下的人类夹缝求生 TIOBE 2014年8月编程语言排行榜:Swift跌出Top 20 精华回顾!历届MDCC大会精彩演讲与议程汇总 《近匠》Fancy3D:亿级游戏背后的轻量级引擎 假如李小龙是程序员…… Docker已扎根新一代PaaS 三星或发布首款头戴式VR设备Project Moonlight 英特尔亚太研发总经理何京翔:数据化时代背后的智慧 云络网络科技CEO Steve Mushero:游戏行业的云运维 腾讯游戏运营管理中心总监刘栖铜:腾讯游戏云的理想与实践 一号专车产品总监曹景辉:LBS应用仍有无限的创新空间 昆仑游戏总裁张益豪:做好中国游戏的海外代理 游族首席运营官陈礼标:重点打造全球化IP 我是怎么利用微信月收入三万以上的! 我的Y Combinator黑客马拉松之感! 最炫HTML5 JavaScript框架Famo.us融资2500万美元 看板先驱David J. Anderson:看板方法拉动互联网时代敏捷变革 《近匠》增强现实开发团队LegendTech:AR技术现已加入15元豪华午餐 微软新技术:简单修改,手机摄像头摇身变3D深度相机 Black Hat USA安全隐患盘点及黑客奥斯卡颁奖 MDCC免费展位报名火热!数量有限,征集进行中 迪游信息科技CEO张晓雷:中日游戏面面观 百余款智能电视创意类应用参赛角逐 Top13 App新鲜出炉! 微信公众平台开发——如何保证access_token长期有效? 拼的就是速度!超快HTML5 2D渲染引擎Pixi.js 一周消息树:百度“涉黄”遭警告,网盘内容审核的四种方式 微信开发商现状调查:接口限制成主要困扰 行业需求多样是最大难点 小米:海外扩张需谨慎,信息安全或成最大掣肘 AMD FX系荣耀归来 或成大众新宠! 驳“学习JAVA钱途无量”的说法 在线等:如何防止C#应用程序第二个实例被启动? 请问谁有ActiveSkinV4.3(或者4V.2)的破解版?50分相赠~! 新手请教 用RMAN备份数据到磁带出错!!解决问题一定给分!!江湖救急啊!! 搞不明白的vc错误,气死我了,请高手指点。。。 上不了网 动态调用DLL是出现的问题,棘手中,待解决。 我要对Spreadsheet的数据进行排序,用javascript怎么写 200分求<构建Web解决方案---应用ASP.NET和ADO.NET>电子书,不是只有源码的,谢谢 用DECS连接AS/400数据库问题 GD网站大家一起随便贴 寻人启事:我有一个侄子,网名叫穿越沦陷的爱,经常跑到这个版块来玩,谁看见了他,让他来找我,急事! 请教高手!!利用二进制文件转换成文本文件进行加密,实现理论是什么? IP包过滤程序问题!!!请大虾帮忙!! sql loader里面不支持FILLER 双系统中,如何删除WIN2000?(98+2000) 实现了第一个愿望... vc和vc.net有什么区别,学了vc有必要学vc.net吗??? 急,数据库表的问题!!! 为什么在Run ActivX程序时出现问题? DLL窗体关闭问题 setfont设置Dialog字体无效,搞不明白,大侠指点 为什么我的Web应用程序项目启动不了,总是出现错误!!! 100分求教jtable问题??? 菜鸟送分问题,请哪位大侠讲讲Inte1.ResponseCode和Inte1.ResponseInfo 声音变了!怎么办啊??? 100分 请问怎么做“索引”? make求救 用ant编译pet store 时,出现问题,提示信息见内文?请帮忙。。。高分酬谢。 三个三角了 开心ing 散分 tmd,上了vsnet2003贼船了。原来vc6的都不好用了 找在linux下免费gui?? 打开窗口获取原窗口信息的问题 Cbuilder安装问题,急! HelloWorld大全[接龙] 我要写一个程序在前台不需要运行后台运行可以:就像平时邮件服务品一样在前台不需要运行,而后台是提供服务的,要怎样来实现 临时表问题 多媒体教学系统开发 jbuilder中关于类的import问题? 有关远程控制的,例如抓屏,限制功能键,限制alt+f4,等等,请去http://hedaofeng.jahee.com 如何取得IE地址栏的输入信息? 急求一段ASP与SQLserver2000处理代码! 怎么创建win32 static library并输出函数?谢谢 !!!!求排列组合的简洁算法(80分) 我要对Spreadsheet的数据进行排序,用javascript怎么写 WIN32异常求救????!!!!!! 一个有深度的问题(对信号量操作不熟者请勿进) 知道为什么会出现iocopyout_chksum吗? 谁能给我《中文ACCESS开发指导手册》?? 从网上下的读不了 请问一个小问题 请问图中是什么鱼啊~海里的鱼RT 如图,一艘船以每小时30海里 如图,某海域直径为30海里的暗礁区中心有一哨所A,值班人员发现,有一轮船从哨所正西方向90海里的B处向哨所驶来.哨所及时向轮船发出了危险信号,但轮船没有收到信号,又继续前进了15海里到 用坚毅、奇异、翻滚、燃烧、渲染、蔓延、毫不犹豫、恍然大悟、居然、与其.不如.造句.不得超过200字,用词准确,句子通顺,意思连贯、有一个中心 词语写话:坚毅 奇异 翻滚 燃烧 渲染 蔓延 毫不犹豫 恍然大悟 居然 与其…不如… 一个中心 不要超过200字 用下列词语编写一段话 坚毅,奇异,翻滚,燃烧.渲染.蔓延,毫不犹豫,恍然大悟,居然 与其.不 let's go and get some f____ water there is something wrong with the l____ .i can't hear you 填空 the police are looking for the bad man in many a____ of the city.the box is too heavy .i can't m_____ it.you can go to a r_____ to have some nice food 哪个国家的英文简称是“PUR”? 仰天大笑出门去 我辈岂是蓬蒿人的意思就这一句话的意思,别的不要, quattro是什么意思 붉은 노을 梅德韦杰夫访华是否标志中俄经济对话新中印战略合作伙伴关系未来发展愿景的联必和必拓调高2014财年铁矿石产量四岁姐姐打开浴缸水龙头 意外将两岁弟澳洲青睐中国游客 维多利亚州长在沪“天津狗不理与新加坡企业合作拓展亚太市意总理会见美国务卿 要求解释监听意通租客伪造房产证卖房 新\"房东\"不菲总统再称菲政府不会就香港人质事件致意总理会见美国务卿 要求解释监听意通韩国政府敦促日方删除主张争议岛屿主权印度总理辛格在中共中央党校发表演讲省教育厅制定“三年计划” 建成100渝黔铁路息烽段全面开展作业贵阳市动物疫病防治规划通过专家论证贵阳至毕节论证城际轨道交通清镇市招聘100名卫生工作者取消药品加成摆摊大姐追到火车站寻失主能否上中甲 就看这一战无标题一个大社区13个出入口,10000多都市剩者为王秀色农家忠犬夫君重生妻星际药剂师农门香校园巨孽市井小记魅影修罗变末日重生之爱上你上仙师徒的任性无限我的竹马是男配金林水乡旅游会同村旅游共乐园旅游叠石旅游银坑旅游联邦空中花园旅游国御温泉度假小镇旅游国御温泉旅游黑湖旅游五星街天主教堂旅游杜巴广场旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘