

下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1VB通用数据表格输出程序的设计做为一种简捷、系统的 Windows 应用程序开发工具, Visual Basic 具有强大 的数据处理能力,提供了多种数据访问方法,可以方便地存取 Microsoft SQL Server、Oracle、 XBase 等多种数据库,被广泛应用于建立各种信息管理系统。 但是, VB 缺乏足够的、 符合中文习惯的数据表格输出功能。 虽然使用 Crystal Report 控件及 CrystalReports 程序可以输出报表,但操作很麻烦,中文处理能力 也不理想, 特别是不能够用来制作不确定内容的表格。 笔者在用 VB 开发淮北市 医疗保险信息管理系统时, 需要对
2、任意的查询结果进行表格输出, 为此,编制了 一个通用的数据表格输出控件, 能够根据查询的结果自动生成二维中文表格,并 打印输出,在此介绍给大家,共同探讨。一. VBVB 中的结果集VB提供的数据访问方法有数据询问对象(DAO)、 Data控件、 远程数据对象 (RDO)、RemoteData 控件(RDC)、ODBC API、VB SQL 等,其中 ODBC API 比 较复杂,开发、调试和支持非常困难;VB SQL 是针对 Microsoft SQL Server 的,这两种方法使用的比较少, 这里不做讨论。 比较常用的方法是 DAO、 Data 控件、RDO、RDC,其中 DAO 和 Da
3、ta 控件使用的结果集(又叫纪录集)包含在 Recordset 对象中,RDO 和 RDC 使用的结果集包含在 rdoResultset 对象中。通用表格输出 的实现方法就是根据任意的 Recordset 对象或 rdoResultset 对象自动生成表格并输 出。二. 表格的自动生成1.1. RecordsetRecordset 对象下面以 Data 控件为例,介绍 Recordset 对象的表格自动生成方法。假设有 Data 控件名称为 MyData,首先说明相关的内容及用法:(1) Data 控件的结果集包含在它的 Recordset 对象中 , 引用 方法 为:MyData.Recor
4、dset。(2) Recordset 对象的 RecordCount 属性为结果集的行数,它决定了表格的长 度,该属性引用方法为:MyData.Recordset.RecordCount(3) Recordset 对象包含一个 Fields 集合,通过 Fields 集合的 Count 属性可以 得到结果集中字段的个数,用做表格的列数,该属性引用方法为:MyData.Recordset.Fields.Cou n。(4) Fields 集合包括结果集合全部Field 对象,这些 Field 对象引用方法为:MyData.Recordset.Fields(i),其中 i 是该 Field 对象在中
5、的位置序号,从 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 属性可以计算出表
6、格对应列的宽度。(8) Field 对象的 Value 属性是该字段的值,这是表格对应列的内容,引用方 法为:MyData.Recordset.Fields(i).Value。以上引用在 VB 中都可有多种引用方法, 这里使用的是比较明了的一种, 便 于说明问题。注意:表格的自动生成可分为两个步骤。第一步,根据结果集中各字段的 Size 和 Type 属性,生成表格各对应列的宽 度,2用 Format 函数使用的格式字符串表示。下面的 Function getFmt()用来生成表格各列的格式字符串,调用时把Field对象的 Type 和 Size 属性值分别赋给形式参数 intType 和 l
7、ogSize。Private Function getFmt(intType As Integer, logSize As Long) As String Dim i AsInteger getFmt = 返回的结果串初始置空Select Case intTypeCase dbBoolean getFmt = getFmt & 0; 1Boolean 型值转换为 0、1,Case dbBytegetFmt = Case dbIntegergetFmt = Case dbLonggetFmt = Case dbCurrencygetFmt = Case dbSinglegetFmt =
8、Case dbDoublegetFmt = Case dbDategetFmt = Case dbBinarygetFmt = Case dbTextIf logSize = 40 Then 限制一列最多打印 40 个半角字符getFmt = _ElseFor i = 0 To CInt(logSize / 2) * 2 - 1 getFmt = getFmt & Next调整数值长度为偶数,以适应汉字制表符End IfCase dbLongBinarygetFmt = Case dbMemo getFmt = Case dbGUID getFmt = Case dbBigInt ge
9、tFmt = Case dbVarBinary getFmt = Case dbChar For i = 0 To CInt(logSize / 2) * 2 - 1 getFmt = getFmt & NextCase dbNumeric For i = 0 To CInt(logSize / 2) * 2 - 1 getFmt = getFmt & Next3Case dbDecimal For i = 0 To CInt(logSize / 2) * 2 - 1 getFmt = getFmt & NextCase dbFloat getFmt = Case db
10、Time getFmt = Case dbTimeStamp getFmt = End SelectEnd 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 in
11、tDc As In teger 存放表格行数,实际上即是 strDy()的元素个数Private Sub Dy()With MyData.Recordset.MoveLastReDim strDy(.RecordCount + 8) 需存放标题、表框等,所以加 8ReDim Fmt(.Fields.Count)For i = 0 To .RecordCount + 7 strDy(i) = 初始置空NextFor i = 0 To .Fields.Count - 1Fmt(i) = getFmt(.Fields(i).Type, .Fields(i).Size) 生成表格各列的格式字符串 j
12、= Len(.Fields(i).Name) If j Len(Fmt(i) ThenFmt(i) = String$(Int(j / 2) + 0.5) * 2, ) 标题 (字段名 ) 字多则增大列宽End IfNextstr = | strO =厂strl =卜str2 = L设定表格为粗框细线,可根据需要改变For i = O To .Fields.Count - 1For j = 1 To Len(Fmt(i) / 2strO = strO & 一strl = strl & ” str2 = str2 & 一Next4If (i = .Fields.Count
13、 - 1) Thenstr = str & Format(.Fields(i).Name, Fmt(i) & | Elsestr = str & Format(.Fields(i).Name, Fmt(i) & End IfIf (i = .Fields.Count - 1) ThenstrO = strO &、strl = strl & ”Tstr2 = str2 & ElsestrO = strO & 丁strl = strl & ”+str2 = str2 & 丄End IfNextstrDy(O) = 表格
14、标题 通过在标题前增加空格可使标题居中strDy(1) = strDy(2) = Format(Now, 打印日期: yyyy 年 m 月 d 日)strDy(3) = str0strDy(4) = strstrDy(5) = str1intDc = 6.MoveFirstDo While Not .EOFstr = | For i = 0 To .Fields.Count - 1If IsNull(.Fields(i).Value) Then处理 Null 值If i = .Fields.Count - 1 Thenstr = str & Format( , Fmt(i) &
15、 | Elsestr = str & Format(” , Fmt(i) & | End IfElseIf i = .Fields.Count - 1 Thenstr = str & Format(Left$(.Fields(i).Value, Len(Fmt(i), Fmt(i) & | Elsestr = str & Format(Left$(.Fields(i).Value, Len(Fmt(i), Fmt(i) & End IfEnd IfNextstrDy(intDc) = strDy(intDc) & strintDc = i
16、ntDc + 1.MoveNextII5LoopstrDy(intDc) = str2End WithEnd Sub在实际编程中还要排除二进制数据字段, 全角与半角字符的匹配调整, 处理 数据中出现的换行符、回车符、制表符,等等,限于篇幅,这里不于介绍。2.2. rdoResultsetrdoResultset 对象rdoResultset 对象的表格自动生成方法与 RecordsetM象的方法相似,在处理 过程中把 Recordset 对象的 RecordCount 属性用 rdoResultset 对象的 RowCount 属 性替换,Fields 集合用 rdoColumns 替换,Fi
17、eld 对象用 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设置日
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学前儿童家庭科学教育
- 商业监管面试题及答案
- 数字养老面试题及答案
- 相约劳动考试题及答案
- 医院液氧罐采购方案
- 小区柴火房改造方案
- 2026版《全品高考》选考复习方案生物732 课时作业(三十) 育种 含答案
- 地基开挖清理方案
- 船厂废旧设备处置方案
- 学生在校一日常规
- 2025年安全员考试试题库复习题库及答案指导
- 湖北烟草专卖局笔试试题2025含答案
- 2025至2030胆道引流管行业项目调研及市场前景预测评估报告
- 电子商务师(三级)理论知识鉴定要素细目表(征求意见稿)
- 孵化器周年庆活动方案
- 股权投资项目可行性研究报告
- 厂务岗位面试题及答案
- 企业岗位职级管理制度
- 儿童沙门菌感染诊疗要点
- 燃气公司防汛管理制度
- 2025-2030年中国少儿艺术培训行业市场深度调研及竞争格局与投资研究报告
评论
0/150
提交评论