夏 平 張 永
摘要 在一些進行數據計算的應用程序中,有時會生成有規律的數據,報表會把數據按需要的形式輸出,但報表一般都是跟數據庫聯合在一起使用的,這樣會對用戶使用帶來不便。本文結合作者本身進行程序開發的實踐經驗,簡要介紹了實現無數據庫報表打印的一般實現方法,重點對數組與記錄集的通信方法進行了探討。
關鍵詞 無數據庫;報表;實現;VB6.0
中圖分類號 TP392 文獻標識碼 A 文章編號 1674-6708(2009)07-0011-02
0 引言
在不使用數據庫技術的應用程序中,對計算得到的數據,如果符合表格特征,也可以像使用數據庫技術一樣,利用報表輸出令用戶滿意的結果文件。
解決以上問題的核心是記錄集對象。一般來說,記錄集是負責在數據庫和應用程序(也包含報表)之間通信的一個重要媒介。如果我們能將有規律的表格數據提供給記錄集,那就可以實現使用報表的目標了,對于報表來說,它并不會關心數據的來源是否是數據庫。在實際的程序設計中,二維數組或結構體數組等都是符合條件的有規律的表格數據。
本文結合實際,簡要介紹了在VB6.0開發環境中如何實現無數據庫報表打印功能。
1 技術實現過程
在某個應用系統開發過程中,需要將結構體數組中的數據使用報表輸出。大體的解決步驟是:先計算出數組中的數據,然后按數組的結構構造出空的記錄集結構,將數組中的數據追加到記錄集中,最后利用VB6.0自帶的報表輸出。完整的實現過程使用代碼描述如下:
1.1 記錄集定義及數組初始化
'定義初始記錄集,可以放在公共模塊中定義
Public rsobj As New Recordset
'定義結構體,可以放在公共模塊中定義,為簡單起見本結構體僅含有5個元素
Public Type typUser
Toothid As Integer
Caliber As Double
SideAngle As Double
THeight As Double
ApAngle As Double
End Type
'定義動態數組,用來保存計算的結果數據,可以放在公共模塊中
Public CatNum() As typUser
'在使用的時候使數組長度初始化,“ToothNum”為一預先計算值,加20是為了保證數組有足夠的容量
ReDim CatNum(ToothNum + 20)
'數組0行數據初始化,此處數組的數據計算是依據某種算法,讀者不必關注
CatNum(0).Toothid = 0
CatNum(0).Caliber = ToothDis / 2
CatNum(0).ApAngle = Atn((ToothDis / 2) / Focal)
CatNum(0).SideAngle = (Atn((Sin(CatNum(0).ApAngle)) / (n1 - Cos(CatNum(0).ApAngle))))
CatNum(0).THeight = Tan(CatNum(0).SideAngle) * ToothDis
'使用循環結構計算余下的數據行
For i = 1 To ToothNum - 1
CatNum(i).Toothid = (CatNum(i - 1).Toothid + 1)
CatNum(i).Caliber = ((ToothDis / 2) + (i * ToothDis))
CatNum(i).ApAngle = (Atn(CatNum(i).Caliber / Focal))
CatNum(i).SideAngle = (Atn((Sin(CatNum(i).ApAngle)) / (n1 - Cos(CatNum(i).ApAngle))))
CatNum(i).THeight = (Tan(CatNum(i).SideAngle) * ToothDis)
Next i
1.2 構造記錄集并導入數據
' rptMemberInfo為報表控件名,本行代碼為設置報表標頭中某個標簽項的輸出信息,其余以此類推
rptMemberInfo.Sections("Section4").Controls("Label11").Caption = " " + ProdName
'從初始記錄集按結構體數組格式構造出對應的記錄集格式
rsobj.Fields.Append " Toothid ", adVarChar, 6'為記錄集增加字段、指定數據類型和長度
rsobj.Fields.Append " Caliber ", adVarChar, 8
rsobj.Fields.Append " ApAngle ", adVarChar, 8
rsobj.Fields.Append " SideAngle ", adVarChar, 8
rsobj.Fields.Append " THeight ", adVarChar, 8
rsobj.Open
'利用循環將數組中的數據追加到記錄集中
For i = 0 To ToothNum - 1'計算循環次數
rsobj.AddNew'增加空白新記錄,然后從數組中導入數據
rsobj.Fields("Toothid ").Value = CatNum(i).Toothid
rsobj.Fields("Caliber ").Value = Format(CatNum(i).Caliber, "0.0000")
rsobj.Fields("SideAngle ").Value = Format((CatNum(i).SideAngle * 180) / Pi, "0.0000")
rsobj.Fields("THeight ").Value = Format(CatNum(i).THeight, "0.0000")
rsobj.Fields("ApAngle ").Value = Format((CatNum(i).ApAngle * 180) / Pi, "0.0000")
rsobj.MoveNext'移動指針至下一位置
Next i
1.3 實現數據報表輸出
'將記錄集作為報表的數據源,實現報表輸出“rptMemberInfo”為報表控件名
Set rptMemberInfo.DataSource = rsobj.DataSource
With rptMemberInfo.Sections("Section1").Controls
For i = 1 To rptMemberInfo.Sections("Section1").Controls.Count
If TypeOf .Item(i) Is RptTextBox Then
.Item(i).DataMember = ""
.Item(i).DataField = rsobj.Fields(i - 1).Name
End If
Next i
End With
2 總結
有些時候,應用系統僅僅是計算數據,并不需要用到數據庫。如果想使用報表來靈活輸出數據,以上所介紹的技術將是一個不錯的選擇。當然,這種技術方法僅僅適用于類似VB6.0這樣的傳統開發工具,在某些可以將二維表格直接與報表關聯的新型系統開發工具中,就不必這么麻煩的轉換了。
參考文獻
[1]蔡敏.Visual Basic數據庫開發工程案例.人民郵電出版社,2007.
[2]李春葆.Visual Basic程序設計教程.中國人民大學出版社,2008.
[3]Microsoft Corporation.Visual Basic 6.0 Programmer's Guide.北京希望電子出版社,1999.
[4]劉穎,常曉波譯.Visual Basic 6.0高級編程.清華大學出版社,2003.
重慶大渡口區科技獎勵大會52萬重獎科技工作者
近日,重慶市大渡口區政府召開的科技獎勵大會,用52萬元重獎科技工作者。
在獎勵大會上,該區政府表彰了1名科技功臣、3名突出貢獻科技工作者及12個科技項目,分別給予了2~6萬元不等的獎勵,獎勵金額共計52萬元。某街道工作人員在工作中創新,發明軟件為殘疾人提供個性化服務,獲得了政府2萬元獎勵。此外,該區還成立了由重慶郵電大學副校長、教授李銀國等13位專家組成的科技顧問團。據了解,顧問團成員今后將對企業進行技術診斷,對企業科技發展提出建設性意見,并參與企業申報的科技項目進行評審等。
科技獎勵大會在全區科技工作者引起強烈反,許多科技工作者和科技顧問團成員紛紛表示,大渡口區科技獎勵大會是在全區上下貫徹落實十七屆四中全會精神、全力以赴攻堅“止滑促增”之際召開,此舉必將激勵更多的人投身于提高科技自主創新能力、建設創新型國家中來,必將為增強我區自主創新能力、增強戰勝各種困難的信心和決心起到積極的推動作用。
科技顧問團副團長、重鋼集團公司總經理劉加才表示:大渡口區此次重金獎勵科技項目和科技人員,激勵作用非常大,充分顯示了區委、區政府對科技工作和科技工作者的一貫重視和關心。同時,他還從政府科技顧問的角度積極建言獻策,提出“四點建議和希望”:一是希望大渡口區進一步創造條件,加強高科技人才引進工作;二是希望進一步發揮政府的引導和主導作用,加強產、學、研結合;三是希望進一步加強科技投入,特別要加大新型科研項目的投入;四是希望加強與市科委等市級部門的協調,整合各方資源,建立研發、成果轉化平臺建設,降低研發成本,促進企業發展。
“科技功臣”獲得者——長征重工鄭興東在發言中講到:非常感謝大渡口區委、政府給予的這個最高榮譽,他認為這個榮譽不僅是獎勵給他個人的,更是獎勵戰斗在科技創新工作崗位上的所有同仁的。他說:沒有科技創新,就沒有長征重工的今天,就沒有大渡口的迅猛發展的今天。
“突出貢獻科技工作者”獲得者——湯捷說:作為一名私營企業的科技工作者,被評選為突出貢獻科技工作者感到無上榮光!隨著社會的不斷進步和發展,競爭會越來越激烈,企業發展如逆水行舟,不進則退,企業只有重視科技創新和技術進步,才能不斷地發展和壯大。
重慶理工大學副校長、區科技顧問石曉輝會后說:大渡口如此隆重獎勵科技工作者,對營造全社會尊重知識、尊重人才氛圍非常有益,他深受啟發,并建議大渡口區下一步要做好“產業”規劃,發展占地面積小,產值高,稅收多的高新技術企業;做好引智工作:做好產學研結合,設立專項,支持企業與科研院所合作的項目,將資金給科研院所,科研院所為企業做好智力支持。設立科技獎:對從事科學研究、成果轉化進行專項獎勵。
科技興國,全民關注,一些普通群眾會后也紛紛表示促動很大,原來以為科技創新離自己很遠,是科學家的事,這次從科技獎勵大會中看到了政府獎勵的科技項目中還有與民生密切相關的項目,使他們深深感受到了:科技創新近在身邊,處處留心都是學問。