WEB开发网      濠电姷鏁告繛鈧繛浣冲洤纾瑰┑鐘宠壘閻ょ偓銇勯幇鍫曟闁稿鍠愰妵鍕冀閵娧佲偓鎺楁⒒閸曨偄顏柡宀嬬畱铻e〒姘煎灡绗戦梻浣筋嚙濮橈箓顢氳濠€浣糕攽閻樿宸ュΔ鐘叉啞缁傚秹宕滆绾惧ジ寮堕崼娑樺缂佹宀搁弻鐔风暋閻楀牆娈楅梺璇″枓閺呯姴鐣疯ぐ鎺濇晝闁靛牆妫欓蹇旂節閻㈤潧浠﹂柛銊ョ埣楠炴劙骞橀鑲╋紱闂佽宕樼粔顔裤亹閹烘挸浜归梺缁樺灦閿曗晛螞閸曨垱鈷戦柟鑲╁仜婵″ジ鎮楀☉鎺撴珖缂侇喖顑呴鍏煎緞濡粯娅囬梻浣瑰缁诲倿寮绘繝鍥ㄦ櫇闁稿本绋撻崢鐢告煟鎼淬垻鈯曢柨姘舵煟韫囥儳绋荤紒缁樼箖缁绘繈宕橀妸褌绱濋梻浣筋嚃閸ㄤ即宕弶鎴犳殾闁绘梻鈷堥弫鍌炴煕閳锯偓閺呮瑧妲愬Ο琛℃斀闁绘劕妯婇崵鐔封攽椤旇棄鍔ら摶鐐烘煕閺囥劌澧柛娆忕箻閺屽秹宕崟顒€娅g紓浣插亾濠㈣泛顑囩粻楣冩煙鐎涙ḿ绠橀柨娑樼У椤ㄣ儵鎮欓鍕紙闂佽鍠栫紞濠傜暦閹偊妲诲┑鈩冨絻椤兘寮诲☉銏犖╅柕澶堝労閸斿绱撴担绋库偓鍝ョ矓瑜版帒鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘 ---闂傚倸鍊烽悞锔锯偓绗涘厾娲煛閸涱厾顔嗛梺璺ㄥ櫐閹凤拷
开发学院WEB开发综合 Access97的报表解决方案 阅读

Access97的报表解决方案

 2006-02-27 11:46:09 来源:WEB开发网 闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�闂傚倸鍊风粈渚€骞夐敓鐘插瀭闁汇垹鐏氬畷鏌ユ煙閹殿喖顣奸柛搴$У閵囧嫰骞掗幋婵冨亾閻㈢ǹ纾婚柟鐐灱濡插牊绻涢崱妤冃℃繛宀婁簽缁辨捇宕掑鎵佹瀸闂佺懓鍤栭幏锟�濠电姷鏁告慨顓㈠箯閸愵喖宸濇い鎾寸箘閹规洟姊绘笟鈧ḿ褍煤閵堝悿娲Ω閳轰胶鍔﹀銈嗗笂閼冲爼鍩婇弴銏$厪闁搞儮鏅涙禒褏绱掓潏鈺佷槐闁轰焦鎹囬弫鎾绘晸閿燂拷闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�  闂傚倸鍊烽懗鑸电仚缂備胶绮〃鍛村煝瀹ュ鍗抽柕蹇曞У閻庮剟姊虹紒妯哄闁圭⒈鍋嗛惀顏囶樄闁哄本娲樼换婵婄疀閺囩姷鐛ラ梻浣哄帶婢瑰﹥绂嶅⿰鍫氣偓鏃堝礃椤忎礁浜鹃柨婵嗛婢ь喖霉閻樻瑥瀚粻楣冩煕椤愩倕鏋庨柣蹇嬪劜閵囧嫰寮村Ο鍝勫Е濡炪們鍨洪悷鈺呭箖閳╁啯鍎熼柕鍥у簻閹凤拷
核心提示:利用OLE自动化解决ACESS97中文版报表生成器直线不能往下顺延的缺陷access97是一个非常优秀的数据库软件,它不仅能充当办公自动化的桌面数据管理工具,也是一个开发Client/Server产品的优秀前端开发工具.它的特点是易学易用、工具丰富、不需写大量代码就可以在很短的时间内开发出界面优美且功能强大的系统,长期
利用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下就行了。->

Tags:Access 报表 解决方案

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接