程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> Access97的報表解決方案

Access97的報表解決方案

編輯:VB綜合教程
利用OLE自動化解決ACESS97中文版報表生成器直線不能往下順延的缺陷
  
  ACCESS97是一個非常優秀的數據庫軟件,它不僅能充當辦公自動化的桌面數據管理工具,也是一個開發Client/Server產品的優秀前端開發工具.它的特點是易學易用、工具豐富、不需寫大量代碼就可以在很短的時間內開發出界面優美且功能強大的系統,長期以來受到廣大開發者的青睐。但筆者在使用時發現其報表生成器中有一個明顯不適合我國國情的缺陷,就是當設置報表DETAIL節上的字段長度因為橫向空間不夠而設為自動向下順延(CanGrow屬性為True)時,如果字段旁有豎線(國內大部分公文報表都有豎線,而國外則很少有),則豎線不能和字段一起向下順延。使整個報表看起來不美觀。這個缺陷在ACCESS2.0和ACCESS97中文版上都有,而在FoxPro2.5B/3.0/5.0下卻沒有。據微軟技術服務部的工作人員說是由於本地化時測試不夠原因所致。為此,筆者在ACCESS內采用了OLE自動化!
  方法,將ACCESS97查詢生成的表送交EXCEL97進行處理(分類匯總、打印、預演),較好地解決了這個問題。由於ACCESS97和EXCEL97的VBA在97版本上幾乎完全兼容,在EXCEL97下錄制的宏代碼只需在ACCESS下稍加修改就行了,所以采用此方法和用內部報表生成器設計所用的時間差不多。整個工作需要下面幾步:
  在EXCEL97下設計好報表的樣式,包括表頭、頁眉、頁碼等,對需要自動翻轉的列,在"單元格格式設置"下設為"自動換行"。
  在EXCEL97下錄制好當數據送入後進行的操作宏(如分類匯總、加邊框線,加空行、打印輸出、預演等動作)。
  在ACCESS下用VBA語句和DAO對象的方法將數據送入EXCEL表內,並將EXCEL下宏操作變成ACCESS下的語句。
  以下是ACCESS97下的程序代碼,實際應用程序界面是一個對話框屏幕(FORM),上面有五個下拉框(Comb_)和一個文字框(Text),由用戶選擇相應的信息,然後用戶按"確定"命令按鈕執行程序。其中有些屬性和方法在ACCESS2.0下不能使用,可采用相應的語句.
  PrivateSub確認_Click()
  OnErrorGoToErrorHandler
  DimstDocNameAsString
  DimkAsInteger
  stDocName="Pqry_YEAR"
  DoCmd.OpenQuerystDocName'從原始表內根據用戶輸入的信息條件運行"生成表查詢",生成一個供打印用的表.
  '增加空記錄處理--為了保證記錄數少時也打印整張表.
  
  
  IfVal(Me![Comb空行])>0Then'如果用戶輸入了大於0的數值,表示加空行
  
  
  Fork=1ToVal(Me![Comb空行])
  CurrentDb.Execute"INSERTINTOPqry_YEAR
  (項目類)VALUES('空行空行空行');"
  Nextk
  EndIf
  DimmsgVarAsInteger
  '定義EXCEL對象變量
  '------------------------------
  DimxlobjAsObject
  DimxlsheetobjAsObject
  DimxlrangeAsObject
  '------------------------------
  '定義ACESS記錄集對象變量
  DimdbsAsDatabase,rstAsRecordset
  DimstrSQLAsString
  DimrecTotal,fieldTotalAsInteger'recTotal:
  表示該表內記錄總數;
  fieldTotal表示字段總數
  Dimi,jAsInteger
  i=0
  j=0
  'Returnreferencetocurrentdatabase.
  Setdbs=CurrentDb'當前數據庫
  Setrst=dbs.OpenRecordset("Pqry_YEAR")'選擇記錄集
  recTotal=rst.RecordCount'得出記錄數
  fieldTotal=rst.Fields.Count'得出字段數
  '----------------------------------
  '建立EXCEL對象
  Setxlobj=CreateObject("Excel.Application.8")
  '打開設計好的EXCEL表--REPORT.XLS
  xlobj.Workbooks.OpenFileName:=pPathname&"REPORT.xls"
  Setxlsheetobj=xlobj.ActiveWorkbook.Worksheets("REPORT")
  '指向工作表
  '如果是改動過的表,不再打開
  IfMsgBox("當前打印表格文件中已有數據,
  是否需要更新?"
  &Chr(13)&_
  "提示:只有對數據進行改動後,才需要更新.",68)
  =vbYesThen
  DoCmd.HourglassTrue'由於時間較長,
  將鼠標設為沙漏形狀
  xlsheetobj.Rows("5:200").Select'選定區域
  xlobj.Selection.DeleteShift:=-4162'
  注意!原錄制宏中-4162為xlnone,是EXCEL97的常量,但在ACCESS下卻不認,只能到EXCEL下的對象浏覽器去查詢對應的常數.
  '開始向EXCEL傳送數據
  DoUntilrst.EOF
  Forj=1TofieldTotal
  xlsheetobj.cells(5 i,j).Value=rst.Fields(j-1)
  Nextj
  rst.MoveNext
  i=i 1
  Loop
  rst.Close
  
  '在EXCEL中調整,具體常數參見EXCEL下的對象浏覽器
  xlsheetobj.Range("A4:Q"&Trim(Str(recTotal 4))).
  Select'選定范圍
  '以下為設置邊框線錄制的宏代碼,已刪除了相似的語句.
  xlobj.Selection.Borders(5).LineStyle=-4142
  xlobj.Selection.Borders(6).LineStyle=-4142
  Withxlobj.Selection.Borders(7)
  .LineStyle=1
  .Weight=-4138
  .ColorIndex=-4105
  EndWith
  
  Withxlobj.Selection
  '確定是合計在表上還是在表尾
  IfMe![Fram位置]=1Then
  .SubtotalGroupBy:=2,Function:=-4157,
  TotalList:=Array(6,9,10,_
  11,12,13,14,15,16),Replace:=True,
  PageBreaks:=False,_
  SummaryBelowData:=False
  Else
  .SubtotalGroupBy:=2,Function:=-4157,
  TotalList:=Array
  (6,9,10,_
  11,12,13,14,15,16),Replace:=True,
  PageBreaks:=False,_
  SummaryBelowData:=True
  EndIf
  EndWith
  '根據用戶的選擇設置頁眉和頁尾。
  Withxlsheetobj.PageSetup
  .LeftHeader=""&Chr(10)&""&Chr(10)&"
  "&Mid(Me![Cmbo單位],4)
  .CenterHeader="&""宋體,加粗""&18"&Me!
  [Cmbo年度]&"年"&Mid(Me![Cmbo類別],4)&"XXX表"
  EndWith
  xlsheetobj.Range("A1").Select
  '將空行內容清掉
  k=Val(Me![Comb空行])
  IfVal(Me![Comb空行])>0Then
  DimcontentAsString
  i=5
  content=xlsheetobj.cells(i,2).formulaR1C1
  DoWhileInStr(1,content,"空行空行空行")=0
  i=i 1
  content=xlsheetobj.cells(i,2).formulaR1C1
  Loop
  xlsheetobj.Range("B"&Trim(Str(i-k 5))&":"&"Q"
  &Trim(Str(i 5))).Select
  xlobj.Selection.ClearContents
  xlsheetobj.Range("A1").Select
  EndIf
  
  Else'不更新
  xlsheetobj.Activate
  EndIf
  xlobj.ActiveWindow.SelectedSheets.PrintPreview'預演報表
  '如為打印:xlobj.ActiveWindow.SelectedSheets.PrintOut
  DoCmd.HourglassFalse'恢復鼠標形狀
  xlobj.Visible=True'讓EXCEL可見
  清除對象變量空間,節省內存
  Setdbs=Nothing
  Setxlobj=Nothing
  xlobj.quit'關閉EXCEL
  ExitSub
  ErrorHandler:'出錯處理
  DoCmd.HourglassFalse
  MsgBox"Errornumber"&Err.Number&":"&Err.Description
  'Resumewithstatementfollowingoccurrenceoferror.
  ResumeNext
  EndSub
  通過這個例子我們看到在OFFICE97下利用OLE自動化擴展應用程序的功能是多麼方便和強大。用EXCEL完成的報表的優點是格式美觀,修改方便.缺點是第一次生成EXCEL表格時速度較慢.
  本例是用EXCEL對數據進行報表操作,其實也可參照此例的方法在EXCEL上建立圖形統計、財務分析、數據透視表分析等應用程序,只要在EXCEL下錄制相應的宏,再加到ACCESS下就行了。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved