套打脚本指南及案例集
1 套打脚本语法及规则
1.1 简要说明
1、该脚本系统采用类Java/JavaScript的语法。
2、面向对象的设计:调用一个对象(假设其名称为text1)的某个方法(假设为getValue),书写为:text1.getValue();
如果是当前对象,则text1可省略,直接写为:getValue()。
3、大小写敏感。
1.2 脚本编辑域
套打脚本可存在于模板设计期中的任意对象,如文字对象、图片对象、金额对象、网格(单元格、行、列及整个网格对象)、数据表(单元格、行、列及整个数据表对象)、动态列表等的前\后处理脚本编辑框中。
前处理脚本 — 是一段小程序,执行引擎在解析模板时,处理该对象之前运行,可用于修改初始值。
后处理脚本 — 是一段小程序,执行引擎在解析模板时,处理该对象之后运行,可用于修改对象的输出结果。具体语法及函数可参考设计器脚本向导中的说明。
1.3 变量定义及赋值
示例:var a = b + 1;
注意:所定义变量的作用域只在当前脚本块,全局变量请使用set()、get()函数。
1.4 控制语句
if...else...
for
while/do while
switch case
break/continue
2 案例
2.1 盖章(电子签名)
需求一:
对于动态的内容,由数据源提供数据,用图片对象直接绑定字段即可。
需求二:
对于固定的内容,只是有条件地控制是否显示。用图片对象,在其“后处理脚本”中写脚本进行控制。
假设存在一个叫“是否完成”的字段isFinished,布尔值,单据状态为“完成”则加盖图章。图章的图片对象的脚本为:
if(getFieldValue(“数据源名称”, “isFinished”))
{
setHide(false);
}
else
{
setHide(true);
}
脚本不是唯一的,只要符合语法,可以举一反三。上例也可写成:
setHide(!getFieldValue(“数据源名称”, “isFinished”));
2.2 “是”/“否”(枚举值显示为汉字)
数据表单元格或单元对象绑定目标字段。后处理脚本为:
setValue(getValue()? “是” : “否”);
或:
setValue(toStr(getValue())==“true”? “是” : “否”);
2.3 字符串匹配替换
需求:
明细分类账套打,凭证类型字段取值(凭证类型+编码)过长,如
“银行付款 – 001”、“银行收款 – 002”,现希望在不改变元凭证类型基础资料前提下,实现打印效果只显示“银付 – 001”、“银收 – 001”。
示例:
var t = getValue();
if(t.contains("银行付款")){setValue(replaceString(t,"银行付款","银付"));}
if(t.contains("银行收款")){setValue(replaceString(t,"银行收款","银收"));}
2.4 关于期间2011-01-01~2011-01-31 现场则想得到格式 201101
操作步骤:
客户端登陆【系统平台->套打->套打管理】,编辑对应的ReportOne模板,找到薪资期间对应的单元格,右键->属性->切换到"通用"页签->后处理脚本。
在后处理脚本框中添加脚本:
string str = getValue();
List date = Arrays.asList(str.split("~"));
List result = Arrays.asList(date.get(0).split("-"));
setValue(result.get(0) + result.get(1));
2.5 年龄计算
var a = year(now());
var b = year(getFieldValue("ds_baseInfo","birthday"));
var c = month(now());
var d = month(getFieldValue("ds_baseInfo","birthday"));
var e = day(now());
var f = day(getFieldValue("ds_baseInfo","birthday"));
var age;
if(c>d || (c==month(getFieldValue("ds_baseInfo","birthday")) && e>=f )){
age = a-b;
}else{
age = a-b-1;
}
setValue(age);
2.6 时间差计算
2.6.1 计算两个日期之间的间隔天数
解决方式:
方法一、通过在SQL中加入天数的字段,将两个日期时间差计算好之后,在套打模板中引入天数字段取值;
方法二、脚本处理:
var v1 = (getFieldValue("数据源","结束时间").getTime());
var v2 = (getFieldValue("数据源","开始日期").getTime());
var quot = v1 - v2;
quot = toInt(quot / 1000 / 60 / 60 / 24);
setValue(quot);
补充说明:
推荐使用方式一,方法二调用了java取函数的方法,计算精确到毫秒,计算结果可能会带小数。
2.6.2 推算某日期的前\后几天的日期
可以先通过js的getTime()转换成毫秒并参与运算,然后将毫秒转通过setTime()换成date型数据。
例:
var add = 1000 * 60 * 60 * 24; //增加一天
var d1 = now().getTime();
var d2 = new Date();
d2.setTime(d1 + add);
setValue(d2);
2.7 数值向上取整脚本示例
通过脚本Math.ceil()运算时,直接输入数值,如Math.ceil(1.23)可取整运算;但是在该方法中嵌套其他的方法时,无法计算出结果,如Math.ceil(getValue())或者Math.ceil(getFieldValue(ds,field))。
Math.ceil貌似和getValue这样的函数不在一个域内,试过好多情况都不能用。可以用一种变通的方法解决,参考以下脚本:
var x=getValue();
var n=toInt(x);
var m=format(x,"0.0");
m=rightString(toStr(m),1);
if(toNumber(m)>0){
setValue(n+1);
}else{
setValue(n);
}
2.8 某分录块没有数据,套打时整块分录不显示(包括表头行和数据行)
以员工简历为例,假如员工没有学历学位信息,则套打模板不显示学历学位整块内容。
该类情况需要在主数据源中有一个标记字段,区分该员工是否有学历学位信息。此处假设以“曾用名”为标记字段,存在曾用名,则该有学历信息,否则表示该员工无学历信息。
在学历数据表所在的网格行中使用后处理脚本
setHide(getFieldValue("ds_baseInfo","oldName")==null)
2.9 多级审批时,将对应环节的审批人取出,放置在指定单元格
步骤1 数据表(格式:普通行-数据行-普通行)绑定多级审批数据源。
在第一个普通行中设置变量,用来存储审批人信息,如:String a=""; String b="";
建议使用更有意义的命名方式。
步骤2 数据行中获取审批人信息,如根据任务名称判断审批人,然后存储在已经设置的变量中。
If(getFieldValue("审批数据源名","任务名称")=="某值"){
a= getFieldValue("审批数据源名","审批人");
}
if(getFieldValue("审批数据源名","任务名称")=="某某值"){
b= getFieldValue("审批数据源名","审批人");
}
…
步骤3 在最后一个普通行中,将获取到的变量值,设置在合适的单元格中。
setValue(a);
补充说明:
1. 前两行都要选中整行后,修改属性,最后一行显示值时,是选中单元格修改属性。
2. 定义变量请在前处理脚本中,数据处理及返回值在后置脚本中;
前两行请在属性中设置“不打印”,只需显示最后一个普通行即可。具体实现,请自行调整。
2.10 当审批中存在加签时,加签节点的任务名称和原审批节点的任务名称一致,如何分别取出多个审批人
步骤1 普通行(或者数据行前的分组行)前处理脚本中,设置数组型变量。
var result = new ArrayList();
步骤2 数据行后处理脚本中,将符合条件的数据插入到数组中。
if(getFieldValue("R1Print_SystemDefine_Approve","AssignDetail.actdefName") == "XX审批")
{
result.add(getFieldValue("R1Print_SystemDefine_Approve","personId.name"));
}
步骤3 将数组中存储的的各值取出。
setValue(result.get(0)); //取出数组中的第一个值
2.11 使用数据表或者动态列表打印分录时,能显示每条分录的序号。
步骤1 在空白处拖入一个文字控件,前置脚本:
Int a =0;
后置脚本:
setHide(true);
步骤2在动态单元格中要显示序号的单元格或者写下后置脚本:
if(getFieldValue("approveInfo","opinion")!=null){
a+=1;
}
setValue(a);
}
2.12 套打日期加一天后置脚本。
后处理脚本:
var a = getValue().toString();
SimpleDateFormat sj = new java.text.SimpleDateFormat("yyyy-MM-dd");//根据需要设置对应的日期格式
Date d = sj.parse(a);
Calendar calendar = Calendar.getInstance();
calendar.setTime(d);
calendar.add(Calendar.DATE, 1);
setValue(sj.format(calendar.getTime()));
2.13 总页码只有一页时候,隐藏总页码(利用回填值和字符串处理)。
后处理脚本:
//<RunAfterStat>
if(getValue().substring(5,6) == "1"){
setValue("");
}
套打脚本指南及案例集
本文2024-09-22 20:14:51发表“eas cloud知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-eas-112393.html