圣安地列斯秘籍一击:VFP打印和报表经验

来源:百度文库 编辑:中财网 时间:2024/04/29 04:23:46
  VFP中的Grid表格用法  VFP函数大全

VFP打印和报表经验  

2011-05-30 12:18:40|  分类: 转摘 |  标签:报表  vfp  打印机  form  对话框   |字号大中小 订阅

本文引用自gdz516《VFP打印和报表经验》 

VFP打印和报表经验

                                      

这是一组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) 打开完整的页面设置对话框. 在这里, 用户可以选择打印机, 页大小, 进纸源和打印方向.
另一个重要的区别是, 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 我想用报表设计器来生成发票. 一些发票会包含多个页. 怎样使发票合计每张发票的最后一页的底部? 如果把它放在概要(summary)带中, 它只在细节带的最后一行打印. 如果把它放在页脚带中, 它又在每一页中都打印出来.

将合计放在页脚带中其它的字段和标签的下面. 在报表表达式对话框中, 单击打印条件按钮, 然后在满足以下条件时打印文本框中输入:
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() 函数中指定条件的记录数.