Access97的报表解决方案

卡卡塔拉拉

卡卡塔拉拉

2016-02-19 12:52

岁数大了,QQ也不闪了,微信也不响了,电话也不来了,但是图老师依旧坚持为大家推荐最精彩的内容,下面为大家精心准备的Access97的报表解决方案,希望大家看完后能赶快学习起来。
利用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下就行了。->

展开更多 50%)
分享

猜你喜欢

Access97的报表解决方案

编程语言 网络编程
Access97的报表解决方案

WEB环境下打印报表的crystal的解决方案

ASP
WEB环境下打印报表的crystal的解决方案

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

JSP报表打印的一种简单解决方案

Java JAVA基础
JSP报表打印的一种简单解决方案

JSP 报表打印的一种简单解决方案

Web开发
JSP 报表打印的一种简单解决方案

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

ACCESS97关于数据库安全的几个问题

电脑网络
ACCESS97关于数据库安全的几个问题

ajax后退解决方案

Web开发
ajax后退解决方案

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

动态加载和动态注册类技术的深入探索

动态加载和动态注册类技术的深入探索

在Delphi中获取和修改文件的时间

在Delphi中获取和修改文件的时间
下拉加载更多内容 ↓