套打模板设计(ReportOne格式)快速入门

套打模板设计(ReportOne格式)快速入门


2024年2月24日发(作者:)

套打模板设计(ReportOne格式)快速入门

1 前言

本文希望通过简要的描述,使用户快速了解EAS套打中的ReportOne格式并能够按照实际需求自己动手设计模板。

ReportOne系列的Print格式(模板文件名为*.r1-print,以下简称为R1),应用于EAS套打,为EAS用户提供自定义格式的单据、报表打印。

R1格式集成到EAS中,始于版本5.4.0。本文针对EAS6.0.0而作,EAS5.4.0的用户也可参考,基本无异。

图1 套打管理中的新建R1模板操作

2 R1格式的组件及规则

R1格式包含了下列组件:页、单元对象(文字、金额、图片)、数据表、网格。

2.1 页

一个模板,自动对应了一个页对象。页不可创建、删除。

页是模板的可设计区域。通常,页的大小为纸张大小减去四边距后的尺寸,此时页与纸张一一对应,套打模式和大部分报表模式就是这种情形。但是当多数据源的报表模式(参考后文的“简历模式”),设计时内容就很多,此设计区域容纳不下的时候,允许修改页的高度。见下图“页面设置”(注:由于不存在横向自由扩展的功能,页宽度不可修改)。

图2-1 页面设置

运行时,页自动与主数据源绑定。如果不存在“能引起分页的对象(如数据表)”绑定主数据源,则主数据源自动移至其下一条记录使页重复输出,例如票据套打模式、简历模式等。否则,由“能引起分页的对象”分页。

2.2 单元对象

单元对象包括:文字对象、金额对象、图片对象,它提供了一块固定的区域,用于展现对应的内容。此内容可以是绑定字段,或自定义的固定内容。

注意,“单元对象”是离散的矩形区域,不等同于表格的“单元格”。

图2-2 工具箱中的单元对象

单元对象本身不引起分页,也不会引起数据源移动至下一条记录。

当单元对象放置在可高度自适应的容器中,并“纵向充满”容器时,可实现高度自适应的效果。什么是“可高度自适应的容器”?网格的行、数据表的数据行,具有“行高自适应”的属性,它们的单元格为“可高度自适应的容器”。

其中的金额对象,提供了对动态币别的支持。对象除了本身可绑定金额数值的字段外,还可以再绑定币别字段。系统根据数据源提供的币别信息,实现“人民币壹佰元整”、“$123.45”等形式的展示。

2.3 数据表

数据表是一种表格,它由规整的行、列组成,行列的交汇处为单元格。行、列、单元格是组成表格的基本元素。(注意“单元格”不等同于“单元对象”)

数据表具有分组展现、统计功能,其数据行能根据数据源重复输出,它是一种可能引起分页的对象。

2.3.1 行

数据表的行分为三种不同类型:普通行、分组行、数据行。

图2-3 数据表各种类型的行及分组描述

 数据行有且只有一行,数据表至少由这一行组成。数据行顾名思义,用于将数据源逐行输出。相对于分组行中的统计内容,数据行中的内容可称为明细数据。数据行属性设置中有“套打型”和“报表型”供选择。套打型用于指定每页打印固定行数;报表型则按照数据量重复输出,空间不够时自动分页。

 分组行与分组对应。在数据表上设置一层分组,则数据行上下两侧各增加一个分组行,称为“分组头”、“分组尾”。分组头、尾随分组重复输出。每层分组的头、尾允许增删多个分组行,但至少必须各保留一行。如果按照需求必须做分组,而分组头(或分组尾)不想输出,可将其行高设

为0,或设置其属性“不打印”。

 普通行位于最外层,对应一份报表的表头表尾,即“总计层”。数据表允许在其头、尾插入多行普通行,也允许没有普通行。

普通行和分组行有属性“每页出现”,可规避其随分组起、止才出现的特性,分页时随页的重复而每页出现,通常与“套打型”配合使用。

2.3.2 单元格

数据表的单元格可以直接用于显示文字内容,也可以作为容器放置单元对象,它可以是下列类型之一:

 文本——固定的文字内容,通常出现在表头或分组头;

 字段——绑定数据表当前数据源的某个字段,通常出现在数据行中;

 统计——可做分组统计(分组范围内)、区域统计(当前页范围内)、累计(从分组开始至当前页)等,通常出现在分组尾(该层分组的统计)或表尾的普通行(总计);

 运算——统计功能的扩展,支持横向的在同一行中对多个数值字段进行运算,再对运算结果进行纵向的统计,最终运算结果显示在该单元格中;

 容器,可放置单元对象或网格,但数据表本身不允许嵌套。

多个单元格可以融合。表头表尾某些列与整体不符的情况,通常可以将一行中的几个单元格进行“合并单元格”,再放入网格进行划分。另一种常见情形是某一列从分组头,跨过数据行,合并到分组尾,并绑上分组字段。注意某些情形可能是没有意义的,例如在二层分组头之间做单元格的融合。

2.3.3 数据源绑定

数据表必须绑定唯一的一个数据源。如果要展现另一个数据源的数据,可以在单元格中放置单元对象,并通过单元对象绑定另一数据源的字段。

2.4 网格

网格也是一种表格,同样由行、列、单元格是组成。

网格本身不绑定数据,它的行没有类型;单元格也不能显示文字,只能作为容器使用。

网格的基本功能是作为一种布局的手段,放置一批单元对象,使模板的调整

更简单。此时,网格可放在页中、数据表的单元格中。网格可以嵌套,但嵌套会使模板变得复杂,所以通常通过单元格的融合也可以达到相同的效果。

网格的另一高级功能是组合多个数据表,在多数据源的情况下完成报表的展现需求。通常配合“一主多从”的数据源出现(参考“简历模式”),此时的网格作为分隔区域的大容器放置在页中,一般设置为1列多行。可在第一行中放置另一网格做表头,可在后续各行中分别放置数据表。放置数据表的行,设置属性“行高自适应”。那么,这个做为大容器的网格,起到将各个数据表依次输出的目的。所以,设置了行高自适应的网格,也是一个可能引起分页的对象。

3 模板设计经典模式

3.1 票据套打

以支票为代表的套打,其特征为:

 单数据源;

数据源的每一行记录对应一张票据;

不带分录。

在页面上准确位置放置单元对象,绑定字段即可。页随数据源的记录自动重复输出。模板允许从磁盘中导入一张图片作为背景,用于辅助确定准确位置。该图片随模板保存、预览(除非设计完成后将其删除),但不输出到打印机。

图3-1 支票套打

支票中金额的展现,可使用金额对象。小写金额可按“样式”中的“填格”属性完成填格功能。

日期可按年、月、日,创建三个文字对象,都是绑定日期字段,分别做格式化:yyyy、MM、dd。如果是日期大写,可用脚本中提供的专门用于支票日期大写的formatChequeDate函数,例如在文字对象的“后处理脚本”中写上:

setValue(formatChequeDate(getValue(),”yyyy”))

3.2 单据套打

单据的主要特征是带分录,逻辑上是“单据——分录”关系的数据源,但在EAS中,通常表现为单数据源。数据源所提供的数据形式上如下:

单据A

单据A

单据B

单据B

单据B

单据C

分录A-1

分录A-2

分录B-1

分录B-2

分录B-3

分录C-1

由上例可见,三张单的分录合并在一起由一个数据源提供。数据源总共6条记录,第一张单据A有2条分录、第二张单据B有3条分录、第三张单据C有1条分录。对于此种情形,要做分组,分组字段为“单据ID”(或叫“单据号”之类能唯一标识单据的字段)。

图3-2 单据套打

该模式通常只需一个数据表,做一层分组。前后各插入多个分组行,可融合后放网格做表头表尾;数据行为套打型,每页重复固定次数。所有分组行设置为“每页出现”。

在分组行的单元格中,填上文本内容“="第" + getPageNumber() + "/" +

getPageTotal() + "页"”,可实现形如“第1/2页”的分组页码。该页码在分组行中,和分组相关,由于我们对单据号做了分组,所以页码就是单据的页码。注意,如果页码是在文字对象中(嵌套网格后放了文字对象),getPageNumber等函数必须冠以“数据表分组行单元格ID.”的前缀,即文字对象所在位置向上层追溯到数据表的单元格的名称,如eNumver()+"/"+eTotal()。

常见的“凭证”等业务的套打,属于此模式。

3.3 多数据源的单据套打(带审批的单据)

该模式特针对下述情形:

 在上述“单据套打”所描述的单数据源的基础上,增加了一个审批信息数据源;

 审批记录行数可预知(最多不超过多少行);

 审批信息在单据每页中显示。

首先,模板开始设计之前,必须引入数据源并设置参数,使“从数据源”依赖“主数据源”。此例中,输入参数名称为billId,为审批数据源的单据ID字段(可按数据库中“外键”的概念理解),绑定到单据数据源的单据ID字段。

图3-3 设置数据源依赖关系

和展现单据的数据表并列地,也放置一个数据表在页中,绑定审批数据源,位于单据下方。由于审批记录行数可预知,设置数据行套打型、固定行数。这样,审批信息将不会跨页,只出现在单据的第一页里。

如果有必要让审批信息在单据的每页中重复出现,在其数据表的“后处理脚本”中填上secondBirth()函数即可。

注意,此例中的数据源提供方式,不能满足报表形式的展现,即不能满足单据跨页显示完了,单据后头接上审批信息(除非只打印一张单据)。如果要达成此需求,数据源必须是“单据——[分录,审批]”这样“一主二从”的形式,请参考“简历模式”。

3.4 单数据源的报表

“报表型”区别于“套打型”的特点是:不限定每页显示数据行数,行高可随内容自动调整(行高自适应),通常为第一页开头是表头,表体内容跨若干页,最后一页是表尾的形式。

和单据套打类似,用一个数据表就可以解决问题。做必要的分组,分组行择需隐藏(“不打印”属性);数据行设置为“报表型”;如果某些字段数据量不可预知,或各行数据多寡悬殊,可设置“行高自适应”;普通行、分组行的“每页出现”属性择需设置。

3.5 多数据源的报表(简历模式)

该模式的数据源为“一主多从”的结构。以简历为例,对应的是“人员基本信息——[教育经历、工作经历„„]”。

如同前面“多数据源的单据套打”中所述,对于多数据源的情况,同样需要设置依赖关系。不赘述。

在“组件及规则”部分中已提及,利用页按主数据源的记录自动重复的功能,人员基本信息数据源中每一个人的记录都能自动得到输出。我们只需要创建一个一列多行的网格作为基本容器,第一行嵌套另一个网格放置基本信息,第二行开始各放入一个数据表,显示教育经历等各从数据源的内容。

以上描述如下图所示。为了清晰展示多层容器的关系,该图中各对象都向内部缩入,留出一圈边缘,实际设计模板时,对象应该是充满的,除非故意设计成这样。

从图中可以看到“分页提示线”,这是由于设计区域不足以容纳众多的内容,我们在页面设置中修改了页的高度。此线只是提示,按照实际纸张输出,一页有

那么大。

图3-4 简历模式

4 模板设计常见需求解决方案

4.1 盖章(电子签名)

需求一:对于动态的内容,由数据源提供数据,用图片对象直接绑定字段即可。

需求二:对于固定的内容,只是有条件地控制是否显示。用图片对象,在其“后处理脚本”中写脚本进行控制。

假设存在一个叫“是否完成”的字段isFinished,布尔值,单据状态为“完成”则加盖图章。图章的图片对象的脚本为:

if(getFieldValue(“数据源名称”, “isFinished”))

{

setHide(false);

}

else

{

setHide(true);

}

脚本不是唯一的,只要符合语法,可以举一反三。上例也可写成:

setHide(!getFieldValue(“数据源名称”, “isFinished”));

4.2 “是”/“否”(枚举值显示为汉字)

数据表单元格或单元对象绑定目标字段。后处理脚本为:

setValue(getValue()? “是” : “否”);

或:

setValue(toStr(getValue())==“true”? “是” : “否”);

4.3 能否做到只显示统计,不显示明细数据

通过隐藏数据行,可以达到目的。数据行属性--“不打印”。

虽然功能上能达到目的,但还是建议避免这种做法,尽量从数据源的角度考虑解决方案。试想为了显示若干行统计数据而取回上万行明细数据,是多么笨拙的做法。

4.4 页眉页脚

R1格式中尚无明确的“页眉页脚”的概念。通过下列途径,可达到页眉页脚一致的效果:

 放置在页中的单元对象,可随页重复输出。

 在单数据表的情况下,数据表的前、后的普通行,设置“每页出现”。

4.5 节纸打印

简而言之就是例如在一张A4纸中打印三张凭证。做法如下:页面设置中纸张按实际打印的物理纸张设置为A4,勾上“节纸打印”选项。模板中单据放置在页靠上三分之一的范围内。

4.6 连续走纸

针式打印机、两边带孔的连续纸。打印机自动走纸,无需任何特殊设置。

4.7 超市小票模式

连续的纸张,每页长度由内容决定,可以打多长就撕下多少。就像在超市买单时的购物小票。

页面设置,纸张选自定义(Custom)、纵向,勾上“动态走纸(超市小票模式)”选项。

4.8 关于纸张、横纵向与打印机进纸方向的问题

纸张有确定的大小,不管是标准纸还是自定义纸张,都是由宽度×高度来描述。例如A4纸是210×297(单位:毫米),如果尺寸为297×210,只是与A4

物理纸张一样大,不能称为A4纸。

打印机的进纸方向是与纸张尺寸一致的,与横纵向的设置无关。例如模板设置了纸张为A4纸,那么一张A4的物理纸张总是210的一端(宽)贴着进纸口,297的一端(高)垂直进纸口来装纸。

横纵向只是定义了内容在这张纸上的打印方向,和进纸方向无关。

以上是一般打印机与纸张的规则,由于容易混淆,特此说明。

另外,不管是设置了纵向还是横向,设计器和预览界面中看到的,总是文字正向的方向,不会像图片一样转换90度。

4.9 如何确定主数据源

当一个模板中定义了多个数据源时,要按照逻辑关系设置参数,定义依赖关系。模板执行时,系统自动识别“不依赖于其它数据源的”为主数据源。主数据源将影响到分页。

如果确实存在无依赖关系的、并列的数据源,则按照设计器中看到的顺序,第一个为主数据源。此时,在设计器导航栏中的数据页签中,选中除第一个之外的任一数据源,鼠标右键,可看到“成为主数据源”的弹出菜单。此菜单项可将选中目标置顶成为主数据源。

图4-1 数据源

不建议在模板中定义多个无关的数据源,而实际只使用到其中的一个或几个。

5 设计器使用技巧

 对象属性设置、设计区中的拖拽操作,遵循“选中目标”原则,即选中谁、操作谁。就像文字编辑时的光标,光标在哪里,录入的文字就插入在哪里。所以,当选中一个文字对象的时候问“为什么不能拖动表格行高”是不聪明的问题。

 设计器左边导航栏的“报表”页签,是对设计区中对象的树状描述。它的对象选中状态和设计区保持一致。当设计区中出现重叠现象,比如对象覆盖到其容器,使选中不方便时,可通过此树来选中对象。

 [Ctrl]+鼠标单击,可多选对象;[Shift]+鼠标单击,可“块选”表格(包括数据表和网格)的单元格。(注:相同容器中的对象才允许多选。)

 选中工具箱中的组件,在设计区中创建对象时,按住[Ctrl],可连续创建多个对象。

 导航栏“数据”页签,可将一个字段拖到设计区目标对象上绑定。特别地,对于数据表,拖放字段的时候按住[Shift],可将字段别名作为文本内容填入单元格中;拖放字段的时候按住[Ctrl],可将单元格的类型置为对该字段的分组统计。

 对象从一个容器“移动”到另一个容器,可剪切([Ctrl]+[X])、粘贴([Ctrl]+[V])。

 数据表单元格的内容可复制,而且可按照单元格的位置批量复制。例如把整行标题文字从第一行移动到第二行,选中第一行第一个单元格,[Shift]+选中第一行最后一个单元格,[Ctrl]+[X],选中第二行第一个单元格,[Ctrl]+[V]。

修订记录

时间

2009-1-21

作者

Along

备注

更新“单据套打”模式的插图和描述,并加上分组页码的说明。


发布者:admin,转转请注明出处:http://www.yc00.com/web/1708766784a1584471.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信