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

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下运行通过。
工作变得简单又高效 试试这八个WebApp 移动周报:生于微信,疯狂猜图的推广经 DataTorrent 将数据分析速度从“实时”提升至“现在时” 华为FusionCube开启全球规模商用 黑暗架构:以最少时间完成系统升级并获客户认可的开发之道 Hadoop Summit 2013见闻:创业与Hadoop 2.0不可阻挡 Facebook的清洁能源改革——革命尚未成功,仍需努力 YARN或将成为Hadoop新发力点 主流编程语言属性一览(多图) 粉碎硬件复杂论:开发者不懂硬件运行的方式怎么可以?! 最新版Chrome OS加入Word和Excel编辑功能 直指微软 传诺基亚将购诺西全部股份,疑为出售手机业务做准备? 优秀技术领导者的修成之道 直接拿来用!最火前端开源项目(三) 第八届开源中国开源世界高峰论坛成功举办 曾经那些主流的API,而今风光已不再! Android 4.3本月9日亮相 新功能汇总 移动游戏的国际化运营技巧 Google的Janus与Facebook的McDipper:将闪存用于数据中心 拥抱开源还是坚守阵地:传统数据库供应商面临抉择 超棒的30款JS类库和工具 立场坚定:惠普仍然密谋回到智能手机市场 6月份浏览器份额:Chrome成市场份额增长最快浏览器 关于PHP的十大误解 你中了几个? 专访西电朱虎明:异构计算硬件架构呈现百花齐放 百家争鸣 GSMA行纪:各种神器、好玩的、好看的全搜罗 大数据初创企业WibiData将Hadoop“打包”,谷歌董事长施密特两次参投 赚钱不忘环保 苹果计划为数据中心兴建太阳能发电厂 深度解析:清理烂代码 电信开放平台发布短信验证码API 创业教父Paul Graham谈创业投资趋势 散分! 如何建立一个这样的数据窗口? 上次未解决的问题(附源程序,及时结贴)(输入地址时http://ip/default.asp能正常使用,但是用http://ip则只能显示首页) 这个分页查询的SQL语句有什么问题?高分求教!!! 怎样求一个集合的子集? 我应该怎么做(项目经理请进,至少代表全国大部分公司的问题),一个年轻软件开发人员的问题 zzzzzzzzzzzzzzzzzzzz 高手指点迷津,如何更新数据库里的image字段 算法问题,再请教各位高手! 急急急,有关classpath 急!如何把picturebox中的内容保存成图片呢! Web Service中怎样验证身份? Web Service性能测试,欢迎评论,来者有分! 散分! 数据类型转换 ColdFusion的语言 - CFML win2003安装后,每个一秒种读一次盘是否正常 各位高手,最近在使用MASK PRO插件时碰到一个问题 x86汇编新手 星期六了,我还在工作....大家来帮忙看看。....很简单的问题 怎样在注册表里删除OFFICE 数据库不同,sql语句也有限制吗? 我在使用化境上传组件时碰到的问题,希望大家帮着看看,解决一下,高分求助 listview中的item能否变灰,也就是使某些项不能选 高分求各位高手急求!!!MP3问题 我的2k(PRO)我的电脑打不开,控制面版也打不开,其余的一切正常。这是为什么? 配置问题 关于上网,上传,二个大问题,高手请进,急! 一个打包问题 如何在asp里实现点一个按钮带动另一个软件的运行?急! 散分! 怎样将http下做好的网站,全盘转为https的.我准备买密匙的.想先测试一下. 如果判断当前时间是在某一时间段内? TX DATA SOURCES 數據源問題? 数据得导入和导出 给个好办法 反驳!“一位女生对男生追心仪女孩的建议”zz 请高手指点出我的小程序错误,谢谢! 菜鸟问题,这个combobox为什么不响应onchange事件?高手看看啊 高分求助 (100分) :求学生的平均分,并且排序输出成绩册!!!! 急!请问如何使用java语言获取mysql数据库的相关信息 编译4次便能成功! 下载UNIX 散分! Jsp函数中如何使用JavaScript中定义的函数? 无题! OnKeyPress和OnkeyDown有什么不同? void Page_Load(Object Sender, EventArgs e)语句,是定义一个方法函数,那括号中的Object Sender, EventArgs e可变吗? 有没有开发linux下防火墙的?怎么使用netfilter? 如何取参数呀? EVC中如何使用CHtmlView类,制作网页方面的程序呀! 拜托看下几道不明白的化学题就告诉我吧我先感谢各位了9g 银离子的配位数为什么是2,银不是最外层的电子数为1么,失去电子后空出一个5S电子层,不是只能供给一对孤对电子么.就比如【Ag(NH3)2】+ 为什么银空出的5s电子层可以给两个NH3分子的两对孤 气体激光器用二氧化碳行么?怎么用? 补充词语:晶()明撤? 请问C中穿过线圈的磁感线为什么能相互抵消,如何相互抵消的.必采纳,谢谢 孔子曰:独学而无友,则孤陋而寡闻.这句话蕴含什么道理? 地球的地心引力存在与金星吗? 影子是什么颜色的? 如何吃q10辅酶 铅锑合金的性能? magic melody中文意思 那些食物含有Q10辅酶? 梭伦改革中,按财产多寡划分社会等级,此举打击最大的是( )、梭伦改革中,按财产多寡划分社会等级,此举打击最大的是( )A.奴隶主阶级 B.氏族贵族 C.雅典公民 D.雅典外邦人为何不是A? H[PtCl3(NH3)] 中心离子是( ),配体是( ),配位数是( ).如果可以的话 请高手们能讲解下 给点参考资料也可以 国庆烟花汇演观后感5、600字就好 英语翻译要求:按词(或词组)翻译词义,并说明该词(或词组)在短语中的词性和语法成分. 通电延时与断电延时有什么区别?顺便看一下这个题:时间继电器的四种延时触点是如何动作的? 观烟花有感(600字左右,符合初中水平,要符合实际) 材料一梭伦改革中这项重要措施的划分等级的标准是什么 独学而无友,则孤陋而寡闻 2009国庆礼花观后感 英语翻译秦氏嘉庆本注:不可善,谓钩箝之辞所不能动,如此者必先命征召之.重累者,谓其人既至,然后状其材术所有,知其所能,人或因此从化也.房立中本译:对于那些以钩钳之术仍没法控制的 什么是超越国家权力的机构.举例欧盟和亚太经济合作组织. 《亡命鸡礼花》有感写写中心思想,传达了什么,从中领悟到了什么,等等200字左右,自己写,文字哲理一点,优美一点, 英语中“烟灰缸”有没有什么引申或比喻的意思? 如何利用激光器采暖如何利用100瓦的灯泡制造激光器?如何使电灯泡的杂色光变成单色光 生姜皮能吃吗?婆婆每次做菜放生姜时都要把生姜皮去掉,她说那个有毒,吃了不好,请问生姜皮真的有毒吗?能不能吃啊? 他喜欢抽烟,想要在生日时收到烟灰缸.(英语) 决定核糖体和内质网联系的是什么?书上说是蛋白质氨基酸末端序列,为什么 吃姜要刮皮吗? 幼讷于言,不补充. 独学而无友,则孤陋而寡闻,这句话怎么怎么解释呀!同题! 大雁和雁鹅有什么区别呢? 幼讷于言,人未之奇.的意思 为什么“独学而无友,则孤陋而寡闻.” 雁鹅有什么特征 幼讷于言,人未之奇的意思 独学而无友,则孤陋而寡闻的启示 实行生产资料公有制就等于实行了社会主义了吗 “幼讷于言,人未之奇”是什么意思?_ 国庆六十周年阅兵式礼炮意味着什么为什么六十响 生产资料公有制是社会主义的本质本质吗?为什么? 蔬菜类如何抽样,根据什么抽样的.各种蔬菜如何判定质量的好坏,什么可接收,什么不能接收 国庆60周年阅兵式礼炮到底鸣了多少下 全身黄,比鹅大,飞行像大雁是什么鸟大概在十几年前的成都金堂的冬天出现过,谁能告诉我这是什么鸟真的是一种鸟,最好最好有图片 MELODY的中文意思 国庆阅兵式 先升国旗还是现放礼炮 大雁与鹅的区别? 物质____决定物质的_____,物质_____也决定物质的用途. 独学而无友,则孤陋而寡闻.在作文中的运用(急!)这句话怎么在作文中运用、还有、这句话的深层寓意是什么、主要是怎么在作文中运用、、请专家解释~急啊、、最好今天可以解决、! 亚磷酸二甲酯能用强碱分解吗?碱解后的产物是什么?请问强碱分解的具体条件是什么?产物是磷酸还是亚磷酸? 物质的用途由什么来决定? H2CO3不完全分解时,化学方程式是什么还有C+CO2生成什么 雁鹅是鹅吗? 氧与硫反应生成带有什么的气体 人的体内为什么会有静电?拜托了各位 谢谢人体怎么会有静电,这是怎么回事? MOS管D极与S极之间的二极管有什么作用? 拜托看下几道不明白的化学题在线等了,感谢各位4c 根据电流磁效应我们发明了什么?奥斯特实验! 希腊梭伦改革后,公民是指什么,平民是指哪些 斯诺登抨击美国国家安全局为“最坏犯罪夫妻生三胞胎 照顾不暇求助志愿者(图福岛核电站污水量激增 用储罐藏污面临十八大以来财税体制改革:理顺事权财权浙江萧山冤案一审审判长辞去余杭区法院朝鲜大型水上乐园爆满 游客高呼劳动党一名在坦桑尼亚中国人住所中被查180埃及法老图坦卡蒙死因新解:或死于“车日本发现“盔甲男尸” 或在火山爆发时德前国防部长:窃听危机或导致美欧严重泰国芭堤雅游船沉没致7人死 一中国游德国西部城市疏散两万居民拆除二战炸弹斯诺登抨击美国国家安全局为“最坏犯罪罗姆尼指责奥巴马对医改法案描述“不诚哈瓦那国际博览会着重推介古巴首个经济英一小猫电话\"报警\"致警方破门而哈佛教授质疑美国饮食指南推出新版本饮罕见日食现象横扫非洲 遇恶劣天气仍壮日本约32万人观看自卫队航空节 特技刚果(金)反政府武装陷入绝境 要求立日本浜名湖渔船失火 恰逢货船经过救起雷凌开创好莱坞营销喀麦隆国脚嫌奖金少 拒绝登机前往巴西樱桃卖出5元一斤“白菜价”雪佛兰新爱唯欧焕新上市今日快讯马山旅游度假区 有枚闪亮“金钥匙以低价米忽悠老人 女子街头连骗带抢预告-13日2时起毒舌直播世界杯开幕恒源祥联手劳伦斯 “体坛奥斯卡”明年投注世界杯留意4细节专家:和平崛起与动武不矛盾 维护主权东北知青忆收麦:把麦粒泡水里加盐煮着阿什利·科尔滋事 遭洛杉矶警方调查扬子晚报财经微信“钱眼”上线啦!下期预告小蛮腰再爆减肥新奇迹本报“作文写吧”要出书 开始接受困难人群如遇急难 可先获救助再办手续翠屏城“千字头”房价 助力刚需南京弹力带健身如何练习 不同人群方法不同奇致美容高考场外有爱心 送水送扇送清
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘