Sales Order with thousands of Releases

OK… this is a distraction… but…
My first “real” mini-computer had a 90 MB CDC Phoenix disk drive… had a blazing speed backup system that you could backup one 15 MB Platter at a time (fixed platter to removable platter), in 20 minutes IF you shut down all other applications from using the drive while the backup was in process.
Very few (if any) of the Phoenix drives exist today because of their ability to have a “Head Crash” by just looking at them funny. There were three fixed platters, and one removable platter… each time you removed the platter, you had to let it “purge” all the dust off the platter. If you didn’t the dust could cause the head crash. Since all the platters shared the same airspace, the crash on the TOP Removable platter would cause aluminum dust to spread and crash the balance of the surfaces, loosing all 90 mb of data.

… ahhh, the good old days…

No, I can’t say I am sure…I would like to think that it is serialized into some binary data which is then sent to the client…which would then deserialize it and place the data into the proper fields.

If I am wrong, then I have learned something new today :slight_smile:

I tried that in my demo environment a few minutes ago and it did not seem to have any effect on things.

Especially in http, I assuming that it’s using the built-in http compression. For net.tcp, there is also compression IIRC.

1 Like

Just tested in a Demo environment, 2023.1.12.

Created an order. Loaded 100 lines, and 100 releases per line. A total of 10 thousand releases for the order.

In the Kinetic web Order Entry, after selecting the order, Epicor calls the v1 API SalesOrderSvc/GetByID method.

The whole SalesOrderTableset is returned and stored in dataviews.
By whole, I mean the OrderHed and all its OrderDtl, OrderRel, OrderMsc, attachments, etc.
As you can see in the screenshot below, that’s a huuge JSON response to transfer from the server and to handle by the browser.

Actually, the browser Developer Tools can’t even display the response as it is too big.
In Postman, it can display the response, but it is having a hard time doing so (+ RAM increases by a lot).

2 Likes

Thanks for testing Victor, and that’s what we are up against. We have this need, we need to be able to do this, but the amount of info that’s being passed back and forth slows it down so much it’s nearly unusable. so they opt to using excel sheets to ship off of and invoice off of :headstone:

Huge loss for us. We literally need to load ship tos and quantity on the release, that’s it. don’t need attachments, don’t need order to touch order misc cause we aren’t adding misc charges on lines for this customer (I know order misc handles header charges too), etc.

The other caveat for us is that our customer tends to change their order quite a bit… and we need to update releases quite often. Doing that in this type of order with this much payload is so tough.

When @Bart_Elia presented the new REST interface in his famous REST Novel Overview, he was concerned how it might be received:

Level unlocked. REST has been a HUGE addition to the Kinetic platform! It was a great evolution from the .NET Object model. The landing spot at the time was well balanced. There are now new challenges like APIs for large objects.

Microsoft has a really nice guide about API Design and in it they have this quote:

In 2008, Leonard Richardson proposed the following maturity model for web APIs:

  • Level 0: Define one URI, and all operations are POST requests to this URI.
  • Level 1: Create separate URIs for individual resources.
  • Level 2: Use HTTP methods to define operations on resources.
  • Level 3: Use hypermedia (HATEOAS, described below).

Kinetic is at level 2, as are most commercial software companies who have REST-enabled their products. It is a natural evolution and I’m not throwing shade here.

This thread is showing us why the RESTafarians would now be saying, “We told you so.” But most REST purist are such jerks, nobody would listen to them anyway.

Not a jerk (most Canadians without a puck are generally pretty nice), is a blogger/YouTuber named Derek Comartin. A few years ago, he did a series about HTTP APIs that does a really nice job explaining how to get to the next maturity level, which is HATEOAS - Hypermedia as the Engine of Application State.

This is a BIG step however. But one could imagine that the action bar (the ‘+’, and other icons) is driven by the server and not directly in a layer with rules. If an action link appears in the response, the icon appears, if not it doesn’t. (Mind you, we’re not talking security, just client behavior. All security would still be enforced at the server.) The landing pages are very well suited for HATEAOS since the action links are basically there.

For a large order, the response would have most of the header and links for options: open lines, all releases for a line, etc. Now the download size is potentially much smaller. Kinetic could certainly come up with a different UI that would allow much less data to be returned for specialized functions that manage only releases for example, but some thought is required for concurrency.

Again, this is a natural progression from a system that had all the bandwidth of a LAN and a lot of memory at the workstation to a higher latency network with the server further away and the reduced memory footprint of a browser. Epicor will evolve here too once the UI continues to settle.

1 Like

Probably a lot of thought, but overall it sounds like the idea of HATEOAS would be beneficial.

1 Like

Thanks for once again expanding my knowledge on all things web Mark!

Years and years ago, I was working with an ERP system called Baan. They allowed developers to set up concurrency zones and if users were updating fields in different zones, they avoided the equivalent of “Record Modified by Another User” conditions. For example, the date of last print was in its own zone and the user wouldn’t get a sharing violation because they printed a document while updating another part of the sales order.

Miller Knoll used Baan, might still use it

It is interesting that you bring up Miller Knoll…The Sales Order that I am having these issues with is for Miller Knoll.

They still do, although it is now called Infor 10 ERP.

1 Like

Infor - the ERP collector.

Jason, so what are you doing now to handle this requirement?

I have a dashboard that I built for adjusting sales orders for a customer that had 100+ line orders, but not 9K of releases. This is the 10.2.400 version of it. It still runs the backend processes, but maybe not updating the sales entry screen will shave off enough time.

It is faster if you uncheck ready to process before you start.

orderprocessing.dbd (622.3 KB)

1 Like

@utaylor The addresses should be not to hard with a ubaq with an advanced update that does not trigger all of the SO calculations and put them in the OTS fields… The quantities would be harder, but after updating the release quantities calling PreOrder or setting ready to calc true should update the whole order once.

There is a method SetCalcQtysPref which might stop all of the recalcs if it was false, but there is no comment with it about what it does.

I have a ubaq that we use to create jobs that they paste in from excel and I make jobs from it. You could do the same with the addresses and quantities. Still excel to begin with, but you would get to use shipping and invoicing in Epicor.

Yes, this type of requirement screams custom interface.

It would be nice to have something built in that could handle this out of the box with grace, but that’s a tough ask, hopefully they come up with something.

In the meantime… :slight_smile:

2 Likes

@utaylor - Currently the CSR that manages the MK account struggles with the trials and tribulations of processing this SO. We are going to be splitting it off into another SO that can begin to grow/accumulate over time like the existing one did, and in 2 or 3 years time we will go ahead and repeat the process if we are still running into this issue.

1 Like