套打脚本指南及案例集

栏目:eas cloud知识作者:金蝶来源:金蝶云社区发布:2024-09-22浏览:1

套打脚本指南及案例集

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("");

}


套打脚本指南及案例集

1 套打脚本语法及规则1.1 简要说明1、该脚本系统采用类Java/JavaScript的语法。2、面向对象的设计:调用一个对象(假设其名称为text1)的某...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息