⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reportpreview.prg

📁 foxpro连接sqlserver的例子
💻 PRG
字号:
*-- ===============================================================
*-- 程序名称:RptPreview.prg
*-- 程序功能:以自定义的窗口显示报表的同时,显示自定义的工具条控制报表的预览打印...
*-- 使用方法:RptPreview ( <cReportName> [,cTitleName])
*		或者:do RptPreview with <cReportName> [, cTitleName ] 
*-- 程序说明:cReportName 为 报表文件名(无须带扩展名),如果省略的话,则可显示工具条
*			  cTitlename  为 报表的标题(可省略,然后以报表文件名做标题)
*			  报表的扩展名以 frx 为准
*-- 原创作者:红虎 
*-- 联系方式:E-mail: hu_feng@163.net	
*			  HomePage: http://www.honghoo.net
*			  Oicq: 1569040
*-- 编写日期:2001年1月
*-- ===============================================================

Func ReportPreview
para cReportName,cTitleName,cDataSource

#include ../inc/system.h
set message to ready_loc

*-- 显示预览工具条
if type("oPrvToolsBar")="O" and !isnull(oPrvToolsBar)
	*-- 如果已存在打印工具条,提示信息及打开工具条上的检查时钟
	oPrvToolsBar.msg.rpt_info.caption = ready_loc
	oPrvToolsBar.ChkTimer.enabled = .T.	
else	   
	*-- 如果不存在打印工具条,则创建该工具条
	public oPrvToolsBar		&& 定义工具条对象的全局变量
	oPrvToolsBar=CreateObject("RptPrvToolsBar")	&& 创建工具条
	oPrvToolsBar.dock(0)	&& 使工具条在屏幕的最上边
	oPrvToolsBar.show		&& 显示工具条
	set mark of bar 3 of my_view to .T.
endif	
	
*-- 判断是否正确传递报表标题参数
if type("cTitleName")#"C"
	*-- 如果报表标题的数据类型不是字符型的,那么将报表标题用报表的名称来代替
	cTitleName	= cReportName
endif

*-- 判断是否正确传递报表文件名参数
if type("cReportName")#"C" or isNull(cReportName)
	*-- 如果传递来的报表的名称不是字符型或是空的,那么应该终止,并提示没有报表可显示
	*-- 此时如果存在报表预览窗口,那么要重新来获取该报表的信息
	with oPrvToolsBar
	if wexist(Preview_name)
		.isInited = .T.
		.rptName  = gcRptName
		.rptTitle = gcRptName
		.pageno = 0
	else
		.msg.rpt_info.caption = NoRpt_loc
	endif
	endwith
	retu .f.
else
	*-- 报表文件名的扩展名以 FRX 为准
	if	at(".",cReportName) = 0
		cReportName = cReportName + ".frx"
	endif
	if !file("&cReportName")	
		*-- 如果传递来的报表文件不存在,那么应该终止,并提示文件不存在
		messagebox(noRptFile_loc,16,error_loc)
		retu .f.
	endif
endif	

*-- 判断是否当前有数据打开
*	对于报表来讲需要当前有数据表被打开,否则也会自动弹出打开数据对话框
*	所以,如果当前没有数据表打开,或打开的表的记录数为0时,应该终止。
if	type("cDataSource") = "C"
	if	used("&cDataSource")
		sele "&cDataSource"
	endif
endif
	
if !used() or recc()=0
	if messagebox(noData_loc,1+48+256,error_loc) = 2
		retu .f.
	endif
endif	

*-- 得到正确的报表文件名和报表标题 
oPrvToolsBar.rptName  = cReportName
oPrvToolsBar.rptTitle = cTitleName


*-- 定义预览窗口
*	这个窗口相当于一个容器,用来容纳报表预览窗口,预览窗口的特征可以从这个窗口来继承
DEFINE WINDOW WinRptPre ;
	FROM 0,0 TO SROWS()-10,SCOLS()-10 ;
	system FLOAT CLOSE noGROW noMINIMIZE ZOOM MDI;
	TITLE Preview_name +": "+cTitleName

set message to MsgInfo_loc + cTitleName
*-- 计算报表总页数
report form &cReportName nocons environment
_pepage	= _pageno		&& 将报表总页数记录在系统变量_pepage中,
						&& 注意该变量不可以小于等于0,否则系统出错
						&& 当报表计算出来没有可供显示的内容时,
						&& 系统变量_pageno最小也是返回1,不会小于0
						
pnTotalPages=_pageno	&& 此总页数变量由用户自定义,可以用到报表中显示"共几页"的形式
						&& 当使用该变量时,应实现用 public 来定义

*-- 将预览所要显示的容器窗口最大化
ZOOM WINDOW WinRptPre MAX

*!*	*-- 显示报表,之前把原先有的先释放!
*!*	if wexist(Preview_name)		&& 存在已有报表预览窗口
*!*		if messagebox(RptExist_loc,4+32,"询问") = 7	&& 询问是否替换原有的窗口
*!*			activate window Preview_name	&& 如果不替换,则激活原有的报表预览窗口
*!*			zoom window Preview_name max	&& 并将该窗口最大化
*!*			retu .F.						&& 终止程序的继续执行
*!*		endif
*!*	endif


*-- 不管是否已经存在原有报表,首先释放原有的报表预览的窗口
*	如果该窗口不存在的话,则不做任何动作
rele window Preview_name

*!*	oprvtoolsbar.chktimer.enabled=.t.
*!*	oprvtoolsbar.isinited=.t.

*-- 显示预览报表在刚才定义的窗口范围内,并不等待,继续执行,
*	如没有nowait参数,报表象一个模式窗口会停留不前,
*	那么接下去的程序运行会因为没有该报表的存在而产生错误
*	所以在这里这个NOWAIT很有必要,不可去掉!!!
REPORT FORM &cReportName PREVIEW WINDOW WinRptPre NOWAIT

*-- 将系统打印预览工具条移到屏幕右下角,并释放她
if wexist(PreviewToolsbarName)
	move window PreviewToolsbarName to 100,100
	release window PreviewToolsbarName
endif

*-- 将报表预览窗口最大化
*!*	zoom window Preview_name max

*-- 初始化工具条完成
*	并标记工具条上的一个是否已初始属性为真.
oPrvToolsBar.isInited 	= .T.
oPrvToolsBar.msg.rpt_info.Forecolor=rgb(0,0,255)

retu

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -