• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    VB通用數據表格輸出程序的設計

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 18次 | 進入軟件測試論壇討論

    領測軟件測試網 淮北市社會保障局計算中心 沙順義

    ---- 做為一種簡捷、系統的 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              
           注釋:打印完成

    ---- 屏幕預覽程序與打印機的輸出相同,只要把 Printer對象換成PictureBox控件對象并使用相應的對象屬性及方法,同時,在編程中還要處理分頁、紙張、打印設置、字體、出錯等等,限于篇幅,這里不一一介紹。在控件中實現了字體及其大小的設置、紙張的設置、自動分頁、自動順序號,任選列的匯總、選擇打印、多份打印等功能,感興趣的朋友可與本人聯系。
    ---- 該控件在中文Windows 95、VB 5下運行通過。 

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>