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

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下运行通过。
《近匠》有了APM,用户快到碗里来——专访听云CTO Wood 联通WO+梦工厂唐敏:走进厦门 构建移动数字生态 HTML5 VS 原生,世界究竟是谁的? 完全开放 微软开源.NET Core的执行引擎CoreCLR Swift与Objective-C的兼容“黑魔法”:@objc和Dynamic 网络技术,从“数制”开始学起——跟随王达老师一步步学习 UPYUN CTO黄慧攀:UPYUN这些年,一段“刚好”的旅程 2015移动游戏重中之重:需成功把握1%付费用户的心 UNITE 2015 BEIJING 20大议题首爆 死路一条?智能硬件免费没有未来 APICloud推出“模块 Store” 公布APP创业 “Time to Market”战略 极路由加入海尔U+联盟 可跨品牌控制多款家居设备 《近匠》Amaze UI:做最懂中国程序员的开源HTML5框架 Testin CTO徐琨:要做测试领域的阿里云! TIOBE 2015年2月编程语言排行榜:JavaScript排名达历史最高点 机智云发布第二代GoKit开发板,兼容Arduino与Intel Edison 计算机视觉,让冰冷的机器看懂这个多彩的世界 昔日学霸反哺教育 打造教育领域今日头条 第三方DevOps实践报告发布 84%中国企业预将受益 《程序员必读之软件架构》作者Simon Brown:架构师与程序员的区别 Xcode 6.3 Beta发布,Swift 1.2带来哪些新变化? 应用生与死:移动测试究竟该怎么搞? Chrome将跟SPDY说再见,拥抱HTTP/2 ImageNet挑战赛中超越人类的计算机视觉系统 微软发布首款Android可穿戴设备人工智能产品 红包大战!双11过后,微信支付宝的又一个营销游戏 O2O大潮来袭,洗牌将至? 谈谈UI架构设计的演化 Node.js 开源基金会成立,Joyent让出领导权 LinkedIn分布式实时性能跟踪与效率优化实例 DIY机器人不是事!软硬两不误的开发平台RoboCORE 怎样让在运行时加载的控件总在最前面?? 代码转换 linux + mysql+ apache + php + jdk + jsdk 怎样让在运行时加载的控件总在最前面?? 代码转换 一个关于全局变量的访问问题。 263游戏大厅里的用户信息列表是怎么实现的?急问,多谢!! 也帮帮我吧!i'll be dead ! 263游戏大厅里的用户信息列表是怎么实现的?急问,多谢!! 关于窗体 如何去掉我的“计划任务”共享? linux + mysql + apache + php + jdk + jsdk 新手问各位大哥一个问题:我在机器上已经安装了98,2000,现在有装了红帽7.2,已经安装成功,但是在LOGIN之后,有开始GNOME之后,什么都 菜鸟问题,请多帮忙 window 2000 server服务器,不能使用mail函数,怎么解决!?急!! 我靠!我今天算碰到一个希奇事!你们听听这个网址! 关于鼠标右键菜单的制作问题 SOS!100分相送。很简单的题目,明天考试急用 请问oracle中的帮助导航器、帮助主题窗口是在哪里啊 重要问题!!!请尽快回复。 证券之星最新版本有没有破解版啊,我在证券之星下载的多是只能用三天 各位老大,有谁知道怎样边接收网络传送的音频流边播放 System.in的问题 为什么listbox.selectIndex返回的值总是-1??? masm611装好后不能DEBUG,怎么回事啊???????? 挥泪放出两百分。为了实行打击报负不得不放点血了。来者有分。大家要涌跃发言。快快回答,正确就结贴。 dll的问题和语言混编 今天买了双新皮鞋,感觉不错。散分。 《微型计算机技术》问题 放分!!!:使用C++多年的老手,一定要看过来,看看我们对C有多了解 怎么让listbox有响应onDbClick事件呀! 如何恢复IE的“自动完成”功能。即让IE弹出那个“自动完成”的提示框询问用户是否保存输入表单中的内容 。 怎样扩大、缩小不规则区域界面? 高手,怎样将数据库表中为BIT的字段,读出来后,显示为yes或者no,而不是默认的true or false 我得分的帖子里显示得分还是0,为什么?能不能纠正!! 在Servlet引用了JDK中没有的包应该怎么设置! 问问一个很简单的问题。大家看看能否帮我澄清这个概念 求职 我想做个类似qq的东西,但是用户登陆后的消息怎么做?? 关于数据库 请教一个简单的阶乘递归的问题 请small_wei前辈领分.[1] 紧急求救!!!! 我还没毕业,却要做一家软件公司的经理,真有点不知所措,望大家踊跃发言,各点建议 简单问题,分数不低:如何得到splitter的rect? up也给分 请教一个win2k的系统复制问题!很头疼!! 寻JavaScript电子版好书,不好的就不要UP了, 有谁喜欢听R.E.M.的《Everybody Hurts》和R.Kelly的《I Believe I Can Fly》? linux + MySQL + apache + php + jdk + jsdk 请问各位,c++源代码如何加密呀? 我是新手,问几个暴菜的问题,不要笑我 preferred +什么? she said,"I didn't tell anyone about this."改成间接引语 Alice often got up late when she was a young girl保句意 Alice_ _get up late when she was a young gir 布兰妮的歌if you seek Amy 中文是什么呢? would you please ( )me something about this community?这里加to tell还是tell为什么 这里to用在哪 连词成句.is bus waiting Lingling a for 布兰妮的If u Seek Amy怎么回事?好像要进行处理才能在电台播放,为什么?这首歌有什么问题 I bought my shoes this year ;my sister bought hers last year.(改为同义句)My shoes are ____________my sister.We arrived early so that we had time to waarm up .(改为同义句)We arrived early _____ _____ _____ have time to warm up He often got up early when he was young( 同义句是什么 ) He_ _ _ up eariy when he was young还有:He was often sick in the past=He _ _ _ sick in the past Where does cathyi is parents went to 把“the students of class 5 are in the classroom" 中的in the classroom"就提问 Are you and lucy in the same class?是啥意思 we didn'r expect them to ______-for us .we didn'r expect them to ______-for when we arrive there so late.A.to be waiting B.to have been waiting C.to have waied D.to wait.为什么不选B.我知道A对.那B 错在哪儿? 英语中像with这样可以用在开头的介词还有哪些? the thief is waiting for a bus?对a bus 提问._____ _____the thief waiting for? We will invite them ____the party A.in B.for C.at D.toWhat do you ____at the meeting?A.tell B.say C.talk D.speak When is the best time to go to Sanya? Mary used to get up early when she was at school,_____? When did Mary lose her handbag? — It was at Christmas ___she lived inlondonwith her mother.Awhere B when C that D which答案是B 为什么不选C lie to me翻译成中文是啥意思? You and Lucy are in the same class.You are c______.根据首字母与句意完成单词 英语翻译Once upon a time,there lived a washer man in a village.He possessed a thin donkey by the name of Udhata.The donkey had to carry loads of clothes to the river bank by the day and he was not satisfied with the food provided by the washer ma lie to me 怎么翻译最合适 marry used to get up early when she was at school__Marry used to get up early when she was at school ,______?A.wasn't she B.used she C.use not she D.didn't she 用四个然而造句,在一个句子里,会的就说, 别为小事抓狂 英语翻译 The thief is waiting for (a bus) (对括号里的提问)()() the thief ()()急 click here to meet them I Andy,and this is Jack .()are in the same class.人称代词) Live in the present.Enjoy the life!翻译下!o(∩_∩)o... how many time 与how soon 区别?__will you need to work out the problem?该填什么?为什么?请详细说明可选择项是how long ,how much time ,how soon ,和how fast,改选那个???? Jack and ---- are in the same class填空 用 I的形式 live in the present这是什么意思 Which word has thousands of letters in them?a.book b.picture c.dictionary d.TV 英法资产阶级革命的时间,起因,主要人物,结果,意义我要来不及了. kids in the present live happily意思是什么 what word has thousands of letter in them乐灵的每日一练求答案 英、法、美资产阶级革命的异同点 Eight girls___this group and they help this old man clean his room every other day.A.make up B.consist of C.are made up of D.makes up正确答案是A. 为什么? 求切尔诺贝利的英文翻译 英法资产阶级革命出现不同的原因最好能从社会经济,政治制度等各方面来回答. 如何归纳介词短语做后置定语,是不是所有介词短语都可以作后置定语,如要归纳是否将所有介词短语都造句? 收集一下英语中过度的短语,比如on the other hand,however之类的要英文和中文解释.为写作文而积累 If U Seek She is a ___ ____ ____ girl.young kind American 怎样排序 福岛会成为第二个切尔诺贝利吗? 急求!几句英文翻译,是一期希望英语上的,找不到合适的整句翻译,抓狂了,非常感谢黄河的流经对陕北的地形产生了极大的影响,它冲刷出来的秦晋大峡谷不仅是视觉上的奇观,也是陕西省与山西 she sent her son to _____classes when he was very young 1.kind 2.a kind 3.a kind of4.all kinds of tell me something about this slang "give a pulse"as above look out of和look out的区别为什么在Don’t _____ the window.这句话中用look out of而不用look out? He wanted to show people the importance of nature in their lives.还是He wanted to told people the 别着急,我们还剩下许多时间.(汉译英) ____ _____ ____,we have much time ____. 怎么用英语翻译“顺便问一下” The emperor wanted to show the people his new clothes.的同义句 more,less,fewer,much,后面分别跟什么? Now I'd like to tell you something about my part timejob this summer vocation改错 out of与out from的区别,不是be make of那一类的就是单纯的out of比方一个选择题:She took his chopsticks(在这里估计是发卡) out of her hair.这里用的是out of 拿out from呢?二者的区别…… preferred to do you know how much time and effdo you know how much time and effort they devoted —— such a complicate work?A to complete B to completing 选哪个 out of和from的区别
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘