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

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下运行通过。
2013年10个科技预测 三维打印技术将成主流 能省电99.96%:微软开发基于云的GPS技术 十个最有用的云数据库 开源产品系列:企业级Web框架web2py 让针对Webkit优化的网站兼容WP8 IE10 CMDN Club 24期:互联网产品的演进之路——从QQ谈互联网14年进化史 360安全浏览器发布“照妖镜”和“网站名片”功能 Windows Server 2012实用教程:添加Hyper-V管理器 为何Google弃置GCE和GAE选择AWS? 2012移动应用盘点:乱象丛生 最佳与奇葩共舞 从1976至2013大事记,看Android未来命运 c#经典入门视频001基础知识-苏坤老师主讲 c#经典入门视频002学习两句话-苏坤老师主讲 c#经典入门视频003基础知识-苏坤老师主讲 回顾HTML5这一年:在痛并快乐中前进 学Apple,微软宣布2013上半年零售店建设计划 真羡慕他们:谷歌宣布Gmail电话明年继续免费 c#经典入门视频004变量-苏坤老师主讲 c#经典入门视频005变量的使用和命名规则-苏坤老师主讲 c#经典入门视频006输出变量的值(及赋值符、连接符、占位符)-苏坤老师主讲 c#经典入门视频007变量交换_输入-苏坤老师主讲 回首JavaScript这一年:笑里藏刀 百媚丛生 平板优先:Supercell游戏公司日收入100万美元 Mootools实现具有排版功能的页面拖拽 2012:云计算的春天 直击Strata+Hadoop World:百万雄师过大江 能携带的网络 Anyfi 150万建网络虚拟热点 又将颠覆产业?传苹果正开发蓝牙智能手表 JavaScript社区开发者调查结果 欢乐淘、求PS大神获腾讯开放平台应用创新大赛年度金奖 2012是响应式设计之年 ASP中用ADO连接SQL Server2000的连接字符串怎么写? 在画布上怎么实现滚动条 急~~~如何从文件中取值赋给动态数组?~~~~在线等待 到哪里能够下载 BCB6 Update 请问关于REDHAT下关于安装MYSQL 的问题 请问关于REDHAT下关于安装MYSQL 的问题 CreateFolder("name") 问题 name是变量怎么办???? 急!!! 如何做像 http://www.my0807.com/1.gif 的文字。。 请教真正的高手。 如何用TURBOC 2.0编程检测WINDOWS是否已在运行中? VS.NET能专Windows98中安装吗? 如何创建一个imagelist,用CImageList,可以记录24位色的位图 这个关于树的问题我越想越想不通,请手指点指点:) 用winsock控件设置client/server程序时,server端应怎样设置,请各位大虾帮帮小弟!!谢了! 从MIDI文件转换成简谱的问题? 请问谁有高招??????? SOS ,谁能帮帮我? 如何在一个程序中得知另一个指定的程序是否运行? 很急!!请教高手,这样的思路是否正确?(数据库方面)内有非常详细的说明,谢谢!! 我是处学者 这个关于树的问题我越想越想不通,请手指点指点:) 50小分征集C++的类和VBS的类的区别? hg0001(CoolFish) ,分已给!请发给我! 电脑上的时钟在关机之后就停止走动,下次开机时仍是上次的时间,是怎么回事?请教大家! 如何使用 WRITEFILE 函数将二进制数据写入文件? 我装的是XP,JDK1.3,无法编译程序 电脑上的时钟在关机之后就停止走动,下次开机时仍是上次的时间,是怎么回事?请教大家! 如下的演示光盘要实现的功能用什么软件开发比较好一个新手完成要多长时间? windows如何实现禁用状态文字? 输入不回显 你没有权限删除贴子!!!奇怪 Tc 那为用的是win XP,请进! 我输入的PYTHON怎么编译不出来? 问一个很弱的问题 为什么我的工具栏成了这个样子 哪里有讲MFC的书,Linux下GCC的书? 到底是什么问题啊?昏~~~(一定给分) 若干问题,请解惑。。。。。。 我这里的局域网是用win2000+sygate共享上网的,如何设置才能禁止局域网中其他计算机上OICQ或聊天室之类的网站? 如何遍历select下拉菜单中的内容,并显示在另一个select菜单中? 如何编写文档? 同样的程序连接SQLServer为什么比Access慢了几十倍 sybase12.5 odbc 中文问题 谢谢吃素的狼,但好象没用(FOXBASE问题) 同样的程序连接SQLServer为什么比Access慢了几十倍 htm和html 有什么不同,哪一个好一些,cfm是什么类型的文件? 请问怎么写mciSendString的play,close,open等的参数?如果是想打开wav文件的话。。。 回复数老是不对 谁能给我发一个类似windows资源管理器的例子!及拥有treeview和listview的sdi! delphi的query为什么不能查询nvarchar和ntext的sqlserver数据 拼音yuan是由"y" "v" "an" 拼出还是由"y" "van"拼出? 四年级作文桥400个字 一个长方形改变形状平行四边形,周长(),面积() yuan的拼音分解开应该是y-u-an还是y-v-an 在3A+B=2C+D中已知30gA和10gB恰好完全反应,生成5gD,已知C的相对分子质量为70.求A的相对分子质量不要用摩尔来解. 我需要课文《飞夺泸定桥》的课文原文,请粘贴到这里. Have you got _____one yuan coin?填a还是an 已知反应3A+2B=2C+D,A、B两种物质完全反应时质量比为3:4,若生成C和D共140克,则该反应消耗B的质量为多少? 要全文!10分钟内拿来1 近似数是4.85的最小三位小数是什么 课文飞夺泸定桥 成语语文五年级11课飞夺泸定桥中所有的成语、其意思. ABCDE乘E等于EEEEEE,那么ABCDE分别代表什么?各位我在百度上找了.所以别找了,没有! 带yuan字读音的成语有哪些?yuan字读音要在最后一个字? 一台车床加工20个零件用一个小时 这样计算 加工8个零件要多少分钟一台车床加工20个零件用一个小时 这样计算 加工8个零件要多少分钟(用比例解) 拼音怎么读?要音调的 ( )地(读音:yuan) ( )认(读音:cheng) 飞夺泸定桥 课文 描写飞夺泸定桥的作文 中国姓氏中发音yuan的有什么?急用! 一台机床4小时加工了20个机器零件.照这样计算,再加工70个零件,共用多长时间?不用方程 《飞夺泸定桥》的写作目的是什么? YUAN为什么是整体读音我搞不懂YUAN为什么会是整体读音,如果YUAN是整体读音,那应该怎样拼读?都YAN的音吗?那还要那个U来干什么用呢?比如:演员两个字就应该读y-u-an yan才对的,难道是yan yan?类似 飞夺泸定桥找泸定桥的简介 ABB*C=DBBC推算出数字 拼音yuan,是整体认读音还是三拼音节? 汽车后的英文字母代表什么意思 如呆ABB*C+=DBBc那么A=()B=()c=()D=() 把一个平行四边形割补成一个长方形后,面积不变,周长( 请详细说明为什么 已知二次函数f(x)=a(x-0.5)²+25,且方程f(x)=0两根的立方和等于19,求这个二次函数的解析式. 用某台机床加工一批机器零件,每小时加工的数量和所需的加工时间的关系如下表每小时加工的数量15 20 25 30 40 60加工时间80 60 48 40 30 20从表上可以看出,( ) 和 ( ) 是两种相关联的量,因为 一个平行四边形拉成一个长方形(周长不变),他的面积是比原来小还是大还是相等? 无形的桥400字作文 从机床每小时加工零件的个数,加工的时间和零件总数这三个量中,你能找出那几种比例关系? 免疫组化具体过程及细胞爬片 关于桥的想象作文400字~350字 英语以下字母所代表的含义:1.UK 2.USA 3.SARS 4.NBA 5.PLA 6.PRC 7.PC 8.HK 9.VOA 10.IOC 11.KFC 12.AIDS 13.FIFA 14.DNA 15.IQ 16.PE 17.VIP 18.DDD 19.IT 20.RMB 21.EMS 22.ID 23.CCP 24.WTO 25.MTV 26.CAAC 27.P 请依次回答,写出题号, 把一个平行四边形割补成一个长方形面积不变周长怎么样.还有一道;一个三角形的底是20分米高是1米它的面积是 yuan属于三拼音节还是属于整体认读音节 拼音怎么标声调?我有些忘了 在免疫组化SABC法中,DAB显色是做什么用的?为什么用?原理是什么?DAB试剂盒是做什么用的?我是初学者,可能问题有点白痴,谢谢大家了 整体认读音节yuan是三拼音节吗 拼音标声调方法 免疫组化步骤设计我初次做免疫组化,过程不太熟悉,请问谁可以给我说下具体的步骤?我的实验是检测小鼠胰岛素,一抗是兔抗小鼠抗体,二抗是荧光标记的羊抗兔抗体, yuan是整体认读音节吗我感觉 yuan 好像不是整体认读音节吧,你看:y u an 可是为什么是整体认读音节呢? 怎么标拼音声调? 谁能帮我详细介绍一个免疫荧光免疫组化的原理还有几本过程? yuan是整体认读音节,那它也是三拼音节吗 拼音的声调符号是怎么标上去的? 为什么要做免疫组化检查,免疫组化用于检查 yuan是整体认读音节吗?是三拼音节吗? 将一个平行四边形拉成一个长方形,它的周长和面积发生了什么变化? 写桥的作文四年级 quan和yuan是三拼音节吗? 概括飞夺泸定桥的主要内容. 四年级写桥的作文 有什么英文名的发音跟汉语拼音的Liu yuan yuan 相近. 汉语拼音的声调怎么读与对应的怎么写 把一个长方形拉成一个平行四边形.这时面积和周长都变了吗? yuan是三拼音节吗 电子的子字汉语拼音读哪种声调
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘