SAP CPI中Groovy脚本使用数组引用进行日期比较异常咨询
问题根因
- 数组访问错误:入参
status是字符串数组,所有判断条件中直接用status == "Approved"将整个数组与字符串比较,该判断永远返回false,是逻辑失效的核心原因,应改为status[i] == "Approved"取当前循环的元素判断。 - 日期类型混用错误:第三个判断条件中
dateApprovedDt是Date类型,CurrentDate是字符串类型,直接用<比较会触发类型匹配异常,需先将CurrentDate转为Date类型再比较。 - 数组越界风险:你定义的
status1数组只有2个元素,索引范围为0和1,else分支中访问status1[2]会直接抛出数组越界异常。 - 逻辑顺序错误:第二个
else if的判断条件完全包含第一个if的条件,只要第一个if成立,第二个分支永远不会被触发,需要调整判断顺序,将更严格的条件(带版本号判断的)放在前面。 - 字符串版本号比较错误:
version[i] > "1"是字符串字典序比较,若版本号存在多位数(如10)会出现判断错误,建议转为整数后再比较。
修正后可用代码
import com.sap.it.api.mapping.*; import java.text.SimpleDateFormat; import java.util.Date; def void Itemstatus(String[] ApprovedDt,String[] status,String[] version,String[] propertyName, Output output,MappingContext context) { String lets = context.getProperty(propertyName[0]); SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd"); Date datelets = formatter1.parse(lets); Date currentDate = new Date(); Date parsedCurrentDate = formatter1.parse(currentDate.format("yyyy-MM-dd")); // 统一日期格式,去掉时分秒影响 def status1 = ["Active","Inactive","Unknown"]; // 补充第三个状态避免越界 for(int i=0; i<status.size(); i++) { Date dateApprovedDt = formatter1.parse(ApprovedDt[i]); String currentStatus = status[i]; Integer currentVersion = version[i].toInteger(); // 更严格的版本判断放前面 if (currentStatus == "Approved" && dateApprovedDt > datelets && currentVersion > 1) { output.addValue(status1[0]) } else if(currentStatus == "Approved" && dateApprovedDt > datelets) { output.addValue(status1[0]) } else if (currentStatus == "Approved" && dateApprovedDt < parsedCurrentDate) { output.addValue(status1[1]) } else { output.addValue(status1[2]) } } }
- 按你提供的测试数据(基准日期2021-09-30),修正后输出结果为:id1对应Inactive、id2对应Inactive、id3对应Active,符合业务逻辑要求。
内容的提问来源于stack exchange,提问作者vijay
相关产品推荐
相关产品推荐

