Polarion Velocity脚本自定义整数字段求和失败求助
Velocity脚本工作项字段求和失败问题解决
问题场景
刚接触Velocity脚本,此前简单脚本运行正常,但筛选工作项并对自定义整数字段NumberPack求和时,总和Total始终为0,原脚本如下:
#set($PCR = $transaction.workItems.search.query("type:Paramrequest AND created:[20220101 TO 30000000] AND NumberPack.1:[00000000001 TO 02147483647]")) #set($Total = 0) #set($Pack = 0) #set($x = 0) #foreach($PCR in $PCR) ##set($Pack = $Pack.parseInt($PCR.fields.get("NumberPack"))) ##set($x = $Total.add($Pack)) $PCR.fields.get("NumberPack").render ## this renders each NumberPack of each WI #set($Pack = $PCR.fields.get("NumberPack")) ##set($x = $Total2.add($PCR.fields.get("NumberPack"))) ##set($Total2 = $Total2 + 1) #set($x = $math.add($x, 1)) #end <br> Total: $Total <br> $x
问题排查
- 变量名冲突:循环变量
$PCR和存储查询结果的变量$PCR重名,导致循环遍历逻辑异常,无法正确访问每个工作项的字段。 - 未有效更新总和:原脚本没有对
$Total执行有效的累加操作,被注释的代码要么语法错误,要么未实际生效;且Velocity中数值为不可变类型,必须通过重新赋值更新变量。 - 类型处理缺失:未确保
NumberPack字段值被转为可运算的整数类型,若返回为字符串会导致累加逻辑失效。 - $math.add使用错误:原代码中
$math.add($x, 1)未重新赋值给$x,虽然这里不影响求和,但属于不规范用法。
修正后的脚本
#set($pcrList = $transaction.workItems.search.query("type:Paramrequest AND created:[20220101 TO 30000000] AND NumberPack.1:[00000000001 TO 02147483647]")) #set($Total = 0) #set($itemCount = 0) #foreach($item in $pcrList) #set($packValue = $item.fields.get("NumberPack")) #set($packInt = $numberTool.parseInt($packValue)) #set($Total = $math.add($Total, $packInt)) #set($itemCount = $math.add($itemCount, 1)) $packValue.render #end <br> Total: $Total <br> 处理的工作项数量: $itemCount
关键修改说明
- 修复变量冲突:将查询结果变量改为
$pcrList,循环变量用$item,保证遍历逻辑正常执行。 - 正确累加总和:通过
$math.add()计算新总和并重新赋值给$Total,符合Velocity不可变数值的特性。 - 类型安全转换:用
$numberTool.parseInt()将字段值转为整数,避免字符串类型导致的运算错误。 - 简化冗余代码:移除无效注释和冗余变量,让逻辑更清晰易懂。
内容的提问来源于stack exchange,提问作者Julien Llanes
相关产品推荐
相关产品推荐

