Multi attribute report

Which IIQ version are you inquiring about?

8.3

Hello

I am trying to create a report that can be scheduled as a task definition ( i hope this is the right approach )

I am having trouble getting more than one attribute in the report. I didn’t think it was going to be this difficult.

Below is the report I’ve been working with. I can get the displayname of the user but not the email. My goal is to have the displayname, email, status of each user in a certain workgroup.

Hoping someone can get me pointed in the right direction.

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE TaskDefinition PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<TaskDefinition created="1741108750259" executor="sailpoint.reporting.LiveReportExecutor" id="a24f1341954e13f08195622b27b31f67" modified="1741288785871" name="NAC Report Template" progressMode="Percentage" resultAction="Rename" significantModified="1741288785871" subType="Identity and User Reports" template="true" type="LiveReport">
  <Attributes>
    <Map>
      <entry key="TaskDefinition.runLengthAverage" value="10"/>
      <entry key="TaskDefinition.runLengthTotal" value="10"/>
      <entry key="TaskDefinition.runs" value="1"/>
      <entry key="report">
        <value>
          <LiveReport title="User Details Report">
            <DataSource defaultSort="name" objectType="Identity" type="Filter">
              <QueryParameters>
                <Parameter argument="queryFilter">
                  <QueryScript>
                    <Source>
                      import sailpoint.object.*;
                      import java.lang.*;
                      import org.apache.commons.logging.LogFactory;
                      import org.apache.commons.logging.Log;
                     
                      Log log = LogFactory.getLog("trace.NAC_Report");
                     
                      Filter f = Filter.eq("workgroup", true);
                      queryOptions.addFilter(f);          
                      Filter f2 = Filter.like("name","FNS_NAC_",Filter.MatchMode.START);
                      Iterator it = context.search(Identity.class, queryOptions);
                      while (it.hasNext()) {
                        Identity id = (Identity) it.next();
                        log.error("xxx Datasource - Name: " + id.getName() + ", DisplayName: " + id.getDisplayName() + ", Email: " + id.getEmail() + ", EmailAttr: " + id.getAttribute("email") + ", ID: " + id.getId());
                      }
                     
                      return queryOptions;
                    </Source>
                  </QueryScript>
                </Parameter>
              </QueryParameters>
            </DataSource>
            <Columns>
              <ReportColumnConfig field="Workgroup" header="Workgroup" property="name" sortable="true" width="110"/>
              <ReportColumnConfig field="email" header="Email" property="email" width="110">
                <RenderScript>
                  <Source>                    
                    import sailpoint.object.*;
                    import java.util.*;
                    import org.apache.commons.logging.LogFactory;
                    import org.apache.commons.logging.Log;

                    Log log = LogFactory.getLog("trace.NAC_Report");
                   
                    String email = "";
                   
                    log.error("xxx Email Script - here is the value " + value); // Should be groupName
                   
                    if (value != null) {
                      QueryOptions qo = new QueryOptions();
                      qo.addFilter(Filter.eq("workgroups.name", value));
                      qo.addFilter(Filter.ne("workgroup", true)); // Exclude workgroups
                     
                      Iterator entIter = context.search(Identity.class, qo);
                      int count = 0;
                      while(entIter.hasNext()){
                        Identity wg = (Identity)entIter.next();
                        String emailAttr = wg.getAttribute("email");
                        email = emailAttr != null ? emailAttr : "N/A";
                        log.error("xxx Email Script - Member - Name: " + wg.getName() + ", Email (getEmail): " + wg.getEmail() + ", Email (attribute): " + emailAttr + ", DisplayName: " + wg.getDisplayName());
                        log.error("xxx Email Script - All Member Attributes: " + wg.getAttributes());
                        count++;
                        break; // Single member per row
                      }
                      log.error("xxx Email Script - Found " + count + " members");
                    } else {
                      log.error("xxx Email Script - Value is null, skipping query");
                    }
                    log.error("xxx Email Script - Returning Email: " + email);
                    return email; // Return String for Email
                  </Source>
                </RenderScript>
              </ReportColumnConfig>
              <ReportColumnConfig field="displayName" header="Display Name" property="displayName" width="150">
                <RenderScript>
                  <Source>                    
                    import sailpoint.object.*;
                    import java.util.*;
                    import org.apache.commons.logging.LogFactory;
                    import org.apache.commons.logging.Log;

                    Log log = LogFactory.getLog("trace.NAC_Report");
                   
                    String displayName = "";
                   
                    log.error("xxx DisplayName Script - here is the value " + value); // Should be groupName
                   
                    if (value != null) {
                      QueryOptions qo = new QueryOptions();
                      qo.addFilter(Filter.eq("workgroups.name", value));
                      qo.addFilter(Filter.ne("workgroup", true)); // Exclude workgroups
                     
                      Iterator entIter = context.search(Identity.class, qo);
                      int count = 0;
                      while(entIter.hasNext()){
                        Identity wg = (Identity)entIter.next();
                        displayName = wg.getDisplayName() != null ? wg.getDisplayName() : "N/A";
                        log.error("xxx DisplayName Script - Member - Name: " + wg.getName() + ", Email (attribute): " + wg.getAttribute("email") + ", DisplayName: " + wg.getDisplayName());
                        log.error("xxx DisplayName Script - All Member Attributes: " + wg.getAttributes());
                        count++;
                        break; // Single member per row
                      }
                      log.error("xxx DisplayName Script - Found " + count + " members");
                    } else {
                      log.error("xxx DisplayName Script - Value is null, skipping query");
                    }
                    log.error("xxx DisplayName Script - Returning DisplayName: " + displayName);
                    return displayName; // Return String for Display Name
                  </Source>
                </RenderScript>
              </ReportColumnConfig>
            </Columns>
          </LiveReport>
        </value>
      </entry>
    </Map>
  </Attributes>
  <Description>FNS_NAC_ Workgroup Member report template.</Description>
</TaskDefinition>

Check below for Form and TaskDefinition.

Import the Form object first.

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Form PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<Form name="NAC Workgroup Report Form" significantModified="" type="Report">
  <Section columns="2" label="rept_uncorrelated_accounts_params_label" name="customProperties">
    <Field displayName="Workgroup Name" filterString="workgroup==true" helpKey="workgroup" name="workgroups" type="Identity" value="ref:workgroups"/>
  </Section>
</Form>

And update the TaskDefinition as below/import below TaskDefinition object

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE TaskDefinition PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<TaskDefinition executor="sailpoint.reporting.LiveReportExecutor" id="" modified="" name="NAC Report Template" progressMode="Percentage" resultAction="Rename" significantModified="" subType="Identity and User Reports" template="true" type="LiveReport">
  <Attributes>
    <Map>
      <entry key="TaskDefinition.runLengthAverage" value="10"/>
      <entry key="TaskDefinition.runLengthTotal" value="10"/>
      <entry key="TaskDefinition.runs" value="1"/>
      <entry key="report">
        <value>
          <LiveReport title="User Details Report">
            <DataSource defaultSort="name" objectType="Identity" type="Filter">
              <QueryParameters>
                <Parameter argument="workgroups" property="workgroups.id"/>
              </QueryParameters>
            </DataSource>
            <ReportForm>
              <Reference class="sailpoint.object.Form" id="" name="NAC Workgroup Report Form"/>
            </ReportForm>
            <Columns>
              <ReportColumnConfig field="username" header="User Name" property="name" sortable="true" width="110"/>
              <ReportColumnConfig field="email" header="Email" property="email" width="110"/>
              <ReportColumnConfig field="displayName" header="Display Name" property="displayName" width="150"/>
            </Columns>
          </LiveReport>
        </value>
      </entry>
    </Map>
  </Attributes>
  <Description>FNS_NAC_ Workgroup Member report template.</Description>
  <Signature>
    <Inputs>
      <Argument name="workgroups" type="Identity">
        <Description>rept_input_result_scope</Description>
      </Argument>
    </Inputs>
  </Signature>
</TaskDefinition>

Hope that helps!