Learning hard stuff

invest 20 minutes in this TEDx video and then start learning the hard stuff that lets you solve all the problems


Related video: Axis of Awesome - 4 Four Chord Song (with song titles) - YouTube

Some language

Yep that’s a great book. Someone mentioned The First 20 hrs in another post if I remember. I’t a good read…or listen.

Thought I’d update this… we’re in the middle of an upgrade and ran into some real knotty issues. Basically we had a lot of data directives that updated the tables that fired them, in some cases when triggered by method directives that acted on the same table.

Apparently in the upgrade from 10.2.100 to 10.3.700, Epicor got a lot stricter and all of these similar stopped working. For example, SalesOrder.Update called some code that made a change in OrderRel which in turn triggered some code that made a change in OrderDtl… etc. We had Null Reference exceptions all over the place and then when we solved them, database locking issues where (for example) Db.Validate() had to become explicitly Db.Validate(orl) because we had vars of multiple Db tables in the code, even though only (again, for example) var orl = (from r in Db.OrderRel blah blah blah was getting updated. Finally I was down to the last error, which was an optimistic concurrency exception, which meant nothing to me but sounded like “hey, that database is locked but how bad could it be?”. I tried everything, and so did the amazing Emmanuel Corpus of Epicor, but realized I needed to completely rewrite the 3000-line Order Entry UI customization I had inherited, with a completely different approach. I’ve never done code in UI before, the IDE sucks, the documentation is worse, and the logical flow is very different (in my mind) to BPM C#.

So here’s the thing - it took me pretty much exactly 20 hours. I know, I know, it’s wasted because Kinetic etc etc but still. I feel like I’ve fiddled my way to BPM journeyman for about 300 hours, or maybe 500, I don’t know, but in 20 hours (2 x 10) plus potty stops I read most of everything I could find, started building, figured it out and built the UI.

All that to encourage the latest new guy or gal - all this stuff is learnable, and the key seems to be to focus intensely for about 20 hours to get the problem solved.

I’ll be rebuilding this again, of course - I’ve blocked out 20 hours in June to learn app studio and another 20 for functions. Sure beats having a life, right!?


Steve, I feel you there. I remember upgrading from 9 to 10 and I knew absolutely nothing about epicor BPMs, business objects and the like.

I started running into issues like you are talking about where a data directive fired another that fired another that fired another and next thing you know there are exceptions and issues. It took so many hours and failures to feel like I got a basic understanding of it. It was all ABL, which I didn’t quite understand, and then throw in C# which I had just learned through some books… That mix is/was a disaster from a syntax perspective to an epicor business logic perspective. I am certain that @slitzau will be able to optimize it and already has I’m sure.

Hats off to you for taking the initiative to get through it. Whatever you do, please pass that knowledge on to that gal or guy and anyone you can.


Great post Steve. It ties in nicely with a Tweet I saw recently (HT to @Bart_Elia for this one)

And while this pokes fun at CTOs, we are all prone to hang on to hard-learned things. But like Steve shows, building that muscle to learn actually carries one to the next learning.

You haven’t matured in IT until the industry obsoletes your best skill a few times. :rofl:


Not sure if I am confused about what you were working on, but BPM’s will be more important with Kinetic not less.

1 Like

Totally agree - No, this was about learning UI script editor.

1 Like

I love getting a ping alert when someone tags me still. It’s been an interesting year moving to the dark side and leading internal IT teams rather than shrinkwrap like Epicor and the like for the first 35 years of my career. :wink:

The one regret is not getting to deal with all you crazies. This is a fantastic community and Epicor is blessed to have a group of advocates as your all. I hope all have been safe and somewhat sane this past year!


Did your BPMs define the LockHint for updating? It also should be confined within a new transaction scope.

Luckily my faith was placed in .NET and so I invest in learning most applications implementing it (web, mobile, desktop, cloud) to stay relevant.

1 Like

Oh yeah, went through all of that. There’s also more than one method to create txScope. In the end, I found that with more than one Db-based var, validate has to be explicit. There may be use cases I haven’t seen where it still works, but our order entry system has over 30 BPMs and none of them did. Also when using ServiceContract in a BPM, I found that there are cases where they stopped working in 700 if they called methods that updated the same table as the data directive, despite using all the correct beforeimage stuff. In one case a consultant had me add the word “true” as in GetService(Db, true) to “make sure it doesn’t call itself” which seems a bit esoteric!

I couldn’t find any documentation on that one, and it didn’t work everywhere, so I ended up building a lot more logic into UIs. I also replaced as many Db.Validate() with method calls as I could.

Anyway as I said, I learned UI scripting to a PDG level in about 20 hours, and all’s well that ends well as Ma Ingalls said.

1 Like

Insightful, we are considering a move upwards soon and this is good to know.

Appreciate the post (and watched the video!)

1 Like

.Net Framework? .Net Standard? .Net Core? Mono? ASP.Net? ASP.NET Core? Angular? React? React Native? Vue? Svelte? Blazor Server-side? Blazor WASM? :wink:

That said…

1 Like

Yes. Are you counting Xamarin as Mono or…? :joy: