Hi, I am trying to use the web service function in a rule to deliver several ele

Hi, I am trying to use the web service function in a rule to deliver several elements of data. The function itself is working just fine but I can't seem to find a way to output just two elements from the result. I can isolate a single variable or the result as a string. Should I be looking at refining the result on the rule output or can I set the rule to populate two variables as the output? Perhaps I have mixed up sail and regular rule concepts. Hopefully someone can set me straight.

Thanks, James

OriginalPostID-178344

OriginalPostID-178344

  Discussion posts and replies are publicly visible

  • 0
    Certified Lead Developer
    Ideally you should look to populate the response into a CDT so that it can easily be used in Appian. So the last line in your expression could be a type constructor i.e.
    type!myAppianCDT(id: <parsedValue>, field1: <parsedValue> .....)
  • Thanks Tim, that makes sense. I thought that if I drop the output to a text variable I could reference the content as if it was a dictionary but this isn't the case either as it appears to flatten the complex type returned from the web service into a string.
    I will do as you suggest and write to a cat instead using the type! constructor.
    Cheers, James
  • You can do this without creating a CDT for it. Just use the default way of how Appian defines a data structure. This is: {key1: value1, key2: value2, ...}
  • Thanks Tim and Stefan. Both of your answers influenced the current end result which is this:

    with(
    local!wsdlUrl: rule!dynamicOBAWSurl(cons!THIS_ENVIRONMENT),
    local!wsResult: webservicequery(
    wsConfig:
    a!wsConfig(
    wsdlUrl: local!wsdlUrl,
    service: "{appian.ZZZZ.org/}Appian",
    port: "AppianSoap12",
    operation: "{appian.ZZZZ.org/}GetCost"
    ),
    inputVar: {
    GetCostSoapIn: {
    orderUrn: ri!URN,
    orderVersion: ri!Version,
    ObaInstance: ri!OBA,
    MonthsSpend: 0
    }
    }
    ),
    "{grossPrice: "&local!wsResult.returnValue.GetCostSoapOut.GetCostResult.Total_Gross_Price&"; monthSpend: "&local!wsResult.returnValue.GetCostSoapOut.GetCostResult.Last_6_Months_Net_Spend&"}"
    )

    The final output of the rule is extracted to pv! in a script task from the ac! using:

    readjson(ac!Param1,"grossPrice")

    For my use case this has delivered what I needed. Which was to display data on a task form in the apps environment. Ideally this will be pulled on demand from within the form as a default value but this might prove to be prohibitive due to load times within the form. If this is the case then pre-processing of the data will be required and a switch of storage to CDT a more suitable method.


  • 0
    Certified Lead Developer
    You might be interested to know that, given a structure local!data: {key: 1, value: "one"}, you can get the data using dot notation - local!data.key - or use the index function - index(local!data, "key", null) - rather than using the json function.