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

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下运行通过。
削减硬件运营成本?亚马逊或自主研发ARM架构芯片 开源框架eMobc:XML开发原生移动应用so easy iOS应用安全开发,你不知道的那些事 市场化API的十个捷径 MongoDB和Cloudera结盟,欲征服大数据市场 红帽收购Inktank,将统一Gluster与Ceph? 那些巨头公司Logo是这么演变来的…… 以史为镜,剖析PaaS大迷局 “心脏出血”还不够?又曝OAuth和OpenID登录漏洞 走近讲师:搜狐于顺治讲述搜狐PaaS云平台实践之路 AppFlood 2014 Q1报告:亚洲和中东市场成为开发者出海首选 华为联合运营商构建能力开放平台 Facebook产品设计主管:揭秘公司如何招聘优秀设计师 【附信息图】美国因软件缺陷导致的十大事件 二十一世纪Windows简史 为什么用户体验和生态系统决定云公司的成败 三星Tizen,路漫漫其修远兮 用户体验是新优势,互联网会受到何种影响? 从GitHub看编程语言流行度 陈沙克:Openstack Horizon Icehouse Blueprint简介 叶琪:Hadoop不是万能的 要明确场景扬长避短 云网融合驱动数据中心技术聚变 给想持续编码CEO的4个建议 盘点开发者最喜爱的十大开源Xcode插件 Cloudera CTO:取代MapReduce 未来会加大Spark等框架投入 中航信资深分析师李洋:自主搭建云平台 助力民航业低成本迎接大数据挑战 安全狗创始人陈奋:借助Hadoop与Spark,欲打造服务器上的360 业界良心:Square开源Viewfinder,25万行代码全公布! 比尔&#183;盖茨:核心业务Bing虽不赚钱,却不能拆分 不可错过,参加第六届中国云计算大会的十大理由 章津楠:未来三年,OpenStack将成为企业去V首选 如何在程序中屏蔽掉系统热健:如 ctrl+alt+del, alt+tab等等 怎样在子线程的运行过程中获得主窗口的指针? 50分征解50分征解!!!!! 如何在listbox中显示多列,并加上标题(每一列都有自己的标题) 现有一DBF数据库,如何把它倒到SQL里? 没分了,仅此10分求日期的正则表达式,希望帮忙 PPT 文件变得好大 oracle8.1.5中transaction slot的问题 怎样在linux下设置有管理员权限的用户!在线等待!!!! 出学者界面实做---STEP 4 小小的堆栈问题 可不可以在一个视图中加入不同数据库的数据? 为什么我在C++ Builder 中用cgi作webservice访问数据库出错? 求JPAD PRO的破解 PPT 文件里插入Organization Chat 请教static问题 我要离开现在的公司了,去寻求新的发展...... 请教各位高人,一个循环定义问题 Win98下为什么拦截不到从另一线程发过来的自定义消息 public class myclass 与 class myclass 一样吗? dbgrid 中,titleclick事件,如何判断选中的是 哪个字段 呢? 很简单 ADOtable 不支持 FindKey, 请教: 应该如何解决记录定位? 火急请教个“重新验证组织单元”问题! 想做一个报表但设置DataEnvironment的连接失败,不知为何错? 请教!linux下将.h和.c文件编译成动态连接库!!! 你真的懂SQL语句的编写吗?快来,我给你分 重载与模板的问题 出租魏公村西口两居之一 不知哪有好一点的聊天室,各位大虾请推荐几个小弟几个!!!! jsp里面有类似于asp的response.end语法吗? 求教各位大虾,这样的数据库程序如何实现。急切中。。。。。 vb中有没有像CommonDialog选文件的定位文件夹的控件? 怎么一次性加入多个子目录中的CPP文件到VC工程中 关于pos系统数据同步传输,欢迎大家进入讨论! 怎么得到本机的ip地址? 关于package 的问题 关于打开网页的问题 怎么在文本文件中的两行中添加一行?怎么删除一行? “split”分割问题 请教:怎么配置Tomcat可以禁止访问目录 ,比如访问 http://127.0.0.1/test 不会出现文件列表? 请问怎样在对话框窗口中的Edit控件里按下Enter键后不要退出 有关dremveaver ultradev 的动态网页制作问题, 请教高手。。 在delphi中如何实现全屏?? 100分。请大虾帮忙搞定 谁有存储过程的学习资料? 怎样判断计算机上有没有装madc数据库连接,? 项目中的一个问题,急待解决,请帮忙,谢谢 无聊散分 鼠标在图片上移动所发生的事件 一个怪问题:ping得通却NetTerm不上? JBuilder中如何拖动控件到面板,位置放置的问题。(高手指教) 请问在那里有csdn helper 下载 写人物外貌的片段 精细胞和卵细胞到了外太空会不会变异哎如果在太空中人的精细胞和卵细胞结合会生个什么东西出来啊? 小明原计划每天早晨跑步2千米.某一天,他按每小时2.5千米的速度跑了0.75小时,这天他完成了吗? 水粉画天空进近处的颜色深还是远处的颜色深? 把精子带上外太空后进行人工受精,孩子会不会太空蔬菜哪样变异,是否对人内的进化有好处为了人内的进化为什么不可以牺牲孩子 两人从A地到B地,哥哥步行,每小时行5千米,先走1小时,弟弟骑车,起了30分钟,两人同时到b地,弟弟每小时行多少千米? 描写胖男孩外貌衣着的段落 人会变异吗? 求一篇守候话题作文,不要爱情的,比如守候诚信守候善良之类的,800字左右的,急用 人在太空可以漂浮,原因是质量消失 还是质量减少 怪物大战外星人 来自外太空的变异南瓜怎么样 小华计划每天早晨跑步1千米,他按每小时2.5千米的速度跑了0.75小时,这天他完成跑步计划了吗?请列式 谁能给我魏晋南北朝时期的皇帝的年号与具体时间? 火车的速度一定,路程和行驶的时间成正比例吗?为什么?订阅少年报的分数和总钱数成正比例吗?为什么? Many people get rainwater from under the ground 成立吗 人死在太空会怎么样?昨天刚看了《地心引力》,有几个问题:1、航天飞机里气压是一个大气压么?它被撞破之后,很短时间内变成真空,那么人会像深海里捞起来的鱼一样被体内压力涨破么?2、 火车时速180公里提速到时速280公里,节省时间48分钟,请问路程? The meeting will be _ by many important people from many countries.A.taken b.joined c experienced d.attended 假如你第一次在北京过春节,这期间,你吃了饺子和其他中国美食并且有压岁钱 希望给好友amy一封英文信60词 一辆车从甲地往乙地第一小时行驶全程的四分之一第二小时行驶全程的三分之一这时共行驶70km甲乙两地相距?km一辆汽车从甲地驶往乙地,第一小时行驶了全程的四分之一,第二小时行驶了全程 生物亲代与后代之间既有遗传,又有变异,这是什么现象 急需一篇初一英语作文.你最享受的生活.字数要求60-80个单词 the flu people in many winter the get 连词成句the face fiies John's ball into. 2-4反义词成语大全 亲爱的老公英语怎么写 汽车从甲地开往乙地,第一小时行了全程的四分之一,第二小时行了全程的三分之一,现已超过中点15千米.问全程多少千米? 一辆汽车从甲地开往乙地,第一小时行了全程的五分之一,第二小时行了全程的四分之一,这时距甲地180千米,甲乙两地相距多少千米 男人经常看一个女人的空间是什么心理 the,flu,people,in,many,winten,the,get 连词成句 用“刘”字组词,要求只能有两个字,不能是人名,要说出词语的意思或出处.组的词越多越好 写一遍800字的话题作文.急有400只老虎,其中300只被租赁到外地来养活家中的100只兄弟姐妹,我问老虎:“在家里好还是在出外打工好?”老虎说:“当然出外打工好,至少吃得饱.”另一只老虎说 一辆汽车从甲地开往乙地,第一个小时行驶全程的四分之一,第二小时行驶了全程的三分之一这时共行驶了70km.甲、乙两地相距多少千米? 刘的词语 给我一篇以善良为题目的话题作文 要650字的 急 Many people get the flu.改为一般疑问句.为什么这样改?说明原因. 表示神态和 心情三个字的词语拜托各位了 3Q 班级管理我有好办法 作文 300字 一辆汽车从甲地开以往乙地,第一小时行驶了全程的五分之一,第二小时行驶了全程的四分之一,这时正好距离终点还有15千米.甲乙两地相距多少千米 春种一粒粟,秋收万颗子. 描写人物的片段不要外貌描写 类似小嘎子和胖墩比赛摔交 临死前的严监生 井冈山作文的结尾怎么写 春种一粒粟,秋收万颗子的种和收是什么意思?这是我们的作业 对班级管理的作文如:对课堂纪律,卫生劳动等 主题为“井冈颂”的作文 叶圣陶作文大赛都有哪些作文?今天最好(2010.10.25) 有关人物描写的片段,有神态,动作,语言.300字 《西江月 井冈山》的写作背景是什么. 英语翻译本公司专注于数字化城市、虚拟现实、动漫、三维动画、效果图、多媒体、电子商务第三方、支持互联网图象等各种技术元素,为不同行业的客户提供多元化最终产品和服务形式,满 一篇关于“班集体”的话题作文要用小标题形式的(不少于600) Many people loved the show (改为一般疑问句) 英语翻译随机变量的数学期望是用于刻划取值的平均位置或集中位置,随机变量ζ的数学期望也称为数X以概率P为权的加权平均.因此数学期望是经济决策中的一项重要决策依据.通过计算各个决 我读古诗写话题作文用小标题的形式快 坐得等 小华骑自行车每小时行X千米,6小时行(6X)千米,Y小时行(XY)千米,行56千米需(56/X)小时,中的56/X是只是问你们56/X那/是+是-还是X还是除 英语翻译Abstract—Fires continue to occur in modern architecture,thepeople's lives and property has brought huge losses.In order toreduce the fire in the building automatic fire alarm equipmentplaced into a necessity.This paper discusses the aut 正章元年是哪个朝代的?哪个皇帝的年号?(《后宫-甄嬛传》里甄嬛的原型是谁?哪个朝代?哪个皇帝?乾元帝也可,回答乾元帝哪个朝代的?哪个皇帝的年号? 作文 春节记事,1000字左右,要用创新作文的形式写,最好是加上小标题!在每个段落后面用一句话来点明中心! 有关‘爱’的话题作文精彩片段和题记 描写神态.外貌.衣着的片段 人到了外太空会出现什么样的状况? 话题作文优美的题记
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘