五、知识链接
1.报表系统
数据报表是反应生产过程中的数据、状态等,并对数据进行记录的一种重要形式,是生产过程必不可少的一个部分。它既能反映系统实时的生产情况,也能对长期的生产过程进行统计、分析,使管理人员能够实时掌握和分析生产情况。
力控为工程人员提供了强大的报表工具。可以实现各种运算、数据转换、统计分析、报表打印等,既可以制作实时报表,也可以制作历史报表。
力控的报表工具有两种,一种是专家报表,另一种是历史报表,下面分别介绍。
(1)专家报表
专家报表是力控科技有限公司在长期开发实践的基础上推出的功能强大、技术成熟的报表组态工具,主要适用于工业自动化领域,是解决实际开发过程中的图表、报表显示、输入、打印输出等问题的理想的解决方案。采用专家报表可以极大地减少报表开发工作量,改善报表的人机界面,提高组态效率。非专业人员采用专家报表组件可以开发出专业的报表;而专业的开发人员采用专家报表组件,则可以更快地进行报表编辑。
专家报表提供类似Excel的电子表格功能,可实现形式更为复杂的报表格式,它的目的是提供一个方便、灵活、高效的报表设计系统。
1)报表介绍。
①专业的报表向导。
通过多年来总结用户的使用习惯和使用频率,开发出了报表向导功能,无论是制作本地数据库报表还是关系数据库报表,都可在最短的时间内完成。
②丰富的单元格式与设计。
通过专家报表组件,用户可以将数据转化为具有高度交互性的内容,报表的单元格多种多样,如按钮、下拉框、单选钮、复选框和滚动条,丰富了报表的功能。
③强大的图表功能。
只要指定图表数据在表上的位置,一个精致的图表就完成了。
④支持多种格式导入导出。
在专家报表中支持CSV、XLS、PDF、HTML、TXT等文件格式的导出,以及支持CSV、XLS、TXT等文件格式的导入,提高了组件数据的共享能力。
⑤与Excel和Word表格数据兼容的复制和粘贴。
专家报表支持剪切、复制和粘贴,其基本格式与Excel和Word表格相同,用户采用这个功能可以用Excel和Word表格与专家报表来交换数据。
⑥别具一格地选择界面。
专家报表采用特有的颜色算法,能够清晰地区分选择区域。
⑦强大的打印及打印预览功能。
专家报表对打印的支持非常丰富,提供了设置页眉、页脚、页边距、打印预览无级缩放、多页显示、逐行打印等功能。
⑧高效地处理数据地机制。
在创建专家报表的时候会自动创建后台历史数据中心,通过历史数据中心将数据库里的数据缓存到本地,减少了实时数据库的压力,减少网络延时,提高了效率,使报表能快速准确地获取到数据。
2)专家报表中的相关名词。
①表页。
专家报表中的每一张表格均称表页,是存储和处理数据最重要的部分,其中包含排列成行和列的单元格。使用表页可以对数据进行组织和分析,可以同时在多张工作表上输入并编辑数据,并且可以对来自不同工作表的数据进行汇总计算。在创建图表之后,既可以将其置于源数据所在的工作表上,也可以放置在单独的图表工作表上。
②单元格。
单元格是指表页中的一个格子,行以阿拉伯数字编号、列以英文字母编号,如第一行第一列为A1,如图2-7-19所示。
③区域。
区域是指表页中选定的矩形块,可以对它进行各种各样的编辑,如复制、移动、删除等。引用一个区域可用它左上角单元格和右下角编号来表示,中间用冒号作分隔符,如D1:G5。
④模板。
专家报表中的模板分两种:普通模板和替换模板。
a.普通模板 指的是将整个制作完的报表保存成一个模型,可以在不同工程中的报表里进行加载。
b.替换模板 主要用于报表里的变量替换,它又分运行模板和组态模板。运行模板是在运行环境下通过函数调用此模板来达到替换表页中变量的目的,这样只要制作一个表页就可以显示不同的变量;组态模板主要用于报表编辑环境下对表页中的变量进行替换,如果报表中有多个分布于不同区域的变量需要替换成其他变量,通过此模板可以达到快速编辑报表的目的。
3)创建专家报表对象。
创建专家报表常用的方法有以下两种。
①在力控软件的工具箱中的“常用组件”里选择“专家报表”,此时光标变为十字,拖动光标会在窗口上出现一个专家报表组件。
②在“工程项目”导航栏中选择“复合组件”,在弹出的“复合组件”对话框中的“报表”项,(见图2-7-20)中双击“专家报表”,即可在窗口中出现专家报表对象,调整大小和位置即可。
图2-7-19 专家报表
图2-7-20 专家报表所在路径
4)设置专家报表向导。
在生成报表时后台会自动添加后台组件历史数据中心,双击报表组件或右键选择“对象属性”打开报表编辑环境,在打开的报表编辑环境中会弹出报表向导组态窗口,如图2-7-21所示,本节主要利用此向导快速地生成报表。
注意事项:此报表向导只是在首次添加报表组件的时候才会自动弹出,如果需要打开此报表向导,可从下拉菜单“向导”中选择“报表向导(R)”或单击菜单栏上的报表向导图标。
这里我们创建一个类型为“力控数据库报表”的专家报表,步骤如下。
①打开报表向导,选择“力控数据库报表向导”,单击“下一步”按钮。
②对行列数以及单元格大小进行设置,在此例中采用默认值,如图2-7-22所示,单击“下一步”按钮。
图2-7-21 专家报表向导
图2-7-22 设置专家报表外观和行列参数
报表向导第二步中各设置的含义如下。
a.表页外观:单击各选项前的复选框对表页外观进行设置,默认情况下都是选中的。
b.运行时:运行时是否改变行高列宽。
c.行列参数:可以对表页中的行列数量、单元格大小以及需要冻结的行列数进行设置。如果设置的行列数少于报表向导所需要的行列数,行列数会自动增加。另外在后续的向导中如果选中行列自适应,则在此设置的行列数不起作用。
③选择要创建的报表类型,在此例中选择创建“自定义报表”,如图2-7-23所示。
报表向导第三步中各设置的含义如下。
a.报表类型:目前专家报表支持多种报表类型,如:班报表、日报表、周报表、月报表、季报表、年报表、自定义报表。
b.取值类型:支持的类型有:瞬时值,数据库中某一时刻的历史值;平均/最大/最小值,采集的是规定时间段内的统计值,详细的可查看GetStatisData()函数帮助。
c.多栏:此功能类似办公软件中的分栏显示,主要针对的是查询单个数据库点历史值,方便报表的布置。
d.填充时间:主要针对的是自定义报表。
时间长度:设置自定义报表的初始时间长度。
时间间隔:设置自定义报表的初始时间间隔。
e.行/列统计:统计当前表页中每一列的历史值。支持的类型有平均、累加、最大、最小值。
f.统计条件:当数据库的数据不为0或-9999时统计。
④设置报表的时间格式和基准行列,如图2-7-24所示,在此例中采用默认值。
图2-7-23 选择报表类型
图2-7-24 设置报表的时间格式
报表向导第四步中各设置的含义如下。
a.时间格式:设置报表首列的时间格式。
b.基准行列:默认情况下由第一行第一列产生报表,可以根据需要修改报表的产生位置。
⑤选择要显示的数据库点添加到右边列表框中,如图2-7-25所示。
选择相应的后台组件,将数据库点由左边“所有点列表”添加到“已选点列表”中即可,还可以单击右边的按钮对已选点列表中的点进行排序。单击“完成”按钮就完成了一个报表的定制。
⑥保存并退出报表编辑环境。
⑦运行后查询数据后的效果如图2-7-26所示。
图2-7-25 报表添加点
图2-7-26 报表运行效果
(2)专家报表扩展配置
1)专家报表中数据的实时更新。
专家报表组态完成运行之后,我们会发现报表中的数据不会随着时间的增加自动更新报表中的数值,如图2-7-27所示。当我们打开专家报表页面时时间为09:13:49,此时显示3个水箱的实时液位值。但如果我们一直观察该报表,则随着时间的推移,后续时间对应的表格中的数值并不会自动更新,仍然显示-9999.00。
图2-7-27 专家报表运行效果
要实现专家报表中的数据实时更新,这里需要对专家报表做进一步的处理,处理方式如下。
在开发环境中的“工程项目”导航栏中,我们依次点开“全局脚本→动作”,双击“应用程序动作”,在弹出的脚本编辑器中,我们选中“程序运行周期执行”编辑区,然后在左侧导航窗口中依次点开“对象→窗口→报表”,如图2-7-28所示,双击“报表”,则弹出报表窗口中所有对象的名称,这里我们找到专家报表对象“Report”,点开“Report”左侧的“+”,则可以看到“Report”对象所有的函数,如图2-7-29所示。这里我们双击“Refresh-Sheet”函数,则在脚本编辑区自动添加“#报表.#Report.RefreshSheet()”,同时在下方的信息显示区显示出该函数的功能说明如下:
图2-7-28 报表路径
图2-7-29 找到专家报表对象
函数原型:#Report.RefreshSheet(nSheetIndex);
函数描述:刷新当前表页(重新获取数据);
返回值:设置成功返回1,否则返回0;
参数:nSheetIndex:当前要操作的页,-1表示当前页;页索引号从0开始,取值范围为0到表页数减1;
说明:刷新当前表页(只对生产模版向导、SQL报表向导有效,无模板禁止使用);
示例:#Report.RefreshSheet(-1);//刷新当前表页。
这里我们函数“#报表.#Report.RefreshSheet()”添加参数“-1”即为“#报表.#Re-port.RefreshSheet(-1)”即可实现实时刷新专家报表中的当前表页。注意一定要把该函数放置“程序运行周期执行”编辑区。
编辑完成后,运行系统回到专家报表窗口,可以看到报表中的数值可以实现实时更新,如图2-7-30所示。
2)专家报表中无效数据的处理方式。
图2-7-30 实时更新的报表数据
在专家报表系统中,报表中无效的数据默认显示为“-9999.00“,这里可以根据需要来显示无效数据,设置的方法如下。
在开发环境中,双击专家报表对象,弹出“报表设置”窗口,点开该窗口工具栏中的“格式→无效数据处理(I)”,如图2-7-31所示,弹出“无效数据处理”对话框,如图2-7-32所示,在该对话框的下拉菜单中我们可以设置“显示数据库数据”“为0/-9999无显示”“为-9999无显示”和“为0无显示”。也可以在“替换数据”中填入要替换为的数据,这样当数据无效时就可以显示替换数据。这里我们选择“为-9999无显示”即可,这样运行的效果如图2-7-33所示,无效数据的表格为空白。
图2-7-31 无效数据处理
图2-7-32 格式选择
图2-7-33 无效数据处理后的运行效果
3)专家报表数据的查询方式。
专家报表默认没有提供查询工具,这样报表只能显示一个固定时间段的数据,不能显示任意时间段的数据,因此有很大的局限性,这里我们需要为专家报表添加查询功能。实现查询的功能有两种,这里我们分别介绍。
a.查询方式1。
我们通过“工具箱”中“Window组件”中的“日期”和“时间范围”(见图2-7-34)来实现查询功能。
我们为专家报表对象添加一个日期组件和两个时间范围组件,如图2-7-35所示,通过查看这3个对象的属性,我们知道它们的名字分别为“DateTime”“TimeSpan”和“TimeSpan1”,然后分别为这3个对象添加文本注释为“开始时间”“时间段”和“时间间隔”,并添加一个名为“查询”的增强型按钮。接下来我们为按钮添加左键动作。
图2-7-34 添加日期和时间组件
图2-7-35 添加时间日期组件后的效果
这里要实现查询功能我们需要通过按钮的左键动作来调用报表对象“Report”的“Set-FreeReportPar()”函数来实现。关于“SetFreeReportPar()”的功能介绍如下:
函数原型:#Report.SetFreeReportPar(nSheetIndex,nBeginTime,nTimeRange,nTime-RangeUint,nTimeSpc,nTimeSpcUnit);
函数描述:修改报表时间参数;
返回值:执行成功返回1,否则返回0;
参数:nSheetIndex为当前要操作的页,-1表示当前页;页索引号从0开始,取值范围为0到表页数减1;
nBeginTime:起始时间,该值可以通过字符串形式的时间调用函数LongTime来得到;
nTimeRange:时间段(只对自由报表有效);
nTimeRangeUint:时间段单位(只对自由报表有效),0表示秒,1表示分,2表示时,3表示日;
nTimeSpc:时间间隔(只对自由报表有效);
nTimeSpcUnit:时间间隔的单位(只对自由报表有效),0表示秒,1表示分,2表示时,3表示日;
说明:修改报表时间参数;
示例:#Report.SetFreeReportPar(-1,1187243114,8,0,1,0);//查询当前页2007.8.1613:46:12之后8秒内的数据。
明确了函数的功能和函数中各个参数的含义之后我们依次为该函数添加参数,添加完之后的函数为“#Report.SetFreeReportPar(-1,#DateTime.GetTime(),#TimeSpan.GetTime(),0,#TimeSpan1.GetTime(),0);”,如图2-7-36所示。
图 2-7-36
保存、编译之后,在运行环境中我们可以通过设置报表的开始时间、要显示的时间段和时间间隔来实现报表的查询功能。
这里我们把涉及的函数进行说明,#DateTime.GetTime()是获取时间组件的时间值,#TimeSpan.GetTime()是获取时间范围组件的时间值,#TimeSpan1.GetTime()是获取时间范围组件1的时间值。
函数说明如下:
#name.GetTime()取得组件时间;
说明:开始时刻以自1970年1月1日8时(时区决定)逝去的秒数来计算。若为之前的时间则返回-1。该值可以通过函数StrTime转成字符串形式的时间。
示例:
#name.GetTime();//取得自1970年1月1日零时逝去的时间秒数。
b.查询方式2。
在方式2中我们要实现专家报表的查询不需要添加Window组件,只需要在窗口中添加一个按钮,在按钮的左键动作中调用专家报表的“#Report.SetTimePar()”函数即可,具体过程如下。
我们在专家报表中添加一个增强型按钮,按钮显示文本为“报表时间设置”,在左键动作的“按下鼠标”脚本编辑区中添加“#Report.SetTimePar(-1)”即可。
关于SetTimePar()函数的说明如下。
函数原型:#Report.SetTimePar(nSheetIndex);
函数描述:运行状态下设置报表的时间参数;
返回值:设置成功返回1,否则返回0;
参数:nSheetIndex为当前要操作的页,-1表示当前页;页索引号从0开始,取值范围为0到表页数减1;
图2-7-37 时间参数设置
说明:修改自定义报表参数;
示例:#Report.SetTimePar(-1)。
保存、编译之后,在运行环境中单击“报表时间设置”按钮,弹出如图2-7-37所示“时间参数设置”对话框,在该对话框中我们设置好“起始时间”“时间长度”和“时间间隔”之后,单击“确定”按钮,则在报表中就显示该时间段内数据的值,也可以实现查询功能。
4)报表数据的导出。
报表中的数据可以导出为CSV文件、PDF文件、Excel文件、html文件和txt文件,这里我们只把数据导出为最常用的Excel文件。
通过按钮的左键动作调用ExportExcelFile(nSheetIndex,nWithDlg,strPath,nExportAll)来实现数据的导出。
函数原型:#Report.ExportExcelFile(nSheetIndex,nWithDlg,strPath,nExportAll);
函数描述:导出Excel文件;
返回值:执行成功返回1;否则返回0;
参数:nSheetIndex为当前要操作的表页索引号,-1表示当前页;表页索引号取值范围0到表页数减1;
nWithDlg:是否有路径对话框,1表示有;
strPath:文件保存路径,如果nWithDlg为1,则可以不设置该参数;
nExport:1-导出所有的表页0-导出当前页;
说明:以Excel方式导出报表;
示例:#Report.ExportExcelFile(0,1,"D:\baa.xls",0);//导出第一页表页到D:\baa.xls
在本例中我们在“按下鼠标”脚本编辑区中输入“#Report.ExportExcelFile(-1,1,"",1)”即可。
5)报表数据的打印预览和打印。
我们添加“打印预览”和“打印”按钮,让两个按钮分别调用#Report.PrintPreview(nSheetIndex,nPageSetDlg)和#Report.PrintSheet(nSheetIndex,nWithDlg)来实现打印预览和打印。关于这两个函数的说明如下所示:
函数原型:#Report.PrintPreview(nSheetIndex,nPageSetDlg);
函数描述:报表打印预览;
返回值:void;
参数:nSheetIndex为当前的要预览的表页索引;表页索引号取值范围0到表页数减1;
nPageSetDlg:是否显示打印设置对话框,0为不显示,1为显示;
说明:调出报表打印预览页面;
示例:#Report.PrintPreview(0,1);//预览第一页并显示打印设置对话框。
函数原型:#Report.PrintSheet(nSheetIndex,nWithDlg);
函数描述:报表表页打印;
返回值:int执行成功返回1,否则返回0;
参数:nSheetIndex为当前要打印的表页索引号,-1表示当前页;表页索引号取值范围0到表页数减1;
nWithDlg:是否显示打印设置对话框,1为显示;
说明:打印指定的表页;
示例:#Report.PrintSheet(0,1);//打印第一页,并显示打印设置对话框。
(3)历史报表
历史报表提供了一种浏览和打印历史数据和统计数据的工具,对历史报表可进行手工或自动打印。历史报表从数据库中按照一定的采样方式获取一个或多个点的历史数据,以表格的形式显示出来。
1)创建历史报表。
在工具箱“常用组件”中选择“历史报表”,在窗口中单击并拖曳到合适大小后释放鼠标或者选择“复合组件→报表→历史报表”,双击历史报表即可创建历史报表,初始的历史报表如图2-7-38所示。
图2-7-38 历史报表
2)历史报表组态。
双击历史报表对象,弹出“属性”对话框,如图2-7-39所示,下面分别介绍属性对话框中各中组态的含义:
①报表。
a.外观:主要是对报表外观的设置,包括颜色、网格和字体的设置。
图2-7-39 属性设置
图2-7-40 为历史报表添加点
b.指定起始时间:报表将获取从指定时间开始的一段历史数据。
c.范围和间隔:获取指定范围和指定时间间隔的历史数据。
d.显示时间:是否显示时间,时间列的长度设置。
e.数据源:选择连接实时数据库的数据源,可为本地或远程的力控数据库。
f.统计:是否统计每列的平均值、最大值和最小值。
②变量。
如图2-7-40所示,单击“变量”选项卡,在点名栏指定实时数据库的点参数,双击空白处可以弹出变量选择对话框,选中你要选的点,单击“选择”按钮,点添加成功,如图2-7-41所示。
图2-7-41 添加点后的历史报表
a.格式:指定数值的字符显示宽度,如8.2表示字符显示宽度为8,其中小数点后位数为2。
b.标题:运行起来后每一个点所对应的标题,共有3种标题类型可以设置。
自定义:自定义标题的名称,可以任意填写。
点名:把点名作为标题的名称。
点描述:把点描述作为标题的名称。
这里着重说一下历史报表如何修改列的宽度,由于列名过长造成列名显示不完整,如何处理?主要是通过调整字符宽度来实现的。双击历史报表对象,在弹出的历史报表属性页中选择“变量”选单,如图2-7-42所示,修改“点名”后面“格式”中默认为的“8.2”至合适值,直至历史报表中的列名能显示完整即可。其中的“8”即代表列宽。修改之后的显示效果,如图2-7-43所示。
图2-7-42 修改列宽
图2-7-43 修改列宽后显示效果
(4)历史报表扩展配置
历史报表组态完成后,需要继续为历史报表添加查询、导出和打印等功能,历史报表才能完善并投入实际的使用,下面就依次介绍历史报表扩展配置的实现。
1)历史报表的基础查询。
对历史报表的查询功能也需要通过调用历史报表对象的函数来实现,通过查看历史报表的属性可以得知,历史报表对象为“HisReport”。
历史报表的查询只有一种方法,与专家报表中的查询方法一类似,就是通过工具箱创建3个Window组件,一个“日期”和两个“时间范围”,对象名分别为“DateTime1”“Time-Span2”和“TimeSpan3”。添加查询按钮,为按钮添加左键动作。在“按下鼠标”脚本编辑区中输入如下代码(可以通过脚本编辑器左侧导航栏来选择对象和函数):
#HisReport.SetTimeEx(#DateTime1.GetTime());//设置历史报表开始时间
#HisReport.SetTimeSpan(#TimeSpan2.GetTime(),#TimeSpan3.GetTime())//设置历史报表的时间段和时间间隔
HisReport.SetTimeEx(int nTime)和SetTimeSpan(int nRange,int nSpace)的功能和说明如下:
①#name.SetTimeEx(int nTime)设置报表开始时间。
参数说明:nTime设置报表开始时间,时间为自1970年1月1日零时逝去的秒数。返回值为整型,1代表设置成功,0代表设置失败。
实例:#name.SetTimeEx(LongTime("2007/3/2710:12:26"));//设置报表开始时间为2007年3月27日10点12分26秒
②#name.SetTimeSpan(intnRange,int nSpace)设置报表时间范围。
参数说明:nRange报表时间范围(秒),nSpace报表时间间隔(秒),返回值为整型,1代表设置成功,0代表设置失败。
实例:#name.SetTimeSpan(3600,60)//设置报表的时间范围为1小时,时间间隔为1分钟
而时间范围组件的GetTime()函数的说明与专家报表中的一样,这里不再重复。
2)历史报表的快捷查询。
历史报表中提供了丰富的函数可以实现方便快捷的查询,而不用每次都输入日期和时间范围。这里我们实现快速查询“前一天”“后一天”“前一小时”“后一小时”“前一分钟”“后一分钟”和“当前时间”,只要单击这些按钮就可以快速地查询一天、一小时或一分钟之前或之后的历史数据,查询完毕单击“当前时间”按钮,则历史报表就能显示以当前时间为开始时间的历史报表。
这些功能主要是通过以下函数来实现的。
我们只需要添加对应的按钮,并分别为按钮添加左键动作即可实现,关于该函数的功能我们只以“前一天”和“后一天”为例来说明,其他时间的实现与此一样。
①#HisReport.OffDay(-1);//设置报表开始时间
语法:#name.OffDay(int nDays)。
参数说明:nDays表示从设定日期开始往后(正整数)或者往前(负整数)的天数返回值为整型,1代表设置成功,0代表设置失败。
实例:#name.OffDay(1)//设置报表开始时间为原始时间的后一天
#name.OffDay(-1)//设置报表开始时间为原始时间的前一天
②#HisReport.SetTimeEx(Curtime)//当前时间
设置报表开始时间
语法:#name.SetTimeEx(int nTime)
参数说明:nTime设置报表开始时间,时间为自1970年1月1日零时逝去的秒数,返回值为整型,1代表设置成功,0代表设置失败。
实例:#name.SetTimeEx(LongTime("2007/3/27 10:12:26"))//设置报表开始时间为2007年3月27日10点12分26秒
而Curtime就是系统当前的时间值,因此,#HisReport.SetTimeEx(
Curtime)就可以实现设置开始时间为当前时间。
查询功能添加完之后的界面如图2-7-44所示,用户可以自行设计查询的布局和实现方式。
图2-7-44 为报表添加查询功能后的效果
3)历史报表的打印预览。
在历史报表对象中为实现打印预览功能提供的函数是PrePrint(),我们只需要为“打印预览”按钮添加左键动作#HisReport.PrePrint()即可。当单击“打印预览”按钮时,则弹出打印预览的窗口,可以看到打印页的预览画面。PrePrint()的语法和功能介绍如下。
语法:#name.PrePrint()
实例:#name.PrePrint();
4)历史报表的手动打印。
在历史报表对象中为实现打印功能提供的函数是Print(),我们只需要为“打印”按钮添加左键动作#HisReport.Print()即可。当单击“打印”按钮,则弹出打印当前报表。Print()函数的语法和功能介绍如下。
语法:#name.Print()
返回值:无
实例:#name.Print()
5)历史报表的定时自动打印。
若要实现历史报表的自动打印功能,比如在每天固定时刻自动打印报表,可以通过脚本控制来实现。
比如,我们希望在每天上午9点时,自动打印窗口Report1中的报表,可按下面步骤进行。
①选择Draw菜单命令“特殊功能→动作→数据改变”,进入脚本编辑对话框,在“变量名”内输入系统变量“Hour”,在编辑器内输入脚本:
②按照上面的设置,每当时间由上午8点59分59秒变为9点时,报表便会自动打印出来(考虑到时间可能有误差,保留了3秒的延迟时间)。
③print("Report1.drw")函数的解释说明如下:print()函数是力控提供的系统函数,当执行该函数时,则会自动打印出名为“Report1”的窗口中的所有内容,不单单是报表的内容。
语法和使用如下:
语法:print(WinName)
说明:打印名字为WinName的窗口,该函数主要用于打印报表。
示例:Print("Win01")//打印窗口Win01。
④若要打印出窗口中的具体某一区域,如何实现?
若要打印窗口中只涉及报表显示的区域,需要调用PrintEx函数,该函数的语法和用法如下。
语法:PrintEx(WindowName,n,left,top,right,bottom);
说明:打印窗口的特定区域。
参数:WindowName为窗口名称,字符串变量或常量。
n为是否放大的参数,0表示安装原样打印(不进行放缩),1表示放缩到整张纸(带不带此参数功能一致)。
left、top、right、bottom均为整型,指定的是要打印的矩形区域。left、top分别为矩形区域左上角横坐标和左上角纵坐标;right、bottom分别为矩形区域右下角横坐标和右下角纵坐标。
左上角和右下角坐标可以通过将光标移至相应位置,并记录光标当前位置而得到。光标位置可以通过“查看→工具栏→坐标工具栏”来调出,调出之后就会在窗口上悬浮一个,实时显示光标的位置。
示例:
//注意表示打印不进行放缩的参数应该和画面名一起保持在双引号中。
注意事项:这里要使用的是系统函数Print和PrintEx,保证不管在哪个窗口中都能直接定时打印,但打印的是报表整个窗口的内容或者窗口中某一部分的内容,与报表对象直接打印相比打印的效果要差一点。
若要进行如下修改:
则运行的结果如下,8点59分变为9点钟时若view中显示的窗口是“报表”窗口时则自动打印出历史报表。若view中显示的窗口不是“报表”窗口时则不会打印。因为该函数是对象的函数只有在“报表”对象出现时(在报表的生存周期中时)才能调用。
6)历史报表的导出。
历史报表只能导出为CSV格式的文件,实现报表导出功能的函数为SaveCSV(char * strFileName),关于SaveCSV(char * strFileName)函数的说明如下。
语法:#name.SaveCSV(char * strFileName);
参数说明:strFileName保存的文件名,参数必须为绝对路径,不能使用相对路径;返回值为整型,1代表保存成功,0代表保存失败。
实例:#name.SaveCSV("d:\f.csv");//将报表保存到"d:\f.csv"文件中
注意事项:文件名strFileName必须为绝对路径,必须带.csv扩展名。
每次保存的文件都会覆盖上次的文件,若导出后应及时保存。当按下导出按钮再次执行#name.SaveCSV(char * strFileName)函数时,则会覆盖上次保存的数据。