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
Parents
  • 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 

  • 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.

Comment
  • 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.

Children
  • 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
            )
          )
        )
      )
    )