關鍵詞 VB6.0,編程,報表
壹 、 前言
Visual Basic開發數據庫系統中,報表打印是其中最重要也是最常用的功能之壹。按照報表實現的方法可大體上分為3類:第1類是較原始的方法,直接控制打印機對象Printer進行畫線和打印;第2類是使用控件,如Data Report、Crystal Report、Active Report等;第3類是將需要打印的報表保存成其他程序可以識別的格式或直接輸入到其他程序中,利用其他程序的打印功能操作,典型代表就是通過Word和Excel打印報表。
二、方法簡介
使用Printer對象編程進行打印,最大的問題是要經常進行坐標運算,需要考慮很多瑣碎的問題,代碼量大,打印的內容無法預覽。優點是控制靈活,且打印效果比較好,在實際應用中,對於壹些靈活度較高,功能較復雜的報表使用本方法是較理想的方法。本文的實例中主要介紹了此種方法的實現過程。
VB自帶的Data Report與Printer比起來,編程強度小了很多,而且它以所見即所得的方式設計報表,比較直觀,打印出來的報表比較美觀,實現打印預覽功能比較簡單。它缺點是不夠靈活,綁定內容只能是Recordset,且還有諸多限制。
Crystal Report是Seagate公司出品的報表打印控件,8.0以上的版式本的功能已經十分強大,控制靈活,堪稱經典的報表解決方案。它的缺點體積比較強大,且是商用軟件,價格比較昂貴。
Active Report是Data Dynamic公司出品的優秀打印控件。Active Report作為Data Report的增強型,控制靈活,功能完備,完全可以勝任日常報表打印工作。
借助VBA調用壹些外部軟件解決打印問題,其中Word和Excel是常用的“打印代理”。這種方法的好處是控制比較簡單,打印功能強大。它的缺點是要求運行報表打印程序的計算機必須安裝相應軟件(如Word或Excel等)。
三、程序實現
1.新建壹個標準工程,名稱為工程1。在工程中創建壹個窗體,名稱為Forml
2.單擊工程菜單下的部件選取項,在彈出的列表中選中Microsoft FlexGrid Control6.0(sp3)選項,然後單擊確定按鍵,MSFlexGrid控件就添加到工具箱中了。
3.在Forml窗體中放置1個MSFlexGrid控件、8個TextBox控件、8個Label控件、5個CommandButton控件等。主要控件對象的屬性如下表所示。
主要控件的屬性列表
對 象
屬 性
值
功 能
MSFlexGrid
名稱
MSFlexGrid1
輸入入庫信息
Text1
名稱
Text1
Text2
名稱
TxtWhm_1
輸入單據號
Text3
名稱
TxtWhm_2
顯示品種數
Text4
名稱
TxtWhm_3
顯示合計數量
Text5
名稱
TxtWhm_4
顯示合計金額
Text6
名稱
TxtWhm_6
輸入供貨商名稱
Text7
名稱
TxtWhm_7
輸入日期
Text8
名稱
TxtWhm_8
輸入經手人
Command1
名稱
CmdRegister
登記命令
Caption
登記
Command2
名稱
CmdSave
保存命令
Caption
保存
Command3
名稱
Cmdprint
打印命令
Caption
打印
Command4
名稱
CmdCancel
取消命令
Caption
取消
Command5
名稱
CmdEnd
退出命令
Caption
退出
4.添加程序代碼
這裏以藥品入庫單為例實現報表的打印、核心代碼如下:
Private Sub CmdPrint_Click() '編程實現票據連續分頁打印
'參數定義,作用為確定打印坐標
Dim i, A As Integer
Dim v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13 As Integer
v1 = 5
v2 = v1 + MSFlexGrid1.ColWidth(0) * 1.2 '序號
v3 = v2 + MSFlexGrid1.ColWidth(1) * 1# '藥品代碼
v4 = v3 + MSFlexGrid1.ColWidth(2) * 0.95 '藥品名稱
v5 = v4 + MSFlexGrid1.ColWidth(3) * 0.9 '規格
v6 = v5 + MSFlexGrid1.ColWidth(4) * 0.8 '產地
v7 = v6 + MSFlexGrid1.ColWidth(5) * 0.9 '批號
v8 = v7 + MSFlexGrid1.ColWidth(6) * 0.8 '有效期
v9 = v8 + MSFlexGrid1.ColWidth(7) * 0.9 '單位
v10 = v9 + MSFlexGrid1.ColWidth(8) * 1.4 '數量
v11 = v10 + MSFlexGrid1.ColWidth(9) * 1.2 '單價-----進貨價
v12 = v11 + MSFlexGrid1.ColWidth(10) * 1.3 '金額
v13 = 11500
Dim m As Integer '總記錄數
Dim N As Integer '每頁記錄數
Dim ii As Integer '總頁數
Dim j As Integer '頁碼數
Dim k As Integer '每頁起始記錄控制
Dim TmpLowerPageMoney As Single '每頁合計金額
m = Val(TxtWhm_2.Text) '(TxtWhm_2 入庫品種數)----總記錄數
N = 4 '每頁 4 條記錄
If Int(m / N) - m / N = 0 Then
ii = m / N
Else
ii = Int(m / N) + 1
End If
Printer.Height = 750 + 300 + 450 * N + 900 + 1000 '定義紙張高度----根據每頁記錄數
Printer.Width = 12000 '定義紙張寬度
For j = 1 To ii '外循環控制打印頁數
TmpLowerPageMoney = 0# '每頁合計金額 ------ 新頁開始清零
Printer.CurrentX = 4000
Printer.CurrentY = 200
Printer.FontSize = 16
Printer.Print "湘潭市維民貿易有限公司入庫單 "
Printer.CurrentX = 9250 '頁碼置於左上角
Printer.CurrentY = 200
Printer.FontSize = 10
Printer.Print "第 " + Trim(Str(j)) + " 頁 *** " & Trim(Str(ii)) + " 頁"
Printer.CurrentX = 200
Printer.CurrentY = 750
Printer.FontSize = 10
Printer.Print "供貨單位:" & TxtWhm_6.Text
Printer.CurrentX = 5000
Printer.CurrentY = 750
Printer.FontSize = 10
'Printer.Print "(此入庫單不做報銷憑證)"
Printer.CurrentX = 8800
Printer.CurrentY = 750
Printer.FontSize = 10
Printer.Print "票號:" & "" & TxtWhm_1.Text
'列標題
'A -------- 表主體縱向高度
A = 1050
Printer.Line (v1, A)-(v13, A) '畫頂橫線
If MSFlexGrid1.ColWidth(0) > 0 Then '第1列
Printer.Line (v1, A)-(v1, A + 450) '畫左堅邊線
Printer.CurrentX = 50
Printer.CurrentY = A + 100
Printer.FontSize = 10
Printer.Print "序號"
End If
If MSFlexGrid1.ColWidth(1) > 0 Then '第2列
Printer.Line (v2, A)-(v2, A + 450)
Printer.CurrentX = v2 + 10
Printer.CurrentY = A + 100
Printer.FontSize = 10
Printer.Print "藥品代碼"
End If
If MSFlexGrid1.ColWidth(2) > 0 Then '第3列
Printer.Line (v3, A)-(v3, A + 450)
Printer.CurrentX = v3 + 40
Printer.CurrentY = A + 100
Printer.FontSize = 10
Printer.Print "藥品名稱"
End If
If MSFlexGrid1.ColWidth(3) > 0 Then '第4列
Printer.Line (v4, A)-(v4, A + 450)
Printer.CurrentX = v4 + 40
Printer.CurrentY = A + 100
Printer.FontSize = 10
Printer.Print "規格"
End If
If MSFlexGrid1.ColWidth(4) > 0 Then '第5列
Printer.Line (v5, A)-(v5, A + 450)
Printer.CurrentX = v5 + 40
Printer.CurrentY = A + 100
Printer.FontSize = 10
Printer.Print "產地"
End If
If MSFlexGrid1.ColWidth(5) > 0 Then '第6列
Printer.Line (v6, A)-(v6, A + 450)
Printer.CurrentX = v6 + 40
Printer.CurrentY = A + 100
Printer.FontSize = 10
Printer.Print "批號"
End If
If MSFlexGrid1.ColWidth(6) > 0 Then '第7列
Printer.Line (v7, A)-(v7, A + 450)
Printer.CurrentX = v7 + 40
Printer.CurrentY = A + 100
Printer.FontSize = 10
Printer.Print "有效期"
End If
If MSFlexGrid1.ColWidth(7) > 0 Then '第8列
Printer.Line (v8, A)-(v8, A + 450)
Printer.CurrentX = v8 + 20
Printer.CurrentY = A + 100
Printer.FontSize = 10
Printer.Print "單位"
End If
If MSFlexGrid1.ColWidth(8) > 0 Then '第9列
Printer.Line (v9, A)-(v9, A + 450)
Printer.CurrentX = v9 + 30
Printer.CurrentY = A + 100
Printer.FontSize = 10
Printer.Print "數量"
End If
If MSFlexGrid1.ColWidth(9) > 0 Then '第10列
Printer.Line (v10, A)-(v10, A + 450)
Printer.CurrentX = v10 + 80
Printer.CurrentY = A + 100
Printer.FontSize = 10
Printer.Print "單價" '註意: 此處“單價”對應“進貨價”
End If
If MSFlexGrid1.ColWidth(10) > 0 Then '第11列
Printer.Line (v11, A)-(v11, A + 450)
Printer.CurrentX = v11 + 20
Printer.CurrentY = A + 100
Printer.FontSize = 10
Printer.Print "金額"
Printer.Line (v12 + 10, A)-(v12 + 10, A + 450) '畫右堅邊線(封口)
End If
A = 1500 'A -------- 表主體縱向高度
Printer.Line (v1, A)-(v13, A) '畫橫線
If j = 1 Then 'k 每頁起始記錄控制
k = 1 'k=0 表示第1行,k=1 表示第2行
Else
k = (j - 1) * N + 1
End If
For i = k To j * N '內循環控制每頁打印-------------分頁打印
If MSFlexGrid1.ColWidth(0) > 0 Then '第1列 序號
Printer.Line (v1, A)-(v1, A + 450) '畫左堅邊線
Printer.CurrentX = 245
Printer.CurrentY = A + 100
Printer.FontSize = 10
If MSFlexGrid1.TextMatrix(i, 0) <> "" Then 'i=0 時為第1行,標題行
Printer.Print MSFlexGrid1.TextMatrix(i, 0)
End If
End If
If MSFlexGrid1.ColWidth(1) > 0 Then '第2列 藥品代碼
Printer.Line (v2, A)-(v2, A + 450)
Printer.CurrentX = v2 + 10
Printer.CurrentY = A + 100
Printer.FontSize = 10
If MSFlexGrid1.TextMatrix(i, 1) <> "" Then
Printer.Print MSFlexGrid1.TextMatrix(i, 1)
End If
End If
If MSFlexGrid1.ColWidth(2) > 0 Then '第3列 藥品名稱
Printer.Line (v3, A)-(v3, A + 450)
Printer.CurrentX = v3 + 10
Printer.CurrentY = A + 100
Printer.FontSize = 10
If MSFlexGrid1.TextMatrix(i, 2) <> "" Then
Printer.Print MSFlexGrid1.TextMatrix(i, 2)
End If
End If
If MSFlexGrid1.ColWidth(3) > 0 Then '第4列 規格
Printer.Line (v4, A)-(v4, A + 450)
Printer.CurrentX = v4 + 20
Printer.CurrentY = A + 100
Printer.FontSize = 10
If MSFlexGrid1.TextMatrix(i, 3) <> "" Then
Printer.Print MSFlexGrid1.TextMatrix(i, 3)
End If
End If
If MSFlexGrid1.ColWidth(4) > 0 Then '第5列 產地
Printer.Line (v5, A)-(v5, A + 450)
Printer.CurrentX = v5 + 50
Printer.CurrentY = A + 100
Printer.FontSize = 10
If MSFlexGrid1.TextMatrix(i, 4) <> "" Then
Printer.Print MSFlexGrid1.TextMatrix(i, 4)
End If
End If
If MSFlexGrid1.ColWidth(5) > 0 Then '第6列 批號
Printer.Line (v6, A)-(v6, A + 450)
Printer.CurrentX = v6 + 30
Printer.CurrentY = A + 100
Printer.FontSize = 10
If MSFlexGrid1.TextMatrix(i, 5) <> "" Then
Printer.Print MSFlexGrid1.TextMatrix(i, 5)
End If
End If
If MSFlexGrid1.ColWidth(6) > 0 Then '第7列 有效期
Printer.Line (v7, A)-(v7, A + 450)
Printer.CurrentX = v7 + 60
Printer.CurrentY = A + 100
Printer.FontSize = 10
If MSFlexGrid1.TextMatrix(i, 6) <> "" Then
Printer.Print MSFlexGrid1.TextMatrix(i, 6)
End If
End If
If MSFlexGrid1.ColWidth(7) > 0 Then '第8列 單位
Printer.Line (v8, A)-(v8, A + 450)
Printer.CurrentX = v8 + 30
Printer.CurrentY = A + 100
Printer.FontSize = 10
If MSFlexGrid1.TextMatrix(i, 7) <> "" Then
Printer.Print MSFlexGrid1.TextMatrix(i, 7)
End If
End If
If MSFlexGrid1.ColWidth(8) > 0 Then '第9列 數量
Printer.Line (v9, A)-(v9, A + 450)
Printer.CurrentX = v9 + 60
Printer.CurrentY = A + 100
Printer.FontSize = 10
If MSFlexGrid1.TextMatrix(i, 8) <> "" Then
Printer.Print MSFlexGrid1.TextMatrix(i, 8)
End If
End If
If MSFlexGrid1.ColWidth(9) > 0 Then '第10列 進貨價
Printer.Line (v10, A)-(v10, A + 450)
Printer.CurrentX = v10 + 150
Printer.CurrentY = A + 100
Printer.FontSize = 10
If MSFlexGrid1.TextMatrix(i, 9) <> "" Then
Printer.Print Format(MSFlexGrid1.TextMatrix(i, 9), "0.00")
End If
End If
If MSFlexGrid1.ColWidth(10) > 0 Then '第11列 金額
Printer.Line (v11, A)-(v11, A + 450)
Printer.CurrentX = v11 + 200
Printer.CurrentY = A + 100
Printer.FontSize = 10
If MSFlexGrid1.TextMatrix(i, 10) <> "" Then
Printer.Print Format(MSFlexGrid1.TextMatrix(i, 10), "0.00")
End If
TmpLowerPageMoney = TmpLowerPageMoney + Val(MSFlexGrid1.TextMatrix(i, 10)) '每頁合計金額
TxtPageLowerMoney = Round(TmpLowerPageMoney, 2)
Printer.Line (v12, A)-(v12, A + 450) '畫右堅邊線(封口)
End If
Printer.Line (v1, A + 450)-(v13, A + 450) '“本頁合計金額大寫”上邊橫線
A = A + 450 '行距每次增加 450
Next i '內循環結束
Printer.FontSize = 10
Printer.Line (v1, A + 450)-(v13, A + 450)
Printer.CurrentX = v1 + 300
Printer.CurrentY = A + 100
Printer.Print "本頁合計金額大寫 " & "" & Format(LabPageUpperMoney, "0.00") '每頁合計金額(大寫)
Printer.Line (v3 + 550, A)-(v3 + 550, A + 450) '“本頁合計金額大寫”右邊豎線
Printer.FontSize = 10
Printer.CurrentX = v9 + 60 'v1 + 7500
Printer.CurrentY = A + 100
Printer.Print "小寫: " & Format(TxtPageLowerMoney, "0.00") & "元" '每頁合計金額(小寫)
Printer.Line (v9, A)-(v9, A + 450) '“小寫:”右邊豎線
Printer.Line (v1, A + 450)-(v13, A + 450) '畫橫線
Printer.FontSize = 10
Printer.CurrentX = v1 + 20
Printer.CurrentY = A + 550
Printer.Print "備註"
Printer.Line (v2, A + 450)-(v2, A + 900) '“備註”右邊豎線
Printer.FontSize = 10
Printer.CurrentX = v9 + 60 'v1 + 7500
Printer.CurrentY = A + 550
Printer.Print "本次開票總金額: " & "" & Format(TxtWhm_4, "0.00") & "元" '總金額(小寫)
Printer.Line (v9, A + 450)-(v9, A + 900) '“本次開票總金額:”右邊豎線
Printer.Line (v1, A + 900)-(v13, A + 900) '畫底邊橫線
Printer.FontSize = 10
Printer.CurrentX = v1 + 10
Printer.CurrentY = A + 1000
Printer.Print "開票人:" & "" & TxtWhm_8.Text
Printer.FontSize = 10
Printer.CurrentX = v1 + 2200
Printer.CurrentY = A + 1000
Printer.Print "收貨人: 復核人: 送貨人:"
Printer.NewPage '新的壹頁
Printer.EndDoc '換頁
Next j '外循環結束
Call MsgBox("正在打印......!", vbOKOnly + vbInformation, "提示...")
End Sub
5.程序運行結果
程序運行效果如圖1所示,打印效果如圖2所示。
圖1 藥品入庫單窗體運行結果
圖2 藥品入庫單報表打印結果
四、 結束語
Printer是Visual Basic提供的壹個操作打印機進行基本打印操作的對象。通過它,可以實現強大的打印功能,可以自定義打印格式、打印頁數、表格的粗細和字體的大小等。編碼雖然稍微麻煩(需要進行多次坐標計算),但也是最靈活的報表打印方式之壹。作者在利用此方法設計《醫藥進銷存管理系統》中的入(出)庫單時,取得了很好的較果,大家可以根據自己開發MIS系統中報表打印的實際要求,借鑒此設計思路,實現屬於自己系統的報表打印。