End-User Reporting

Overview

Allows end users of the platform to construct their own grids, charts, and dashboards.

Key Features & Functionality

  • Quick setup of data catalog based on existing record types
  • Front end construction of the follow types: grid, pie charts, bar charts, column chart, line chart, KPI, and more!
  • Front end configuration of dashboards to combine multiple charts into a single page with page filters
  • Dashboards and reports can be individually shared with Users and Groups
  • End user documentation

Note: Appian provides self-service analytics capabilities where end users can explore enterprise data and build their own custom reports. Before downloading this utility, refer to Appian Documentation to see if you can use the available self-service analytics capabilities.

Anonymous
  • Looks like this might be a 23.2.20.0 Appian thing.

  • Experiencing this error. Please advise.

    An error occurred while evaluating expression: recordTypes: rule!EUR_ParseRecordType(
     documents: reject(
        fn!isnull,
        a!forEach(
          items: pv!documents,
          expression: if(
            or(
             document(fv!item, "extension") = "xml",
             document(fv!item, "extension") = "xsd"
            ),
            fv!item,
            null
          )
         )
       )
    ) (Expression evaluation error in rule 'eur_parserecordtype' at function a!forEach [line 5]: Error in a!forEach() expression during iteration 1: Expression evaluation error at function 'xpathdocument' [line 19]: Namespace with prefix 'xsi' has not been declared.) (Data Outputs)

    We use Oracle and are on Appian 23.2.205.0. 

  • I deleted the app and restarted. I think It happened because I clicked submit on the configure record type screen before click on the pencil/edit icon and establishing the fields

  • Hi, I am getting this error after using the workaround above when selecting to configure a record type. Is this a similar issue from the 23.2 upgrade or do you think I did something wrong? 

  • If you update this rule: EUR_ParseRecordType with the content of the following code block.  That should be a good workaround until the product fixes the issue.

    a!localVariables(
      local!icons: rule!EUR_IconList(),
      reject(
        fn!isnull,
        a!forEach(
          items: ri!documents,
          expression: a!localVariables(
            local!document: fv!item,
            local!isRecord: not(rule!EUR_isEmpty(xpathdocument(
              fv!item,
              "//recordType/@name"
            ))),
            local!isCdt: not(rule!EUR_isEmpty(xpathdocument(
              fv!item,
              "//*[local-name()='complexType']/@name"
            ))),
            local!isExpressionBacked: if(
              local!isRecord,
              tostring(xpathdocument(
                fv!item,
                "//recordType/*[local-name()='source']/@*[local-name()='type']"
              )) = "a:Datatype",
              false
            ),
            if(
              or(
                and(
                  local!isRecord,
                  not(local!isExpressionBacked)
                ),
                local!isCdt
              ),
              a!localVariables(
                local!name: tostring(xpathdocument(
                  docId: fv!item,
                  expression: if(
                    local!isRecord,
                    "//recordType/@name",
                    "//*[local-name()='complexType']/@name"
                  )
                )),
                local!pluralName: if(
                  local!isRecord,
                  tostring(xpathdocument(
                    docId: fv!item,
                    expression: "//*[local-name()='pluralName']/text()"
                  )),
                  local!name
                ),
                local!uuid:  if(
                  local!isRecord,
                  tostring(xpathdocument(
                    docId: fv!item,
                    expression: "//recordType/@*[local-name()='uuid']"
                  )),
                  "{" &
                  tostring(xpathdocument(
                    docId: fv!item,
                    expression: "//*[local-name()='schema']/@targetNamespace"
                  )) & "}" & 
                  tostring(xpathdocument(
                    docId: fv!item,
                    expression: "//*[local-name()='complexType']/@name"
                  ))
                ),
                local!fieldsXml: xpathdocument(
                  docId: fv!item,
                  expression: if(
                    local!isRecord,
                    "//*[local-name()='sourceConfiguration']//field",
                    "//*[local-name()='element']"
                  )
                ),
                local!dataStoreEntityUuidResult: if(
                  local!isRecord,
                  tostring(xpathdocument(
                    docId: fv!item,
                    expression: "//*[local-name()='source']/@*[local-name()='uuid']"
                  )),
                  null
                ),
                local!dataStoreEntityUuid: if(
                  rule!EUR_isBlank(local!dataStoreEntityUuidResult),
                  null,
                  index(split(local!dataStoreEntityUuidResult, "@"), 1, null)
                ),
                local!dataType: if(
                  rule!EUR_isBlank(local!dataStoreEntityUuidResult),
                  null,
                  reject(
                    fn!isnull,
                    a!flatten(a!forEach(
                      items: ri!documents,
                      expression: xpathdocument(
                        docId: fv!item,
                        expression: "//entity[uuid = '" & local!dataStoreEntityUuid & "']/type/text()"
                      )
                    ))
                  )
                ),
                local!fields: reject(
                  fn!isnull,
                  a!forEach(
                    local!fieldsXml,
                    if(
                      local!isRecord,
                      'type!{urn:com:appian:types:EUR}EUR_RecordTypeField'(
                        uuid: tostring(xpathsnippet(fv!item, "//uuid/text()")),
                        type: tostring(xpathsnippet(fv!item, "//type/text()")),
                        sourceFieldName: tostring(
                          xpathsnippet(fv!item, "//sourceFieldName/text()")
                        ),
                        sourceFieldType: tostring(
                          xpathsnippet(fv!item, "//sourceFieldType/text()")
                        ),
                        fieldName: tostring(
                          xpathsnippet(fv!item, "//fieldName/text()")
                        ),
                        isRecordId: toboolean(
                          tostring(
                            xpathsnippet(fv!item, "//isRecordId/text()")
                          )
                        ),
                        isUnique: toboolean(
                          tostring(
                            xpathsnippet(fv!item, "//isUnique/text()")
                          )
                        ),
                        isCustomField: toboolean(
                          tostring(
                            xpathsnippet(fv!item, "//isCustomField/text()")
                          )
                        ),
                        fieldCalculationType: tostring(
                          xpathsnippet(fv!item, "//fieldCalculationType/text()")
                        )
                      ),
                      if(
                        rule!EUR_MapXsdToAppianTypes(xsdType: xpathsnippet(fv!item, "//@type")) <> cons!EUR_APPIAN_TYPES[8],
                        'type!{urn:com:appian:types:EUR}EUR_RecordTypeField'(
                          uuid: tostring(xpathsnippet(fv!item, "//@name")),
                          type: tostring(rule!EUR_MapXsdToAppianTypes(xsdType: xpathsnippet(fv!item, "//@type"))),
                          fieldName: tostring(xpathsnippet(fv!item, "//@name")),
                          isRecordId: rule!EUR_ExtractIsRecordId(
                            appinfo: tostring(xpathsnippet(fv!item, "//*[local-name()='appinfo']/text()"))
                          ),
                          isUnique: rule!EUR_ExtractIsUnique(
                            appinfo: tostring(xpathsnippet(fv!item, "//*[local-name()='appinfo']/text()"))
                          ),
                          isCustomField: false,
                          fieldCalculationType: "NA"
                        ),
                        null
                      )
                    )
                  )
                ),
                local!relationships: if(
                  local!isRecord,
                  if(
                    rule!EUR_isBlank(local!dataStoreEntityUuidResult),
                    a!forEach(
                      xpathdocument(
                        docId: fv!item,
                        expression: "//*[local-name()='recordRelationshipCfg']"
                      ),
                      'type!{urn:com:appian:types:EUR}EUR_RecordTypeRelationship'(
                        uuid: tostring(xpathsnippet(fv!item, "//uuid/text()")),
                        targetRecordTypeUuid: tostring(xpathsnippet(fv!item, "//targetRecordTypeUuid/text()")),
                        relationshipName: tostring(xpathsnippet(fv!item, "//relationshipName/text()")),
                        relationshipType: tostring(xpathsnippet(fv!item, "//relationshipType/text()")),
                        isCdt: false
                      )
                    ),
                    'type!{urn:com:appian:types:EUR}EUR_RecordTypeRelationship'(
                      targetRecordTypeUuid: local!dataType,
                      relationshipName: local!name,
                      relationshipType: cons!EUR_RELATIONSHIP_TYPES[1],
                      isCdt: true
                    )
                  ),
                  reject(
                    fn!isnull,
                    a!forEach(
                      local!fieldsXml,
                      if(
                        rule!EUR_MapXsdToAppianTypes(xsdType: xpathsnippet(fv!item, "//@type")) = cons!EUR_APPIAN_TYPES[8],
                        'type!{urn:com:appian:types:EUR}EUR_RecordTypeRelationship'(
                          targetRecordTypeUuid: rule!EUR_ExtractUuid(
                            document: local!document,
                            type: tostring(xpathsnippet(fv!item, "//@type"))
                          ),
                          relationshipName: tostring(xpathsnippet(fv!item, "//@name")),
                          relationshipType: rule!EUR_ExtractRelationshipType(
                            appinfo: tostring(xpathsnippet(fv!item, "//*[local-name()='appinfo']/text()"))
                          ),
                          cascadeType: rule!EUR_ExtractCascadeType(
                            appinfo: tostring(xpathsnippet(fv!item, "//*[local-name()='appinfo']/text()"))
                          ),
                          isCdt: true
                        ),
                        null
                      )
                    )
                  )
                ),
                local!filtersXml: xpathdocument(
                  docId: fv!item,
                  expression: "//*[local-name()='fieldCfg']"
                ),
                local!filters: if(
                  local!isRecord,
                  a!forEach(
                    items: local!filtersXml,
                    expression: 'type!{urn:com:appian:types:EUR}EUR_RecordTypeFilter'(
                      uuid: tostring(xpathsnippet(fv!item, "//@*[local-name()='uuid']")),
                      name: tostring(xpathsnippet(fv!item, "//@name")),
                    )
                  ),
                  null
                ),
                local!relatedActionsXml: xpathdocument(
                  docId: fv!item,
                  expression: "//recordType/*[local-name()='relatedActionCfg']"
                ),
                local!relatedActions: if(
                  local!isRecord,
                  a!forEach(
                    items: local!relatedActionsXml,
                    expression: 'type!{urn:com:appian:types:EUR}EUR_RecordTypeAction'(
                      uuid: tostring(index(xpathsnippet(fv!item, "//@*[local-name()='uuid']"), 1, null)),
                      name: tostring(xpathsnippet(fv!item, "//*[local-name()='staticTitleString']/text()")),
                      icon: displayvalue(
                        tostring(xpathsnippet(fv!item, "//*[local-name()='iconId']/text()")),
                        local!icons.id,
                        local!icons.friendlyName,
                        null
                      ),
                      isRelated: true
                    )
                  ),
                  null
                ),
                local!listActionsXml: xpathdocument(
                  docId: fv!item,
                  expression: "//recordType/*[local-name()='recordListActionCfg']"
                ),
                local!listActions: if(
                  local!isRecord,
                  a!forEach(
                    items: local!listActionsXml,
                    expression: 'type!{urn:com:appian:types:EUR}EUR_RecordTypeAction'(
                      uuid: tostring(index(xpathsnippet(fv!item, "//@*[local-name()='uuid']"), 1, null)),
                      name: tostring(xpathsnippet(fv!item, "//*[local-name()='staticTitle']/text()")),
                      nameExpr: tostring(xpathsnippet(fv!item, "//*[local-name()='titleExpr']/text()")),
                      icon: displayvalue(
                        tostring(xpathsnippet(fv!item, "//*[local-name()='iconId']/text()")),
                        local!icons.id,
                        local!icons.friendlyName,
                        null
                      ),
                      isRelated: false
                    )
                  ),
                  null
                ),
                local!actions: a!flatten({
                  local!relatedActions,
                  local!listActions
                }),
                'type!{urn:com:appian:types:EUR}EUR_RecordType'(
                  name: local!name,
                  pluralName: local!pluralName,
                  uuid: local!uuid,
                  fields: local!fields,
                  relationships: local!relationships,
                  dataStoreEntityUuid: local!dataStoreEntityUuid,
                  filters: local!filters,
                  actions: local!actions,
                  isCdt: local!isCdt
                )
              ),
              null
            )
          )
        )
      )
    )

  • There is a bug in the 23.2 Platform version causing the xpathsnippet and xpathdocument functions to fail when referencing namespaces not declared in the initial tag of an xml document (which is the case here).  This should hopefully be resolved relatively soon.

    I will look into a quick workaround to get you unstuck.

  • Hi,

    I'm installed this app from scratch, it's the latest one. When I'm trying to add recordt types using "UPLOAD SYSTEM RECORD TYPES" the process model in charge is throwing an error:

    Can anyone help me, or guide me?


    Thanks

    This is the error:

    An error occurred while evaluating expression: recordTypes: rule!EUR_ParseRecordType( documents: reject( fn!isnull, a!forEach( items: pv!documents, expression: if( or( document(fv!item, "extension") = "xml", document(fv!item, "extension") = "xsd" ), fv!item, null ) ) ) ) (Expression evaluation error in rule 'eur_parserecordtype' at function a!forEach [line 5]: Error in a!forEach() expression during iteration 1: Expression evaluation error at function 'xpathdocument' [line 19]: Namespace with prefix 'xsi' has not been declared.) (Data Outputs)

    The variable has the document list from recordtypes zip 

  • Thank you, Michael. Yes I am installing from scratch and hope the installation from <new> folder is all good.

  • Are you trying to install from scratch? If so, just import the script and application in New.  You only need the upgrade scripts and zips if upgrading from an older version.

  • hi Micheal,

    I am installing the EUR app and have successfully imported the sql scripts and application package in the <new> folder but when importing the <upgrade> application "1.4.0 to 1.5.0.zip", I am getting the below inspect error. Would you please check whether the sequence to be imported in the <upgrade> folder is in correct order to proceed. Can I skip the inspect error to proceed importing the application zip in sequence as in the <upgrade> folder?.

    If not, can you please share the latest full application package, db scripts & custom properties which includes all the upgrades for the new package installation. Please advise. Thanks