玩转报表打印设置
时 间:2015-08-25 08:27:44
作 者:在水一方 ID:20576 城市:沈阳
摘 要:access对报表的设置是非常简单的。对于票据等特殊尺寸的报表,如果更换打印机就会出现页面设置参数错误的问题,怎样才能固化页面设置的参数呢?
正 文:
PRT_LIST 获取打印机列表函数,
PAPER_LIST 获取指定打印机支持的纸张列表函数,
printRpt 自定义打印函数。
使用方法:创建表RPT_SETTING,储存各个报表的打印参数。使用printRpt 函数打印报表,打印时系统通过调用表RPT_SETTING储存的参数实现自由打印。
创建打印模块,创建打印函数
Option Compare Database Option Explicit Private Const DC_MAXEXTENT = 5 Private Const DC_MINEXTENT = 4 Private Const DC_PAPERNAMES = 16 Private Const DC_PAPERS = 2 Private Const DC_PAPERSIZE = 3 Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, lpDevMode As Any) As Long Private Type POINTS X As Long Y As Long End Type
Function PRT_LIST() As String ' 获取打印机信息 Dim strDefaultPrinter As String ' 包含默认打印机索引的变量。 Dim prt As Printer ' 包含打印机对象的变量 For Each prt In Application.Printers PRT_LIST = prt.DeviceName & ";" & PRT_LIST Next strDefaultPrinter = Application.Printer.DeviceName ' 记忆默认打印机。 End Function
Function PAPER_LIST(strPrnt As String) As String ' 获取纸张信息 On Error Resume Next Dim PAPER_item As String Dim i As Long, ret As Long Dim Length As Integer, Width As Integer Dim PaperNo() As Integer, PaperName() As String, PaperSize() As POINTS '支持最大打印纸: ret = DeviceCapabilities(strPrnt, "LPT1", DC_MAXEXTENT, ByVal 0&, ByVal 0&) Length = ret \ 65536 Width = ret - Length * 65536 '支持最小打印纸: ret = DeviceCapabilities(strPrnt, "LPT1", DC_MINEXTENT, ByVal 0&, ByVal 0&) Length = ret \ 65536 Width = ret - Length * 65536 '支持纸张种类数 ret = DeviceCapabilities(strPrnt, "LPT1", DC_PAPERS, ByVal 0&, ByVal 0&) '纸张编号 ReDim PaperNo(1 To ret) As Integer Call DeviceCapabilities(strPrnt, "LPT1", DC_PAPERS, PaperNo(1), ByVal 0&) '纸张名称 Dim arrPageName() As Byte Dim allNames As String Dim lStart As Long, lEnd As Long ReDim PaperName(1 To ret) As String ReDim arrPageName(1 To ret * 64) As Byte Call DeviceCapabilities(strPrnt, "LPT1", DC_PAPERNAMES, arrPageName(1), ByVal 0&) allNames = StrConv(arrPageName, vbUnicode) ' 遍历纸张的编号和名称 i = 1 Do lEnd = InStr(lStart + 1, allNames, Chr$(0), vbBinaryCompare) If (lEnd > 0) And (lEnd - lStart - 1 > 0) Then PaperName(i) = Mid$(allNames, lStart + 1, lEnd - lStart - 1) i = i + 1 End If lStart = lEnd Loop Until lEnd = 0 '纸张尺寸 ReDim PaperSize(1 To ret) As POINTS Call DeviceCapabilities(strPrnt, "LPT1", DC_PAPERSIZE, PaperSize(1), ByVal 0&) ' "纸张编号" & ";" & "纸张名称" & ";" & "宽度" & ";" & "高度" For i = 1 To ret PAPER_item = PaperNo(i) & ";" & PaperName(i) & ";" & PaperSize(i).X / 10 & ";" & PaperSize(i).Y / 10 ' MsgBox PAPER_item PAPER_LIST = PAPER_LIST & ";" & PAPER_item Next i PAPER_LIST = Mid(PAPER_LIST, 2) End Function
Function PrintRpt(ByVal strRptName As String, conStr As String, prtView As Integer) As Integer '自定义打印函数 On Error GoTo err Dim rpt As Report Dim strPrinter As String ' 打印机名称 Dim intPapersize As Integer ' 纸张编号 Dim intOrientation As Integer ' 打印方向 Dim intTop As Integer ' 上边距(mm) Dim intBottom As Integer ' 下边距(mm) Dim intLeft As Integer ' 左边距(mm) Dim intRight As Integer ' 右边距(mm) Dim prt As Printer ' 获取表"RPT_SETTING"中相关报表信息 strPrinter = Nz(DLookup("[PRINT_NAME]", "RPT_SETTING", "[REPORT_NAME]='" & strRptName & "'")) strPrinter = IIf(strPrinter = "", Application.Printer.DeviceName, strPrinter) ' 选择默认打印机 intPapersize = Nz(DLookup("[PAPER_CODE]", "RPT_SETTING", "[REPORT_NAME]='" & strRptName & "'")) intOrientation = Nz(DLookup("[PAPER_ORI]", "RPT_SETTING", "[REPORT_NAME]='" & strRptName & "'")) intTop = Nz(DLookup("[U_DIST]", "RPT_SETTING", "[REPORT_NAME]='" & strRptName & "'") * 56.7) intBottom = Nz(DLookup("[D_DIST]", "RPT_SETTING", "[REPORT_NAME]='" & strRptName & "'") * 56.7) intLeft = Nz(DLookup("[L_DIST]", "RPT_SETTING", "[REPORT_NAME]='" & strRptName & "'") * 56.7) intRight = Nz(DLookup("[R_DIST]", "RPT_SETTING", "[REPORT_NAME]='" & strRptName & "'") * 56.7) DoCmd.OpenReport strRptName, acViewPreview, , conStr, acHidden '隐式打开报表,以加载报表设置参数 Set rpt = Reports(strRptName) ' 将报表的页面设置为已定义好的页面设置。 rpt.Printer = Application.Printers(strPrinter) rpt.Printer.PaperSize = intPapersize rpt.Printer.Orientation = intOrientation rpt.Printer.TopMargin = intTop rpt.Printer.BottomMargin = intBottom rpt.Printer.LeftMargin = intLeft rpt.Printer.RightMargin = intRight If prtView = 0 Then '预览 DoCmd.OpenReport strRptName, acViewPreview, , conStr ElseIf prtView = 1 Then '打印 DoCmd.OpenReport strRptName, , , conStr DoCmd.Close acReport, strRptName, acSaveYes End If PrintRpt = 1 Exit Function err: DoCmd.Close acReport, strRptName PrintRpt = 0 End Function
实例:
If MsgBox("入院登记成功,是否打印住院押金收据?", vbYesNo, "") = vbYes Then Dim rptname As String rptname = "住院押金凭证入院_收款员" i = PrintRpt(rptname, "OPER_DATE = #" & OPER_DATE & "#", 1) If i = 0 Then MsgBox "报表【" & rptname & "】参数设置有错误,请联系管理员!", vbCritical, "系统提示" End If End If
Access软件网官方交流QQ群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- Access对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- Access判断多条明细的配方或订...(11.30)
- 如何让后台数据库在局域网共享时,且...(11.29)
- 【Access月初月末日期设置方法...(11.29)
- 【Access IIF函数嵌套示例...(11.26)
- Access快速开发平台--使用组...(11.25)
- Access快速开发平台--对上传...(11.22)
- Access快速开发平台企业版--...(11.18)
- 不会用多表联合查询,多表查询没结果...(11.16)
- 【案例分享】主键字段值含有不间断空...(11.16)
- Access快速开发平台--后台D...(11.14)