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

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下运行通过。
战歌:85后手游开发团队背后的故事 分秒钟做款App:细数国内外在线DIY应用网站 指点传媒CEO专访:紧握二三线市场用户命脉 专访Waygo创始人:白切鸡怎么翻译? 探究共享软件海外营销新策略(西安站) 讲师秀8:车音网沈康麒和他的智能驾车服务 数据可视化独领风骚:看这6家初创公司如何玩转大数据? 最新研究显示:IE10防恶意软件能力比Chrome等浏览器都要强 Windows Blue正式定名Windows 8.1 对Windows 8及RT用户免费 Testin云测试破1000万次 自动化测试成趋势 接手Android后首次接受媒体采访 Sundar Pichai谈Android未来 C语言实现二分法查找 让开发者高效编程的10个新框架 Google Analytics中显示访客停留时间为“0”的秘密 大数据之惑 麻省理工三位物理学家自建数据库服务Cloudant 融资1200万美元 网页浏览器进入再造新时代 AMD揭露HSA运算架构新技术hUMA细节 美团悄然上线云主机服务:与亚马逊殊途同归,还是另有谋划? 微软发布deep-tech团队招募令,期望获得下一代开发者的支持 2013谷歌I/O开发者大会:发布多个软件产品和服务 C语言实现二分法求解方程 开发测试云与虚拟化解决方案 学苹果?微软淘汰Points支付系统改用Gift cards 甲骨文改变Java版本号命名方式 [CTO俱乐部第97期]中科院、腾讯、深圳明源研发团队管理经验分享 Android Studio来了,它能取代Eclipse吗? Google Play Game不够开放,被OpenKit炮轰 Google Play Game Service详解 不仅提供API更提供后端支持 IBM Power走向Linux,是必然的! 美国国家安全局解密特工培训手册:如何利用谷歌等大众搜索工具搜集保密数据 请给我一个GetCurrentDirectory使用实例, 问一个深入MFC的简单问题 请问有关delphi项目编译的一个小问题。 各位,那里有VisualAge for Java4.0下在?我从ibm的网站上下载了,但是安装不了,说是语言不对! shcv.dll 编译不过去!!!!! have a test!have a test!have a test!have a test!have a test!have a test!have a test!have a test! mysql 结果中再次查询如何才能实现呢 pc2phone java支持byte[] a = String.getBytes("iso-8859-1");转换吗? c语言中关于对windows命令调用的语法、命令及其格式。 怎么样捕捉数据库连接出错的信息?? 在SQL语句中,如何获得一汉字字段的字节长度,而不是字符长度?如“测试”返回4,不是2 如何建树 winsock.dll提供的都是什么函数?如果它提供的是winsockAPI,那么winsock32。lib提供的又是些什么?它们重复吗? FormatDateTime这个函数的日期间的字符不支持汉字,怎么解决? 关于用JAVA生成GIF的问题?(16M的GIF,256的我已经知道了) 如何在ACCESS李使用SQL? 梦天请进,谢谢! 能不能将对象序列化后存到数据库再取出还原?有没有例子? 分屏的已个视要做成对话框,请指教,顺便告诉我如何给分,只能给这么多 sorry,梦天进来,thanks!! 急!请问怎么在java类里写编译另一个类的语句?? 如何在ACCESS里使用SQL? 谁有BO2K源代码,我愿高分求购.不为别的目的,只为深入学习系统编程 如何实现 调用IE打开一个页面,并且多次调用,只打开一个窗口? 帮我点一下我就给分! 一个简单问题:我在给Access数据表中增加记录,其中一字段是CTime类型,但老是非法操作。调试后错误出现是:return (GetLocalTm(NULL)->tm_year) + 1900 不知如何解决。请各位大师救救我把。 动态的保存datawindow object的问题 怎么给一个(tab control)属性单 的标题栏上给添加一个背景位图呢! 千山一刀之忍者神龟进来拿分!!! 怎样得到年、月、日的值 那里有C++ Primer这本书 十万火急!!!怎么在oracle+developer2k中取得本机ip.——高分奉上!! 如何判断输入的信息是中文? dll调用找不到程序入口?? 怎么用win2000来制作一张可以代光盘启动的启动盘 我怎么用一个ALT 封装一个 ToolBar Control的 ActiveX的控件! 谁有什么好的例子吗! 给个意见,是联通好呢?还是移动好? Paramstr如何正确处理带空格的参数? 我在表中插入记录可流览时却见不到新插入的记录只有关闭程序然后重新运行才能看见新插入的记录. 用awt控件制作的下拉菜单,为什么在IE环境下无法正常显示? 请CommerceServer(商业秘密[::路德一族::])luojx(大鱼儿)koyia(koyia) 三位高手再去谁能单独解决~谁能独享100分!绝不食言(再详细点!)) 怎样让程序只运行一次? 怎样合并两个EXE文件? 把数据库表转换成文本文件,有什么好办法吗/ 怎么才能当鼠标移到表格上,然后表格的颜色改变 请kylincn(随心所欲),lianghu(山人)进来拿分; 另外 斑竹帮我给分http://www.csdn.net/expert/topic/389/389544.shtm 哪儿可以找到一些游戏的算法 我快疯了!!!! 谁用过FAST REPORT 请求帮助!!! 用C语言编写一程序,统计从键盘输入的任意自然数中偶数的个数并求其和#include "stdio.h"main(){\x05int num,count=0,sum=0;\x05printf("please input one number(>0):\n");\x05scanf("%d",&num);\x05for(;num!=-1;)\x05{\x05\x05if(num% 阴影部分的面积是5平方米求环形的面积是多少 两个4次多项式相加 综合除法和余式定理 1.设多项式f(x)=(x+3)(x-2)+5,若f(x)除以x-k之余数为k^2,则k=?1.设多项式f(x)=(x+3)(x-2)+5,若f(x)除以x-k之余数为k^2,则k=?2.设f(x)=x^3-2x^2-x+2,则多项式g(x)=f(f(x))除以x-1所得之余式为? 看到一个背单词的诀窍,背单词的诀窍:首先Z,Y,X,Q,J,K,U,然后V,W,N,O,L,接着B,D或E,R或F,G或T,I或H,M,最后挑战BOSS:C,P,A,S,不久你会发现,在英语的世界里,单词会主动认识你. 两个多项式相加后,不含一次项,是什么意思 图中大正方形的面积是40平方米,求阴影部分面积 下图中阴影的面积是5平方分米,求圆环的面积 两个一元多项式相加我想要一个C++的源程序最好有主函数要多点注释错了,不是这样的,我需要的是输入两个一元多项式,两个多项式相加合并,输出一条链. 若多项式x^3-2x^2+x+3除以x-2的余数为a,求2x-y-4的绝对值 + 根号a-x-y =0的解 空调作用原理 有一个自然数含有10个不同的约数,但质约数只有2和3,那么,这个自然数最大是 图中大正方形的面积是60平方米,小正方形的面积是多少?希望不要用60除以2,有没有别的方法? 右图中阴影部分的面积是40平方米,求环形的面积 已知右图阴影部分的面积是25.12平方米,小圆的半径是3米,求正方形的面积36页36页 5个连续偶数之和是100,这5个偶数分别是多少? 1.5v干电池电压升到4V驱动发光二极管,求详细的原理 已知下图阴影部分的面积是50.24平方米,小圆的半径是3米,正方形的面积是多少? 5个连续的偶数和是100,其中最小的一个和最大的偶数分别是多少? 帮我做一下,阴影部分的面积是20平方厘米,求环形的面积是多少平方米?图片上传不了 设S为整数,则所有奇数可表示为( ),所有偶数可表示为( ),所有被3除余2的数可表示为( ) 100以后的4个连续奇数和偶数是什么? 下图中阴影部分的面积为5平方厘米 求环形面积·求高手如题 已知下图阴影部分的面积是50.24m²,小圆的半径是3 m.正方形的面积是多少平方米? 5个连续的偶数和是100, 世界大学排名前一百名?求2010年最新数据!亚洲的占多少?中国的占多少?权威报告 已知n表示任何一个整数,则用n表示偶数为 ? 奇数为? 被3除余2的数是 两个连续整数之和是? 五个连续的偶数的和是100,其中最大的一个数是多少? 编写VB程序 输出1至100(包括1和100)内能被7整除的所有整数用 循环语句 编写WHILE 或者 UNTIL 已知下图阴影部分面积是50.24平方米,小圆的半径是3m,正方形面积是多少?急用 关于余数定理的问题~多项式余数定理是指一个多项式 f(x) 除以一线性多项式 x - a 的余数是 f(a).例如,(5x3 + 4x2 - 12x + 1) / (x - 3) 的余数是 5(3)3 + 4(3)2 - 12(3) + 1 = 136这里x=3,这样分母不就为0了吗?我 有一个自然数含有10个不同的约数,但质因数只有两种:2和3.这个自然数最大是 所有偶数都可以用2n来表示(n为整数),请你表示出所有的奇数和所有被5除余2的数 余数定理问题已知f(x)除以x-n/m的余数是k,那么f(x)除以mx-n的余数是?为什么答案依为k,如果可以详细,能不能给我具体深入讲一下,我才学余数定理请说具体点, 91的92次幂 除以100的余数 二项式定理解答 要求详细说明-919 怎么就算出 81的余数 已知下图阴影部分面积是50.24平方米,小圆的半径是3m,正方形面积是多少? 下面程序计算100以内正偶数之和,错在哪里?main(){int sum,i;for(i=100;i>=0;i--);if(i%2==00sum+=i;else sum=0;printf("和为:%d\n",sum);} 什么是中国余数定理? 1.化简(√2+1)^5+(√2-1)^5= 2.利用二项式定理证明命题:15^8-1能被64整除 3.67^200除以9所得的余数是PS:67^200意为:67的200次方 那个英语四级阅读你是怎么提高的? 余数定理高手进1.已知关于X的整式能被X+3整除;除以X+2,X-3时,余数分别是-4,6,求满足上述条件的次数最低的整式2.已知F(X)=X的三次方+2X的二次方+3X+2除一整系数多项式G(X)所的的商式及余 英语四级各题的具体分值? 关于多项式恒等定理f(x) g(x)究竟表示什么~还有~x前面的系数究竟取什么啊~没有要求随便取得嚒~不好意思我初中的~没学过这个东西~、 阴影部分的面积是25平方米,求圆环的面积 下图中圆的半径是2厘米,长方形长与宽的比是3比2,求阴影部分的面积 关于多项式定理求[xk+x(k-1)+x(k-2)...+x2+x1]n的展开式其中xk为X的K次幂,依次类推 还有最好能对上面的公式做一下解释 下图中阴影部分的面积是25平方厘米,你能算出环形的面积是多少吗? 已知下图中的长方形长是8厘米,宽是4厘米,求阴影部分的面积 因式定理和余数定理是什么请用初中知识解决,详细一点拜托 阴影面积是25平方米求圆环面积 求下图中阴影部分的面积,长方形长是8米,宽是4米 多项式的恒等定理指的是什么最好有来源 下图中阴影的面积是25平方厘米,请你求出环形面积 下图中的长方形长10厘米宽8厘米,三角形甲和乙的面积都是长方形面积的1/4,求阴影部分的面积 多项式恒等定理的推广我所知道的多项式恒等定理只是涉及x的整数次幂的,那么它能不能推广呢,包括x的实数次幂,以及lnx啊之类的~搞不清 阴影部分面积25平方米,求环形面积 1.能被3整除的最大两位奇数是( ) 2.能被3整除的最小两位偶数是( ) 3.个位0又是3的倍数的两位数是( )4.能被3和5整除的最大两位奇数是( ) 数学填空题:M,N两素因素都是2和3,它们的最大公约数是12,已知M有8个约数,N有9个约数,则M,N的和是什么 请问SAT2数学中高次多项式函数的五个定理详细解释 两个五次多项式相加后A.十次多项式B.五次多项式C.次数不低于五次的多项式D.次数不高于五次的整式
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn