Here’s a technique for a Mashup to call a Lawson Web Service (LWS) using the correct Lawson Web Service server and the correct environment (DEV, EDU, PRD, TST, etc.).
The problem
By default, when we use the Web Service wizard in Mashup Designer, the URL to the Lawson Web Service server is hard-coded in the two Parameters WS.Wsdl and WS.Address.
For instance, in the following example we’re using a Lawson Web Service that calls the M3 API CRS610MI.LstByNumber, but the server (hostname), the port number (10000), and the environment (TST) are hard-coded in the URL:
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ui="clr-namespace:Mango.UI.Controls;assembly=Mango.UI" xmlns:mashup="clr-namespace:Mango.UI.Services.Mashup;assembly=Mango.UI"> <mashup:DataPanel Name="WS"> <mashup:DataPanel.Events> <mashup:Events> <mashup:Event SourceEventName="Startup" /> </mashup:Events> </mashup:DataPanel.Events> <mashup:DataPanel.DataService> <mashup:DataService Type="WS"> <mashup:DataService.Operations> <mashup:DataOperation Name="Read"> <mashup:DataParameter Key="WS.Wsdl" Value="http://hostname:10000/LWS_TST/svc/CRS610MI.wsdl" /> <mashup:DataParameter Key="WS.Address" Value="http://hostname:10000/LWS_TST/services/CRS610MI" /> <mashup:DataParameter Key="WS.Operation" Value="LstByNumber" /> <mashup:DataParameter Key="WS.Contract" Value="CRS610MI" /> <mashup:DataParameter Key="mws.user" Value="LSO.USER" /> <mashup:DataParameter Key="mws.password" Value="LSO.PASSWORD" /> </mashup:DataOperation> </mashup:DataService.Operations> </mashup:DataService> </mashup:DataPanel.DataService> </mashup:DataPanel> </Grid>
Because the server and environment are hard-coded in the XAML, it will be difficult to deploy the Mashup on other servers, and on other environments (DEV, EDU, PRD, etc.). The workaround would be to make one copy of the Mashup per target server and per target environment. But it would quickly become a maintenance nightmare.
The goal is to make that URL dynamic, based on the server and on the environment we are currently running.
The solution
The solution is to dynamically read at runtime the URL to Lawson Web Services that’s defined in the Smart Office Profile:
Step 1 – Get the value
We get the URL to Lawson Web Services in the Mashup with:
{mashup:ProfileValue Path=M3/WebService/url}
For example:
Step 2 – Create a parameter
Then, we create an Event parameter with a SourceKey and the value, and we call it for example BaseUri:
<mashup:Event SourceEventName="Startup" > <mashup:Parameter SourceKey="BaseUri" Value="{mashup:ProfileValue Path=M3/WebService/url}" /> </mashup:Event>
Step 3 – Move it to an Event
Then, we move the two WS parameters from the DataPanel to the Event as TargetKeys:
<mashup:Event SourceEventName="Startup" > <mashup:Parameter SourceKey="BaseUri" Value="{mashup:ProfileValue Path=M3/WebService/url}" /> <mashup:Parameter TargetKey="WS.Wsdl" Value="http://hostname:10000/LWS_TST/svc/CRS610MI.wsdl" /> <mashup:Parameter TargetKey="WS.Address" Value="http://hostname:10000/LWS_TST/services/CRS610MI" /> </mashup:Event>
Step 4 – Variable substitution
Finally, we use Karin’s solution for variable substitution and markup extension to un-hard-code the URL:
<mashup:Event SourceEventName="Startup" > <mashup:Parameter SourceKey="BaseUri" Value="{mashup:ProfileValue Path=M3/WebService/url}" /> <mashup:Parameter TargetKey="WS.Wsdl" Value="{}{BaseUri}/svc/CRS610MI.wsdl" /> <mashup:Parameter TargetKey="WS.Address" Value="{}{BaseUri}/services/CRS610MI" /> </mashup:Event>
Final code
Here’s the resulting source code:
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ui="clr-namespace:Mango.UI.Controls;assembly=Mango.UI" xmlns:mashup="clr-namespace:Mango.UI.Services.Mashup;assembly=Mango.UI"> <mashup:DataPanel Name="WS"> <mashup:DataPanel.Events> <mashup:Events> <mashup:Event SourceEventName="Startup" > <mashup:Parameter SourceKey="BaseUri" Value="{mashup:ProfileValue Path=M3/WebService/url}" /> <mashup:Parameter TargetKey="WS.Wsdl" Value="{}{BaseUri}/svc/CRS610MI.wsdl" /> <mashup:Parameter TargetKey="WS.Address" Value="{}{BaseUri}/services/CRS610MI" /> </mashup:Event> </mashup:Events> </mashup:DataPanel.Events> <mashup:DataPanel.DataService> <mashup:DataService Type="WS"> <mashup:DataService.Operations> <mashup:DataOperation Name="Read"> <mashup:DataParameter Key="WS.Operation" Value="LstByNumber" /> <mashup:DataParameter Key="WS.Contract" Value="CRS610MI" /> <mashup:DataParameter Key="mws.user" Value="LSO.USER" /> <mashup:DataParameter Key="mws.password" Value="LSO.PASSWORD" /> </mashup:DataOperation> </mashup:DataService.Operations> </mashup:DataService> </mashup:DataPanel.DataService> </mashup:DataPanel> </Grid>
Conclusion
With this solution we learned how to create a Mashup that calls a Lawson Web Service such that the Mashup will use the correct Lawson Web Service server and the correct environment (DEV, EDU, PRD, TST, etc.).
Maybe LPD should make this a native feature of Mashups so that developers don’t have to implement it themselves.
For more examples on how to call a Lawson Web Service from a Mashup, refer to Karin’s post.
That’s it!
thibaudatwork I want your help o urgent basis I wanted ur VBA code in which you are updating GeoCodes in MMS010 using Excel Macro so i want that Excel Macro code with some comments for lines of code as i am new to Macro calling
LikeLike
Hi Kiran. Send me an email at Infor and I will send you a sample macro. You can also search the internet for help. The Lawson Web Services are standard SOAP/WSDL and you can use any SOAP client of your choice. /Thibaud
LikeLike
Greeting Sir;
When I try to use this code, I get a message saying Incorrect Configuration, and it indicates some mandatory value is missing. No form of the syntax can I get to work even with strings instead of the variables. Below is a link to the two blocks of code, one works, one failes. Can you advise me if I’m missing something?
Full Source Code:
http://billywilloughby.com/downloads/XAML%20Issue/This%20Code%20Fails.htm
Thanks; Billy
LikeLike
Billy, I looked at your code and can’t find any obvious problem. Try adding TargetEventName=”Read” to your Event. If not, try adding blank DataParameters WS.Wsdl and WS.Address with just Key and without Value, and let the Event pass the values. /Thibaud
LikeLike
Greetings Sir;
Thank you for your response, sadly neither of those changes seem to help. I still get the same exception message about Incorrect configuration, even with the blank DataParameter Key.
I’ve also tried working around it by binding the values to labels or textboxes (They show correctly of course) but I have been unable to bind the value fields for the DataParameter back to anything. Any other suggestions, or someone I could escalate to?
Thanks; Billy
LikeLike
Hi Billy, create in Infor Xtreme ticket and hopefully they’ll find somebody to assist you. Also, what version of Smart Office are you using? /Tibo
LikeLike
Greetings Sir;
I’m running Infor Smart Office 10.0.5.0.38. Interestingly enough, if I pass a bad url or wsdl link, it complains (Error Calling Web Service) that it’s wrong, then it gives me the error about Incorrect Configuration. I believe the information is being passed as expected but some internal configuration check is rejecting the call because the Data Operation tag does not meet the expected configuration. I will ask someone here to open a ticket. Thanks; Billy
LikeLike
thanks again and again for these helpful Posts ,,, i want to know how to Call WS (which retrieves one row and two columns as a result ) with a button and then write the first Column in a Text Field on the Grid… here is my code
i tested the WebService with the Tool and it is Working well
when i write that Code …
Label Grid.Row=”2″ Grid.Column=”1″ Name=”result” Content=”{Binding Path=Data, ElementName=detail}”
the label Takes value with the click ” getItemNameResponseType”
LikeLike