CSDN-CSDN社区-其他数据库开发-VFP

收藏 VFP的报表打印功能[问题点数:10,结帖人:wenlian_xu]

楼主发表于:2007-08-01 13:18:58
以前我都是用如下指令打印
set   print   on  
set   devi   to   print
@1,0   say   文本行1
@2,0   say   文本行2
...
...
...
eject
set   print   to
set   print   off
set   deve   to   scree
其中文本行中有数据表的内容。

现在我想用报表打印实现,可选择打印机和打印纸,并可预览。请问报表打印的系列命令有哪些?
回复次数:15
#1楼 得分:0回复于:2007-08-01 13:40:45
我特别想知道具体的思路,到底怎么搞?我打印的数据表往往是动态数据库,以sys(2015)命名的数据库,关闭表单的同时也就关闭了数据表。
#2楼 得分:10回复于:2007-08-01 13:41:17
REPORT   FORM   命令  
请参阅  

显示或打印一个由报表定义(.frx)文件指定的报表。该定义文件是由   CREATE   REPORT   或   MODIFY   REPORT   之类的命令所创建的。

REPORT   FORM   命令也可以识别   Visual   FoxPro   标签文件(lbx   格式)并像报表文件一样处理。你也可以使用   REPORT   FORM   来运行以前在   FoxPro   for   MS-DOS   中创建的基于字符方式的报表文件。

 
REPORT   FORM   FileName1   |   ?   [ENVIRONMENT]   [Scope]  
      [FOR   lExpression1]   [WHILE   lExpression2]   [NOOPTIMIZE]
      [RANGE   nStartPage   [,   nEndPage]]
      [HEADING   cHeadingText]   [SUMMARY]   [NORESET]   [PLAIN]
      [NOCONSOLE   |   OFF]   [PDSETUP]  
      [NAME   ObjectName]  
      [OBJECT   oReportListener   |   TYPE   iExpression]
      [TO   OutputDestination   [NODIALOG]]  
      [PREVIEW   [PreviewDestination]   [NOWAIT]   [WINDOW   WindowName]]
 

参数
FileName1   |   ?  
指定一个报表定义(.frx)文件的名称或者显示一个打开对话框以便你从中选择一个   .frx   文件。默认情况下,报表显示在当前输出窗口中。   注意:  
报表文件的默认扩展名是   .frx。如果这个   .frx   文件不在当前目录或文件夹下,则你必须包括它的路径名。从   Visual   FoxPro   7.0   开始,当你使用了   TO   子句时,FileName1   会包含在状态消息框中。如果你不希望它出现,请参见   对   TO   子句的描述。  
   

[ENVIRONMENT]  
即使   AutoOpenTables   属性被设置成假值(.F.),它也会打开并恢复该报表的数据环境中已定义的所有表和表之间的关联。   注意:  
ENVIRONMENT   关键字是为兼容性保留的,例如,报表是从一个早期版本的   FoxPro   中转换过来的时候。  
   
要恢复与一个   Visual   FoxPro   报表关联的数据环境,请设置数据环境的   AutoOpenTables   属性为真(.T.)   (默认值)。要确保报表运行结束时报表环境被关闭,请设置数据环境的   AutoCloseTables   属性为真(.T.)   (默认值)。更多的信息,请参见   AutoOpenTables   属性   和   AutoCloseTables   属性。  
[Scope]  
指定报表要处理的记录范围。报表只会处理指定所用于范围内的记录。   注意:  
当你包含了一个   Scope   子句时,这个作用域操作符只对当前活动工作区起作用。  
   
下面的表格列出了可能的   Scope   值。   作用域   说明  
ALL
  包括所有记录。(默认值)
 
NEXT   nRecords
  包含从当前记录开始的以下   nRecords   条记录。
 
RECORD   nRecordNumber
  只包含指定的记录。
 
REST
  包含从当前记录开始直到最后的一条记录。
 
有关作用域子句的更多信息,请参见Scope   子句。  
[FOR   lExpression1]  
只有当逻辑表达式   lExpression1   计算值为真时的那些记录将被打印。通过使用   FOR   子句,可以排除你不希望打印的记录。   提示:  
如果   lExpression1   是一个可优化的表达式,Rushmore   查询优化器会优化带   FOR   子句的   REPORT   FORM   命令。为了得到最佳性能,请使用一个可优化的   FOR   子句。更多的信息,请参见   SET   OPTIMIZE   和   使用   Rushmore   查询优化来加速数据访问。    

[WHILE   lExpression2]  
只打印当逻辑表达式   lExpression2   计算值为真(.T.)时的数据。  
[NOOPTIMIZE]  
禁止对   REPORT   FORM   命令使用   Rushmore   优化。更多的信息,请参见   SET   OPTIMIZE   和   使用   Rushmore   查询优化来加速数据访问。  
[RANGE   nStartPage   [,   nEndPage]]  
指定要打印或其它输出方式的页号范围。nStartPage   参数指定要打印的第一页,打印直到   nEndPage   参数指定的最后一页为止。如果省略   nEndPage   参数,   最后一页的默认值是   32,767。   注意:  
RANGE   子句选择要输出的页,作用域子句   FOR,WHILE   选择记录。如果你选择了打印预览,这些选择标准不会起作用,除非你   通过   OBJECT   子句或   SET   REPORTBEHAVIOR   90   命令指定了对象-辅助模式。在对象-辅助模式下,你既可以在原始的   REPORT   FORM   命令中使用所有的   RANGE   子句,也可以指定要打印的页范围子集(使用   ReportListener.CommandClauses   的   PrintPageCurrent,PrintRangeFrom,以及   PrintRangeTo   成员)。更多的信息,请参见   OnPreviewClose   方法。  
   

[HEADING   cHeadingText]  
指定要做为一个附加题头放置在报表每一页上的文本。如果你同时包含了   HEADING   子句和   PLAIN   关键字,PLAIN   关键字优先处理。  
[SUMMARY]  
禁止打印细节行,这样就会只打印合计和子合计项目。  
[NORESET]  
指定不重置   _PAGENO   和   _PAGETOTAL   系统内存变量。当前报表将使用这两个变量的当前值做为起始值。更多的信息,请参见   _PAGENO   系统内存变量   和   _PAGETOTAL   系统内存变量。   注意:  
如果你同时使用了   NORESET   和   RANGE   关键字,你必须预先计算哪些页要打印。  
   

[PLAIN]  
禁止打印除报表开始时以外的所有页题头。  
[NOCONSOLE   |   OFF]  
在打印报表或将它发送给一个文件时,禁止在   Visual   FoxPro   主窗口或一个用户定义窗口中显示它的内容。   注意:  
当你使用   Visual   FoxPro   9.0   的对象-辅助输出模式时,REPORT   FORM   不会在当前输出窗口中显示你的报表内容,所以   NOCONSOLE   和   OFF   关键字对原始的行为没有影响。但是,该关键字可以在ReportListener   对象的   CommandClauses   中使用。你可以在你的报表监听器派生类中测试它们,并可选的禁止显示报表内容或其它基于这些内容的用户反馈。更多的信息,请参见   CommandClauses   属性。  
   

[PDSETUP]  
装入一个打印机驱动设备设置。可以包含   PDSETUP   为创建于   FoxPro   for   MS-DOS   的基于字符的报表使用一个打印机驱动程序设置。当你在   Visual   FoxPro   中创建了基于图形的报表时,PDSETUP   将被忽略。  
[NAME   ObjectName]  
指定一个与报表的数据环境关联的对象变量名。   注意:  
数据环境以及数据环境中的对象拥有属性和方法,例如像   AddObject   方法,可以在运行是设置或调用它们。对象变量用于提供对这些属性和方法的访问。  
   
如果你省略了   NAME   子句,Visual   FoxPro   使用报表文件的名字替代它,可以在相关事件的代码中引用它。  
[OBJECT   oReportListener   |   TYPE   iExpression   ]  
调用   Visual   FoxPro   的对象-辅助输出模式。既可以使用一个基于报表监听器基本类(ReportListener)的对象引用,也可以是一个指定输出类型的数值。在一个   REPORT   FORM   命令上   OBJECT   子句指定的值优先于   SET   REPORTBEHAVIOR   的设置。更多的信息,请参见   ReportListener   对象,ListenerType   属性   和   OutputType   属性(Visual   FoxPro)。  
[TO   OutputDestination   [NODIALOG]]  
指定报表的输出目标。要禁止运行时显示的状态信息框,请包含   NODIALOG   关键字。   注意:  
在对象-辅助输出模式下,NODIALOG   将在报表运行期间设置ReportListener   对象的   QuietMode   属性为   .T.。更多的信息,请参见   QuietMode   属性。  
   
下面的表格描述了   OutputDestination   的可能取值。   OutputDestination   说明  
[PRINTER   [PROMPT]   [NOPAGEEJECT]   [NOEJECT]]
  将报表发送到打印机。

要在开始打印前显示打印对话框,请包含   PROMPT   关键字。在对象-辅助模式下,该选项是否可用受   ReportListener.CommandClauses.PrintPageCurrent   成员的值影响。

要指定   Visual   FoxPro   在报表结束时不强行弹出打印页并且不关闭打印工作队列,请包含   NOPAGEEJECT   关键字。下一个被打印的报表将被附加在当前已打开的打印工作队列上。

你必须确保最后被打印的报表没有使用   NOPAGEEJECT   子句,只有这样才能关闭打印工作。

NOPAGEEJECT   仅在程序执行期间有效。如果在“命令”窗口中使用则将被忽略。在此运行期间不支持改变页面方向,例如试图将页面从纵向改变为横向。

你可以使用   NOPAGEEJECT   来链接多个报表并且从一个报表转到下一个报表时页号也会连续。这种技术对于像传真报表等工作是非常有用的。

REPORT   FORM   命令也允许使用一个   NOEJECT   关键字,那是   Visual   FoxPro   不再支持的关键字,用于早期的   DOS   版   FoxPro   和   FoxBASE+。该关键字不会执行任何功能但也不会触发错误。
 
[FILE]   FileName2   [[ADDITIVE]   ASCII]
  指定报表要发送到的文本文件名称。该文件的默认扩展名是   .txt。

当你省略了   ASCII   关键字或使用   Visual   FoxPro   的对象-辅助输出模式时,它会将报表内容连同   PostScript   脚本或其它打印机代码输出到这个文本文件,要使用这个报表定义文件来创建一个   ASCII   文件文件,请   SET   REPORTBEHAVIOR   80   并包含   ASCII   关键字。

注意:  
当你包含了   ASCII   关键字时,你可以在一台没有安装打印机驱动程序的电脑上处理这个报表。不使用   ASCII   关键字,REPORT   FORM   命令在一个没有安装打印机驱动程序的电脑上执行时会产生一个错误。  
   

一个   ASCII   文件中只能包含文本。如果报表是创建于   FoxPro   for   MS-DOS   下的一个基于字符的布局面板,破折号和加号可能会被包含在文件中代表线条和形状。此外,报表定义文件中任何字体或颜色设置,图形,线条,矩形,或者圆角矩形都不会出现在这个   ASCII   文本文件中。你可以使用   _ASCIICOLS   和   _ASCIIROWS   系统内存变量来指定每行可以放置的字符数以及每页可以放置的行数。这些变量的默认值对应于一个标准的纵向页面。更多的信息,请参见   _ASCIICOLS   系统内存变量   和   _ASCIIROWS   系统内存变量。

要使用附加而不是覆盖方式在一个   ASCII   文件上添加新内容,需要在   ASCII   关键字前面加上   ADDITIVE   关键字。ADDITIVE   和   ASCII   关键字必须采用这种指定的次序。
 
#3楼 得分:0回复于:2007-08-01 13:41:43
接上


[PREVIEW   [   PreviewDestination]   [NOWAIT][WINDOW   WindowName]]  
在预览窗口中显示报表而非打印报表。默认情况下,预览窗口是模式化的但提供了一个可访问的打印预览工具栏。关键字   NOWAIT   指定   Visual   FoxPro   在运行时继续执行程序而不会等待用户关闭预览窗口。   提示:  
由   FoxPro   MS-DOS   创建的基于字符的报表和标签由一个基于字符的特殊预览窗口。这种机制不受   SET   REPORTBEHAVIOR   的影响而且不支持   OBJECT   子句或者   WINDOW-相关的子句。  
   
如果你包含了   WINDOW   <WindowName> ,预览窗口将采用你通过   WindowName   指定的这个窗口的特征,如标题,大小,等等。WindowName   可以是一个表单对象的   name   属性,或者一个使用   DEFINE   WINDOW   创建的窗口的引用变量。更多的信息,请参见   DEFINE   WINDOW   命令。下面的表格描述了   PreviewDestination   可以使用的值,你可以使用单独   WINDOW   子句,也可以与   PreviewDestination   结合起来使用。   PreviewDestination   说明  
[IN   WINDOW   WindowName]
  指定一个用于预览报表的窗口。

如果你包含了   IN   WINDOW   <WindowName> ,报表将在你指定的   WindowName   窗口中预览。
 
IN   SCREEN
  指定预览将被显示在   Visual   FoxPro   主窗口内并且无法移出。
 

说明
当你使用   Visual   FoxPro   的对象-辅助输出模式时,REPORT   FORM   命令的所有子句都可以在你的报表监听器的   CommandClauses   成员对象中使用,除了指定记录选集的子句(作用域,FOR   和   WHILE)。你可以在报表运行时使用   CommandClauses.RecordTotal   属性来了解有关信息,或者在报表运行前为你的   ReportListener   对象指派这些值。CommandClauses   属性   主题中为你描述了关于   CommandClauses   成员对象是如何利用每个子句的详细信息。

示例
示例   1
下面的例子显示了如何将两个报表做为一个批此报表工作来打印。Visual   FoxPro   通过运行这个报表集两次来获取总页数,并将它存储在   _PAGETOTAL   系统内存变量中用于报表布局中的   Page   X   of   Y(共   Y   页   第   X   页)   表达式。

注意:  
你可以确保通过在你的报表中包含   _PAGETOTAL   表达式使报表运行两次。如果你不需要   _PAGETOTAL   但希望两次运行其它的计算式,你可以使用对象-辅助输出模式并设置报表监听器的   TwoPassProcess   属性为   .T.。更多的信息,请参见   TwoPassProcess   属性。  
   

NORESET   指定在继续打印下一个报表时使用连续的页号。NOPAGEEJECT   指定第二个报表的首页继续使用第一个报表最后一页中保留(未用完)的空间继续打印。

    复制代码  
REPORT   FORM   myReport1.frx   TO   PRINTER   NOPAGEEJECT
REPORT   FORM   myReport2.frx   TO   PRINTER   NORESET
MESSAGEBOX( "你已打印了   "   +   TRANSFORM(_PAGETOTAL)+   "   页. ")
 

示例   2
下面的例子演示了如何在一个报表输出到打印机之前先查看它。

    复制代码  
REPORT   FORM   myReport1.frx   TO   PRINTER   PROMPT   NODIALOG   PREVIEW
 

要使预览窗口非模式化,需要包含下面代码中的   NOWAIT   关键字:

    复制代码  
REPORT   FORM   myReport1.frx   PREVIEW   NOWAIT
 

要在一个指定的窗口内预览结果,下面的代码包含了   WINDOW   子句来指定一个名为   MyWindow   的窗口,它时你以前使用   DEFINE   WINDOW   命令创建的:

    复制代码  
REPORT   FORM   myReport1.frx   PREVIEW   WINDOW   MyWindow
 

示例   3
下面的例子演示了如何将报表发送到一个   ASCII   文件。_ASCIIROWS   和   _ASCIICOLS   系统内存变量定义了这个   ASCII   文件每页的行数以及每行的字符数。REPORT   FORM   命令打印一个名为   MyReport.frx   的报表到一个名为   MyFile.txt   的   ASCII   文件中。

    复制代码  
SET   REPORTBEHAVIOR   80
_ASCIIROWS   =   nLines
_ASCIICOLS   =   nChars
REPORT   FORM   MyReport.frx   TO   FILE   MyFile.txt   ASCII
 
#4楼 得分:0回复于:2007-08-01 13:42:02
打印时,表是打开的就可以了。
#5楼 得分:0回复于:2007-08-01 13:42:50
---------打印命令
???       把结果直接输出到打印机    
CREATE     REPORT       以编程方式创建报表    
EJECT       向打印机发送换页符  
EJECTPAGE       向打印机发出有条件走纸的指令    
LABEL       根据表文件和标签定义文件打印标签    
MODIFY     REPORT       打开报表设计器,从中可以修改或创建一个报表    
ON     PAGE       指定当报表中打印输出到达一定行数,或发出EJECTPAGE时,将执行的命令    
PRINTJOB...ENDPRINTJOB       打印设置    
REPORT       根据MODIFYREPORT或CREATEREPORT创建的报表定义文件显示或打印报表    
SET     MARGIN       设置打印的左页边距,对所有定向到打印机的输出结果都起作用    
SET     PDSETUP       装入一个打印机驱动程序设置或清除当前打印机驱动程序设置    
SET     PRINTER       打开或者关闭向打印机的输出,或将结果输出到一个文件、端口
#6楼 得分:0回复于:2007-08-01 13:47:37
十豆三,你的帮助怎么那么详细?我的帮助没有你的多、没有你的说得好。你哪儿搞的?
      你能高度概括地说一下步骤吗?
#7楼 得分:0回复于:2007-08-01 13:49:10
我再细细学习一下,听说VFP9.0的报表功能非常好。
#8楼 得分:0回复于:2007-08-01 13:51:52
是VFP9.0的报表新功能不少,我也没有系统的研究过。


我的资料都是看到了就马上收集。

再有就是多来论坛,因为回答问题的同时就是在学习。
#9楼 得分:0回复于:2007-08-01 13:57:39
非常感谢十豆三的指点。
#10楼 得分:0回复于:2007-08-03 17:20:33
十豆三讲的东西,我老看不明白,找不到重点
你的BLOG我也去看了,看不懂啊...
#11楼 得分:0回复于:2007-08-04 10:18:35
佩服楼主啊,竟然还在使用古董级的报表打印方法,很老的系统了吧,本人也只是在传说中的for   DOS版下用过.
用apple_8180(十豆三)的方法吧,基于Windows的都用这种方法了
  • weigm用户头像
  • weigm
  • (北斗)
  • 等 级:
#12楼 得分:0回复于:2007-08-06 09:45:26
哈哈,我管理的一个系统还是在dos的,打印还用 "PrintScreen "这个键呢:)   不过这个系统不是我写的,一直没搞清楚怎么用Dos程序用VFP5.0的表
#13楼 得分:0回复于:2007-08-06 13:15:08
我不太熟报表打印,我要打印的数据表都是用cusror生成的临时表,怎么取数?十三豆,有没有报表打印的实例可参考?我也想学一学。
#14楼 得分:0回复于:2007-08-06 14:40:57
你如果还用上面的原始代码,参考的例子,没有,只能看早期的VFP书籍。


用VFP的报表,请参考教程:

VFP6.0教程
http://www.java-dotnet.net/online/foxpro/default.htm

163的VFP视频教程:
http://tech.163.com/special/t/000915SU/ttupfoxpro.html
#15楼 得分:0回复于:2007-08-07 15:09:43
再问:如何在指定的位置打印报表的“共X页     第Y页”及数据表的记录数?
相关问题
VFP报表打印的问题! 其他数据库开发/ VFP - CSDN社区community.csdn.net
关于VFP报表打印预览的问题MS-SQL Server / 基础类- CSDN社区community ...
在vfp 9.0sp2报表打印设置中,打印结果与实际字段设置不相吻合的问题
VFP9.0报表打印图片问题,请教大家其他数据库开发/ VFP - CSDN社区 ...
用vc开发有没有什么可用的报表打印控件,类似vfp得报表设计器VC/MFC ...
高分请人简要介绍用VFP做数据库开发的优点和局限其他数据库开发/ VFP ...