How to add custom field to report

Hi everyone,
I would like to ask you for a help with adding small customization to one of OOTB Report templates (and want to point that this is my very first time playing with Reports so don’t judge me).
I wanted to add column called “Completer” to report template called “Work Item Archive Report” that would show who completed work item that was archived. The main reason for this is that our Compliance team wants to review who completed work items with type “Manual Action” (and I couldn’t find any report that would show this).

I reviewed that Manual Actions work items in archive have this parameter:
image

So I was trying to add Parameter to Query parameters section like this:

 <Parameter argument="completers">
                  <QueryScript>
                    <Source>
                                    
                                    import sailpoint.object.*;
                                    import sailpoint.api.*;
                                    if (value != null &amp;&amp; !value.isEmpty()){
                                      if (arguments.get("isArchive") == true){
                                        List names = ObjectUtil.convertIdsToNames(context, Identity.class, value);
                                        queryOptions.addFilter(Filter.in("completer", names));
                                      } else {
                                        queryOptions.addFilter(Filter.in("completer.id", value));
                                      }
                                    }

                                    return queryOptions;
                                    
                                  </Source>
                  </QueryScript>
                </Parameter>

Then I added this field to report form:
<ReportColumnConfig field="requester" header="Completer" property="completers" sortable="true" width="110"/>

And added this argument to Inputs section:

      <Argument multi="true" name="completers" type="Identity">
        <Description>Person who completed work item</Description>
      </Argument>

However, when I execute report using this report template, I receive following error:

sailpoint.tools.GeneralException: Error preparing ProjectionDataSource
	at sailpoint.reporting.JasperCsvWriter.write(JasperCsvWriter.java:139)
	at sailpoint.reporting.LiveReportExecutor.execute(LiveReportExecutor.java:228)
	at sailpoint.api.TaskManager.runSync(TaskManager.java:895)
	at sailpoint.api.TaskManager.runSync(TaskManager.java:722)
	at sailpoint.scheduler.JobAdapter.execute(JobAdapter.java:128)
	at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: net.sf.jasperreports.engine.JRException: Error preparing ProjectionDataSource
	at sailpoint.reporting.datasource.BaseProjectionDataSource.next(BaseProjectionDataSource.java:206)
	at sailpoint.reporting.datasource.WorkItemArchiveDataSource.next(WorkItemArchiveDataSource.java:171)
	at sailpoint.reporting.JasperCsvWriter.write(JasperCsvWriter.java:103)
	... 6 more
Caused by: sailpoint.tools.GeneralException: could not resolve property: completers of: sailpoint.object.WorkItem
	at sailpoint.persistence.HibernatePersistenceManager.search(HibernatePersistenceManager.java:2064)
	at sailpoint.persistence.ClassPersistenceManager.search(ClassPersistenceManager.java:334)
	at sailpoint.server.InternalContext.search(InternalContext.java:880)
	at sailpoint.reporting.datasource.ProjectionDataSource.prepare(ProjectionDataSource.java:56)
	at sailpoint.reporting.datasource.BaseProjectionDataSource.next(BaseProjectionDataSource.java:203)
	... 8 more
Caused by: org.hibernate.QueryException: could not resolve property: completers of: sailpoint.object.WorkItem
	at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:73)
	at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:67)
	at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyType(AbstractEntityPersister.java:4775)
	at sailpoint.persistence.HQLAliasContextImpl.getPropertyInfo(HQLAliasContextImpl.java:214)
	at sailpoint.persistence.HQLAliasContextImpl.parseProperty(HQLAliasContextImpl.java:242)
	at sailpoint.persistence.HQLAliasContextImpl.substituteAlias(HQLAliasContextImpl.java:117)
	at sailpoint.persistence.HQLAliasContextStack.substituteAlias(HQLAliasContextStack.java:101)
	at sailpoint.persistence.HQLFilterVisitor.addSelectColumns(HQLFilterVisitor.java:577)
	at sailpoint.persistence.HQLFilterVisitor.getQueryString(HQLFilterVisitor.java:511)
	at sailpoint.persistence.HibernatePersistenceManager.search(HibernatePersistenceManager.java:2046)

Could you tell me if adding this field is even possible? If yes, could you tell me what would I need to do to add it?

Thank you in advanced for everybody who will participate in this topic!

Does anybody have any idea for this topic?

Hi @KrzysztofG,

2 tips:

  1. The error says
    could not resolve property: completers of: sailpoint.object.WorkItem
    This means it’s also looking at WorkItems, not just WorkItemArchives. WorkItems don’t have a field completers (the actual field is completer, and only for WorkItemArchive). This is the reason for that error. Try setting the Included Work Items filter to : Archived. This will make the task executer only look at WorkItemArchives.
    <entry key="statusOptions" value="archive"/>.

  2. Unfortunately however, the WorkItemDataSource does not return completer as a column option to return in the report. You would have to create your own DataSource that does that. You can refer to “Developing Custom Reports” in the “IdentityIQ Reports” documentation. You can do that by either using a Filter based DataSource, or, what is most commonly used, creating a Java DataSource. This is a java class that conforms to the interface sailpoint.reporting.datasource.JavaDataSource, which is described in the IIQ JavaDocs.

Hope this helps you forward :wink:

Kind regards,
Wim

1 Like