金蝶EAS_套打脚本指南及案例集
概述
本文档主要介绍金蝶BOS套打脚本的语法规则和典型应用案例等内容。本手册的内容主要是对套打功能有扩展需求的使用用户,初学者可以通过套打用户手册和套打模板制作指南掌握套打模板的基本操作过程。
读者对象
本文档适用于金蝶BOS套打模板的编制用户。
适用说明
l 该文档适用于EAS8.0及以上版本的R1套打模板。
l 详细的脚本方法说明请参考套打用户手册
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 小数点后面数字为0不显示,不为0显示
步骤1获取单元格数值,数值转换为字符串
var a = getValue();
var b = toStr(a);
步骤2判断该数值除以1的余数是否等于0,是的话就是整数,可以去掉0,不是就不去掉0
if(toNumber(a) % 1 == 0){
setValue(b.substring(0,b.indexOf(".")));
}else{
setValue(a);
}
2.13 小数点整数取整,消失取两位小数
步骤1获取单元格数值,数值转换为字符串
var a = getFieldValue("数据源名称","字段名称");
步骤2判断该数值除以1的余数是否等于0,是的话就是整数,可以去掉0,不是就保留两位小数
if(toNumber(a) % 1 == 0){
setValue(toInt(a));
}else{
setValue(format(toNumber(a),"0.00"));
}
2.14 审批信息另起一页打印
步骤1 将所有的控件放单一个大网格中,然后在审批信息数据表的上一个网格行填写下面脚本即可。
SetProperty(“newPageNextRow”,true);
金蝶EAS_套打脚本指南及案例集
本文2024-09-22 20:14:29发表“eas cloud知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-eas-112355.html