用途
如何将作业(job)中设置的参数值,传递到子转换(ktr)脚本。
应用场景
为了保持kettle脚本通用性,一般通过设置命名参数的方式解决。
执行时,通过动态设置参数的达到脚本通用的目的。
例如:脚本job_1,用于计算2组数据,其中时间范围取值如下:
报告名称 | 时间范围 | 开始日期(ksrq) | 结束日期(jsrq) |
报告1 | 当年1月1日到今天0点 | 2020-01-01 | 今日0点 |
报告2 | 昨天0点到今天0点 | 昨天0点 | 今日0点 |
问题描述
- 上述脚本每天都需要手工执行;
- 每次执行时,都需要手工设置开始、结束时间,较为繁琐,且人工设置容易出错;
- 希望在不改变子转换脚本的前提下,实现参数的自动传入;
问题分析
由于上述业务需求固定,计划在作业脚本中,编写JavaScript脚本,自动计算开始日期,结束日期参数,并将参数传递到子转换脚本中。
1、作业总体流程
1.1、作业命名参数
1.2、设置变量-步骤
/*
如何将作业(job)中设置的参数值,传递到子转换(ktr)脚本
功能:获取或设置变量
作用域:仅当前作业(job)有效
parent_job.setVariable
parent_job.getVariable
功能:获取或设置参数变量
作用域:作业(job)和子转换脚本都有效
parent_job.getParameterValue
parent_job.setParameterValue
*/
// 获取计算类型:1、计算累计数据,2:计算昨天数据
var useType = parent_job.getVariable("type");
var dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd");
var date = new java.util.Date();
// 计算今天
date.setDate(date.getDate());
var today = dateFormat.format(date);
// 计算昨天
date.setDate(date.getDate()-1);
var yesterday = dateFormat.format(date);
if (useType == 1) {
parent_job.setParameterValue("ksrq",parent_job.getVariable("ksrq.default"));
}else{
parent_job.setParameterValue("ksrq",yesterday);
}
parent_job.setParameterValue("jsrq",today);
true;
2、子转换
2.1、转换-命名参数
2.2、获取系统信息-步骤
2.3、写日志-步骤
3、执行结果
3.1、子转换执行结果
转换脚本执行时,如果不指定开始日期(ksrq),结束日期(jsrq)参数,执行结果如下:
3.2、作业执行结果
- 使用默认参数的执行结果
开始日期默认为2020-01-01 - 作业执行时,设置type=2,执行结果如下
说明作业中的参数正确传入到子转换脚本中: