Questions about ProvisioningTransactionObjectDataSource

Which IIQ version are you inquiring about?

8.3

I have an issue with reporting using the above. I use this:

              <ReportColumnConfig field="name" header="report_provisioning_id" property="name" sortable="true" width="110"/>
              <ReportColumnConfig field="name1" header="report_provisioning_id" property="name" sortable="true" width="110"/>


And the result is that the first column is always populated, and the second is always empty. In addition, I notice when the name is missing any leading 0’s the name, even through I expect the name to be a string.

On a related note, is there a list of properties ProvisioningTransactionObjectDataSource? It’s not in the javadoc.

Hi @AJGibson76 ,

As you are using an invalid field name ‘name1’ the value is not getting populated. The value of the field gets populated from the java code in the class ProvisioningTransactionObjectDataSource.

Can you share Entire Report xml to be able to help you better?

Sure:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE TaskDefinition PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<TaskDefinition executor="sailpoint.reporting.LiveReportExecutor" name="Reporting_DetailedProvisioningTransaction_Test" progressMode="Percentage" resultAction="Rename" subType="Administration Reports" template="true" type="LiveReport">
  <Attributes>
    <Map> 
      <entry key="report">
        <value>
          <LiveReport disablePreview="true" title="Reporting_DetailedProvisioningTransaction_Test">
            <DataSource dataSourceClass="sailpoint.reporting.datasource.ProvisioningTransactionObjectDataSource" type="Java">
              <QueryParameters>
                <Parameter argument="identities" property="identityName"/>
                <Parameter argument="applications" property="applicationName"/>
                <Parameter argument="integration" property="integration">
                  <QueryScript>
                    <Source><![CDATA[            
                        import java.util.*;

                        import sailpoint.object.*;

                        if (value != null && !value.isEmpty()){
                          queryOptions.addFilter(Filter.ignoreCase(Filter.like("integration", value, Filter.MatchMode.START)));
                        }

                         return queryOptions;   
                      ]]></Source>
                  </QueryScript>
                </Parameter>
                <Parameter argument="accountDisplayName" property="accountDisplayName">
                  <QueryScript>
                    <Source><![CDATA[
                        import java.util.*;

                        import sailpoint.object.*;

                        if (value != null && !value.isEmpty()){
                          queryOptions.addFilter(Filter.ignoreCase(Filter.like("accountDisplayName", value, Filter.MatchMode.START)));
                        }

                        return queryOptions;
                      ]]></Source>
                  </QueryScript>
                </Parameter>
                <Parameter argument="status" property="status"/>
                <Parameter argument="type" property="type"/>
                <Parameter argument="operation" property="operation"/>
                <Parameter argument="source" property="source">
                  <QueryScript>
                    <Source><![CDATA[
                        import java.util.*;

                        import sailpoint.object.*;

                        if (value != null && !value.isEmpty()){
                          queryOptions.addFilter(Filter.ignoreCase(Filter.like("source", value, Filter.MatchMode.ANYWHERE)));
                        }

                        return queryOptions;
                      ]]></Source>
                  </QueryScript>
                </Parameter>                
                <Parameter argument="creationDate" property="created" valueClass="daterange"/>
                <Parameter argument="forced" property="forced">
                  <QueryScript>
                    <Source><![CDATA[
                        import java.util.*;

                        import sailpoint.object.*;

                        if (value == true){
                          queryOptions.addFilter(Filter.eq("forced", true));
                        }

                        return queryOptions;
                      ]]></Source>
                  </QueryScript>
                </Parameter>             
              </QueryParameters>
            </DataSource>
            <ReportForm>
              <Reference class="sailpoint.object.Form" name="DetailedProvisioningTransaction"/>
            </ReportForm>
            <Columns>
              <ReportColumnConfig field="name" header="name" property="name" sortable="true" width="110"/>
              <ReportColumnConfig field="name1" header="name1" property="name" sortable="true" width="110"/>
            </Columns>
          </LiveReport>
        </value>
      </entry>
    </Map>
  </Attributes>
  <Description>Test Report</Description>
  <Signature>
    <Inputs>
      <Argument multi="true" name="applications" type="Application">
        <Description>help_report_provisioning_application</Description>
      </Argument>
      <Argument multi="true" name="identities" type="Identity">
        <Description>help_report_provisioning_identity</Description>
      </Argument>
      <Argument multi="true" name="integration" type="ProvisioningTransaction">
        <Description>help_report_provisioning_integration</Description>
      </Argument>
      <Argument name="accountDisplayName" type="string">
        <Description>help_report_provisioning_account_display_name</Description>
      </Argument>
      <Argument multi="true" name="operation" type="string">
        <Description>help_report_provisioning_operation</Description>
      </Argument>
      <Argument multi="true" name="source" type="string">
        <Description>help_report_provisioning_source</Description>
      </Argument>
      <Argument multi="true" name="status" type="string">
        <Description>help_report_provisioning_status</Description>
      </Argument>
      <Argument multi="true" name="type" type="string">
        <Description>help_report_provisioning_type</Description>
      </Argument>
      <Argument name="creationDate" type="date">
        <Description>help_report_provisioning_date</Description>
      </Argument>
      <Argument name="forced" type="boolean">
        <Description>help_report_provisioning_forced</Description>
      </Argument>
    </Inputs>
  </Signature>
</TaskDefinition>

Any reason why you want to use the same field name/property in multiple columns?

I also tried this:

           <ReportColumnConfig field="name" header="name" property="name" sortable="true" width="110"/>

              <ReportColumnConfig field="name1" header="name1" property="name" sortable="true" width="110"/>

              <ReportColumnConfig field="name" header="name2" property="name2" sortable="true" width="110"/>


The result is: name column presents a value, name1 is empty, and name2 isn’t physically present in the results.

I need multiple columns that are derived from the ProvisioningTransaction. This means I need multiple columns being fed the id so I can retrieve the PT and then retrieve the field I want from it. The xml I posted is me just trying to figure out the issue.

Is there a way I can retrieve it once for the entire row? That would probably be more efficient anyways.

Hi,

you can use only the property variables available in the ProvisioningTransaction Object or hibernate xml file.

Since you are using invalid property and field name, the values are not getting populated and might cause an error

Could you let us know what columns you want in your results , so that we coould help you to retrieve the results

Then you can use Filter datasource type so you can set any field name to the column, can take the id and use RenderScript to customize the column values by taking the property as id.

I already have a Filter report that uses the ProvisioningTransaction and much of the code I have works there. This, however, uses the sailpoint.reporting.datasource.ProvisioningTransactionObjectDataSource java object, which does not have a corresponding table, and I don’t have access to the source code or any javadoc.

Andrew, I think you can acheive the same goal using the Filter based report.

Also can you try this if this works?

sailpoint.reporting.datasource.ProvisioningTransactionObjectDataSource is not an object, it is a class which implements the JavaDataSource interface, to retrieve the data related to the ProvisioningTransaction object, therefore you can use only the properties of ProvisioningTransaction object in the property

It’s a java object, instead of a transaction object. As I have said several times, there is no javadoc for this object, so I don’t know what properties it possesses.

Also, none of this solves the original issue, calling the name property more than once fails.

I have tried is and it does work, however the same code does not work with the java object approach. The filter approach does not give me what my bosses have demanded of me. I need the java approach. I need to be able to call the same property multiple times and get the same value back.

There is no JavaDocs for the class “sailpoint.reporting.datasource.ProvisioningTransactionObjectDataSource” as it is not a primary object class and this class is created for the ProvisioningTransaction reports

To view the properties available to be used in the report, you should look into the ProvisioningTransaction object from debug page.

As you are using the invalid field names, the columns are not getting populated and not because of the property. To look at the available field names you can look into the OOTB “Detailed Provisioning Transaction Object Report” report.

If you want to use you custom field names and use Java DataSource type, then you can create a custom class which implements JavaDataSource and mention it in the “dataSourceClass” in the TaskDefinition.

This is all deflecting from the core issue. This is the relevant code:

              <ReportColumnConfig field="name" header="name" property="name" sortable="true" width="110"/>
              <ReportColumnConfig field="nameOne" header="nameOne" property="name" sortable="true" width="110"/>

The first column is populated, the second is empty. Why?

That’s the behavior of java data source reports. The fields are hardcoded inside the data source class but all the available object (in this case ProvisioningTransaction) properties can be added as field names and you will get the respective value.

As your requirement is to get some field from the provisioning transaction object, try adding the property name as the field name and set the property to the value same as that of the field name.

If the field property is not what is needed and you need to make other lookups, add a renderscript to the name field and do the needed lookups and put them in a variable called renderCache as renderCache.put("varName", objValue) which are persistent for the whole report execution and retrieve the value in another custom column render script and return it.

<ReportColumnConfig field="name" header="name" property="name" sortable="true" width="110">
    <RenderScript>
        // lookup the value using methods value is the variable that will hold the current value for this field and return the value in the end
        renderCache.put("otherField", objectValue);
        return value;
    </RenderScript>
</ReportColumnConfig>
<ReportColumnConfig field="nameOne" header="nameOne" property="name" sortable="true" width="110">
  <RenderScript>
        // lookup the value from the renderCache and return it
        return renderCache.get("otherField", objectValue);
    </RenderScript>
</ReportColumnConfig>

I tried it:

              <ReportColumnConfig field="name" header="report_provisioning_id" property="name" sortable="true" width="110">
                <RenderScript>
                  <Source><![CDATA[
                    renderCache.put("accessId", value);
                    return renderCache.get("accessId");
                  ]]></Source>
                </RenderScript>
              </ReportColumnConfig>
              <ReportColumnConfig field="accessId" header="accessId" property="name" width="110">
                <RenderScript>
                  <Source><![CDATA[
                    return renderCache.get("accessId");
                  ]]></Source>
                </RenderScript>
              </ReportColumnConfig>
              <ReportColumnConfig field="accessId1" header="accessId1" width="110">
                <RenderScript>
                  <Source><![CDATA[
                    return renderCache.get("accessId");
                  ]]></Source>
                </RenderScript>
              </ReportColumnConfig>

The first column is populated, but the last 2 are not. Any reason why?

Does RenderScript not work with DataSource reports?

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.