Search code examples
velocitypolarion

Polarion Velocity Script adding a custom field integer


I'm new to Velocity scripting and made a few simple scripts and they work ok. I'm now trying something else, which should be simple but I can't seem to get it to work.

I'm selecting a bunch of Work Items, reading a custom field (NumberPack) and I just want to sum them.

My script is as follow:

#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

As you can see I tried a few methods but I keep getting the total 0.

Any ideas what I'm doing wrong?

Thanks


Solution

  • If you write

    #set($Pack = $PCR.fields.get("NumberPack"))
    Pack: $Pack <br>
    

    the output is something like:

    Pack: com.polarion.alm.server.api.model.fields.ProxyIntegerField@67807d51 
    

    In the API Javadoc (https://almdemo.polarion.com/polarion/sdk/doc/javadoc-rendering/com/polarion/alm/shared/api/model/fields/IntegerField.html), you'll find that api.model.fields IntegerField has a get() method, which gives you the value. Though I agree this is never explicitly stated in the documentation.

    You need to write

    #set($Pack = $PCR.fields.get("NumberPack").get())
    

    to get the value. The following statement will give you the cumulative sum.

    #set($Total = $math.add($Total, $PCR.fields.get("NumberPack").get()))
    

    Also be careful with your #foreach statement. In this case it seems to work, but it would be safer to give your iterator variable a name differing from the collection you are iterating through. For example:

    #foreach($PCR in $PCRs)