Appian Community
Site
Search
Sign In/Register
Site
Search
User
DISCUSS
LEARN
SUCCESS
SUPPORT
Documentation
AppMarket
More
Cancel
I'm looking for ...
State
Not Answered
Replies
5 replies
Subscribers
8 subscribers
Views
1801 views
Users
0 members are here
Share
More
Cancel
Related Discussions
Home
»
Discussions
»
AI and Rules
Hi, I am trying to use the web service function in a rule to deliver several ele
james.franklin
over 9 years ago
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
Tim
Certified Lead Developer
over 9 years ago
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> .....)
Cancel
Vote Up
0
Vote Down
Sign in to reply
Verify Answer
Cancel
0
james.franklin
over 9 years ago
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
Cancel
Vote Up
0
Vote Down
Sign in to reply
Verify Answer
Cancel
0
Stefan Helzle
A Score Level 3
over 9 years ago
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, ...}
Cancel
Vote Up
0
Vote Down
Sign in to reply
Verify Answer
Cancel
0
james.franklin
over 9 years ago
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.
Cancel
Vote Up
0
Vote Down
Sign in to reply
Verify Answer
Cancel
0
PhilB
A Score Level 1
over 9 years ago
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.
Cancel
Vote Up
0
Vote Down
Sign in to reply
Verify Answer
Cancel