The big deal
So one of well known swiss speciality is milk chocolates. Taking into consideration that it will be soon Christmas, i have a very few days to organize my chocolate boxes distribution roundtrip. Chocolate does not wait. I also know my friends are eager to taste them… My deliveries are packed but in which order should i load them in my car ? So many destination points, are you kidding me ?!
Hopefully, Optimap will help me find the best trip to drop my boxes on time. A few settings in TOI module plus the use of API MYS450MI and i am ready to go !
Not reinventing the wheel
Starting from Thibaud’s last post, i would like to present you an example of integration with M3.
As soon as you have exported your deliveries to Optimap, it calculates the fastest round trip :
- each delivery point is tied to a label (DLIX value) and you are able to manually modify the order on the Optimap site by playing with the “edit route” functionality; simply drag and drop the label up or down through the list
- the START label represents the starting/ending point of the roundtrip and corresponds to the departure warehouse
- once you are done, go to sub-menu “export / raw path with labels” and drag and drop the result in the textbox at the top of the window
API MYS450MI/AddDelivery is used to update loading and unloading sequences of each DLIX. This way, you are able to print the loading list from DRS100 for example with the proper order you have chosen.
Functional tips :
MYS450MI uses files from TOI : MYOPIH, MYOPID, MYOPIU
To make it work, we need a partner described in MMS865. This partner should be the default value in MWS410/P. The loop is the following one :
- starting point : deliveries are not downloaded (message OQMSGN = blank, download status OQIRST = 10 “ready to be downloaded”)
- download deliveries to MYS450 (use MYS410 or MWS410+related option 54) (OQMSGN gets a new value, OQIRST = 20)
- Update status of the message in MYS450 (from 10 to 20) to tell M3 the external system has downloaded those deliveries (mandatory to avoid error message later during API call)
- Call MYS450MI/AddDelivery to upload new values for OQSULS and OQMULS fields on each delivery + execute the message (MSGN in MYS450 should get status 90 = finished, OQIRST is reset to 10 and OQSULS/OQMULS are updated)
Business rules :
- all deliveries sent to Optimap have the same departure warehouse
- the partner E0PA is set in MWS410/P. If you change this value in MWS410/P you must close the panel and re-open it (because CSYSTR is updated on closing the panel)
- in our example, all deliveries have the same unloading place. As a result, we will force OQMULS = 1. MULS normally depends from DRS021 settings.
- the first DLIX to ship is the last one loaded on the truck; OQSULS has the same sorting as Optimap roundtrip
Technical choice :
As you can manually drag to re-order stop points on the website, the drop event in WPF to catch the desired route has been chosen. The update in M3 is done after a confirm dialog box and uses a background worker with a progress bar. The navigator is closed to minimize the memory consumption.
As there is no API to retrieve the partner E0PA, an SQL statement is done to retrieve the proper value in CSYSTR.
If one of the delivery of the selected list has no message OQMSGN or a bad download status (OQIRST < 20), the progress bar displays an error message and is stucked at 99%. You can enhance business rules checks at will.
Other possibility : you can also explore the XMLHttpRequest. Some examples are available into the LSO developers guide (example with PFI integration). A good idea for v5 !
Source code
Available on Thibaud’s GitHub.
Demo
Example here.
Conclusion
Sigh ! Here was an example of M3 integration with Optimap round trip solver, TOI module and WPF event drag and drop.
I can’t imagine the complexity Santa Claus will face in a few days…
That’s it !
Maxime.
Credits: original idea by Jesper Lyngsoe, Jan 29, 2013: “update the field OQMULS and OQSULS [with MYS450MI AddDelivery], then the shipping list will be planned also”
LikeLike