标签:
vfp报表 |
分类: VisuralFoxProl |

VFP报表打印经验
1 我知道用 REPORT FORM ...
PROMPT
命令可以让用户为报表选择一个指定的打印机.但有没有办法让选定的打印机成为当前工作期中的默认打印机?
最简单的办法是用以下命令:
SET PRINTER TO NAME GETPRINTER()
以上命令会显示一个标准打印机对话框. 用户可以选择一个打印机,
该打印机将成为默认的打印机. 如果用户没有选择打印机而选择了取消,
原来默认的打印机不会被修改.
2
如果我象上面所述改变以默认打印机,
会不会影响到用户可能运行的其它 Windows 应用程序?
不会. SET TO PRINTER TO NAME 只影响
Visual FoxPro 的默认打印机, 不会影响 Windows 默认的打印机. 如果想让
Visual FoxPro 默认打印机与 Windows 默认的打印机一样,
执行以下命令:
SET PRINTER TO DEFAULT
3 GETPRINTER() 与 SYS(1037)
有什么不同?
另一个重要的区别是, GETPRINTER()
简单的返回用户选择的打印机的名字(如果没有选择则是一个空串) -
它并不实际改变选定的打印机. SYS(1037) 不返回任何东西,
但它会执行用户的选择. 例如,
如果用户选择了一个指定的激光打印机并设置进纸方式为手动,
那么这些选择会影响到后面打印的报表(除非在报表设计器中另外指定了不同参数或在
REPORT 命令中使用 PROMPT 子句).
4 在我的一个报表中,
我想让用户选择上纸盒或下纸盒.
但又不想让用户改变纸张大小和打印方向. 可能吗?
没有VFP 命令或函数可以达到这一目的.
唯一的办法是在运行时修改报表文件 (FRX 文件).
你可以在在运行时控制报表设置一文中找到相关细节.
好了, 我已读了那篇文件. 但它没有回答我的下一个问题.
怎样在第一页中选择上纸盒而其它页选择下纸盒?
你只能创建该报表的两个拷贝. 在报表设计器中用面面设置对话框选择纸源:
第一个拷贝用上纸盒, 另一个拷贝用下纸盒. 然后两次运行REPORT FORM
命令, 用RANGE 子句来选择报表页数:
REPORT FORM MyReport_Ver1 RANGE 1,1 NOCONSOLE
REPORT FORM MyReport_Ver2 RANGE 2 NOCONSOLE
以上命令将用MyReport_Ver1 打印第一页,用MyReport_Ver2
打印第二页及以后的页.
5 我想在预览窗口中显示报表,
但又想要用户单击报表预鉴工具条上的打印按钮时,打开打印对话框.
可能吗?
是的. 命令如下:
REPORT FORM MyReport TO PRINTER PROMPT PREVIEW
6 如何以编程方式最大化报表预览窗口?
象这样:
KEYBOARD "{ctrl+f10}"
REPORT FORM MyReport PREVIEW
7 我有一个 VFP
主窗口不可见的,作为顶层表单运行的应用程序,不幸的是,
这也意味着报表窗口的不可见. 怎么办?
在 VFP 5.0 中,
唯一的办法是在预览前直接恢复 VFP 窗口,并在预览后隐藏它.
代码如下:
_SCREEN.Visible = .T.
REPORT FORM MyReport PREVIEW
_SCREEN.Visible = .F.
在 VFP 6.0 中, 你可以在一个普通表单中预览报表.
它自己是一个顶层表单, 因此不必显示 VFP 主窗口. 要达到这一点,
创建一个叫做 frmPreview 的表单. 设置它的 ShowWindow 属性为 2
(作为顶层表单). 然后启动表单, 例如用 DO FORM 命令.
最后象这样预览你的报表:
REPORT FORM MyReport PREVIEW IN WINDOW frmPreview
8 我用带 FOR 子句的 REPORT
FORM 命令来打印一个表中的部分数据. 在很多情况下,
没有问题.
但当用户预览报表并单击预览工具条上的打印按钮时,
整个表中 的数据都被打印了.
这是 VFP 5.0 的一个 BUG.
在该情况下, 打印按钮不理会象下面一样的命令中的 FOR 子句:
REPORT FORM customers PREVIEW FOR country = "UK"
解决办法是用筛选代替:
SET FILTER TO country = "UK"
REPORT FORM customers PREVIEW
SET FILTER TO
该 bug 在 VFP 5.0a 中已修正.
9 我想用报表设计器来生成发票.
一些发票会包含多个页.
怎样使发票合计每张发票的最后一页的底部?
RECNO()=RECCOUNT()
这会使合计只在最后一条记录时打印.
(该情况假设你为每一张发票使用一个单独的临时表或游标,
且没有设置排序.)
10
如果用户在一个没有安装打印驱动程序的电脑上运行我的程序,会发生什么情况?
在执行与打印相关的任务时会产生一个或多个运行时错误.
典型的错误是 "打印机未准备好", "载入打印驱动程序错", 两个.
它们会在应用程序打印报表时出现, 也会在执行 SET PRINTER,
GETPRINTER() 和其它相似的命令或函数时发生,
但幸运的是可以预览报表.
要避免这些运行时错误, 在执行与打印相关的任务前,检查 APRINTERS()
函数的返回值. 如果该值为零, 就意味着未安装打印驱动程序.
11 能否废止或移去报表预览工具条上的打印按钮?
要移去VFP
内置的工具条上的按钮, 在开发环境中打开工具条, 按住Alt 键,
将按钮拖离工具条. 该设置保存在资源文件中 (FOXUSER.DBF 和
FOXUSER.FPT),
因此要使该设置在用户系统上生效,你必须将这两文件复制到用户系统中.
12 我想在报表中包含页数,
例如, "共 Y 页第 X 页", Y
是报表总页数,X是当前页号. 可能吗?
唯一的办法是运行该报表两次,
象这样:
nTotalPages = 0
REPORT FORM MyReport NOCONSOLE
nTotalPages = _pageno
REPORT FROM MyReport TO PRINT NOCONSOLE
第一次不会实际打印任何东西 (因为没有使用TO PRINT 子句),
但该过程会将报表总页数放入 VFP 的系统内存变量 _pageno 中. 要打印"共
Y 页第 X 页", 报表中应包含以下表达式:
"共 "+ ALLTRIM(STR(nTotalPages))+ " 页第 "+ALLTRIM(STR(_pageno)) +"
页"
13 我使用 Microsoft Web Browser
控件来显示 HTML 页. 怎样打印页呢?
Web Browser 控件没有Print 方法.
但是你可以用它的ExecWB 方法来打印当前文档. 通常,
该方法将执行browser 用户界面的通常可用的命令.
你的代码可应该象这样:
THISFORM.WebBrowser.ExecWB(6,1)
第一个参数, 6, 告诉method 你想进行打印. 第二个参数设置为 1, browser
将显示一个打印对话框(象Internet Explorer 中那个一样).
若不想显示该对话框, 设置该参数为2
14如何计算报表内的行数?
答你可以使用报表变量来计数报表的行数。从报表菜单中选择"变量"来建立一个报表变量。给报表变量取一个名字并增加一个
IIF() 函数到变量。作为逻辑表达式的 IIF()
函数,为你要计数的字段指定条件:
第一个 IIF() 函数返回值指定 1。
第二的 IIF() 函数返回值指定 0。
例如,下列 IIF() 函数用于计数州名为华盛顿的记录(State =
'WA')的记录数。
IIF(State = 'WA', 1, 0)
选择"求和" 按钮,
并保存报表变量.放入一个字段到报表的分组或页脚带,并为报表表达式指定报表变量。
当报表被预览或打印后,该字段显示一个符合在 IIF()
函数中指定条件的记录数.
一组经常要用到的VFP命令与函数。
01. select :
SELECT distinct zsbh2003.zg from zsbh2003
&&相同的记录只显示一次
SELECT distinct zsbh2003.zg from zsbh2003 INTO array mm
&&相同的记录只显示一次,并保存于数组中
SELECT distinct zsbh2003.zg from zsbh2003 INTO cursor temp
&&相同的记录只显示一次,并保存于虚拟暂存表中
SELECT distinct zsbh2003.zg from zsbh2003 INTO table temp
&&相同的记录只显示一次,并保存于表中
? _tally
02. replicate( )
函数
REPLICATE(cExpression, nTimes)
03. report 命令
根据 MODIFY REPORT 或 CREATE REPORT 创建的报表定义文件显示或打印报表。
REPORT FORM FileName1 | ?
参数描述
FileName1: 指定报表定义文件的名称。
?: 显示"打开"对话框,从中可选择报表文件。
Scope:
指定要包含在报表中的记录范围。只有在指定范围内的记录才包括在报表中。Scope
子句有:ALL、NEXT nRecords、RECORD nRecordNumber 和 REST。有关
scope 子句的详细内容,请参阅帮助中的Scope 子句和语言概述。
REPORT 的默认范围是所有记录(ALL)。
FOR lExpression1只有使表达式 lExpression1 的计算值为"真"(.T.)
的记录,才打印其中的数据。包括 FOR 可以筛选出不想打印的记录。
如果 lExpression1 是一个可优化表达式,Rushmore 将优化 REPORT FOR
命令。为获得最佳运行性能,应在 FOR 表达式中使用可优化表达式。
详细内容,请参阅稍后的 SET OPTIMIZE 命令与《Microsoft Visual FoxPro
6.0 中文版程序员指南》第十五章"优化应用程序"中的"掌握 Rushmore
技术"。
WHILE lExpression2指定一个逻辑表达式 lExpression2
作为打印数据的条件。只要 lExpression2条件计算为"真" (.T.)
,就打印记录中的数据,直至遇到使表达式不为"真"(.T.)
的记录为止。
HEADING cHeadingText:指定放在报表每页上的附加标题文本。如果既包括 HEADING 又包括了PLAIN,应把 PLAIN 子句放在前面。
NOCONSOLE:当打印报表或将报表传输到一个文件时,不在 Visual FoxPro 主窗口或用户自定义窗口中显示有关信息。
PLAIN:
指定只在报表开始位置出现的页标题。
RANGE nStartPage [, nEndPage]: 指定要打印的页码范围。nStartPage 指定了要打印的第一页;nEndPage 指定了要打印的最后一页。如果省略 nEndPage,则要打印的最后一页默认为9,999。
PREVIEW [[IN] WINDOW WindowName | IN SCREEN] :以页面预览模式显示报表,而不把报表送到打印机中打印。要打印报表,必须发出带 TO PRINTER 子句的 report 命令。
请注意:当命令中包括 PREVIEW 子句时,忽略系统变量。
使用可选的 WINDOW 或 IN WINDOW 子句中,您可以指定一个窗口 WindowName,报表输出到这个窗口中。该窗口可由 DEFINE WINDOW 命令定义。如果包含WINDOW 子句,则使用 WindowName 指定的窗口的特性(例如标题、大小等等)进行预览。如果包含了 IN WINDOW 子句,则在 WindowName 指定的窗口中预览报表。
包含可选的 IN SCREEN 子句,表明报表预览窗口位于 Visual FoxPro 主窗口中,并且不能移动到外面去。
可以在命令中包括可选的 NOWAIT 子句。这时,Visual FoxPro 能够在运行程序时不等待关闭页面预览窗口就继续执行程序。也就是说,当页面窗口打开时,Visual FoxPro 继续运行程序。
在已发布的应用程序中,应确保可以得到"查看"菜单。关掉打印预览工具栏时,如果没有"查看"菜单,将无法恢复"打印预览"工具栏。
TO PRINTER [PROMPT]: 把报表输送到打印机打印。在 Visual FoxPro 中,命令中可以包括可选的 PROMPT 子句,在打印开始前显示设置打印机的对话框。可调整的打印设置项取决于当前安装的打印机驱动程序。PROMPT 子句应紧跟在 TO PRINTER 子句之后。