tag:blogger.com,1999:blog-9135342366060462722023-12-12T19:23:38.278+13:00movex blogthoughts along the infor m3 (movex) journeyAlhttp://www.blogger.com/profile/06469996988980345250noreply@blogger.comBlogger36125tag:blogger.com,1999:blog-913534236606046272.post-67368433444145542312019-11-24T13:55:00.000+13:002019-11-24T13:55:15.983+13:00Querying Infor's Datalake via Compass and ION APIs<div>
When data has been published to Infor's Datalake from Infor or non-Infor applications we can access this data from the newly provided Compass API via ION APIs as follows:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqAZOlLSDyMNWvBry_JFuuJmFvhvMJYiumX9BgoETte7CMhKpoazBmRFSGDGBkH7yVBJyr8DgcvumAjy9cPb960ETIQ8hwb2ZSxccF0o-d9Sp5lFO5vwq0De1cnbeGaywgsK_I0UsEV6mn/s1600/IONAPI-InforION.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="385" data-original-width="955" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqAZOlLSDyMNWvBry_JFuuJmFvhvMJYiumX9BgoETte7CMhKpoazBmRFSGDGBkH7yVBJyr8DgcvumAjy9cPb960ETIQ8hwb2ZSxccF0o-d9Sp5lFO5vwq0De1cnbeGaywgsK_I0UsEV6mn/s640/IONAPI-InforION.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Find the datalakeapi API & click Documentation:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1kcgeuSdjqc8MXWCVjB00E0_4Exf5APLgo6Zt-n3j3-xAPc30s0zvZsMPrGKxaRSUEvxzVV5Hi2iBYVYQFg99YH9gKRtsDKNL66AVAc0zEcG7s6x0kyqhmeNsoVAu2HgjGX9ZEpJlJOzH/s1600/datalakeapi-documentation.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="433" data-original-width="1151" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1kcgeuSdjqc8MXWCVjB00E0_4Exf5APLgo6Zt-n3j3-xAPc30s0zvZsMPrGKxaRSUEvxzVV5Hi2iBYVYQFg99YH9gKRtsDKNL66AVAc0zEcG7s6x0kyqhmeNsoVAu2HgjGX9ZEpJlJOzH/s640/datalakeapi-documentation.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
The API methods exposed are:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPDXo60puCSD-LogO2VSNmFp6MI2vGBK132SMhxWfrX8IGY7DyibVX5SZIh9rTAQWqoBsaGrHVwL5aLP0QFJfoxK04_xniRAwIycPvWFUrBTFsLAWFAN0QaxE4JkkyXJ6cQuHQXj4Eeoco/s1600/compassapi-methods.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="280" data-original-width="805" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPDXo60puCSD-LogO2VSNmFp6MI2vGBK132SMhxWfrX8IGY7DyibVX5SZIh9rTAQWqoBsaGrHVwL5aLP0QFJfoxK04_xniRAwIycPvWFUrBTFsLAWFAN0QaxE4JkkyXJ6cQuHQXj4Eeoco/s640/compassapi-methods.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
We will use the POST / jobs API to submit our query, then GET /jobs/status to see if the query has completed and finally GET /jobs/result to get the result of the query.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEiOGi5DvTdHvEiwCX8sP8BZKIYFYOj5KcKvIiEOL459sEnU9guIWKYEB0sntgFTOfZHtVDzzankMI9U4WqB8djH8gHlM0MuIIr0lPJFJTgIXW0xm7VEidYshqAwuYGX1IDIjUKLyx-BvV/s1600/compassAPIPOSTrequest.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="373" data-original-width="1065" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEiOGi5DvTdHvEiwCX8sP8BZKIYFYOj5KcKvIiEOL459sEnU9guIWKYEB0sntgFTOfZHtVDzzankMI9U4WqB8djH8gHlM0MuIIr0lPJFJTgIXW0xm7VEidYshqAwuYGX1IDIjUKLyx-BvV/s640/compassAPIPOSTrequest.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
This returns a query ID that we can use to obtain the status of our query and eventually get the result of the query:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxzOU8oBsklzc0YsP_dq9QQ4FkR3lOpqtQP2pXJ7Z1J62ELSLi0TmaTwQo-8qmf33BXs5xumF4M5x9wR4NMiOdZx_7u2WR-L2xZV0345umYdXuEV6ULfB1GpzMl61CyaEL9LaUtcVNQi7U/s1600/compassAPIPOSTresponse.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="271" data-original-width="1048" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxzOU8oBsklzc0YsP_dq9QQ4FkR3lOpqtQP2pXJ7Z1J62ELSLi0TmaTwQo-8qmf33BXs5xumF4M5x9wR4NMiOdZx_7u2WR-L2xZV0345umYdXuEV6ULfB1GpzMl61CyaEL9LaUtcVNQi7U/s640/compassAPIPOSTresponse.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Querying the status of the compass API call via GET /jobs/status:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOAGA3LhaTRs2J1kf6w2lwGkFGnquRLK_WLHKxvJTT7nJpPITWCs9zb6_rLtDPgFryXi2zKMGwSxTHCrTTP3kCHnKu4iFAANcRLZPejHjlGZSqVeODLUuYJNil8n8l39hWS0izgeQLz5UZ/s1600/compassAPIquerystatus.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="394" data-original-width="1077" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOAGA3LhaTRs2J1kf6w2lwGkFGnquRLK_WLHKxvJTT7nJpPITWCs9zb6_rLtDPgFryXi2zKMGwSxTHCrTTP3kCHnKu4iFAANcRLZPejHjlGZSqVeODLUuYJNil8n8l39hWS0izgeQLz5UZ/s640/compassAPIquerystatus.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb8moTHnBeFFob9z_XNuCEiBSlOb6vt3p9v9eFBSESUWp-5_PtvPsyt2wpOnp2SoTXvGiUjGs4yOBcXJrV1H_CwP7JQbklVb7DKItU1wGLLdYxea0iEznyIyXttyJd9CCpsvOfeYGoKZYI/s1600/compassAPIquerystatusresponse.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="288" data-original-width="1044" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb8moTHnBeFFob9z_XNuCEiBSlOb6vt3p9v9eFBSESUWp-5_PtvPsyt2wpOnp2SoTXvGiUjGs4yOBcXJrV1H_CwP7JQbklVb7DKItU1wGLLdYxea0iEznyIyXttyJd9CCpsvOfeYGoKZYI/s640/compassAPIquerystatusresponse.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
As the status is FINISHED we can now request the result of the query by calling GET /jobs/result:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-7bO4ik-IgSLX26-tQojFuLnCmWLdF7vbrtsgaazVdq7-nSfYvXwVEgl5u6oQ0FHFm5pxVWtrqevfSsQQWS7qIXN0hmrD88CBqFsNFFqQL_SvOLVQmJkO8En9Fc6hyphenhyphenACKfeB2kG82Um8Q/s1600/compassAPIresponse1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="347" data-original-width="1057" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-7bO4ik-IgSLX26-tQojFuLnCmWLdF7vbrtsgaazVdq7-nSfYvXwVEgl5u6oQ0FHFm5pxVWtrqevfSsQQWS7qIXN0hmrD88CBqFsNFFqQL_SvOLVQmJkO8En9Fc6hyphenhyphenACKfeB2kG82Um8Q/s640/compassAPIresponse1.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibGDcZ88D7nKlI46chM8PC9IQV25JLiSpJM3KatE75XvDRmMX7vfGQdxhbZnuFli9i62uAKY7dWtxJzjRAZae2un1DVu4eHhuWSwA80iyG6s1KC38aYEi6Jls-cDNW2i_ijYcu_MfLMFVe/s1600/compassAPIresponse2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="152" data-original-width="1036" height="92" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibGDcZ88D7nKlI46chM8PC9IQV25JLiSpJM3KatE75XvDRmMX7vfGQdxhbZnuFli9i62uAKY7dWtxJzjRAZae2un1DVu4eHhuWSwA80iyG6s1KC38aYEi6Jls-cDNW2i_ijYcu_MfLMFVe/s640/compassAPIresponse2.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
So the result of the query (select count(*) from MITBAL) against our data in Datalake is 22,624 records.</div>
<div>
<br /></div>
<div>
We can then leverage this capability through external tools like Powershell as described <a href="http://movexblog.blogspot.com/2019/11/calling-ion-apis-from-powershell.html" target="_blank">here</a>.</div>
Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com4tag:blogger.com,1999:blog-913534236606046272.post-17586094935634804512019-11-19T22:23:00.003+13:002019-11-19T22:41:24.240+13:00Calling ION APIs from PowershellFurther to the post on how to <a href="http://movexblog.blogspot.com/2019/11/calling-ion-apis-from-postman.html" target="_blank">call ION APIs from Postman</a>, here are quick notes on how to call ION APIs from Powershell:<br />
<br />
In the last post we had a json file from ION API with the credentials information:<br />
<br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;">{</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"ti":"######_TRN",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"cn":"Example_TRN",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"dt":"12",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"ci":"######_TRN~********************",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"cs":"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"iu":"https://mingle-ionapi.se2.inforcloudsuite.com",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"pu":"https://mingle-sso.se2.inforcloudsuite.com:443/######_TRN/as/",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"oa":"authorization.oauth2",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"ot":"token.oauth2",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"or":"revoke_token.oauth2",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"ev":"^^^^^^^^^^^^",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"v":"1.0",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"saak":"######_TRN$$$$$$$$$$$$$$$$$$$",</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><span style="white-space: pre;"> </span>"sask":":::::::::::::::::::::::::::::"</span><br />
<span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;"><br /></span><span style="background-color: white; color: #666666; font-family: "trebuchet ms" , "trebuchet" , "verdana" , sans-serif; font-size: 13.2px;"></span><span style="background-color: white; color: #666666; font-family: "courier new" , "courier" , monospace; font-size: 13.2px;">}</span><br />
<br />
And a URI:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">https://mingle-ionapi.se2.inforcloudsuite.com/#######_TRN/M3/m3api-rest/execute/EXPORTMI/Select/?SEPC=%7C&HDRS=1&QERY=count(*)%20from%20MITTRA</span><br />
We can use this information to call the ION API from Powershell:<br />
<br />
#Set the URI<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$Uri = "https://mingle-sso.se2.inforcloudsuite.com:443/####_TRN/as/token.oauth2"</span><br />
<div>
<br /></div>
Set the token request:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$Body = @{</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="white-space: pre;"> </span>grant_type = 'password'</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="white-space: pre;"> </span>username = '<span style="background-color: white; color: #666666; font-size: 13.2px;">######_TRN$$$$$$$$$$$$$$$$$$$</span>'</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="white-space: pre;"> </span>password = '<span style="background-color: white; color: #666666; font-size: 13.2px;">:::::::::::::::::::::::::::::</span>'</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="white-space: pre;"> </span>client_id = '<span style="background-color: white; color: #666666; font-size: 13.2px;">######_TRN~********************</span>'</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="white-space: pre;"> </span>client_secret = '<span style="background-color: white; color: #666666; font-size: 13.2px;">@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</span>'</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="white-space: pre;"> </span>scope = ''</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="white-space: pre;"> </span>redirect_uri = 'https://localhost/'</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">}</span><br />
<br />
Request the token from ION API:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$AuthResult = Invoke-RestMethod -Method Post -Uri $Uri -Body $Body</span><br />
<br />
We can show the token in Powershell:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$AuthResult.access_token</span><br />
<br />
We then call the API, passing in the URI and the token:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$output = Invoke-RestMethod -Uri 'https://mingle-ionapi.se2.inforcloudsuite.com/#######_TRN/M3/m3api-rest/execute/EXPORTMI/Select/?SEPC=%7C&HDRS=1&QERY=count(*)%20from%20MITTRA' -Headers @{ 'Authorization' = 'Bearer TokenValue' }</span><br />
<br />
Get the result of the API call - in this case the number of records in MITTRA<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$output.miResult.MIRecord.NameValue.Value</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
In Powershell this is:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUKNui4VL9lCUhFT52CD8HZltcQjA7xHCPJSQAXUGKBmHvRg7bAyFLqE9y_wm6yI5E9Zlrz-G4yQc8AxLdC-axM3c3IV-qYRT6nrQJD3Ir10j3kYTPhiPz_i7T3qWg4iVYSN-tYWzCnjaz/s1600/Powershell+result.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="364" data-original-width="854" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUKNui4VL9lCUhFT52CD8HZltcQjA7xHCPJSQAXUGKBmHvRg7bAyFLqE9y_wm6yI5E9Zlrz-G4yQc8AxLdC-axM3c3IV-qYRT6nrQJD3Ir10j3kYTPhiPz_i7T3qWg4iVYSN-tYWzCnjaz/s640/Powershell+result.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Giving us a row count for MITTRA of 4,152,575 rows.Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com1tag:blogger.com,1999:blog-913534236606046272.post-56231851070836968162019-11-19T20:41:00.003+13:002019-11-19T20:41:45.444+13:00Calling ION APIs from PostmanThe first step in integrating to Infor's Multi-tenant CloudSuite via ION APIs is by simulating the call of these using a tool like Postman. This article will quickly run through the process for this. In this we:<br />
<br />
<ol>
<li>Obtain the URL to call an ION API</li>
<li>Create an authorised transaction that can call the ION API</li>
<li>Call the ION API from Postman</li>
</ol>
<br />
<br />
<h2>
Step 1: Calling the API from ION API in Ming.le</h2>
Select the suite to call the API from. I'll use M3:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3sDZy-NVe_YPyLiJNKehZvdmMmtSs_09Bhvky_FhL6rG_zL7DmC0fOUS6h15bUsQVQOu3oR8XpPP1E7J4l1sL5B90iEqO_pnpGUj6NXr4kNfw6NbxP4O9fIF_OJggWyCBuafbPS6mBQQd/s1600/SelectM3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="383" data-original-width="996" height="123" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3sDZy-NVe_YPyLiJNKehZvdmMmtSs_09Bhvky_FhL6rG_zL7DmC0fOUS6h15bUsQVQOu3oR8XpPP1E7J4l1sL5B90iEqO_pnpGUj6NXr4kNfw6NbxP4O9fIF_OJggWyCBuafbPS6mBQQd/s320/SelectM3.png" width="320" /></a></div>
<br />
Find the API to use, then click Documentation:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ_3wI49Q0x9pg9B6Nnrpggj86G4B6JWyHsF0ENURX3jDNZlSBbIqT7kaqnoGEQi07DUhu9y8eviw5xPJ63phGYKUFw5y9EiyDB2JHBXfIla1w8V-5mr3YVwfx96mvRlpO1YskdquEwEXw/s1600/SelectDocumentation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="469" data-original-width="683" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ_3wI49Q0x9pg9B6Nnrpggj86G4B6JWyHsF0ENURX3jDNZlSBbIqT7kaqnoGEQi07DUhu9y8eviw5xPJ63phGYKUFw5y9EiyDB2JHBXfIla1w8V-5mr3YVwfx96mvRlpO1YskdquEwEXw/s400/SelectDocumentation.png" width="400" /></a></div>
<br />
Select the API transaction to use, then click Try it out:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiryXurYeaxEKRLW0t-lac0YO_rIXI5elnsx7NZZO5koz5uvdl6vkGle-zFVHx7ZSVTIp_l9uGFs5ygNYbN4un_X0xwg3qJ0pyKTVvnIyJr7k4up-lvoV40O2RW0uLHgSPW74UQ_Kp6DNzp/s1600/SelectGet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="155" data-original-width="615" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiryXurYeaxEKRLW0t-lac0YO_rIXI5elnsx7NZZO5koz5uvdl6vkGle-zFVHx7ZSVTIp_l9uGFs5ygNYbN4un_X0xwg3qJ0pyKTVvnIyJr7k4up-lvoV40O2RW0uLHgSPW74UQ_Kp6DNzp/s400/SelectGet.png" width="400" /></a></div>
<br />
Enter the parameters to use for the API transaction and click Execute:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrn7VmK9d2F67YvGHbjNwl73bQUlzFIrCRM9R5OkAa6YDfqugBDHMzXhpu3ZWWJELF6X5jPy5P0ZWl4aBvXe1vFMMws05lp8pCgK7sborXzUEmMftxAdpGP2gXIWBtpKidownMSLctGmtK/s1600/EnterParameters.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="352" data-original-width="589" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrn7VmK9d2F67YvGHbjNwl73bQUlzFIrCRM9R5OkAa6YDfqugBDHMzXhpu3ZWWJELF6X5jPy5P0ZWl4aBvXe1vFMMws05lp8pCgK7sborXzUEmMftxAdpGP2gXIWBtpKidownMSLctGmtK/s400/EnterParameters.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF5DIbU76odMfbqfFgT266MZJBQOjXyA0Jr6w3F5M8FNbmdxpHj8dRxZ-IEmuN7AQRN-tnsZYT6KAxqrbf1MJ9wY7pL2Fi-xu3uKnFFSQ7Jjoh1eNymZ-EqCjmzxnzRt6VIQroWwc4m0Zp/s1600/RequestURL.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="355" data-original-width="595" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF5DIbU76odMfbqfFgT266MZJBQOjXyA0Jr6w3F5M8FNbmdxpHj8dRxZ-IEmuN7AQRN-tnsZYT6KAxqrbf1MJ9wY7pL2Fi-xu3uKnFFSQ7Jjoh1eNymZ-EqCjmzxnzRt6VIQroWwc4m0Zp/s400/RequestURL.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Save the request URL returned e.g.<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">https://mingle-ionapi.se2.inforcloudsuite.com/#######_TRN/M3/m3api-rest/execute/EXPORTMI/Select/?SEPC=%7C&HDRS=1&QERY=count(*)%20from%20MITTRA</span><br />
<br />
<h2>
Step 2: Creating an ION API Authorised application</h2>
From ION ION create a new Authorised App / Backend service:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitakRrN3lOlreaU9GPUPJNcm9RS84QR1PcvvmY5p5j6vIi2hWoHII3TwdgS5ZRwiibe-wCqiNOOEFdtlSJtDLCsXud0E3DWgJy-MyCO8bCGFgaIJ54wZUMF_inUg_CKOf0Ki4mL1XaAw6G/s1600/CreateAuthorisedApp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="167" data-original-width="511" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitakRrN3lOlreaU9GPUPJNcm9RS84QR1PcvvmY5p5j6vIi2hWoHII3TwdgS5ZRwiibe-wCqiNOOEFdtlSJtDLCsXud0E3DWgJy-MyCO8bCGFgaIJ54wZUMF_inUg_CKOf0Ki4mL1XaAw6G/s400/CreateAuthorisedApp.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiis9OlZObN7kKzrR8vxLjd26tDpy1VIETYh2KxMppa1QMGYVfDSmZpBHRWIUzOKdzeDZC0LAEaboAAVwv4FP4ilbcGrm2G1CVnbD8qbBjvnFTSS5TXmJ2gyV7707xiZsNWHMgX35J75qPW/s1600/CreateBackendService.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="603" data-original-width="354" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiis9OlZObN7kKzrR8vxLjd26tDpy1VIETYh2KxMppa1QMGYVfDSmZpBHRWIUzOKdzeDZC0LAEaboAAVwv4FP4ilbcGrm2G1CVnbD8qbBjvnFTSS5TXmJ2gyV7707xiZsNWHMgX35J75qPW/s400/CreateBackendService.png" width="233" /></a></div>
<br />
Then Download Credentials:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHM1eTiwLCWAepM_wMGTy5MI_cVK9jR9osOo2rn-59L5AbRpUF0Q7UwWuIXZTKIRtLz2BmNF9OjuZ6rqqXfbcOkRZx2QuHjJI68mWFpgSllrOUuqmn2pdYUijO9p1pvUahp-zgp0jaMLM5/s1600/DownloadCredentials.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="270" data-original-width="533" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHM1eTiwLCWAepM_wMGTy5MI_cVK9jR9osOo2rn-59L5AbRpUF0Q7UwWuIXZTKIRtLz2BmNF9OjuZ6rqqXfbcOkRZx2QuHjJI68mWFpgSllrOUuqmn2pdYUijO9p1pvUahp-zgp0jaMLM5/s400/DownloadCredentials.png" width="400" /></a></div>
<br />
Set the credentials to be a service account, then specify the user to use.<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOZOcDHSvgUfRJjGWn8PO1dlC6eorKOvOsVL-hocoG4M52-AahQVbDv6YXzo8Xe1E9qeTEKFUmfV8UV5gt6P9MCyfmkHIsYW0B-F6MHKeT_g4Nj1Pwzo1IGwXfOBbLssxWuH9uzHuvMIAd/s1600/DownloadCredentials2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="382" data-original-width="809" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOZOcDHSvgUfRJjGWn8PO1dlC6eorKOvOsVL-hocoG4M52-AahQVbDv6YXzo8Xe1E9qeTEKFUmfV8UV5gt6P9MCyfmkHIsYW0B-F6MHKeT_g4Nj1Pwzo1IGwXfOBbLssxWuH9uzHuvMIAd/s400/DownloadCredentials2.png" width="400" /></a></div>
<br />
The json file returned will look like this:<br />
<span style="font-family: "Courier New", Courier, monospace;">{</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"ti":"######_TRN",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"cn":"Example_TRN",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"dt":"12",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"ci":"######_TRN~********************",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"cs":"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"iu":"https://mingle-ionapi.se2.inforcloudsuite.com",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"pu":"https://mingle-sso.se2.inforcloudsuite.com:443/######_TRN/as/",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"oa":"authorization.oauth2",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"ot":"token.oauth2",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"or":"revoke_token.oauth2",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"ev":"^^^^^^^^^^^^",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"v":"1.0",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"saak":"######_TRN$$$$$$$$$$$$$$$$$$$",</span><br />
<span style="font-family: Courier New, Courier, monospace;"><span style="white-space: pre;"> </span>"sask":":::::::::::::::::::::::::::::"</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">}</span><br />
<br />
<h2>
Step 3: Calling the ION API from Postman</h2>
In Postman, paste the request URL from step 1 into the URL field:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgswQt8TxvhX3oAnoU3MAmEscjIfrMfLo-a2NvAZbQJvgSCptpX-b8_UlbsVAKyeqZQBfUBQ4Bo5B81TwxeFbyyfXRyqO_mxi-UadWTRvFG3NnE5WTZICP5oXHdW1QsIhXNMgFczDFlf-jJ/s1600/URLInPostman.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="192" data-original-width="1361" height="89" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgswQt8TxvhX3oAnoU3MAmEscjIfrMfLo-a2NvAZbQJvgSCptpX-b8_UlbsVAKyeqZQBfUBQ4Bo5B81TwxeFbyyfXRyqO_mxi-UadWTRvFG3NnE5WTZICP5oXHdW1QsIhXNMgFczDFlf-jJ/s640/URLInPostman.png" width="640" /></a></div>
<br />
On the Authorisation tab, change the type to OAuth 2.0, and click the Get New Access Token button:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM_D9gPfR3WBU6g1w0lYPQJ8ThXzjB_CtPska3i6QJoezPImH0KbWt-37GV2RTzrENyUjZD1GS96OFNb6ekcSl0HeTyKL0BCl3xDXdGNpiWeMli5wkbHnhWyDUJfgBx3r1-cUZ9tXnbS_r/s1600/GetNewAccessToken.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="285" data-original-width="994" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM_D9gPfR3WBU6g1w0lYPQJ8ThXzjB_CtPska3i6QJoezPImH0KbWt-37GV2RTzrENyUjZD1GS96OFNb6ekcSl0HeTyKL0BCl3xDXdGNpiWeMli5wkbHnhWyDUJfgBx3r1-cUZ9tXnbS_r/s640/GetNewAccessToken.png" width="640" /></a></div>
<br />
Change the Grant Type to Password Credentials.<br />
Enter pu + ot from the json file into the Access Token URL e.g.<br />
https://mingle-sso.se2.inforcloudsuite.com:443/######_TRN/as/token.oauth2<br />
Enter saak from the json file into the Username.<br />
Enter sask from the json file into the Password.<br />
Enter ci from the json file into the Client ID.<br />
Enter cs from the json file into the Client Secret.<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj34vBGPEoPZWeSIUO51Egmh6Ay2esoGeKsgAc6NnYChg8ZCyAaz__G5fgaw-ksZeDjmtSeP6OA4cDtLfyW7J3ZZPkCMWsQXOEgcQwWa4MaHD6dZ5pr3wm92zfZLnXcOhUEJxhMcHScTbnq/s1600/GetNewAccessToken2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="570" data-original-width="623" height="365" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj34vBGPEoPZWeSIUO51Egmh6Ay2esoGeKsgAc6NnYChg8ZCyAaz__G5fgaw-ksZeDjmtSeP6OA4cDtLfyW7J3ZZPkCMWsQXOEgcQwWa4MaHD6dZ5pr3wm92zfZLnXcOhUEJxhMcHScTbnq/s400/GetNewAccessToken2.png" width="400" /></a></div>
<br />
Click Request Token. This will return a token. Click Use Token.<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmBOL6DDAjwYFexPxZn2ARt174sTNyuTZJw9vsQRyUcn6vrASu81TzXCO_6txE94h902o8RW70JNbMX5rHaaDPPNKQ3jfHQvdxAURQN2upejnURnOQN2VA1Cn3pQ6xgPCdsU5UBsHIG5h/s1600/AccessToken.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="411" data-original-width="810" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmBOL6DDAjwYFexPxZn2ARt174sTNyuTZJw9vsQRyUcn6vrASu81TzXCO_6txE94h902o8RW70JNbMX5rHaaDPPNKQ3jfHQvdxAURQN2upejnURnOQN2VA1Cn3pQ6xgPCdsU5UBsHIG5h/s400/AccessToken.png" width="400" /></a></div>
<br />
This will put the token into the Access Token field. Then click Send to call the ION API:<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqhHO5BIMIa8atQkJKx0E2m0A0kPDvhWIfiL8oj8fUPApucRoukSbEU0nGEwYGL87NoTWip84y2dbx7UOtgvsdtlsBsMKc1o2RcdTF5JeNcRer8aj8i4SArIs-GrYinkUNsNLLGoQq62R3/s1600/CallAPI.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="727" data-original-width="909" height="508" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqhHO5BIMIa8atQkJKx0E2m0A0kPDvhWIfiL8oj8fUPApucRoukSbEU0nGEwYGL87NoTWip84y2dbx7UOtgvsdtlsBsMKc1o2RcdTF5JeNcRer8aj8i4SArIs-GrYinkUNsNLLGoQq62R3/s640/CallAPI.png" width="640" /></a></div>
<br />
This returns the data requested.<br />
<br />
For more details see the Infor presentation <a href="https://www.youtube.com/watch?v=RJCEsnzSdIM" target="_blank">here</a>.Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com0tag:blogger.com,1999:blog-913534236606046272.post-43343694698351669032018-10-29T07:06:00.002+13:002018-10-29T07:06:32.161+13:00EXPORTMI now available in M3 13.4 and M3 CE for SQL-like ad-hoc access to tablesDuring the <a href="http://www.imun.com.au/conference-2018/" target="_blank">IMUN conference</a> last week, Ole Rasmussen mentioned Infor's new API EXPORTMI that allows us to perform SQL-like queries over M3 tables. While we could achieve the same functionality by building custom APIs using MDBREADMI or CRS990MI, this gives power users and consultants a quick and dirty solution to pull data out of tables on an ad-hoc basis.<br />
<br />
Using <a href="http://i3consulting.co.nz/" target="_blank">i3 Consulting</a>'s Excel REST API tool, talking to a M3 instance in Infor's cloud, we can see this in action:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmAk84GzNg1NwgVYeR9hqg7fVvZ9rKEqXNLCZmhrVg9bYhUcFIEi0c87EoQ4gDzg8J26Xamj1_dlD5uMP9y5adSJVFOFOHCCUdKz7I5Oe5PTXTehruQDUPDGO7fUfwcRdFVqn7y0vJQubc/s1600/EXPORTMI_Select.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="565" data-original-width="1427" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmAk84GzNg1NwgVYeR9hqg7fVvZ9rKEqXNLCZmhrVg9bYhUcFIEi0c87EoQ4gDzg8J26Xamj1_dlD5uMP9y5adSJVFOFOHCCUdKz7I5Oe5PTXTehruQDUPDGO7fUfwcRdFVqn7y0vJQubc/s640/EXPORTMI_Select.PNG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
This capability is a critical requirement for single and multi-tenant customers in Infor's cloud as SQL access is typically limited in single tenant and outright banned in multi-tenant.<br />
<br />
The functionality is described in NCR <a href="https://www.inforxtreme.com/espublic/EN/AnswerLinkDotNet/SoHo/Solutions/SoHoViewSolutionC.aspx?SolutionID=1987614" target="_blank">9965</a>.<br />
<br />Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com0tag:blogger.com,1999:blog-913534236606046272.post-29493386043931364982017-02-23T21:51:00.001+13:002017-02-23T21:55:16.443+13:00Configurable XML documents from M3Infor has just released the XML output capability that was announced as part of the 13.4 deliverable and was originally expected late last year. This is an alternative to the streamfiles that Movex / M3 has traditionally generated and provides another great opportunity for modification elimination.<br />
<br />
The release notes are <a href="https://www.inforxtreme.com/espublic//DLSearch/51245/M3BECOMCG_15.1.4_UWA.pdf" target="_blank">here</a>.<br />
<br />
The Infor press release is below.<br />
<br />
<i>"Infor M3 Configurable Output Management enables the use of extensible
self-contained business documents in XML format combined with
OpenText™ StreamServe StoryTeller, a marketing-leading document layout
tool. </i><br />
<i>For existing customers, Infor M3 Configurable Output Management and the
use of XML can help simplify the creation and maintenance of business
documents. </i><br />
<i>For new Infor M3 customers, Infor M3 Configurable Output
Management and XML can act as a project accelerator through reduction of
the time required to define business documents.
This phase one delivery enables you to switch invoice and credit note-related
documents to the new XML format. The plan is to deliver more business
document types for the Infor M3 13.4 platform. </i><br />
<i><br /></i>
<i>Why adopt Infor M3 Configurable Output Management</i><br />
<br />
<ul>
<li><i>Switching to XML business documents within Infor M3 can help
reduce the cost of ownership of your solution by reducing the
need for source code modifications and simplifying the tailoring of
business document layouts.</i></li>
<li><i>You can keep all your business documents when there is an
upgrade to Infor M3 13.4 and you can move them to the new Infor
M3 Configurable Output Management XML format whenever it
suits your business, i.e. no immediate migration requirement.</i></li>
<li><i>Provides greater flexibility in the generation of XML business
documents, including the ability to extend with custom elements and user defined fields without the need for any source code
modifications.</i></li>
<li><i>All applicable XML business documents are self-contained,
include relevant language translations and use standard data
formats.</i></li>
<li><i>The Infor M3 base StreamServe bundle includes new added value
components, such as the StoryTeller layout tool, and customers
that have a valid support agreement for the product can upgrade
to the new bundle free of license charges.</i></li>
<li><i>Use the newest capabilities of StreamServe, such as StoryTeller,
which is designed to help reduce the number of document layouts
that your customers need to maintain. In the new solution, layouts
can be maintained in a global project template. </i></li>
</ul>
<i>Infor M3 version compatibility </i><br />
<i>Infor M3 customers need to be on Infor M3 13.4 or later to use the new Infor
M3 Configurable Output Management capabilities."</i>Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com4tag:blogger.com,1999:blog-913534236606046272.post-7719500742496221542016-10-04T14:55:00.002+13:002016-10-04T14:55:14.217+13:00Smart Office 10.2 hotfix 17 resolves JScript not working on Windows 10Infor have recently released hotfix 17 for Smart Office 10.2. This resolves a number of bugs including the issue with <a href="http://movexblog.blogspot.com/2016/08/windows-10-anniversary-edition-stops.html" target="_blank">JScripts not working on Windows 10</a> machines :). <br />
<br />
The fix doesn't appear to have been back-ported yet to earlier versions of Smart Office - so M3 7.1 customers with Windows 10 are still unable to run JScripts.<br />
<br />
Smart Office Hotfix 17 is available via CCSS.Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com2tag:blogger.com,1999:blog-913534236606046272.post-86168814930262832802016-08-12T18:14:00.001+12:002016-08-12T18:14:15.248+12:00Windows 10 patch MS16-072 / 3163622 / 3163018 can break Smart Office *WORKAROUND*A <a href="http://movexblog.blogspot.com/2016/06/windows-10-patch-ms16-072-3163622-can.html" target="_blank">couple of months ago</a> I logged an issue with Xtreme regarding Smart Office client being unable to communicate with the Smart Office server. This has become a more significant issue with the Windows 10 anniversary edition also <a href="http://movexblog.blogspot.com/2016/08/windows-10-anniversary-edition-stops.html" target="_blank">breaking JScripts</a> running within Smart Office.<br />
<br />
Today I have received a suggested workaround from Infor now to resolve the issue of windows updates stopping Smart Office loading. I've tried this on a couple of sites and it appears to address the issue. The workaround is:<br />
<br />
1. Download <a href="https://www.nartac.com/Products/IISCrypto" target="_blank">IIS Crypto 2.0</a> from Nartac.<br />
2. Install this on the PC<br />
3. In IIS Crypto 2.0 on the Cipher Suite tab (1), untick the TLS_DHE_RSA_WITH_AES_128_CBC_SHA Cipher (2) then click Apply (3):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzbfNt8S60SvV-WNV_q9slDReT6TiIbP6jZqH1-R_h9UWafz82IoL80r-VK8bqkgqJEdotPAluXzyUPwK0rq57n5p7Koyg56G48OZrd85oIWNMjVm4n1n_QWvMpzPk47vrnZCjG6U8b8W_/s1600/IISCrypto.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="385" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzbfNt8S60SvV-WNV_q9slDReT6TiIbP6jZqH1-R_h9UWafz82IoL80r-VK8bqkgqJEdotPAluXzyUPwK0rq57n5p7Koyg56G48OZrd85oIWNMjVm4n1n_QWvMpzPk47vrnZCjG6U8b8W_/s640/IISCrypto.PNG" width="640" /></a></div>
4. Reboot the PC.<br />
<br />
Smart Office should now load correctly. I've tested this against multiple sites and multiple versions of Smart Office and all the Smart Office instances that were not working now do work. <br />
<br />
Unfortunately this does not resolve the <a href="http://movexblog.blogspot.co.nz/2016/08/windows-10-anniversary-edition-stops.html" target="_blank">JScript issue</a> :(<br />
<br />Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com2tag:blogger.com,1999:blog-913534236606046272.post-18772988113806275692016-08-04T20:57:00.000+12:002016-08-04T20:57:18.790+12:00Windows 10 Anniversary edition stops JScripts from loading in Smart Office<span style="font-family: inherit;">The Windows 10 <a href="https://blogs.windows.com/windowsexperience/2016/08/02/how-to-get-the-windows-10-anniversary-update/" target="_blank">Anniversary update</a> has just rolled out and with it has come <a href="http://movexblog.blogspot.com/2016/06/windows-10-patch-ms16-072-3163622-can.html" target="_blank">more problems</a> for Infor's Smart Office.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">When using a panel that has a JScript attached to it, the JScript does not load and an error message is logged within the Smart Office log e.g.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><span style="background-color: white; color: #1a1a1a;">5/05/2016 9:29:30 PM ERROR MForms.Render.RenderEngine.PostRender Failed to run scripts</span></span><br />
<span style="font-family: inherit;"><span style="background-color: white; color: #1a1a1a;">System.IO.FileNotFoundException: Could not load file or assembly 'file:///C:\Users\user\AppData\Local\Temp\aibwfam0.dll' or one of its dependencies. The system cannot find the file specified.</span></span><br />
<span style="font-family: inherit;"><span style="background-color: white; color: #1a1a1a;">File name: 'file:///C:\Users\user\AppData\Local\Temp\aibwfam0.dll'</span></span><br />
<span style="font-family: inherit;"><span style="background-color: white; color: #1a1a1a;"><br /></span></span>
<span style="font-family: inherit;"><span style="background-color: white; color: #1a1a1a;">Infor don't have a resolution to this yet, much like the problem with the <a href="http://movexblog.blogspot.com/2016/06/windows-10-patch-ms16-072-3163622-can.html" target="_blank">Microsoft patch</a> that on certain configurations broke Smart Office altogether, the current recommendation from IRD is to not install the Anniversary update.</span></span><br />
<br />
Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com11tag:blogger.com,1999:blog-913534236606046272.post-45442618870995873322016-07-18T09:30:00.002+12:002016-07-18T09:30:52.058+12:00Simple event-driven automations with Event hub and MEC - overviewAt <a href="http://www.inforum2016.com/" target="_blank">Inforum 2016</a> this year I presented a simple pattern we'd developed across multiple projects to automate and apply business rules when transactions occur in the M3 business engine. <br />
<br />
Historically we have used <a href="https://potatoit.kiwi/" target="_blank">JScripts</a> to achieve this within Smart Office, but a number of factors have driven us away from this approach. These include:<br />
<ul>
<li>the increased maturity of the H5 client;</li>
<li>the inclusion of the H5 enterprise features within the foundation client as of Infor Xi;</li>
<li>an increasing diversity of data input mechanisms across our customer base (M3WM, custom applications, data feeds from PLCs etc.); and </li>
<li>the problems inherent to applying business rules at the UI level that could be bypassed by users.</li>
</ul>
While JScripts still have their place, for set and forget application of business rules along the lines of "<a href="https://ifttt.com/" target="_blank">if this then that</a>", there are better approaches now available.<br />
<br />
We first investigated Infor's Ming.le a couple of years back, but when we started looking into Ming.le our assessment was that it was not mature enough to meet out needs. Note that this has now changed, we have used Ming.le on a few projects and we are very excited by the possibilities offered by Ming.le within the Infor Xi stack.<br />
<br />
Nonetheless, while at the time we were not convinced that Ming.le was appropriate for our needs, the technology underpinning Ming.le was of interest. Specifically Event hub which monitors all transactions within M3 and allowed us to capture:<br />
<ul>
<li>Start and stop of M3 programs including batch programs;</li>
<li>Create, Update and Delete transactions on M3 tables; and</li>
<li>Current and Prior values of records in M3 tables.</li>
</ul>
<div>
Many, if not most, of the processes we wished to automate occur when one of the transactions above occurs. For example we wanted to:</div>
<ul>
<li>Notify upstream planners for supply chain order connected orders when requested delivery date on CO, MO, PO line changes;</li>
<li>Update customer agreement / bulk order when quote changed;</li>
<li>Reclassify, move, or write off balance ID when goods were received into a location;</li>
<li>Load payment when a POS sale is invoiced;</li>
<li>Write to a log when a M3 program is started;</li>
<li>Export planned orders when the MRP run completed.</li>
</ul>
<div>
What we found was that Event hub existed within the M3 ecosystem as shown below:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb7TpTJ-PF7ERmjSQQGB5HOf2coYdseAazmKHYbic80xiwygXN6Y349MPdacRf-l2U4fQrAz2hLmulQ2BrxnKRo6tZPUjD3zZCY0yX6O_pC95JpjeumrirFxFlTkQBabmjwWJKjoRx3bkN/s1600/EventHub.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb7TpTJ-PF7ERmjSQQGB5HOf2coYdseAazmKHYbic80xiwygXN6Y349MPdacRf-l2U4fQrAz2hLmulQ2BrxnKRo6tZPUjD3zZCY0yX6O_pC95JpjeumrirFxFlTkQBabmjwWJKjoRx3bkN/s640/EventHub.PNG" width="640" /></a></div>
<div>
<br /></div>
<div>
Event hub is one of the technologies underpinning the M3 ION BODs and is responsible for creating the initiator message, much like a MBM, that instructs MEC to create the BOD and pass to ION for action.</div>
<br />
One of the great things about Event hub is that it is available in all M3 10.1+ installations that have the business engine on the Grid. So for sites that are on the Grid, but don't yet have ION, we can still leverage the functionality that Infor has delivered to support ION to build automations as described here.<br />
<br />
The pattern we developed for creating a simple automation has three main parts:<br />
<ol>
<li>Create the Event hub subscription;</li>
<li>Create the MEC subscription to Event hub; and</li>
<li>Build the automation in MEC.</li>
</ol>
<div>
Over the next few days I'll detail how each of these steps work and how, with minimal MEC skills, simple event-driven automations can be built.</div>
Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com0tag:blogger.com,1999:blog-913534236606046272.post-5078552944610182262016-07-16T08:58:00.000+12:002016-07-16T08:58:33.099+12:00Inforum 2016Inforum 2016 in New York was a great opportunity to meet colleagues and friends, learn what's coming in the new versions of the Infor product suite, hear from thought leaders in a number of areas and enjoy the Maroon 5 concert :)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgADz4a0-YP-Ufys2n0lEJB_5Ltd-m5DAv_cv4PKnH7II1y0VjrTmNzk-W-Sd49T6tBQjwd3asJwOD-KbwErzR8oZVU7W-pA3hMSH660AFVIsbzxIEv0uL4EpSslxs29uOsnXLzaOeLtNGd/s1600/PANO_20160710_164600.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgADz4a0-YP-Ufys2n0lEJB_5Ltd-m5DAv_cv4PKnH7II1y0VjrTmNzk-W-Sd49T6tBQjwd3asJwOD-KbwErzR8oZVU7W-pA3hMSH660AFVIsbzxIEv0uL4EpSslxs29uOsnXLzaOeLtNGd/s640/PANO_20160710_164600.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV7Tn8xOFb4MDbywNfiAOw6LDNB_cp3JP0ELgjPVy66mxApfAu2f4OdJg4UrbOPg0AahQqlwXlVB-sCYPl_rRzlX7rnxSKiMh6ucWmfTL2NmCTJC_sJrn-ZXlEBLFYivKhpz-AgVmj1u8l/s1600/IMG_20160710_164731.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV7Tn8xOFb4MDbywNfiAOw6LDNB_cp3JP0ELgjPVy66mxApfAu2f4OdJg4UrbOPg0AahQqlwXlVB-sCYPl_rRzlX7rnxSKiMh6ucWmfTL2NmCTJC_sJrn-ZXlEBLFYivKhpz-AgVmj1u8l/s640/IMG_20160710_164731.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjTrFm4S3GLnQG6i86pS5BB3bvf_-zzI0icVGEXC24A920lN37jykKfzdawDDbQs9fZ0podqH6rFhf6qmFH69_EBTvbgPJYZFcfhF_BfTjBUkCoTtmb2iL18dBtuU1vK3QAcrJNquzW4o4/s1600/IMG_20160712_104254.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="316" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjTrFm4S3GLnQG6i86pS5BB3bvf_-zzI0icVGEXC24A920lN37jykKfzdawDDbQs9fZ0podqH6rFhf6qmFH69_EBTvbgPJYZFcfhF_BfTjBUkCoTtmb2iL18dBtuU1vK3QAcrJNquzW4o4/s640/IMG_20160712_104254.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5cNeuIKYnp6tyLz5n8dposs2y9THUgMDszvsIwc86ykmWJNZzb1NJUibrx1cCMEHmuOIEet9Kg6pCN7xxfjvjxfduCSIzTaDp4QKD5LH2CyV9wQuza_xbamcQtHBX5lIiWEmu5zhBQdol/s1600/IMG_20160712_211536.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5cNeuIKYnp6tyLz5n8dposs2y9THUgMDszvsIwc86ykmWJNZzb1NJUibrx1cCMEHmuOIEet9Kg6pCN7xxfjvjxfduCSIzTaDp4QKD5LH2CyV9wQuza_xbamcQtHBX5lIiWEmu5zhBQdol/s640/IMG_20160712_211536.jpg" width="640" /></a></div>
Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com0tag:blogger.com,1999:blog-913534236606046272.post-39485545107632010462016-06-17T22:56:00.000+12:002016-06-19T10:52:38.015+12:00Windows 10 patch MS16-072 / 3163622 / 3163018 can break Smart OfficeMicrosoft released patch <a href="https://technet.microsoft.com/library/security/MS16-072" target="_blank">MS16-072</a> / <a href="https://support.microsoft.com/en-us/kb/3163622" target="_blank">3163622</a> / <a href="https://support.microsoft.com/en-us/kb/3163018" target="_blank">3163018</a> for Windows 10 this week and it's causing communications issues between some Smart Office clients and servers:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTey_Cw7Fio8lxBr2azcScXOlg3jdYqu9fKAqpt40JwDjzZ9YywxXLJrQNomlR4EkPbqJDrtl-5FqRNQEFoINQFylNiXdje9bZp8HqIq3CPaefok9s0jou6EmvwDtyUOFuvxVoWpKhdtVd/s1600/Capture.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTey_Cw7Fio8lxBr2azcScXOlg3jdYqu9fKAqpt40JwDjzZ9YywxXLJrQNomlR4EkPbqJDrtl-5FqRNQEFoINQFylNiXdje9bZp8HqIq3CPaefok9s0jou6EmvwDtyUOFuvxVoWpKhdtVd/s1600/Capture.PNG" /></a></div>
<br />
Looking at the server installation point - https is inaccessible from Internet Explorer and Edge, while it works fine from Chrome:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy1Ec8CGv35cLV-TDaUaYAADSkrIqE20nbJWqwQiqK8MqeHIpz-m9gH8nSsRTjXYgGk3C9e2ZZPya7aRldbZPXqsuefFePWFWKL5lehGAYwnaO1xjSyid6aOtaDQl3ZlVzD4TO9IPfo3FG/s1600/Capture2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="376" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy1Ec8CGv35cLV-TDaUaYAADSkrIqE20nbJWqwQiqK8MqeHIpz-m9gH8nSsRTjXYgGk3C9e2ZZPya7aRldbZPXqsuefFePWFWKL5lehGAYwnaO1xjSyid6aOtaDQl3ZlVzD4TO9IPfo3FG/s640/Capture2.PNG" width="640" /></a></div>
<br />
<br />
The Microsoft fix is impacting <a href="http://www.askwoody.com/2016/security-update-for-group-policy-kb-3159398-breaks-group-policy/" target="_blank">other</a> <a href="http://www.infoworld.com/article/3084930/microsoft-windows/microsoft-acknowledges-permission-problems-with-ms16-072-patches-kb-3159398-3163017-3163018-3163016.html" target="_blank">areas</a> <a href="http://windowsitpro.com/patch-tuesday/update-kb3163622-breaks-group-policy-it-s-not-me-it-s-you" target="_blank">of</a> <a href="https://social.technet.microsoft.com/Forums/en-US/e2ebead9-b30d-4789-a151-5c7783dbbe34/patch-tuesday-kb3159398?forum=winserverGP" target="_blank">infrastructure</a> <a href="http://windowsreport.com/windows-10-updatekb3163018-reported-issues/" target="_blank">as</a> well. The immediate workaround is to uninstall KB 3163622 / 3163018 from affected PCs until either Microsoft resolves the issue or Infor provides an official mitigation. It also appears that there may be group policy changes that can be made to address this, but I haven't tested these yet:<br />
<br />
"MS16-072 changes the security context with which user group policies are retrieved. This by-design behavior change protects customers' computers from a security vulnerability. Before MS16-072 is installed, user group policies were retrieved by using the user's security context. After MS16-072 is installed, user group policies are retrieved by using the machines security context. This issue is applicable for the following KB articles:<br />
3159398 MS16-072: Description of the security update for Group Policy: June 14, 2016<br />
3163017 Cumulative update for Windows 10: June 14, 2016<br />
3163018 Cumulative update for Windows 10 Version 1511 and Windows Server 2016 Technical Preview 4: June 14, 2016<br />
3163016 Cumulative Update for Windows Server 2016 Technical Preview 5: June 14 2016<br />
<b>Symptoms</b><br />
All user Group Policy, including those that have been security filtered on user accounts or security groups, or both, may fail to apply on domain joined computers.<br />
<b>Cause</b><br />
This issue may occur if the Group Policy Object is missing the Read permissions for the Authenticated Users group or if you are using security filtering and are missing Read permissions for the domain computers group.<br />
<b>Resolution</b><br />
To resolve this issue, use the Group Policy Management Console (GPMC.MSC) and follow one of the following steps:<br />
Add the Authenticated Users group with Read Permissions on the Group Policy Object (GPO).<br />
If you are using security filtering, add the Domain Computers group with read permission."<br />
<div>
<br /></div>
Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com5tag:blogger.com,1999:blog-913534236606046272.post-47233848003294846942015-06-01T13:46:00.000+12:002015-06-01T13:46:18.884+12:00Upgrading M3 to 13.3I've been looking at the M3 13.3 installation, and while the documentation is a little unclear on the process to upgrade from 13.2 to 13.3, there is a <a href="https://www.inforxtreme.com/media/solution/1594468/M3%2013x%20to%2013.3%20-%20%20An%20Update%20Not%20An%20Upgrade-20150210%201258-1.mp4" target="_blank">video</a> that provides a little more information. After working my way through this, my quick notes on the process I followed are below:<br />
<br />
<h4>
Step 1 - Upgrade the technology stack</h4>
<ul>
<li>Download Lifecycle Manager Server, Core technology package and Session provider package;</li>
<li>Update Lifecycle Manager Server from the command prompt. This is similar to the initial install process, however we select the Upgrade path and upgrade the existing Server instance; </li>
<li>Start Lifecycle Manager - we are prompted to restart and LCM will then be upgraded;</li>
<li>Upload the core technology package and restart LCM when prompted;</li>
<li>Upload the session provider package and restart LCM when prompted;</li>
<li>Upgrade the Grid;</li>
<li>Upgrade GDBC;</li>
<li>Upgrade Event analytics and Event hub;</li>
</ul>
<div>
<br /></div>
<h4>
Step 2 - Upgrade the business engine</h4>
<ul>
<li>Apply a major upgrade to the BE instance;</li>
<li>On the BE, upload the FP3 feature pack for MVX and the country variant;</li>
<li>On the BE, apply the feature pack and select FP3;</li>
<li>Run upgrade database with fix/feature pack for MVX and the country variant;</li>
<li>Run import database data for MVX and the country variant;</li>
<li>Run apply MI metadata;</li>
</ul>
<br /><h4>
Step 3 - Apply MCP1 for 15.1.3 and then run fix programs</h4>
<ul>
<li>The documentation suggests that the next step would be to run the fix programs, but I found these failed to start. So I downloaded and applied MCP1 (including apply feature pack, upgrade database and import database data for this). Once MCP1 was installed the fix programs would start;</li>
<li>Run fix programs. This is a new function that replaces the process where these were previously applied one by one from Serverview;</li>
</ul>
<div>
<br />
At this stage the "M3 Core" applications have been updated to 13.3 levels. We still however need to upgrade the other components:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwqAGe0SyiFcuMguCkBQjNVDckuitPDoWNVAKN9kYHeeoSGkYWT_QdZHxHH2_uL9ckQFuef3XAmXsYvg1yDGj7W589VDBXAcUwi-jyc61c1zWoOxjNugsvnpTWft9b1cqX_GJmY-2FFqwp/s1600/Components.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="376" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwqAGe0SyiFcuMguCkBQjNVDckuitPDoWNVAKN9kYHeeoSGkYWT_QdZHxHH2_uL9ckQFuef3XAmXsYvg1yDGj7W589VDBXAcUwi-jyc61c1zWoOxjNugsvnpTWft9b1cqX_GJmY-2FFqwp/s640/Components.PNG" width="640" /></a></div>
<div>
<br /></div>
<h4>
Step 4 - Upgrade other components</h4>
<div>
<ul>
<li>Download Smart Office and H5 packages;</li>
<li>Upload Smart Office and H5 packages;</li>
<li>Upgrade UI Adapter;</li>
<li>Upgrade Mango server (includes upgrade, installation point export, sign and import);</li>
<li>etc.</li>
</ul>
<div>
<br /></div>
</div>
<div>
<div>
In general the 13.3 upgrade process is a massive improvement, in particular for the BE and core M3 components. The complexity of upgrading the add-on components hasn't really changed though and these still vary from a simple right-click upgrade, through complexity approaching that of the initial install.</div>
<div>
</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com0tag:blogger.com,1999:blog-913534236606046272.post-1204514785774274592015-05-28T22:37:00.000+12:002015-05-28T22:37:06.524+12:00M3 13.3 (BE 15.1.3) and M3 on LinuxInfor has just released to GA M3 13.3 (BE 15.1.3) along with a day 1 mandatory MCP.<br />
<br />
On InforXtreme there is the M3 13.3 <a href="https://www.inforxtreme.com/esknowbase/root/DLPublic/44990/M3%2013.3%20-%20Release%20Summary%20May%202015.pdf">release summary</a>, <a href="https://www.inforxtreme.com/esknowbase/root/DLPublic/44800/M3%2013.3%20-%20Business%20Engine%20Net%20Change%20Overview.pdf">what's new</a> and <a href="https://www.inforxtreme.com/espublic//DLSearch/44931/M3BERN_15.1.3_UWA.pdf">BE release notes</a>.<br />
<br />
A highlight for me from 13.3 is the increase to 10 character dimension field. Many sites I work with struggle to fit the information they want to store into the space available in the dimensions, so this is a great improvement. A minor niggle is given we were looking at a fairly significant database change for this, it would have been nice to have moved to 15 characters for each dimension so we could post large item codes directly into the GL without using surrogate keys, but this is still a massive improvement.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeuZ_RnZ-2f5wnVdhjIPGIhz7yRDQRQhvfEDsTqRIQGkqoqNGp5-XexUxY4IeB7WsVad5BUOrjckZRZ2M4MA5ULCCWQK84wMMPZN4VhVdEjp4SMI2AN_ZwQ7rdW-iPPYtS5k6TsFw0QcE/s1600/Dimensions.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeuZ_RnZ-2f5wnVdhjIPGIhz7yRDQRQhvfEDsTqRIQGkqoqNGp5-XexUxY4IeB7WsVad5BUOrjckZRZ2M4MA5ULCCWQK84wMMPZN4VhVdEjp4SMI2AN_ZwQ7rdW-iPPYtS5k6TsFw0QcE/s640/Dimensions.PNG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The grower contract management module, discussed in its early stages of development at Inforum 2014, is also of interest. This leverages purchase agreements and the QMS module for testing while the product is growing. It also allows for provisional payments to suppliers and final payments based on receipt and testing.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdmGr4XtFCCDrV8dsNkSPkq1Duaigf_TyCLw9sLNkTaOqulhQmgPSmMigyPfpMGcSvVBBStb3uIgFBefW5k2LTAx97CLvDMiA4zX1GtWV1ZQyldWjBs_Y08M8Y2ypHqZD7T4uylycYAZg/s1600/Grower.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="361" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdmGr4XtFCCDrV8dsNkSPkq1Duaigf_TyCLw9sLNkTaOqulhQmgPSmMigyPfpMGcSvVBBStb3uIgFBefW5k2LTAx97CLvDMiA4zX1GtWV1ZQyldWjBs_Y08M8Y2ypHqZD7T4uylycYAZg/s640/Grower.PNG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
A minor but very nice change is price list identifiers are increased from 2 to 10 characters. This is a very welcome change.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj34JQz5MdaSPEZnNHBKkcJyDaAKIGq-GwU4ofLi5x8rmhRDHIwGTBhp-m_KKzXDWYLNSiF6iEUEvi59XrbPidmsmL-D_ohL3cOwp0_LCxlmT8L_gF0nDYh6GkhUsy0qFNlorhFK6KhFrE/s1600/pricelist.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="332" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj34JQz5MdaSPEZnNHBKkcJyDaAKIGq-GwU4ofLi5x8rmhRDHIwGTBhp-m_KKzXDWYLNSiF6iEUEvi59XrbPidmsmL-D_ohL3cOwp0_LCxlmT8L_gF0nDYh6GkhUsy0qFNlorhFK6KhFrE/s640/pricelist.PNG" width="640" /></a></div>
<br />
There's a lot of good changes in this release, as there were in <a href="https://www.inforxtreme.com/esknowbase/root/DLPublic/32561/M3%2013.1%20BE%20Net%20Change%20Overview.pdf">13.1</a> and <a href="https://www.inforxtreme.com/esknowbase/root/DLPublic/36294/M3%2013.2%20BE%20Net%20Change%20Overview.pdf">13.2</a> before it, way too many to list here.<br />
<br />
<b>M3 on Linux</b><br />
At Inforum last year, M3 running on Linux with PostgreSQL as a back-end was promised. With M3 13.3 Infor have met this promise for the core M3 application. The M3/Linux <a href="https://www.inforxtreme.com/esknowbase/root/DLPublic/44953/M3COREIPG_13.3.0_L.pdf">installation guide</a> is up on InforXtreme for this. This requires <a href="http://www.redhat.com/en/technologies/linux-platforms/enterprise-linux">RHEL</a> and <a href="http://www.enterprisedb.com/products-services-training/products/postgres-plus-advanced-server/downloads">Postgres Plus Advanced Server</a>. <a href="https://www.centos.org/">CentOS</a> is likely compatible, if unsupported, and there is a 60 day trial available for Postgres Plus. Time to fire up a VM and take a look.<br />
<div>
<br /></div>
<br />
With the 13.x series Infor continues to demonstrate its willingness and capability to invest in M3 to deliver new functionality to published and predictable schedules.<br />
<br />Alhttp://www.blogger.com/profile/06469996988980345250noreply@blogger.com0tag:blogger.com,1999:blog-913534236606046272.post-22049808859364595392014-10-02T13:46:00.002+13:002014-10-02T13:46:51.597+13:00Building a M3 Web Service over an API and SQL Server's FOR XMLAs part of the series of posts on agile interface development with ION there are a couple of foundation aspects we need:<br />
<br />
<ul>
<li>Building a M3 Web Service; and</li>
<li>Creating the XML file for for the Web Service</li>
</ul>
<h2>
Building a M3 Web Service over APIs</h2>
<div>
I've covered building a M3 web service over M3 display screens <a href="http://movexblog.blogspot.com/2010/02/creating-m3-web-service.html" target="_blank">before</a> and building these over APIs is fundamentally the same, but to recap briefly there are two basic steps to this:</div>
<div>
<br /></div>
<h3>
1. Create the Web Service in MWS Designer</h3>
<div>
Once you've determined the API transaction you want to use (in this example I'll use MMS025MI.AddAlias) build the web service in MWS designer by:</div>
<div>
<br /></div>
<div>
Creating a new web service</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGt4H6A_MHD70dS_PX_IAhhsOX7_P_jF9Xb0gasAT6apXSG4k9KAPOKK2wFpNAcasrbt_KMmxmjewrltr1Ig_0cPiGTq6lWMzEwwjTTVnRa2fW3tgLcTSq8hHoT77qWdU9yl5eDKuQE2d4/s1600/NewWebService.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGt4H6A_MHD70dS_PX_IAhhsOX7_P_jF9Xb0gasAT6apXSG4k9KAPOKK2wFpNAcasrbt_KMmxmjewrltr1Ig_0cPiGTq6lWMzEwwjTTVnRa2fW3tgLcTSq8hHoT77qWdU9yl5eDKuQE2d4/s1600/NewWebService.PNG" height="135" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
and specify the API transaction to use</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZNkKhANuIaqVlbJmngUCk0BySk7gxk9iJIrLMqcW-_WKXD6Jp99bKUWgbxPZGVqMzaVqc2LUN7-Eq2_nXsEXznPUkm28Fe7ay8uzhW6xVZTXT3540eCGDKIWy1PIC3SB8-F8B7_xJAQjf/s1600/WebServiceMethod.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZNkKhANuIaqVlbJmngUCk0BySk7gxk9iJIrLMqcW-_WKXD6Jp99bKUWgbxPZGVqMzaVqc2LUN7-Eq2_nXsEXznPUkm28Fe7ay8uzhW6xVZTXT3540eCGDKIWy1PIC3SB8-F8B7_xJAQjf/s1600/WebServiceMethod.PNG" height="124" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Check the aliases on the fields for naming conflicts and resolve as required. I've seen this as an issue with, for example, some Warning message fields where these often do not have unique aliases.</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSZ_z1DO-80RJZpuRqtOEUPUONoWN39E6fYtUhJtsuae31ZYTF8Eds-TJ3I7pjwNlklFgJDycISBKSqKKAuLwtiSQLA3VTQT7vp1Rrj9b_-TIsge4GZV7bJ5V7j2xuVECSeMXXlntNx-6n/s1600/WebServiceFields.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSZ_z1DO-80RJZpuRqtOEUPUONoWN39E6fYtUhJtsuae31ZYTF8Eds-TJ3I7pjwNlklFgJDycISBKSqKKAuLwtiSQLA3VTQT7vp1Rrj9b_-TIsge4GZV7bJ5V7j2xuVECSeMXXlntNx-6n/s1600/WebServiceFields.PNG" height="276" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Once it's set up then deploy the web service.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
This will have published the SOAP web service to your MWS service. From here any SOAP compliant application can call the web service to interact with M3.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3 style="clear: both; text-align: left;">
2. Validate the Web Service</h3>
<div class="separator" style="clear: both; text-align: left;">
From LCM, manage the MWS application. From the List function you can then find your deployed web service. Copy the http link for the default router.</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieTK-d7Oir4XGzEQ-6FkOAYtxzG0S-LMYVX6fDAR-0L7YQKfEyLOHnhiNpU67GveWTCAPgsdlthCboTornLs8KET-6wwPgXZsLBpZeflMLn-fkufTryBMY21qJAw6HwEJO6ab3HqElBlQl/s1600/DeployedWebService.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieTK-d7Oir4XGzEQ-6FkOAYtxzG0S-LMYVX6fDAR-0L7YQKfEyLOHnhiNpU67GveWTCAPgsdlthCboTornLs8KET-6wwPgXZsLBpZeflMLn-fkufTryBMY21qJAw6HwEJO6ab3HqElBlQl/s1600/DeployedWebService.PNG" height="289" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
To validate the web service works correctly and to get the exact format of the XML file required by the web service, I tend to use <a href="http://sourceforge.net/projects/soapui/files/" target="_blank">SOAPUI</a>. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
In SOAPUI create a new web service</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhykHEVaKQbVH28mkpb3w2eXtkagLqcxyRpgjqdd9tI1OBQP07q0LNu75FtKG411H_87_7B1l8td63Yo_FswaXhaneoFYaLdWoZaUWwqFHzEYBU07p0jTwb9maItZkWQdqy0sIPclKq6CGI/s1600/SOAPUICreate.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhykHEVaKQbVH28mkpb3w2eXtkagLqcxyRpgjqdd9tI1OBQP07q0LNu75FtKG411H_87_7B1l8td63Yo_FswaXhaneoFYaLdWoZaUWwqFHzEYBU07p0jTwb9maItZkWQdqy0sIPclKq6CGI/s1600/SOAPUICreate.PNG" height="204" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
then manipulate the default request to reflect the call you want to make:</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA1mTmAvpzfnb-PBmI2jEj_wDxoteoh8qNRyqiFrtWL4v0f8bcvPCIu0hUkshjyr1_GCnFhioee8SinKC0lMjJxzWM7HNozq5tou46E7UpWIKGZmAXjzxvEaT-Bb3HX9oHra7SY-O_egmO/s1600/SOAPUIRequestDefault.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA1mTmAvpzfnb-PBmI2jEj_wDxoteoh8qNRyqiFrtWL4v0f8bcvPCIu0hUkshjyr1_GCnFhioee8SinKC0lMjJxzWM7HNozq5tou46E7UpWIKGZmAXjzxvEaT-Bb3HX9oHra7SY-O_egmO/s1600/SOAPUIRequestDefault.PNG" height="250" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
becomes</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrjproWhohrv6d4RJ7Dyi47BDLqZY7H8WkFxnCc09n0d9c5DCUnaOQ7jkev26hFL0HLscVVM-wGvqPazp4ON07ruVwJ7BhMUJU5InQe6q9edr1XURZeY8HvJFOJSu-S-nm2fgLkuJmbNu-/s1600/SOAPUIRequestTestData.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrjproWhohrv6d4RJ7Dyi47BDLqZY7H8WkFxnCc09n0d9c5DCUnaOQ7jkev26hFL0HLscVVM-wGvqPazp4ON07ruVwJ7BhMUJU5InQe6q9edr1XURZeY8HvJFOJSu-S-nm2fgLkuJmbNu-/s1600/SOAPUIRequestTestData.PNG" height="187" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Execute the test and validate that the data has been posted into M3. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The XML above is the template for the file we will create below. We want everything apart from the <soapenv> tags so:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokcAO2lHcF2tOzTagLsn8yvFrDEZiuDhLqRskGYdRa-kFI8AvdvtBJA20qheQG_JWHT_J6PjqhVgVYxKpccsnG5rV8YIDya8ZdFHJV881BTCasocU9yKdfzlMBsWXJZQhTB8xBxSJql98/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> <AddAlias>
<AddAliasItem>
<Company>100</Company>
<AliasCategory>2</AliasCategory>
<AliasQualifier>EA13</AliasQualifier>
<ItemNumber> 02010</ItemNumber>
<AliasNumber>4434567001143</AliasNumber>
<AliasType>EA13</AliasType>
</AddAliasItem>
</AddAlias>
</code></pre>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
Note that when using SOAPUI, if your MWS is on the Grid then you'll use the authentication mechanism setup within LCM for this. If your MWS is pre-Grid then you'll normally pass in the authentication as part of the XML string. For this example I used MWS on the Grid which requires the authentication to be added via the Auth tab at the bottom of the SOAPUI screen.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h2>
Creating the XML file for for the Web Service</h2>
<div>
The starting point for this is a SQL Server table that has the field names and formats exactly the same as the Aliases in the M3 Web Service. Note however that a date for M3 should be in the format YYYY-MM-DD. It's better to use SQL type char(10) for this rather than datetime.<br />
<br />
There are <a href="http://msdn.microsoft.com/en-nz/library/ms178107.aspx" target="_blank">many</a> <a href="http://msdn.microsoft.com/en-nz/library/ms188273.aspx" target="_blank">articles</a> <a href="http://www.codeproject.com/Articles/54584/Controlling-the-XML-output-when-using-the-FOR-XML" target="_blank">showing</a> how to use FOR XML to create XML output. I won't reinvent the wheel here and will instead just jump straight to the solution we developed:<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokcAO2lHcF2tOzTagLsn8yvFrDEZiuDhLqRskGYdRa-kFI8AvdvtBJA20qheQG_JWHT_J6PjqhVgVYxKpccsnG5rV8YIDya8ZdFHJV881BTCasocU9yKdfzlMBsWXJZQhTB8xBxSJql98/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> declare @xml xml --Used to build the initial XML record
declare @output varchar(max); --Used for the final XML record
--Obtain the inner data
WITH XMLNAMESPACES (
DEFAULT '""http://your.company.net/MMS025MI/AddAlias""')
select @xml = (
select
*
FROM [dbo].AddAlias AddAliasItem
FOR XML AUTO , ELEMENTS,root('AddAlias') )
--Fix the quotes around the namespace
select @output = (select convert(varchar(max),@xml))
set @output = REPLACE ( @output , '&quot;' , '"')
declare @cmd varchar(8000)
select @cmd = 'bcp "select ''' + @output + '''" queryout "C:\OUTPATH\data.xml"'
+ ' -S SQLSERVERNAME -T -r -w -t -c -C RAW';
exec xp_cmdshell @cmd, NO_OUTPUT;
</code></pre>
<br />
Looking at the components of this:<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokcAO2lHcF2tOzTagLsn8yvFrDEZiuDhLqRskGYdRa-kFI8AvdvtBJA20qheQG_JWHT_J6PjqhVgVYxKpccsnG5rV8YIDya8ZdFHJV881BTCasocU9yKdfzlMBsWXJZQhTB8xBxSJql98/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> WITH XMLNAMESPACES (
DEFAULT '""http://your.company.net/MMS025MI/AddAlias""')
</code></pre>
<br />
This adds the XML namespace http://your.company.net/MMS025MI/AddAlias to the AddAlias node.<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokcAO2lHcF2tOzTagLsn8yvFrDEZiuDhLqRskGYdRa-kFI8AvdvtBJA20qheQG_JWHT_J6PjqhVgVYxKpccsnG5rV8YIDya8ZdFHJV881BTCasocU9yKdfzlMBsWXJZQhTB8xBxSJql98/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> select
*
FROM [dbo].AddAlias AddAliasItem
</code></pre>
<br />
This changes the node wrapping the actual data to AddAliasItem instead of AddAlias which is the table name.<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokcAO2lHcF2tOzTagLsn8yvFrDEZiuDhLqRskGYdRa-kFI8AvdvtBJA20qheQG_JWHT_J6PjqhVgVYxKpccsnG5rV8YIDya8ZdFHJV881BTCasocU9yKdfzlMBsWXJZQhTB8xBxSJql98/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> FOR XML AUTO , ELEMENTS,root('AddAlias') )
</code></pre>
<br />
This does two things. Firstly by default FOR XML AUTO will treat the data as XML attributes on the AddAlias node. Specifying ELEMENTS makes these appear as <a href="http://www.w3schools.com/dtd/dtd_el_vs_attr.asp" target="_blank">XML elements rather than attributes</a>. Secondly, while we renames the AddAlias node to AddAliasItem above, we still need an outer AddAlias node. The command root('AddAlias') will add an outer AddAlias node wrapping the AddAliasItem node.<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokcAO2lHcF2tOzTagLsn8yvFrDEZiuDhLqRskGYdRa-kFI8AvdvtBJA20qheQG_JWHT_J6PjqhVgVYxKpccsnG5rV8YIDya8ZdFHJV881BTCasocU9yKdfzlMBsWXJZQhTB8xBxSJql98/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> select @output = (select convert(varchar(max),@xml))
set @output = REPLACE ( @output , '&quot;' , '"')
</code></pre>
<br />
The XML output from the FOR XML AUTO command will convert quote marks (") to &quot;. ION however requires that quote marks appear as quote marks, so we use the SQL REPLACE command to find and correct these.<br />
<br />
<pre style="background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjokcAO2lHcF2tOzTagLsn8yvFrDEZiuDhLqRskGYdRa-kFI8AvdvtBJA20qheQG_JWHT_J6PjqhVgVYxKpccsnG5rV8YIDya8ZdFHJV881BTCasocU9yKdfzlMBsWXJZQhTB8xBxSJql98/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> select @cmd = 'bcp "select ''' + @output + '''" queryout "C:\OUTPATH\data.xml"'
+ ' -S SQLSERVERNAME -T -r -w -t -c -C RAW';
exec xp_cmdshell @cmd, NO_OUTPUT;
</code></pre>
<br />
The final step is to output the generated XML data to the file system. Here we use the SQL Server bulk copy command <a href="http://msdn.microsoft.com/en-us/library/ms162802.aspx" target="_blank">BCP</a> to write the XML data to the disk. We can call command line programs via <a href="http://technet.microsoft.com/en-us/library/aa260689(v=sql.80).aspx" target="_blank">xp_cmdshell</a> and the NO_OUTPUT statement suppresses success or failure messages and makes the call cleaner.<br />
<br />
This SQL logic will then take all records in the AddAlias and output these as a single XML file. However, the M3 Web Service doesn't like multiple API commands in a single call, so we wrap this logic in a SQL cursor and output one record per XML file. I'll cover the cursor logic in the last post in this series.<br />
<br />
We can then take the XML file generated and test this in SOAP UI to confirm that what we have generated is compliant with the data required for the XML call.</div>
<h2>
</h2>
Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com2tag:blogger.com,1999:blog-913534236606046272.post-87706526618048511512014-09-09T06:41:00.000+12:002014-09-09T06:41:46.655+12:00Agile interface development using IONI'm attending <a href="http://www.infor.com/inforum/agenda/" target="_blank">Inforum</a> next week and will be presenting there on our experience using <a href="http://www.infor.com/solutions/technology/ion/" target="_blank">ION</a> as part of an <a href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank">Agile</a> interface development project.<br />
<br />
In my presentation I cover briefly the details of the methodology we developed for this project which allows us to build a basic interface between two systems in about 30 minutes. In this post I'll outline this methodology and, over the next few posts, I will build out the detail of how this works.<br />
<br />
Note that the interface approach I'll describe here focuses on the plumbing between the two systems and intentionally moves business logic for any transformations, control flow or quality of service required outside the interface itself.<br />
<br />
<br />
There are 5 main components of the interface:<br />
<br />
<ol>
<li>M3 Web Service</li>
<li>ION Endpoint for Web Service</li>
<li>ION Endpoint for file system</li>
<li>ION Document flow to connect Web Service and file system</li>
<li>SQL server stored procedure to create XML file for ION</li>
</ol>
<br />
<div>
Each of these components take about 5 minutes to set up, and the way they are set up is the same for all web services which makes for a very quick, repeatable process.</div>
<div>
<br /><h3>
M3 Web Service</h3>
</div>
A M3 Web Service can be built over M3 APIs, most M3 programs, or SQL statements or stored procedures. We've covered how to build web services over <a href="http://movexblog.blogspot.com/2010/02/creating-m3-web-service.html" target="_blank">M3 programs</a> and <a href="http://potatoit.wordpress.com/2012/09/10/lso10-apis-webservices-things-have-changed/" target="_blank">SQL statements</a> before. As part of this series I'll cover how to build a web service over an API.<br />
<br />
Via M3 Web Services and the M3 Web Services Designer (both licensed modules from Infor) we expose the API as a <a href="http://en.wikipedia.org/wiki/SOAP" target="_blank">SOAP</a> web service, which can be widely consumed to allow easy integration with M3. Conveniently, ION can consume these Web Services and thereby expose standard M3 APIs for List, Get, Create, Update and Delete functions.<br />
<br />
<h3>
ION Endpoint for Web Service</h3>
<div>
This advises ION the url that the web service will be exposed on, and the methods that will be exposed via this web service. We also define the authentication with M3 (using a M3 username and password) and the identifier that will be used to track the processing of the ION message.</div>
<div>
<br /></div>
<div>
Through this endpoint ION will be able to call the web service we defined above.</div>
<div>
<br /></div>
<h3>
ION Endpoint for File System</h3>
<div>
For this interface design we're accepting an XML file from an external system (in this case SQL Server) and passing this through ION to M3. So here we define the source directory where ION will find the XML files. This source directory can be on a network share, so we also specify the authentication to connect to that share.</div>
<div>
<br /></div>
<div>
Note that we could instead of using the file connector be querying a SQL Server directly via a stored procedure, but we chose the file system approach as it was ultimately simpler and led itself more to code reuse than the direct to SQL approach did.</div>
<div>
<br /></div>
<h3>
ION Document flow</h3>
<div>
The document flow connects the endpoints together and the XML data that will be passed from the file system to the web service. The document flow is where we can use the ION mapper to define business logic (like we can in MEC), but with this approach we do not. ION is simply used to pass the message between systems. Again this design decision reduced complexity and enabled reuse.</div>
<div>
<br /></div>
<h3>
SQL Server to create XML file</h3>
<div>
Here we use SQL server to create the XML file that ION requires. The SQL Server command "<a href="http://msdn.microsoft.com/en-nz/library/ms178107.aspx" target="_blank">FOR XML</a>" allows us to take the output from a SQL query and generate an XML document. We then use <a href="http://msdn.microsoft.com/en-us/library/aa337544.aspx" target="_blank">bcp</a> to create the XML file.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
When we put these components together the architecture looks like this:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8ezXlEH-fuZcJ-YHuddEScH4ZRMUImm2pfwWVfIn5wo95SMP1jf_bqRmBO1bGLKIhFLwiJoa0FtqOvU1_F-5O8Qrf-jwdEoId_aMQGQxTZZ9UoLcjeDkXQPNAD6bHd6ueYdrSJrbqpSKF/s1600/SQLServerToM3Design.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8ezXlEH-fuZcJ-YHuddEScH4ZRMUImm2pfwWVfIn5wo95SMP1jf_bqRmBO1bGLKIhFLwiJoa0FtqOvU1_F-5O8Qrf-jwdEoId_aMQGQxTZZ9UoLcjeDkXQPNAD6bHd6ueYdrSJrbqpSKF/s1600/SQLServerToM3Design.PNG" height="265" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The two components on the left refer to the solutions we were integrating with M3 via ION, in this case Infor's <a href="http://www.infor.com/product_summary/scm/advancedplanner/" target="_blank">Advanced Planner</a> and <a href="http://www.infor.com/product_summary/scm/advancedscheduler/" target="_blank">Advanced Scheduler</a> and a manufacturing plant.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
In my presentation I go into some detail about the challenges inherent in those integrations and why an Agile approach was required.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The following posts will cover:</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul>
<li>Building a M3 Web Service over an API and SQL Server's FOR XML</li>
<li>Building the endpoints and document flow in ION</li>
<li>Control logic and other considerations</li>
</ul>
<div>
<br /></div>
Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com3tag:blogger.com,1999:blog-913534236606046272.post-48135358422941122622013-09-24T22:48:00.000+12:002014-09-09T05:41:13.679+12:00M3 13.1 / BE 15 & SmartOffice 10.1.1 UI improvementsI've been using BE 15 for a few weeks now with Smart Office 10.1.1 and I wanted to mention a few of my favourite UI improvements.<br />
<br />
There are simple things like the Text Block now defaulting the active control to the Next button. This is a great time saver when you have T in your panel sequence and you are pressing ENTER to move between the panels.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCuA4qaQPYm_HWqU8DYyObCYsuBGoAsj6oBRIuApb7eFmYwBBj2PIskfaBxZ_WLhbSjHXGIyGPy7pK7ceDP-4N069hvuVhyAUEHs82BDPfx44Sxw5qBhuPSoag0LAZwPQfrFKuJiEIiVcC/s1600/TextBlock.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCuA4qaQPYm_HWqU8DYyObCYsuBGoAsj6oBRIuApb7eFmYwBBj2PIskfaBxZ_WLhbSjHXGIyGPy7pK7ceDP-4N069hvuVhyAUEHs82BDPfx44Sxw5qBhuPSoag0LAZwPQfrFKuJiEIiVcC/s400/TextBlock.PNG" height="371" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
With BE 14 and below the default control was the text field so you needed to use the mouse or Tab key to get to the Next button to submit which interrupted a user's flow. Now with BE 15 you can just keep pressing ENTER to move between the panels including Text panels.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The new toolbox screens are great. Infor has built a new toolbox screen standard (see NCR 5418 on InforXtreme for details) which provides both additional toolbox screens but also enhanced capability within the toolbox screens. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcE4zwJJPZVua2wkxEXb4L_401eTN9HmS2nMPgV4IlYYVT5pwYhUz14kJJK5rc7_MN7MknWBGUomNiNdFlgjkrogAVbm8NV1UBTF7Oe27QKotpeaOMBNVoOAh1MS3vnpohcIw06jFAsD94/s1600/CRS610ToolboxScreen.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcE4zwJJPZVua2wkxEXb4L_401eTN9HmS2nMPgV4IlYYVT5pwYhUz14kJJK5rc7_MN7MknWBGUomNiNdFlgjkrogAVbm8NV1UBTF7Oe27QKotpeaOMBNVoOAh1MS3vnpohcIw06jFAsD94/s640/CRS610ToolboxScreen.PNG" height="171" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
There are three major parts to this change:</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ol>
<li>Views can now be linked to Sorting Orders. With previous versions of the BE toolbox screens could use any view with any sorting order. This would often lead to combinations that made little workflow sense. You can now specify on a View that this should be restricted to a specified Sorting Order.</li>
<li>Views are extended to 30 columns with up to 250 characters which is close to double the previous limits. This allows us to make proper use of widescreen monitors.</li>
<li>Columns within the Views can be logically formatted. We can specify date formatting, numerical formatting, financial formatting (appending CR to negative values) etc.</li>
</ol>
<div>
This is a big change and very beneficial to the screens that support the new toolbox standard. However screens that were previously toolbox screens (OIS300, MMS200, PMS100, PMS170, PPS170 etc.) have not been updated to support the new standard. This is a shame as the new standard is a significant improvement over what was offered before. This does make BE 15 a bit of a transitional release with different approaches to creation and maintenance of the toolbox screens depending on which program you are in.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Perhaps my favourite new function however is the addition of related tables and virtual fields. These are a framework that allow us to easily build functionality that extends M3. The related tables can be found from the new program CMS005.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzg4IIWyU7cRNQAxXEu5GHSOaUulfUyHygTjyy5MngN1RK3Tj1FraVPNmvEzHrGi9TxQymmLPLnhkVGa484v9oTazvXthXcWRerkrK3ugX38w3Zm3cmD-R3q9i0fYCTpZ1IWI9QD5sE4WE/s1600/RelatedTables.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzg4IIWyU7cRNQAxXEu5GHSOaUulfUyHygTjyy5MngN1RK3Tj1FraVPNmvEzHrGi9TxQymmLPLnhkVGa484v9oTazvXthXcWRerkrK3ugX38w3Zm3cmD-R3q9i0fYCTpZ1IWI9QD5sE4WE/s640/RelatedTables.PNG" height="196" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Here I have created a new custom table and linked it to MMS001 based on the primary keys</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaNnn_4NSpzEe6kdMQ8YDAAzP1ZiQbn3-9-tOK2RTF4SFGIYSiJlwM73-pJdDr6dZ-27r9lBAlwvChq4lnAoAqSAmH4oUFJyXLrUKqUeZhDObTvcfhPNmak6R7icAsKX8FT_kkwyFFGaLs/s1600/RelatedTables1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaNnn_4NSpzEe6kdMQ8YDAAzP1ZiQbn3-9-tOK2RTF4SFGIYSiJlwM73-pJdDr6dZ-27r9lBAlwvChq4lnAoAqSAmH4oUFJyXLrUKqUeZhDObTvcfhPNmak6R7icAsKX8FT_kkwyFFGaLs/s640/RelatedTables1.PNG" height="196" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn9_BROGSVgLroY1pjMwZ474h-MD562-_DNLLAG3dmHODo3Yz_q5YyVKURTQ3UNBwnGYBvpG6p8YUB7uv6dpcQ3QxYHzh8zwTKIAdTeXjkm30K6YkKbuuBMT3HGNyO9T0synk_ke-ahGxS/s1600/RelatedTables2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgn9_BROGSVgLroY1pjMwZ474h-MD562-_DNLLAG3dmHODo3Yz_q5YyVKURTQ3UNBwnGYBvpG6p8YUB7uv6dpcQ3QxYHzh8zwTKIAdTeXjkm30K6YkKbuuBMT3HGNyO9T0synk_ke-ahGxS/s640/RelatedTables2.PNG" height="358" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
With a very simple JScript I am now able to easily add additional fields to MMS001 from the custom table I created in CMS011 and read and write these via the native M3 APIs e.g.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ-BYnwZ1OU9z3nixWwrjWz5Jmha_BiQAHtiatGUbMwtgsvKNIcWtJMVeVHFqqcPnrEfvJfLpQyTGY-wg34-9sR88DGAqmNtDj1SL5AhrRTzszyRMJvMMvaIiiTR5Y5FRKIncje213Jbbg/s1600/RelatedTables3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ-BYnwZ1OU9z3nixWwrjWz5Jmha_BiQAHtiatGUbMwtgsvKNIcWtJMVeVHFqqcPnrEfvJfLpQyTGY-wg34-9sR88DGAqmNtDj1SL5AhrRTzszyRMJvMMvaIiiTR5Y5FRKIncje213Jbbg/s640/RelatedTables3.PNG" height="590" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
It's also now possible to show these custom fields in the new toolbox screens.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
We were able to do this already with Mashups, JScripts and Web Services, but this new functionality bakes this into the core of M3 and makes building extensions to M3 significantly easier.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Some of the functionality highlights I see as particularly valuable for my customers includes:</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul>
<li>Customer Order workflow improvements to significantly reduce the number of panels required to enter a CO</li>
<li>Improvements to the Purchase Order process to ease the analysis of alternate acquisition methods and print a PO without sending it to the supplier</li>
<li>Improvements to the Balance ID toolbox to bring some of the DO creation functionality initially introduced in Warehouse Mobility back into the core M3 package</li>
<li>Changes to the stocktake functionality to reduce the cost of undertaking cyclic stocktakes by initiating stocktakes on empty locations and during picking</li>
<li>Significant improvements for the F&B industry including best before & harvest / kill dates, ageing in hours and minutes, GS1-style extensions to PO processes and addition of allocation restrictions to ensure that a customer is never shipped older product than has already been dispatched to them</li>
<li>Lot blending within silos and Lab Inspection changes to allow Lab Inspections at the Balance ID rather than lot level</li>
<li>An API for GLS850</li>
<li>Improvements to the ability to reconcile the logistics and general ledger systems</li>
<li>The ability to mark a user as "Deactivated" within MNS150 without deleting the user.</li>
</ul>
<div>
<br /></div>
As time allows I'll cover some of these in additional posts.Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com2tag:blogger.com,1999:blog-913534236606046272.post-65942580372393216512013-09-04T10:14:00.001+12:002013-09-04T10:14:39.814+12:00M3 SDK alternativeThere's a great <a href="http://smartofficeblog.com/2013/06/20/script-assemblies-in-mforms/" target="_blank">post</a> over on the Smart Office blog about how to build Smart Office applications when you don't have access to the Smart Office SDK. It would be great to see wider distribution of the Smart Office SDK, as it allows developers to quickly and easily extend the core functionality of M3 using Visual Studio, but this is the next best thing. All that appears to be missing is the logic for deploying a Smart Office package in LCM, though that appears to be a zip file with a manifest so should be able to be reverse-engineered.Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com0tag:blogger.com,1999:blog-913534236606046272.post-44387280295553399202013-06-13T08:56:00.001+12:002013-06-13T08:56:40.042+12:00Infor's 10x webcast sessionsInfor have published their 10x sessions on the Internet. The M3 session is accessible here <a href="http://webinars1.infor.com/Americas/20130517_10x_M3.mp4">here</a>, and the other sessions are available from this <a href="http://www.infor.com/company/webcasts/erparchive/erpstrategy/20130517-infor10x-summit-week?stage=form_submitted" target="_blank">link</a>. The M3 session provides a high-level overview of the 13.1 / BE v 15 functionality.Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com0tag:blogger.com,1999:blog-913534236606046272.post-22935193773577942022013-06-10T21:31:00.003+12:002013-06-10T21:31:51.290+12:00M3 BE v15 / 13.1Infor has recently released M3 v 13.1 / BE v 15. The release notes are all up on the InforXtreme documentation site. Over the next few months I'll be working on a BE 14 -> BE 15 upgrade so I've been trawling through the release notes. There's some interesting stuff there. Highlights on a first read from a technology perspective are mashup / custom list enhancements and lots more programs supporting customisable Browse panels. <br />
<br />
From a functionality perspective the extensions to the advance invoicing functionality look interesting, especially with the ability to enforce this and extend this into cashflow planning. Lab Inspection approval at a Balance ID level is critically needed for the F&B industry so it's good to see it there. Inbound transportation management is a good addition filling a hole in the M3 solution. The API for GLS850 is well overdue filling an area where most sites have built custom solutions to solve.<br />
<br />
There's lots of other interesting changes there and I'll review areas as I get to them in the coming months.Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com4tag:blogger.com,1999:blog-913534236606046272.post-45806271028241696852012-11-23T07:33:00.003+13:002012-11-23T07:33:54.664+13:00LSO & M3 discussion forumsI was trolling through some older posts on Karin's <a href="http://lawsonsmartoffice.com/">blog</a> and spotted a reference to a LSO discussion forum in the comments.<br />
<br />
The address is <a href="http://www.lawsonguru.com/forums/ux/lso/">http://www.lawsonguru.com/forums/ux/lso/</a> Thanks Karin for pointing this out :-)<br />
<br />
For generic M3 / Movex issues the discussion forum <a href="http://erp.ittoolbox.com/groups/technical-functional/intentia-l/">http://erp.ittoolbox.com/groups/technical-functional/intentia-l/</a> is a great place to ask questions and contribute to collective community knowledge base.<br />
<br />Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com2tag:blogger.com,1999:blog-913534236606046272.post-65989882469783413422012-11-16T16:46:00.003+13:002012-11-16T16:46:49.152+13:00Lawson Web Services and .Net - a guest postMy friend and colleague Paul Grooby at Resene Paints in Wellington was kind enough to contribute the post below about his trials and tribulations with consuming Lawson Web Services in .Net.<br />
<br />
<br />
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
<b>Using Visual Studio .Net and Lawson Web Services.</b></div>
<div class="MsoNormal">
Paul Grooby – 2012-11-02.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Using Lawson WebServices is a doddle, once you understand how it fits together. And if you want to generate simpler data entry and display screens (without SQL and wrapping API’s then this is the ticket). Once you've <a href="http://movexblog.blogspot.com/2010/02/creating-m3-web-service.html">created your web-services</a> in Lawson Web Services and published these you can see them in a browser before you start testing them using SOAPUI.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhthJEyFoPLdE3vkJvZa5hE6CdrlbTpQLiEBrpI_cMhCAaRSM9DtmU1-AoCeKyFyicxb7EkfHN7SmSyi-L1Svzy0O4oj7dkmPCFZ4tp3y8usPkD7M6ge1IB-yT4bvdG1WItj3fIHNVGxN-1/s1600/1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhthJEyFoPLdE3vkJvZa5hE6CdrlbTpQLiEBrpI_cMhCAaRSM9DtmU1-AoCeKyFyicxb7EkfHN7SmSyi-L1Svzy0O4oj7dkmPCFZ4tp3y8usPkD7M6ge1IB-yT4bvdG1WItj3fIHNVGxN-1/s400/1.JPG" width="400" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Click on the WSDL file link above – this will load the XML file in the browser that you can then save.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguP93eYoxFf68jiKdlXIRu-9dBivIKwfzbegypt3sIMbmGR5c4bBDEO0HfVdFdOXb-8gBoymFXu1trKKhrA4TBA214xn3KTFQJRNZPQM0ZmLpU3KsHnxjbtDL3R7sNcVIfIq-8OtKCxzZu/s1600/2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguP93eYoxFf68jiKdlXIRu-9dBivIKwfzbegypt3sIMbmGR5c4bBDEO0HfVdFdOXb-8gBoymFXu1trKKhrA4TBA214xn3KTFQJRNZPQM0ZmLpU3KsHnxjbtDL3R7sNcVIfIq-8OtKCxzZu/s400/2.JPG" width="400" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Choose File ->Save from the menu to save the file as a WSDL file on your system.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Now a caveat – while Lawson Web Services generated <a href="http://books.xmlschemata.org/relaxng/ch19-77049.html">xsd:datetime</a> definitions for some of the API fields, it doesn't accept accept xsd:datetime inputs to them – so open the saved WSDL file in a text editor and do a find and replace on any datetime fields.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6S88LFiSJ1LO_sUK25nX4Xr4CLYQgHZtattnWMeEB4arFDtm1JNrM_fzpjROjMQifg0XCJHxHSQUw_RWMVrJBuMFg-7tns_1gsiHer0hPDqtYEdCgWpAqgLaP4tNMwS_j9DDuRbpK1oFA/s1600/3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6S88LFiSJ1LO_sUK25nX4Xr4CLYQgHZtattnWMeEB4arFDtm1JNrM_fzpjROjMQifg0XCJHxHSQUw_RWMVrJBuMFg-7tns_1gsiHer0hPDqtYEdCgWpAqgLaP4tNMwS_j9DDuRbpK1oFA/s400/3.JPG" width="400" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Replace the datetime fields with a string datatype. Once you've checked the remainder of the WSDL file its time to do the cool stuff and fire up Visual Studio (we’ll need this WSDL file later). I'm going to create a blank web application for this demo (it could as easily be a console application or windows application).</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLmW-DZdSwCC-s1mAb63GdrciuC-P73NsgW6-vXpGLQEdC8CFdY62EC2wnSDoAXUACeHAMROKw2JASLE-RUqDLLOLIrqwqaBMEYd2H526URAbIUkbmVQ-_GNJSKaY7kx8Ac1ZXgiTvm2cY/s1600/4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLmW-DZdSwCC-s1mAb63GdrciuC-P73NsgW6-vXpGLQEdC8CFdY62EC2wnSDoAXUACeHAMROKw2JASLE-RUqDLLOLIrqwqaBMEYd2H526URAbIUkbmVQ-_GNJSKaY7kx8Ac1ZXgiTvm2cY/s400/4.JPG" width="400" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
I normally add the external WSDL files to the application and place them in their own folder in the project. Locate the file and add to the project.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd1Nbw0L6Iw9VEW-ljmZGFG0nnb1nGMWqBXfMo_0RBWwgS58jfTRALBBJE_l4GwjD6PYlmQMTqEFYOJQJmDRp6Xg3fYc6vvcla6isG-Pp_UrTACElBU8FI8OBOVzNFICsL1MY8xIcgg4at/s1600/5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd1Nbw0L6Iw9VEW-ljmZGFG0nnb1nGMWqBXfMo_0RBWwgS58jfTRALBBJE_l4GwjD6PYlmQMTqEFYOJQJmDRp6Xg3fYc6vvcla6isG-Pp_UrTACElBU8FI8OBOVzNFICsL1MY8xIcgg4at/s400/5.JPG" width="362" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg9CHWCIWfwt87qKlahszEA79gPOu81ribq10eKsDVqW0pI5GUWqd-oDcx1yTDv1aE8Kb1gufxxKi1d6SpfWMuAofuAjwusmPJGT4MTv9SlcabXtpAh8T8VJbi_cWLIlaoaUMQRBI6K_dr/s1600/6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg9CHWCIWfwt87qKlahszEA79gPOu81ribq10eKsDVqW0pI5GUWqd-oDcx1yTDv1aE8Kb1gufxxKi1d6SpfWMuAofuAjwusmPJGT4MTv9SlcabXtpAh8T8VJbi_cWLIlaoaUMQRBI6K_dr/s320/6.JPG" width="320" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
From here select the file and in the properties box of the studio project select and copy the file path.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmVU1EzSPujPi6ZRb_JCLpq8BaYU6-nhMY912vvSTVmxz9VGFz4dhCTdjKA6kDe9VeGlyXK3EZhoKQ4_8jP6Kqb84j79BoJWV6LsdEKbBppLVeNJ1i9AAyt-Ic2G1S3W_htZmhuXJ7R3zB/s1600/7.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmVU1EzSPujPi6ZRb_JCLpq8BaYU6-nhMY912vvSTVmxz9VGFz4dhCTdjKA6kDe9VeGlyXK3EZhoKQ4_8jP6Kqb84j79BoJWV6LsdEKbBppLVeNJ1i9AAyt-Ic2G1S3W_htZmhuXJ7R3zB/s400/7.JPG" width="400" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
With the file path copied to the clipboard, select the option to add a service reference to the application..</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcMn2rc9cbIRIh9xZbQPo4wK1-RLYqsWfMM1WEk4kKLXv-5jj0vwtul0vixXbSKO1_KAcespt-Cb2hNU_6Cg11P91F9o64u4X-1j8FZfqpk1c5BwzyXrkLJ5EG1NH51WZZTD0fH5n17Qjp/s1600/8.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcMn2rc9cbIRIh9xZbQPo4wK1-RLYqsWfMM1WEk4kKLXv-5jj0vwtul0vixXbSKO1_KAcespt-Cb2hNU_6Cg11P91F9o64u4X-1j8FZfqpk1c5BwzyXrkLJ5EG1NH51WZZTD0fH5n17Qjp/s1600/8.JPG" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The following dialog box will be displayed:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglz_EJqztAvjo7WgOR4jT9ko96Z826J4_4sZxtgi3uUF0At6F_nE4Cq2afGm5GkdfqS9Gwqr4KLezBYRpzvID8B9zsHf02BMgzWOKQcQz9t5u8NhyphenhyphendsZZZrc7ktv1vu1l6e0rj7rIWZ2gx/s1600/9.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglz_EJqztAvjo7WgOR4jT9ko96Z826J4_4sZxtgi3uUF0At6F_nE4Cq2afGm5GkdfqS9Gwqr4KLezBYRpzvID8B9zsHf02BMgzWOKQcQz9t5u8NhyphenhyphendsZZZrc7ktv1vu1l6e0rj7rIWZ2gx/s400/9.JPG" width="400" /></a></div>
<div class="MsoNormal">
Paste the file path into the Address bar – Don’t click Ok just yet – click the advanced button to check a couple of important options.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipdHsWGVHFguI5diZxVosmOnhxj-NGg-v5g5S9U_K85lXbJ52Q-8bdcg0ZY_nTmf-_Jhz1YO0fJDA_Lm4Q99eNIGMfiDOmqK8Qq5xYHXJ3OA2BR7wX5nZAkDZarNf8ajfPHF7bnVS0k_W8/s1600/10.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipdHsWGVHFguI5diZxVosmOnhxj-NGg-v5g5S9U_K85lXbJ52Q-8bdcg0ZY_nTmf-_Jhz1YO0fJDA_Lm4Q99eNIGMfiDOmqK8Qq5xYHXJ3OA2BR7wX5nZAkDZarNf8ajfPHF7bnVS0k_W8/s400/10.JPG" width="390" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Ensure that these two check boxes are checked and then click the OK button.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Give the webservice a relevant namespace. As a naming convention I tend to leave these the same name as the API / Webservice so that these can be traced back.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Once you click the Ok button a list of service endpoints will be displayed.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7TVoB7BN7-u6lKcnrKLdBwuT8drhZfqNOrEEq_fhaBFrn5v_h-6R-L-ya6_3eipRv12xYRxNrztXdGRVsL1zH-rH_9Cq5yaMlVk66vvHZyxDs4My8cpoiwkBoSESjnI7j8863BKf8N5va/s1600/11.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="143" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7TVoB7BN7-u6lKcnrKLdBwuT8drhZfqNOrEEq_fhaBFrn5v_h-6R-L-ya6_3eipRv12xYRxNrztXdGRVsL1zH-rH_9Cq5yaMlVk66vvHZyxDs4My8cpoiwkBoSESjnI7j8863BKf8N5va/s320/11.JPG" width="320" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Click Ok – Visual Studio will do its thing and generate the necessary references and stubs for the program.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The project will now look like the following </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCJrhhZgO40Fyc49KKoWp3UL8zzAypOmG4W4mMRi9cpdudAQS6pBMlJLuGHZjp2jNq1LIrSKCVkX-Xmyti-qI4C1HqePFNLs6jWh6nAWtaZg-WZH1U4QpvYUgYLLLAPigPOmn9sjCOb367/s1600/12.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCJrhhZgO40Fyc49KKoWp3UL8zzAypOmG4W4mMRi9cpdudAQS6pBMlJLuGHZjp2jNq1LIrSKCVkX-Xmyti-qI4C1HqePFNLs6jWh6nAWtaZg-WZH1U4QpvYUgYLLLAPigPOmn9sjCOb367/s320/12.JPG" width="269" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
If your project doesn't show all of the files then click on the button highlighted to see them.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The two files with the extension 'svcinfo' contain details of where the endpoint of the service is located. This is important in that you’d normally develop, test and then deploy in the different environments. If you don’t remember that the endpoints are embedded in these files you could be pointing at the wrong environment.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
However to save a little hassle, and this is why we copied the file locally we can edit our WSDL file that's contained in the project.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7avrqCHJ7FFy2-iLw9prxCwBq1QgOj8AJxNwxedlVa7S8ct2HzWVgc6V69RDrrLBZGHQKpYbFQRyV49xC0vbt8m-kEYeCfPRvSa0IEcj_MbxNX1Vem-bGOcjzqwfm0bh-ayFFJkflbCsF/s1600/13.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="506" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7avrqCHJ7FFy2-iLw9prxCwBq1QgOj8AJxNwxedlVa7S8ct2HzWVgc6V69RDrrLBZGHQKpYbFQRyV49xC0vbt8m-kEYeCfPRvSa0IEcj_MbxNX1Vem-bGOcjzqwfm0bh-ayFFJkflbCsF/s640/13.JPG" width="640" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The endpoint is embedded in the WSDL – if you change this to point to say PROD and regenerate the files, the files with the svcinfo extension will be updated – follow this process here:</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
1: Alter the end point in the WSDL file. Save.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
2: Against the service select the option to configure the service reference</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbYRjc4qv1UDekGGB5Fe7i-m7qr7njlQZSjj_AA1m-CJAHZq_00sjh0pBc-qcLELUlkb8ltnjGAkSh21EixN1Ptk4qP-cFnoyWQXHFH9uo6zUlWH3UrG3SsD2mpwclvXkXFHhOlsV5Pthw/s1600/14.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbYRjc4qv1UDekGGB5Fe7i-m7qr7njlQZSjj_AA1m-CJAHZq_00sjh0pBc-qcLELUlkb8ltnjGAkSh21EixN1Ptk4qP-cFnoyWQXHFH9uo6zUlWH3UrG3SsD2mpwclvXkXFHhOlsV5Pthw/s1600/14.JPG" /></a></div>
<div class="MsoNormal">
This will display the follow dialogue box:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwSxUHnhu-KB1LokxhbeFXQGHk7cb3kmfzC9XapVu-ks7OE7n5JWq14IwrR_XBaOKBZrRf6fwJMZIwvPWkOWwRQyzyFAThMWakX1jHU8rz14k5F6HSEWBW5mgM62Qr6d4dKZltBvF3XP4i/s1600/15.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="155" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwSxUHnhu-KB1LokxhbeFXQGHk7cb3kmfzC9XapVu-ks7OE7n5JWq14IwrR_XBaOKBZrRf6fwJMZIwvPWkOWwRQyzyFAThMWakX1jHU8rz14k5F6HSEWBW5mgM62Qr6d4dKZltBvF3XP4i/s400/15.JPG" width="400" /></a></div>
<div class="MsoNormal">
Make sure the address is pointing to your local file then click Ok. </div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
From the project menu for the service select the option to update the service reference:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsrXCUZk7UV3cJSUSh6t2jPY2GizV-7y0u7dvj8OdhvtUVPluSNtPoXVexrHEI5w4o7V-IeD_QQF5YDXMvhYc6jQlptHGlJ8iaFo25yQTDZ8hx7fYPyexl9pSc0uDIemkNPALvQMIibo5O/s1600/16.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsrXCUZk7UV3cJSUSh6t2jPY2GizV-7y0u7dvj8OdhvtUVPluSNtPoXVexrHEI5w4o7V-IeD_QQF5YDXMvhYc6jQlptHGlJ8iaFo25yQTDZ8hx7fYPyexl9pSc0uDIemkNPALvQMIibo5O/s1600/16.JPG" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
You can check that the service has taken by opening the svcinfo files and checking the end point.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbBDIoFvgrn4npYr59pZR2jgwbIQ4LyNkTtU7Lg53u5p8v-JLJXvUM2mri6SORItDzUIxfKK72nTvx-paDIuv3eGAb43FXun3yt2OeLoXXiZFSsS230IP6gHlPeFFm8nwqc1AyAFuRnK4_/s1600/17.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="21" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbBDIoFvgrn4npYr59pZR2jgwbIQ4LyNkTtU7Lg53u5p8v-JLJXvUM2mri6SORItDzUIxfKK72nTvx-paDIuv3eGAb43FXun3yt2OeLoXXiZFSsS230IP6gHlPeFFm8nwqc1AyAFuRnK4_/s640/17.jpg" width="640" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
This process also updates the web.config file in this case so we just need to check that this has been updated.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX83SgL49zt-6R6mX2cHAYvgu0jMepIXdVDS3HLh6YwlAuplr-_F6INMFFYjSbLTMlnZ69dRny_h8rxxMUV12KJRQwe2e4wZhl4Abc4BQOfVYPIDscE1GOTs36150tfNxVDFqd7BqEZ0Py/s1600/18.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="116" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX83SgL49zt-6R6mX2cHAYvgu0jMepIXdVDS3HLh6YwlAuplr-_F6INMFFYjSbLTMlnZ69dRny_h8rxxMUV12KJRQwe2e4wZhl4Abc4BQOfVYPIDscE1GOTs36150tfNxVDFqd7BqEZ0Py/s400/18.jpg" width="400" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
If we see two endpoints with the same contract we’re in trouble – delete the incorrect one as the process will not work.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
So that’s all there is to it for the adding of a reference. If you want to use the interactions you’ll need to write a bit of code. The following section has a simple class that consumes the objects used above.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The following class is used to interact with the webservice (I won’t teach you about programming – suffice to say this works a treat). It creates a 'Customer' object, calls the various methods to populate the relevant bits of information and retains that information.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
using System;</div>
<div class="MsoNormal">
using SampleLWSApplication.CRS610MI;</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
namespace SampleLWSApplication</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
public class Customer</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
#region PrivateVariables</div>
<div class="MsoNormal">
private String _company = "";</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
// also based on this customer we should be able to also use the GetBasicData</div>
<div class="MsoNormal">
private String _customername = "";</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
private String _customernumber = "";</div>
<div class="MsoNormal">
private String _customerpassword = "";</div>
<div class="MsoNormal">
private String _customersordernumber = "";</div>
<div class="MsoNormal">
private String _division = "";</div>
<div class="MsoNormal">
private String _facility= "";</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
// get the other details such as order number , etc</div>
<div class="MsoNormal">
private String _ordertype = "";</div>
<div class="MsoNormal">
private String _password = "";</div>
<div class="MsoNormal">
private String _payer = "";</div>
<div class="MsoNormal">
private DateTime _requesteddeliverydate ;</div>
<div class="MsoNormal">
private String _transactionreason= "";</div>
<div class="MsoNormal">
private String _username = "";</div>
<div class="MsoNormal">
private String _warehouse= "";</div>
<div class="MsoNormal">
private String _emailaddress = "";</div>
<div class="MsoNormal">
private String _specialnstructions = "";</div>
<div class="MsoNormal">
#endregion</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public Customer()</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
// create the class</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
/// <summary></div>
<div class="MsoNormal">
/// Get CustomerData is to pull the data through for the customer</div>
<div class="MsoNormal">
/// </summary></div>
<div class="MsoNormal">
/// <param name="CustomerNumber"></param></div>
<div class="MsoNormal">
public void GetBasicData(String CustomerNumber)</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
// code to do a lookup against the customer and retrieve the basic data from the system</div>
<div class="MsoNormal">
// always need a client</div>
<div class="MsoNormal">
CRS610MI.CRS610MIClient crs610MIClient = new CRS610MIClient();</div>
<div class="MsoNormal">
// create the soap header</div>
<div class="MsoNormal">
CRS610MI.headerType mwsheader = new CRS610MI.headerType();</div>
<div class="MsoNormal">
mwsheader.user = _username; // user name for the API from the configuration file</div>
<div class="MsoNormal">
mwsheader.password = _password; // password for the API from the configuration file</div>
<div class="MsoNormal">
mwsheader.company = _company;</div>
<div class="MsoNormal">
mwsheader.division = "xxx";</div>
<div class="MsoNormal">
// create a new object to hold the details</div>
<div class="MsoNormal">
CRS610MI.GetBasicDataItem getBasicData = new GetBasicDataItem();</div>
<div class="MsoNormal">
// set the variables for the process</div>
<div class="MsoNormal">
getBasicData.Company = 100;</div>
<div class="MsoNormal">
// set to the passed</div>
<div class="MsoNormal">
getBasicData.CustomerNumber = CustomerNumber.ToUpper(); // force to upper case</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
CRS610MI.GetBasicDataCollection collection = new GetBasicDataCollection();</div>
<div class="MsoNormal">
collection.maxRecords = 1000;</div>
<div class="MsoNormal">
collection.GetBasicDataItem = new GetBasicDataItem[1];</div>
<div class="MsoNormal">
collection.GetBasicDataItem[0] = getBasicData;</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
CRS610MI.GetBasicDataRequest crs610MIRequest = new GetBasicDataRequest(mwsheader, collection);</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
try</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
// pul back the data responses</div>
<div class="MsoNormal">
CRS610MI.GetBasicDataResponse responseItem = crs610MIClient.GetBasicData(crs610MIRequest);</div>
<div class="MsoNormal">
// turn this into an array</div>
<div class="MsoNormal">
CRS610MI.GetBasicDataResponseItem[] ri = responseItem.GetBasicDataResponse1;</div>
<div class="MsoNormal">
// loop through the array</div>
<div class="MsoNormal">
for (int i = 0; i < ri.Length; i++)</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
// output the data</div>
<div class="MsoNormal">
// set the values</div>
<div class="MsoNormal">
_customername = ri[i].CustomerName;</div>
<div class="MsoNormal">
_transactionreason = ri[i].FreeField3;</div>
<div class="MsoNormal">
_division = ri[i].Division;</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
catch (System.ServiceModel.FaultException ex)</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
Console.Write(ex.Message);</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
/// <summary></div>
<div class="MsoNormal">
/// Get CustomerData is to pull the data through for the customer</div>
<div class="MsoNormal">
/// </summary></div>
<div class="MsoNormal">
/// <param name="CustomerNumber"></param></div>
<div class="MsoNormal">
public void GetOrderInfo(String CustomerNumber)</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
// code to do a lookup against the customer and retrieve the basic data from the system</div>
<div class="MsoNormal">
// always need a client</div>
<div class="MsoNormal">
CRS610MI.CRS610MIClient crs610MIClient = new CRS610MIClient();</div>
<div class="MsoNormal">
// create the soap header</div>
<div class="MsoNormal">
CRS610MI.headerType mwsheader = new CRS610MI.headerType();</div>
<div class="MsoNormal">
mwsheader.user = _username; // user name for the API from the configuration file</div>
<div class="MsoNormal">
mwsheader.password = _password; // password for the API from the configuration file</div>
<div class="MsoNormal">
mwsheader.company = _company;</div>
<div class="MsoNormal">
mwsheader.division = "xxx";</div>
<div class="MsoNormal">
// create a new object to hold the details</div>
<div class="MsoNormal">
CRS610MI.GetOrderInfoItem getOrderInfo = new GetOrderInfoItem();</div>
<div class="MsoNormal">
// set the variables for the process</div>
<div class="MsoNormal">
getOrderInfo.Company = 100;</div>
<div class="MsoNormal">
// set to the passed</div>
<div class="MsoNormal">
getOrderInfo.CustomerNumber = CustomerNumber.ToUpper(); // force to upper case</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
CRS610MI.GetOrderInfoCollection collection = new GetOrderInfoCollection();</div>
<div class="MsoNormal">
collection.maxRecords = 1000;</div>
<div class="MsoNormal">
collection.GetOrderInfoItem = new GetOrderInfoItem[1];</div>
<div class="MsoNormal">
collection.GetOrderInfoItem[0] = getOrderInfo;</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
CRS610MI.GetOrderInfoRequest crs610MIRequest = new GetOrderInfoRequest(mwsheader, collection);</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
try</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
// pull back the data responses</div>
<div class="MsoNormal">
CRS610MI.GetOrderInfoResponse responseItem = crs610MIClient.GetOrderInfo(crs610MIRequest);</div>
<div class="MsoNormal">
// turn this into an array</div>
<div class="MsoNormal">
CRS610MI.GetOrderInfoResponseItem[] ri = responseItem.GetOrderInfoResponse1;</div>
<div class="MsoNormal">
// loop through the array</div>
<div class="MsoNormal">
for (int i = 0; i < ri.Length; i++)</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
// output the data</div>
<div class="MsoNormal">
// set the values</div>
<div class="MsoNormal">
_facility = ri[i].Facility;</div>
<div class="MsoNormal">
_warehouse = ri[i].Warehouse;</div>
<div class="MsoNormal">
_payer = ri[i].Payer;</div>
<div class="MsoNormal">
_division = ri[i].Division;</div>
<div class="MsoNormal">
_ordertype = ri[i].CustomerOrderType;</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
catch (System.ServiceModel.FaultException ex)</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
Console.Write(ex.Message);</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
// Properties here</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
#region Properties</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String SpecialInstructions</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _specialnstructions; }</div>
<div class="MsoNormal">
set {_specialnstructions = value;}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
public String Company</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _company; }</div>
<div class="MsoNormal">
set { _company = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String EmailAddress</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _emailaddress; }</div>
<div class="MsoNormal">
set { _emailaddress = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
public String CustomerName</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _customername; }</div>
<div class="MsoNormal">
set { _customername = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String CustomerNumber</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _customernumber; }</div>
<div class="MsoNormal">
set { _customernumber = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String CustomerOrderNumber</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _customersordernumber; }</div>
<div class="MsoNormal">
set { _customersordernumber = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String CustomerPassword</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _customerpassword; }</div>
<div class="MsoNormal">
set { _customerpassword = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String Division</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _division; }</div>
<div class="MsoNormal">
set { _division = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String Facility</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _facility; }</div>
<div class="MsoNormal">
set { _facility = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String OrderType</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _ordertype; }</div>
<div class="MsoNormal">
set { _ordertype = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String Password</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _password; }</div>
<div class="MsoNormal">
set { _password = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String Payer</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _payer; }</div>
<div class="MsoNormal">
set { _payer = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public DateTime RequestedDeliveryDate</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _requesteddeliverydate; }</div>
<div class="MsoNormal">
set { _requesteddeliverydate = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String TransactionReason</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _transactionreason; }</div>
<div class="MsoNormal">
set { _transactionreason = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String UserName</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _username; }</div>
<div class="MsoNormal">
set { _username = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
public String Warehouse</div>
<div class="MsoNormal">
{</div>
<div class="MsoNormal">
get { return _warehouse; }</div>
<div class="MsoNormal">
set { _warehouse = value; }</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
#endregion Properties</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
}</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
A note or two about the code.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
The basic structure for each call is the following:</div>
<div class="MsoNormal">
</div>
<ul>
<li>Create a client</li>
<li>Create a mwsheader object (this is the SOAP Header)</li>
<li>Create a base item for the method to pass parameter</li>
<li>Create a collection of correct return types</li>
<li>Add the base item as array 0 to pass</li>
<li>Add a request of the correct type</li>
<li>Call the method and return a collection of responseitems of the correct type</li>
<li>Check for any errors and if none use the returned collection of types in any manner that you like – for 'Get' methods its likely that there is only one object returned, for List methods there is likely to be 0 to many.</li>
</ul>
<br />
<div class="MsoNormal">
Importantly – You’ll also find problems with the service if using a List type operation where the amount of data returned by the service exceeds the file size (not sure where this is set but it seems to be around 64K) – to get around this problems use the following syntax when creating the client.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Note that I've also added complexity by having this endpoint embedded in the web.config file – its' my style of programming.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
String endPoint = System.Configuration.ConfigurationManager.AppSettings["INTERNETORDERSENDPOINT"];</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
WebOrders.InternetOrdersClient orderClient = new InternetOrdersClient(new asicHttpBinding(BasicHttpSecurityMode.None) { MaxReceivedMessageSize = 2147483647, MaxBufferSize = 2147483647 }, new EndpointAddress(endPoint));</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
<br /></div>
<br />
<div class="MsoNormal">
In the above example we've set the return size to a huge number – this get around the limitation but still may not be enough – in which case you’d probably want to look at the fields being output from the Web service and whether you need them all.</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Enjoy :-)</div>
<div>
<br /></div>
<br />
Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com2tag:blogger.com,1999:blog-913534236606046272.post-12115665899253386772012-11-16T15:21:00.001+13:002012-11-16T15:22:38.320+13:00Open source alternative to MvxSock for API interactions with M3I've recently come across an open source alternative to Infor's MvxSock library called MvxLib (<a href="http://mvxlib.sourceforge.net/">http://mvxlib.sourceforge.net/</a>). I haven't had the time yet to look into this in detail but there are a few potential benefits I see from this:<br />
<br />
<ul>
<li>Firstly it's a native .Net library, so no more wrapping the old style MvxSock dll whenever we need to use it in a .Net application;</li>
<li>Secondly it's open source, so with some work this could be used as the basis for building (for example) applications in Windows Mobile, Android or IOS;</li>
<li>Thirdly it's open source. I know I already mentioned that one but it's worth reiterating. There is an ecosystem of 3rd party consultants and software solutions that interact with M3. Wouldn't it be nice to be able to do so without being beholden to Infor for access to the underlying library that allows this?</li>
</ul>
<div>
For my next project I'm certainly going to look at this as an option. And and when I do (or someone else does and lets me know about it) I'll post my conclusions on its suitability as a MvxSock replacement.</div>
<div>
<br /></div>
Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com2tag:blogger.com,1999:blog-913534236606046272.post-59115508782314389282012-10-12T07:01:00.001+13:002012-10-12T07:01:19.215+13:00Another JScript and Mashups blogI've just spotted another JScripts and Mashups blog over at <a href="http://www.joshgeving.com/rss">http://www.joshgeving.com</a><br />
<br />
It appears to be really focussed on S3, but would be worth checking out.Al Johnsonhttp://www.blogger.com/profile/12728083455378232837noreply@blogger.com0tag:blogger.com,1999:blog-913534236606046272.post-78873825472734478062012-01-13T20:56:00.004+13:002012-06-11T07:29:49.108+12:00New Lawson S3 Technology BlogThere's a new Lawson S3 Technology Blog at <a href="http://lawsons3tech.wordpress.com/">lawsons3tech.wordpress.com</a>. As there is lots of technology (like LSO, PFI and LBI) shared between S3 and M3 this may be an interesting blog to follow for M3 users as well.<br />
<br />
<Edit><br />
Note that the blog has now moved to Infor's site <a href="http://blogs.infor.com/s3tech/">http://blogs.infor.com/s3tech/</a><br />
</Edit>Alhttp://www.blogger.com/profile/06469996988980345250noreply@blogger.com0tag:blogger.com,1999:blog-913534236606046272.post-43475207764281634142012-01-10T22:01:00.000+13:002012-01-10T22:04:45.951+13:00JScripts and toolbox programs<br />
Thibaud has <a href="http://thibaudatwork.wordpress.com/2011/12/26/self-configuration-for-smart-office-scripts/">posted</a> a entry on how JScripts that can be programmed to be generic across multiple screens. This reminded me of a solution I've used for dealing with M3 toolbox screens where the columns can change based on the panel version selected by the user.<br />
<br />
Columns in LSO can be queried by looking at the controller.RenderEngine.ListControl.Columns list. The following JScript parses through the list of columns (in my case in mms080) to find the columns that store the ORCA (order category) and RIDN (order number) columns.<br />
<br />
var category_column = 100;<br />
var orderno_column = 100;<br />
var listControl = controller.RenderEngine.ListControl;<br />
var columns = listControl.Columns;<br />
for(var i=0; i < columns.Count; i++) {<br /> if(columns[i] == "ORCA") { category_column = i;}<br /><columns.count; i++)="" {<br=""><columns.count; i++)="" {<br=""> if(columns[i] == "RIDN") { orderno_column = i;}<br /> }</columns.count;><br />
<br />
From there I can check to see if I have the columns I need to run my JScript logic, and if I do not then advise the user accordingly. <br />
<br />
if (qty_column != 100 && category_column != 100') {<br />
//apply logic<br />
} else {<br />
//advise the user that we don't have the required information to run the script<br />
}<br />
<br />
This approach allows robust JScripts that work with user-configurable toolbox screens.</columns.count;>Alhttp://www.blogger.com/profile/06469996988980345250noreply@blogger.com0