| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4172 人关注过本帖
标题:请教表单中打印报表的代码
只看楼主 加入收藏
dz_ccz
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-4-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
请教表单中打印报表的代码
    我是一个典型的菜鸟,在学习编程中遇到了一个我头痛的问题,敬请坛子里的大哥大姐协助。
   
    问题:
    一条记录有几十个字段,仅一条记录我就建了5个报表(分别是:BB1.frx、BB2.frx、BB3.frx、BB4.frx、BB5.frx)。在VF6.0环境中,我创建一个表单,设置了3个命令按钮,分别是:
    1、[指定打印](指定一条记录打印)。关键字段ZDH,格式AAAAA-BBB-CCC-DDD
    2、[区间打印](取 BBB 等于102的所有记录打印)
    3、[全部打印]

    请教:
    这三个命令按钮,用那些代码来实现其目的?。在什么地方录入这些代码?。

[ 本帖最后由 dz_ccz 于 2011-4-7 17:21 编辑 ]
搜索更多相关主题的帖子: 关键字 
2011-04-02 21:36
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:20 
指定报表的打印范围在VFP的帮助文件已经表述的非常清楚啊。以下是帮助文件中的内容:

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 子句,也可以指定要打印的页范围子集(使用 的 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 关键字。在对象-辅助模式下,该选项是否可用受 成员的值影响。

要指定 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 关键字必须采用这种指定的次序。
 

[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 主窗口内并且无法移出。
 

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2011-04-03 10:02
dz_ccz
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-4-2
收藏
得分:0 
回复 2楼 hu9jj
谢谢hu9jj斑竹,学习了。
如果能够具体指教一下就好了

[ 本帖最后由 dz_ccz 于 2011-4-3 14:27 编辑 ]
2011-04-03 14:25
ilikeflash
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:148
专家分:186
注 册:2011-4-6
收藏
得分:0 
设置一个打印按钮,添加一个选项按钮组,在打印的click事件中通过do case根据选项按钮组不同的值查询出需要的数据存入cursor,把这个cursor作为报表的源表就行啦.
2011-04-07 00:25
dz_ccz
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-4-2
收藏
得分:0 
感谢hu9jj和ilikeflash的帮助,大部分问题已经解决,目前仅区间打印的2、3、4种情况,存在问题,无法打印,要实现的目的和代码报告如下:
另一个问题,就是在无法打印的情况下,还退不出VF系统,更无法返回。
---------------------------------------------------------------------------
1、指定宗地号段打印(基本没有问题)
szdh=THISFORM.TEXT1.VALUE
zzdh=THISFORM.TEXT2.VALUE
if zdh>=szdh . and . zdh<=zzdh
    REPORT FORM d:\米易土地登记\diji1.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\diji2.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\diji6.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\sp.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\djk1.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\djk2.frx NOCONSOLE TO PRINTER NOEJECT
  skip
ENDIF
-----------------------------------------------------------------------------
2、打印某乡镇所有的资料
一、要实现目的
    条件:关键字段zdh(字符型、16个字节)已经排序,形如“MY204-200-03-006”,其中MY204表示乡镇代码,200表示村代码,03表示组代码,006表示组内的宗地序号。
    过程:在文本框TEXT5内输入乡镇代码,如MY204。
    目的:就是把数据库中某一乡镇(如MY204)所有宗地的登记资料,按宗地顺序(不是按表的顺序打印出来)
二、代码
xzdh=THISFORM.TEXT5.VALUE
if SUBSTR(zdh,1,5)=xzdh
    REPORT FORM d:\米易土地登记\diji1.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\diji2.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\diji6.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\sp.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\djk1.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\djk2.frx NOCONSOLE TO PRINTER NOEJECT
    * 还需要skip吗?
  skip
ENDIF

3、  打印某村所有的资料
一、要实现目的
    条件:关键字段zdh(字符型、16个字节)已经排序,形如“MY204-200-03-006”,其中MY204表示乡镇代码,200表示村代码,03表示组代码,006表示组内的宗地序号。
    过程:在文本框TEXT3内输入村代码,如MY204-200。
    目的:就是把数据库中某一乡镇的某村(如MY204-200)所有宗地的登记资料,按宗地顺序(不是按表的顺序打印出来)
二、代码
xzdh=THISFORM.TEXT3.VALUE
if SUBSTR(zdh,1,9)=xzdh
    REPORT FORM d:\米易土地登记\diji1.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\diji2.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\diji6.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\sp.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\djk1.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\djk2.frx NOCONSOLE TO PRINTER NOEJECT
    * 还需要skip吗?
  skip
ENDIF

4、3、  打印某组所有的资料
一、要实现目的
    条件:关键字段zdh(字符型、16个字节)已经排序,形如“MY204-200-03-006”,其中MY204表示乡镇代码,200表示村代码,03表示组代码,006表示组内的宗地序号。
    过程:在文本框TEXT4内输入组代码,如MY204-200-03。
    目的:就是把数据库中某一乡镇、村内某一组(如MY204-200-03)所有宗地的登记资料,按宗地顺序(不是按表的顺序打印出来)
二、代码
xzdh=THISFORM.TEXT4.VALUE
if SUBSTR(zdh,1,12)=xzdh
    REPORT FORM d:\米易土地登记\diji1.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\diji2.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\diji6.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\sp.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\djk1.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\djk2.frx NOCONSOLE TO PRINTER NOEJECT
    * 还需要skip吗?
  skip
ENDIF

请高手们看看,是什么问题?
谢谢

[ 本帖最后由 dz_ccz 于 2011-4-7 17:24 编辑 ]
2011-04-07 17:15
ilikeflash
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:148
专家分:186
注 册:2011-4-6
收藏
得分:0 
2、打印某乡镇所有的资料
一、要实现目的
    条件:关键字段zdh(字符型、16个字节)已经排序,形如“MY204-200-03-006”,其中MY204表示乡镇代码,200表示村代码,03表示组代码,006表示组内的宗地序号。
    过程:在文本框TEXT5内输入乡镇代码,如MY204。
    目的:就是把数据库中某一乡镇(如MY204)所有宗地的登记资料,按宗地顺序(不是按表的顺序打印出来)
二、代码
xzdh=THISFORM.TEXT5.VALUE
if SUBSTR(zdh,1,5)=xzdh
    REPORT FORM d:\米易土地登记\diji1.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\diji2.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\diji6.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\sp.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\djk1.frx NOCONSOLE TO PRINTER NOEJECT
    REPORT FORM d:\米易土地登记\djk2.frx NOCONSOLE TO PRINTER NOEJECT
    * 还需要skip吗?
  skip
ENDIF
xzdh=THISFORM.TEXT5.VALUE
SELECT * FROM ztsytbl WHERE namef=khname
xzdh=THISFORM.TEXT5.VALUE
SELECT * FROM 资料表 WHERE xzdh=zdh order by zdh into cursor lssj
REPORT FORM d:\米易土地登记\diji1.frx NOCONSOLE TO PRINTER NOEJECT
你的这几个报表格式应该是一样的吧?这样你可以改变text5的值,来筛选出需要的乡镇代码的记录,存入lssj中,做为源送进报表就行。


[ 本帖最后由 ilikeflash 于 2011-4-19 02:22 编辑 ]
2011-04-19 02:15
dz_ccz
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-4-2
收藏
得分:0 
回复 6楼 ilikeflash
先谢谢了,我再学习一下。
2011-04-19 08:51
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
在程序中出现绝对路径是不明智的办法,这样程序换到其他电脑上有可能无法正常运行。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2011-04-19 08:58
andy292
Rank: 2
等 级:论坛游民
威 望:1
帖 子:86
专家分:13
注 册:2005-2-26
收藏
得分:0 
学习一下,CURSOR表不错
2017-05-17 23:21
快速回复:请教表单中打印报表的代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022270 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved