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

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下运行通过。
VB如何在运行时动态增加控件 显示和隐藏鼠标-VB资料 VB用ActiveX Control Pad VB用API函数改进ListView 控件的显示效果 用VB6.0中文版进行DHTML程序开发 用VB编写标准CGI程序 用VB编写留言板 用VB播放FLASH动画 用VB开发进程管理软件 VB用WinSock设计Chat程序 运用MSChart,生成统计图形-VB资料 向文本框等等控件的系统右键菜单里追加自己定义的菜单-VB资料 在VB中用定时控件实现长定时操作 在Visual Basic中,在GotFocus事件中快速选定文本 在程序中注册和注销 OCX 控件 -VB资料 在运行时维护DBGRID的栏位宽度-VB资料 VB怎样使用VB开发基于Sybase的C/S软件 VB怎样在运行时动态生成多个相同的控件 直接编辑VB中网格控制项的两种方法 自制控件方面的有关知识-VB资料 Unicode vs Ansi -VB资料 VB 中调用 Word 拼写检查 VB4.0安装程序的汉化 VB中对字符串的处理及其扩展 把符串中的一子串替换为另一子串 -VB资料 把数字转成英文字-VB资料 翻转一个字符串-VB资料 混合字符串的长度 -VB资料 将阿拉伯数字转成中文字的程式 -VB资料 将包含有Null结尾的字符串转换为VB字符串 切分字符串-VB资料 java 中的double类型,在Oracle数据库中应该对应的是什么类型? 怎样作才能不让用户随意更改系统时间和日期? 关于单击和双击的问题 请问一个关于GB要转换成日文的Shift-JIS内码的问题 请问一下这个字符串什么意思? 在ASP.NET中怎樣讀取通過用XMLHTTP Send過來的XML數據包(一個問題50) 关于IrDA在WINDOWS/NT/XP下的编程实现 一定给分啊,快点进来看看阿 ! 帮忙写个SQL语句。 静态文本框里的文字如何调整其大小? store procedure类型 数据窗口问题 编译器参数,在线等待 求sql 如何用BUTTON按钮,将一个窗体文件关闭? 非常简单的付值问题.火急,再线等待,马上送份 调用RasDia();第一次拨号成功断线后再拨就返回错误字符终止连接为何代码如下: 怎样能编写用于用ie注册邮箱、论坛账号时自动填表的软件 资源文件的问题! 一个挑战斑竹的问题!!50分 如何把压缩文件(*.rar或则*.zip)和word文档存到Acess数据库啊??? 如何可以知道访问我的网站的用户来自哪里? 关于SQL的问题 这对话框我如何去掉 asp.net 能否运行在Solaris系统下,参与者有分 c#请求援助 int a 除以 int b 取他们的余数用C#该怎么写啊?谢谢 求救!显示后台数据,在线等待!等…… jsp中的数据库问题,求教!!急 刚学数据库,弱智问题,高分赠送! 这个查询怎么写? 关于表生成文本文件遇到的事情,急 InstallShield Professional Standard Edition 6.30 英文版的下载(高分:200) 寻一男友:发展方向——>老公 我用serv-u,客户端访问为什么没有用户登陆窗口啊? 脚本验证datetime要准确点的 请问,想做出象Protel(Tango)作图效果的程序,如何下手呢? win API函数的区别(win xp 和win 2000)高难度!! 那儿有winsock.pbl 进入系统的速度变慢????在线等待 当 AllowPaging 设置为真并且选定的数据源不实现 ICollection 时,AllowCustomPaging 必须为真,并且 ID 为 DataGrid1 的 Data 怎么提高搜索速度? 如何printScreen并获得这个图片? 如何用SQL格式化一个IP地址?我得到的IP地址是一串数字,想显示为255.255.255.255那样的样子。 为什么在客户端出现Interface not support的错误? help,关于文本显示! SOS 急急急 请教几个概念? 如何打开一个用winexec打不开的可执行文件。 进入系统的速度变慢????在线等待 请大家谈谈目前比较经典软件,共享的,免费的,大公司的,个人的,国内的,国外的,不分行业等等,只要是经典都可以,请大家畅谈! 欢迎踊跃讨论!如何使得delphi编的exe或dll最小! 中国三大平原是哪些? 23.增值税一般纳税人销售货物适用13%税率的有(ACD)A.销售材料  B.销售钢材  C.销售图书  D.销售自来水 理由 每天看书的5分子1还多10页,4.5天看完这本书,问这本书一共多少页?怎么答题 春作者朱自清,现代著名散文家、( )、( )、( ).他的代表作有( )等 甲乙合作一工程要6天,如果甲先做3天,再由乙继续做8天刚好完成.若甲独做这一工程,要多少天呜呜呜,烦死了,端午节也在写作业,好多应用题不会, 一本小说,每天看45页,第16天看完;如果每天看54页,第14天就看完了,这本小说最多几页,最少呢? 我国的三大平原是哪些 一项工程,甲独做6天完成,乙独做8天完成.两人合做3天,完成这项工程的 双向自动扶梯一层到二层,两个扶梯梯级宽度都是800,三十度倾斜角度,提升高度为4200那么土建时,二层预留洞口宽度为多少,二层顶端是否要留得大点,一层基坑的大小是多少? 请告诉我一篇《清晨》三年级作文有多少字 一项工程,甲独做6天完成,乙独做8天完成,两人合做( )天完成,所以尽量将清楚 一本小说,如果每天看45页,第十六天看完;如果每天看54页第14天看完.这本小说最多有几页?最少呢? 用好像仿写句子,不是比喻句.好的要重谢!还有分 一项工程,甲单独做6天完成,乙单做8天完成,两人合做多少天完成? 我读1本书第1天读了10页以后每天都比前一天多读2页第16天读28页正好读完 这本书共多少? 作文:清晨,我走进校园写清楚走进校园看到的、听到的、想到的,描写要具体,想想要合理. 一项工程,甲乙合做8天完成.如果先让甲独做6天,再由乙独做,完成任务时发现乙比甲多了3天,乙独做这项工程要几天完成? 有关 崇尚科学,反对邪教 的征文800到1000字.麻烦写得水平高一些吧. 有带像、似乎但又不是比喻句的句子吗? 找一篇题目为等待的作文,字数600左右,要中学生水平. 一项工程甲队独做8天完成,乙队独做10天完成,甲乙合干三天,乙队另有任务,甲队还要干几天才能干完这工程高手来解 以舒适的早晨为题,写一篇350字左右的作文!急!一定要快!1快!有急用!!! 以"春节,我最快乐的一件事"为题,写一篇作文,字数500字左右, 小东图书本数的5分之3等于小强图书的3分之2,小东与小强图书质量比是多少 雨后的早晨(400字左右作文)《雨后的早晨》400字左右作文,急!好心人帮帮忙吧!还有,要怎么样点击才能选择满意答案呢? 我是个高中生,我写作文总是没话说,所以常因字数不够被扣分,怎样才能改善呢,还有怎样写好作文 小刚和小强看同一本书,小刚还有19页没看,小强还有14页没有看,他们俩()看的页数多. 用上‘好像’一词 写一个不是比喻句的句子怎么写呢 我作文总是写不够字数怎么办?怎么才能有话说,凑够字数?基础差我看到作文就觉得没话说.怎么才能把文章写细腻,写够字数?800字 中山陵怎么走? 用好像一词写一个不是比喻句的句子 已知圆锥的底面半径是3,母线长为6,则该圆锥侧面展开后所得扇形的圆心角为需要讲解下.. 中山陵怎么去 小明,小英和小美三人定期向李老师求教,小明每六天去一次,小英每八天去一次,小美每九天去一次.他们每多少天会同时想李老师求教?最先的再加5分 帮我点评一下这篇托福作文,看看能多少分求 各种拍砖People work because they need money to live.What are some other reasons that people work?Discuss one or more of these reasons.Use specific examples and details to support your ans 中山陵的地理位置【要简短】 有没有否定语气的比喻句?就是,有“不像”的句子是不是比喻句?比如说,桥像彩虹,这是比喻句,并且是肯定句。有本体和喻体。但是,如果变为“桥不像彩虹”本体和喻体还成不成立呢? 励志名言名句,附带一篇演讲稿 用什么去刺激蟋蟀须,让它们打架 求作文提纲——等待不如行动以 “等待不如行动” 为中心,列出三个分论点以及论证事例.最好是用辩证性思维去论证……EG:标题XXX分论点:1XXX(用XX、XX事例←一两句话概述)……可以多送 什么句子有“如”,“像”却不是比喻句,能举例子吗,比喻句有什么特点?"如玩电脑那般激动"是不是把干某件事情的心情比作玩电脑时的心情呢? 小红看一本书,第一天看了全书的14%,第二天看了12页,还剩27页没看.这本书一共多少页? 比较优美的哲理性散文有哪些?要朱自清的.(全文) 为什么句子中有“像”字却不是比喻句? 小红看一本书,第一天看了全书的10%,第二天看了全书的15%.第二天比第一天多看12页,还剩多少页没有看 甲乙两队修一条路,甲队独自修10天完成,乙队独自修15天完成.之后他们两队一起修,乙队因事请了几天假,之后两队一共用了8天,乙队请了几天假. 一项工作甲单独做需要5天完成,乙单独做要10天完成,若甲单独做了x天后,甲乙合作y天,则一共完成了( ) 蟋蟀怎么才能打架 我国三大平原是哪些? 一件工作,甲单独做X天可以完成,若甲、乙一起做,Y天可以完成,那么乙单独做几天可以完成 蟋蟀会因为吃的而打架吗 春是一篇 散文?朱自清是现代著名 ,,,. 一项工程甲乙合干12天完成,乙丙合干15天完成,甲丙合干20天完成,如果甲乙丙三人合干几天完成? 有一本书,原计划每天看20页,如果每天多看5页就提前2天看完,问这本书有多少页?请不用方程式解题,并讲出过程, 我国的三大平原 《青鸟》读后感50字0000000000000000000000000000000000000000000000000000青鸟》讲述的是:圣诞节前夜,伐木工简陋的小屋里,男孩蒂蒂和女孩咪蒂正在眺望富人家的孩子过节.仙女装扮成老太太请他们为她 蟋蟀为什么爱打架我要做问题,请帮我! 求一篇朱自清的2000字散文 一项工程,甲队6天完成,乙队8天完成,两对合作多少天完成工程的3分之2 ? 每天看书的5分子1还多10页,4.5天看完这本书,问这本书一共多少页? 日本赛马失控与轿车相撞当场丧生 司机希腊经济危机使国内中产阶级损失惨重(美国多名政客支持监听行为 称总统不必以色列耄耋作家展望巴以和平并存 遭官澳媒称澳政府拟摒弃前任政府对亚洲战略报告称全美国一年有500名少年儿童死阿根廷执政党保住国会最大党地位 但选加拿大婚外情网站欲进驻新加坡 遭民众印度拟射火星探测器 欲争亚洲第一被批美监管机构调查房地产信托投资基金日本一杂志启用胖模特 专为胖女孩设计德国政界对美监听默克尔愤怒 欲传唤斯美媒:监听默克尔行动在奥巴马得知后便美国多名政客支持监听行为 称总统不必习近平会见南非副总统莫特兰蒂法国极右政党领导人演讲 遭乌克兰女权浙江临海户外休闲用品展开幕 欲探索跨美国多名政客支持监听行为 称总统不必韩总统好感度调查出炉 卢武铉居首李明法国极右政党领导人演讲 遭乌克兰女权澳媒称中国买家推动悉尼当地房价升高2[英超专栏]数说英超第17轮|升班马[关注]这一批孩子有福气了!内蒙古将[重磅]从家长“找教练”到学校“请教[奇葩篇]教练,我这个星座踢什么位置[焦点]校园足球历史性突破:北理工学福利,龙虎机构助拳19股,暴涨一触即天下有两难,地上有两苦,世界有两险!有钱就是这么任性酒后看性格,准到惊人!城会玩,大众等品牌的车标含义你造吗?等油价降?别等了,买这些车根本不用考小小仪表盘上的12个指示灯!你都知道福特撼路者”万人试驾会“火热来袭苏州一女孩用了几年手机后,发现一个惊45个小卧室理念,玩转小卧室不在话下途牛休闲度假市场份额首超携程,预示什酒店英语口语从找餐厅问路和预订开始生活虐我千万遍,我待生活如初恋父母必知:简单正确的止咳护理法若你没诚意,宁愿我们再不相见李大霄:蓝筹股持续性行情期待机构观点
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘