Visual Basic 6.0 (VB6) 程式語言案例學習 (07. 收據列印程式)
Visual Basic 6.0 (VB6) 程式語言案例學習 (07. 收據列印程式)¶
7.1 問題¶
這是所有學校以及公司行號由來已久的問題,需要大量列印收據或者是股東會單的資料,原來的方式是使用點陣式印表機,然後列印三聯單,列印之前先將相關資料編輯成文字檔,核對正確之後,再開始列印。但問題是編輯的文字檔其實也是要依照用Excel所整理的資料整理的,這等於多做了一次工,因此需求是可以匯入原先就有的Excel檔,然後就可以列印。當然步驟流程越簡單越清楚是最好的,操作介面清楚明瞭,這是需求者的要求。
7.2 需求¶
表格 7‑1 「收據列印程式」系統目的分析表
版本:1.0 | 要做什麼 | 不要做什麼(不要做不代表不會做) |
---|---|---|
能做什麼 | (第一格:必要項目) | (第二格:次要項目) |
要能夠直接由Excel匯入程式中。 | 建立單據人員資料管理。 | |
要能夠列印到正確的位置。 | 每次列印的資料,都要保存下來,以免補單或者是需要單筆列印的時候,可以直接列印。 | |
要能夠大量列印。 | ||
金額的部分要能夠轉為國字大寫。 | ||
不能做什麼(不能做代表不需要做) | (第三格:不必要項目) | (第四格:不需要項目) |
具有歷史查詢功能,可查詢是否列印,或列印幾次。 | 能夠與學籍資料庫連線,獲得列印名單。 |
表格 7‑2 「收據列印程式」系統目標分析表
版本: | 重要 | 不重要 |
---|---|---|
優先 | (重) | (急) |
要能夠直接由Excel匯入程式中。 | 金額的部分要能夠轉為國字大寫。 | |
要能夠列印到正確的位置。 | ||
要能夠大量列印。 | ||
不急迫 | (輕) | (緩) |
建立單據人員資料管理。 | 每次列印的資料,都要保存下來,以免補單或者是需要單筆列印的時候,可以直接列印。 |
表格 7‑3 「收據列印程式」系統規格表
規格項目 | 規格內容 | 備註 |
---|---|---|
制定格式 | 請依照收據編號、捐款日期、立據日期、捐款者、統一編號、地址、金額(文字) 、用途、備註、小編號、學生姓名的欄位來建置Excel檔。 | … |
金額請使用文字型態編輯,方可轉成中文大寫。 | ||
匯入Excel | 要能夠將Excel檔匯入至Access資料庫中 | … |
預覽列印 | 要能夠預覽列印 | … |
直接列印 | 要能夠直接列印 | … |
7.3 特色¶
適用於大量列印收據,可以預覽以及直接列印,透過Excel所編輯好的資料檔,匯入程式之後,就可以連續不斷的列印收據,目前實測列印收據單可達一萬筆。
7.4 使用工具¶
語言 | 軟體 |
---|---|
MS Visual Basic | MS Visual Basic 6.0、MS Access、MS Excel |
7.5 系統架構¶
經由訪談得知使用者會操作Excel,因此這大大提升了需求解決的能力,有些問題不一定要全部由程式設計來解決,透過現有的能力,就可以解決。例如:單筆列印,這是用來補單或單據列印時卡紙重印,筆者認為不必特別將名單進行資料管理的工作,而只要透過Excel輸入單筆資料,就可以達成。因此這件工作就交由使用者來做就好了,程式設計可以將焦點放在列印單據上,而無須增加名單管理的功能,事實上對程式寫作也有好處,對系統流程來說更能增加準確性,因為倘若你將名單匯入之後,特別設計一個資料管理功能,那麼就會多了一次工程,而且往後名單人員異動,使用者是必還得更新原先的Excel資料,因為名單的Excel資料是既定的工作,除了Excel要改之外,資料庫名單也要再改一次,事實上是畫蛇添足了。因此整個系統架構,就變得單純,只要能夠匯入Excel資料,能夠直接或預覽列印即可。所以我們在分析系統的時候,也請務必把分析的階層提高到工作流程管理,這樣才知道施工是否有意義。否則變成徒勞無功了。
7.6 程式實作¶
Step 1:如圖 7-1,看得出來這是相當簡單的程式介面,使用者只要依照三個步驟就可以完成列印單據的工作。
圖 7‑1 收據列印程式版面配置
Step 2:重點程式碼說明,請參考以下程式原始碼。
‘預覽列印按鈕被點選事件副程式 Private Sub Command2_Click() ‘檢查檔案是否正確 If Len(Trim(Text1.Text & “”)) <= 0 Then labExcel_Message.Caption = “請指定檔案。” Exit Sub End If ‘檢查檔案是否存在 Dim objFso As FileSystemObject Set objFso = New FileSystemObject Text1.Text = Trim(Text1.Text & “”) If objFso.FileExists(Trim(Text1.Text) & “”) = False Then labExcel_Message.Caption = “檔案不存在。” Exit Sub End If Set objFso = Nothing ‘開始轉換 Dim strRet As String labExcel_Message.ForeColor = vbBlack labExcel_Message.Caption = “開始轉換。” DoEvents ‘建立Excel轉Access物件 Set objExcel = New clsExcel ‘開始將Excel工作表轉換為Access資料表 strRet = objExcel.ExportExcelSheetToAccess(“收據名單”, _ Text1.Text, _ “TestTablea”, _ App.Path & “\temp.mdb”) Set objExcel = Nothing If strRet <> “資料表轉換成功。” Then labExcel_Message.ForeColor = vbRed labExcel_Message.Caption = strRet Exit Sub End If labExcel_Message.ForeColor = vbBlack labExcel_Message.Caption = strRet ‘宣告資料庫物件 Dim objCnn_ADD As ADODB.Connection Dim objRst_ADD As ADODB.Recordset Dim strSQL As String ‘建立資料庫物件 Set objCnn_ADD = New ADODB.Connection Set objRst_ADD = New ADODB.Recordset ‘連接資料庫 strSQL = “Provider=Microsoft.Jet.OLEDB.4.0;” & _ “Data Source=” & App.Path & “\temp.mdb” & “;” & _ “Mode=Read|Write|Share Deny None;” & _ “Persist Security Info=False;” ‘開啟資料庫 objCnn_ADD.Open strSQL strSQL = “Select * From [TestTablea]” objRst_ADD.Open strSQL, objCnn_ADD, adOpenStatic, adLockPessimistic ‘設定報表資料來源 Set DataReport1.DataSource = objRst_ADD ‘將金額由阿拉伯數字轉為國字大寫 Do Until objRst_ADD.EOF If IsNull(objRst_ADD!金額) = False Then objRst_ADD!金額 = dfUpperCaseChineseNumber2(CCur(Trim(Str(objRst_ADD!金額) & “”))) End If objRst_ADD.Update objRst_ADD.MoveNext Loop ‘設定列印資料 ‘Do Until objRst_ADD.EOF DataReport1.Sections(1).Controls(“Label1”).Caption = “地址:台北縣中和市XX路XX號” DataReport1.Sections(1).Controls(“Label2”).Caption = “電話:(02)22XX-24XX” DataReport1.Sections(1).Controls(“Label3”).Caption = “捐款日期:” & objRst_ADD(“捐款日期”) DataReport1.Sections(1).Controls(“label4”).Caption = “立據日期:” & objRst_ADD(“立據日期”) DataReport1.Sections(1).Controls(“Label5”).Caption = “捐款者:” & objRst_ADD(“捐款者”) DataReport1.Sections(1).Controls(“Label6”).Caption = “統一編號:” & objRst_ADD(“統一編號”) DataReport1.Sections(1).Controls(“Label7”).Caption = “地址:” & objRst_ADD(“地址”) DataReport1.Sections(1).Controls(“Label8”).Caption = “金額:” & dfUpperCaseChineseNumber2(Ccur(Trim(objRst_ADD!金額 & “”))) & “” DataReport1.Sections(1).Controls(“Label9”).Caption = “用途:” & objRst_ADD(“用途”) DataReport1.Sections(1).Controls(“Label12”).Caption = “備註:” & objRst_ADD(“備註”) DataReport1.Sections(1).Controls(“Label21”).Caption = “地址:台北縣中和市XX路XX號” DataReport1.Sections(1).Controls(“Label22”).Caption = “電話:(02)22XX-24XX” DataReport1.Sections(1).Controls(“Label23”).Caption = “捐款日期:” DataReport1.Sections(1).Controls(“label24”).Caption = “立據日期:” DataReport1.Sections(1).Controls(“Label25”).Caption = “捐款者:” DataReport1.Sections(1).Controls(“Label26”).Caption = “統一編號:” DataReport1.Sections(1).Controls(“Label27”).Caption = “地址:” DataReport1.Sections(1).Controls(“Label28”).Caption = “金額:” DataReport1.Sections(1).Controls(“Label29”).Caption = “用途:” DataReport1.Sections(1).Controls(“Label32”).Caption = “備註:” objRst_ADD.MoveNext ‘顯示預覽 DataReport1.Show 1 ‘由您決定是否每次列印都要顯示訊息 If MsgBox(“”, vbYesNo, “是否要繼續?”) = vbYes Then Exit Do End If Loop ‘關閉資料庫 objRst_ADD.Close objCnn_ADD.Close ‘釋放記憶體空間 Set objRst_ADD = Nothing Set objCnn_ADD = Nothing End Sub
Step 3:程式執行結果,請參考如圖 7-2~7-3。
圖 7‑2 收據列印程式執行結果
圖 7‑3 預覽列印執行結果
7.7 修改重點¶
由於名單資料是由學籍資料庫匯出的,倘若您要將本程式修改為網路版,這是個很好的思考方向,當然修改成網路版等同於要增加名單管理功能,對於學校而言,你必須加入年級、班級…等群組,透過群組分類之後才是學生名單。對於公司而言,可能要依照縣市、地區…等分為群組,而後才是名單。當然有名單之後就可以透過勾選的方式,看是要列印勾選的群組或是單一名單,這樣對於使用者來說才有工作效率。除此之外,列印的部分就可以直接採用本程式的原始碼來修改,格式上也可以直接透過DataReprot來做調整,調整到您需要的位置,其餘的部分是不需要特別修改。這等於您花了一點小功夫做名單資料庫管理,卻有極大的效益,這才是我們所希望的。
7.8 結論¶
首先特別感謝Spencer Yang所提供的數字轉國字大寫程式,這讓我們方便許多。
有時候我們分析系統的時候,也可以把使用者的技能程度考慮在內,不一定全部都要程式來完成,就這個案例而言,倘若我們完成了名單管理,對於使用者來說只是不便而已,因為當名單異動的時候,他必須修改兩個地方,一個是Excel表,另外一個是名單管理。因此筆者認為這是必須簡化的部分,並且與需求者溝通,只要有道理,其實需求者還是可以接受。由於開發時程安排非常短,因此筆者並沒有提出網路版的架構,否則製作成網路版反而會變得相當方便,這是建議讀者思考的方向。
Lai Tai-Yu (賴岱佑)