Last week I had to copy several M3 Supplier CRS620 records, from one company CONO into another company, and I found this elegant solution using JavaScript 6.
Classic approach
Traditionally, I would have used M3 API or SQL to export the records to a CSV file in my computer, change the company number, and use M3 Data Import (MDI) to import the CSV into the other company. But the API LstSuppliers does not output all the fields, so I would have had to use GetBasicData, record by record. It is trivial, but it is tedious because of the many steps and tools involved, and it is antiquated.
A new approach
Instead, I have been wanting to learn JavaScript 6 (ECMAScript 6th Edition), so I challenged myself to learn this new solution using the M3 API REST web service and ES6.
Using ES6 is elegant because the result is very concise (only two lines of relevant code), and it is very expressive using: arrow functions (the new anonymous functions), map/reduce and array comprehension, Promises (the new deferred; chaining, fluid programming), and the fetch API (the new XMLHttpRequest).
Here is the source code in ES6:
var baseUrl = "https://hostname:21108/m3api-rest/execute/CRS620MI/"; ["1069112004", "1069112005", "1069112006", "1069112007", "1069112008", "1069112009", "1069112010"] .forEach(SUNO => GetBasicData(930, SUNO) .then(data => AddSupplier(702, "USA", data))); function GetBasicData(CONO, SUNO) { var url = baseUrl + "GetBasicData;cono=" + encodeURIComponent(CONO) + "?SUNO=" + encodeURIComponent(SUNO); return fetch(url, { credentials: 'same-origin', headers: { 'Accept': 'application/json', }}) .then(response => response.json()); } function AddSupplier(CONO, DIVI, data) { var url = baseUrl + "AddSupplier;cono=" + encodeURIComponent(CONO) + ";divi=" + encodeURIComponent(DIVI) + "?"; data.MIRecord[0].NameValue.map(o => url += "&" + o.Name + "=" + encodeURIComponent(o.Value)); return fetch(url, { credentials: 'same-origin', headers: { 'Accept': 'application/json', }}); } /* optional: console.log([data.MIRecord[0].NameValue.find(o => o.Name === "CONO").Value, data.MIRecord[0].NameValue.find(o => o.Name === "SUNO").Value]); console.log([response.url.split("?")[1].split("&").find(pair => pair.split("=")[0] === "SUNO").split("=")[1], data.Message]); */
We have to run this in the JavaScript console of a browser that supports ES6 and the fetch API, such as Google Chrome, and we have to login to the Infor ION Grid Management Pages to have an authenticated session.
And we can inspect the request/responses in the network tab:
That’s it!
Thanks for reading. Leave us a comment in the section below. And if you liked this, please subscribe, like, share, and come write the next blog post with us.
UPDATE: From H5 Client:
Infor.M3.MIUtil.getApiUrl(baseUrl, company, division) {
return baseUrl + “;cono=” + company + “;divi=” + division;
}
(not very useful yet, but MIUtil to be explored)
LikeLike
hello thibaudatwork,
Is there any way to connect to the rest M3 API endpoint and get response in the local machine.
LikeLike
What do you mean? Yes, that’s what I do in my example, see the screenshots, that’s my local machine.
If you mean to execute the script not in a browser, for example from the command line, you can do that too, but you have to take care of HTTP Basic authentication and maintain the session yourself.
LikeLike
have similar example for connecting with Excel VBA?
LikeLike
Hi,
I would like to know what is a transaction method name to import customer and sales order.
LikeLike