Epicor BPM & Functions Design Feedback

Why it is not accessible via help page?

It was inaccessible since it is for development time only, and help page is a kind of public surface.
I don’t know if you exposed it later…

One suggestion I have would be to combine the Method and Data Directives menu items into one menu item. I don’t nessicarily see why theres a need for two menu items vs 1 item with a selector for method or data directive.

Agreed. I think that this is the key here. We really need options for whether to encrypt/block read access or enable disabling/unpublishing (maybe just for SDK/partner level?).

While from an Epicor Partner perspective, there are aspects/code we don’t want easily accessible for reading or editing, there is also plenty of times where we do. I.e. for providing OOTB examples or to better enable system administrators to review/understand/reuse certain components.

Given the great flexibility and functionality of the Epicor Functions framework, in my mind it just makes perfect sense for it to be leveraged for providing far better and simpler partner solution/IP management versus either publishing and installing unprotected/unmanaged code (i.e. BPMs) or having to develop, distribute, and support custom DLLs/BOs/services. The potential benefits/opportunities here are huge if/when this is available from a general ecosystem/solution value perspective based on the greater re-use capabilities - providing a great to benefit for all. Particularly with how easy it is to invoke Epicor Functions from BPMs - enabling the easy development of Functions to be shipped with standard BPMs to call them while still enabling system administrators to easily disable and copy the BPM to then change pre/post conditions if/when needed.

1 Like

They are completely different. It does not matter that they have similar UI. EFx has similar UI, but EFx is neither MD nor DD.

Moreover, I’d prefer to completely remove DD.

As I wrote above, it is possible already. Installed libraries cannot be demoted. Installed “as hidden” cannot be even viewed in EFx UI for non SM/GSM.

SW already supports all 3 modes.

Re being able to encrypt a function: In 11.2 or 11.1? While I am aware of how to encrypt the solution package, I haven’t yet seen how we can encrypt an actual Epicor Function code in 11.1.

For example, as per below, when I exported a Function Library via Solution Workbench and imported it into another database, the custom code/function was still fully readable via Epicor Function Maintenance and at the database level. I get that with a widget function it’s no longer easily readable at the UI level but then it’s still easily readable at the database level.

My apologies if I’ve missed another feature to this. I must admit, I haven’t reviewed the technical documentation on Solution Workbench recently.

Re: Disabling/unpublishing, yeah, that does make sense now at a package level. Thanks! Ideally we’d be able to define at a function library level but having multiple solution workbench packages for different library types shouldn’t matter too much.

1 Like

I never wrote about encryption :wink:

I wrote about the ability to make a library invisible in Functions UI and about the ability to disallow demoting.

SW allows to select installation mode when you add a library to the solution.\

Also, you can see the library in UI only because you are SM. Try to login as normal user. Even as EFx power developer.

Anyway, if you want to hide code in the preview, you need to request a feature. I don’t expect to support data encryption on pre-library base. At least mead term.

One thing that could be improved is the assembly search, either I’m using it incorrectly but I have never been able to get the filter to work and it loads incredibly slowly, the scrollbar behaviour reminds me of eFrontOffice behaviour, when the slider gets smaller as the more records loaded.

I was just testing this to validate my claim, and of course after the second time it loaded instantly, but when I put in a filter of ice my whole instance of Epicor just disappeared, as in, closed down instantly with no errors or warnings, but this in the application event log.

Application: Epicor.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ArgumentException
   at System.Text.RegularExpressions.RegexParser.ScanRegex()
   at System.Text.RegularExpressions.RegexParser.Parse(System.String, System.Text.RegularExpressions.RegexOptions)
   at System.Text.RegularExpressions.Regex..ctor(System.String, System.Text.RegularExpressions.RegexOptions, System.TimeSpan, Boolean)
   at System.Text.RegularExpressions.Regex.IsMatch(System.String, System.String, System.Text.RegularExpressions.RegexOptions)
   at Ice.Bpm.WinForms.Plugins.InvokeExtMethod.AddReferencePanel+<>c__DisplayClass13_0.<ApplyCurentFilter>b__1(Ice.Contracts.BO.BpMethod.ReferenceInfo)
   at System.Linq.Enumerable+WhereEnumerableIterator`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MoveNext()
   at System.Linq.Buffer`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]..ctor(System.Collections.Generic.IEnumerable`1<System.__Canon>)
   at System.Linq.OrderedEnumerable`1+<GetEnumerator>d__1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MoveNext()
   at System.Linq.Buffer`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]..ctor(System.Collections.Generic.IEnumerable`1<System.__Canon>)
   at System.Linq.Enumerable.ToArray[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](System.Collections.Generic.IEnumerable`1<System.__Canon>)
   at Ice.Bpm.WinForms.Plugins.InvokeExtMethod.AddReferencePanel.ApplyCurentFilter()
   at Ice.Bpm.WinForms.Plugins.InvokeExtMethod.AddReferencePanel.<.ctor>b__7_0(System.Object)
   at System.Threading.TimerQueueTimer.CallCallbackInContext(System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.TimerQueueTimer.CallCallback()
   at System.Threading.TimerQueueTimer.Fire()
   at System.Threading.TimerQueue.FireNextTimers()
   at System.Threading.TimerQueue.AppDomainTimerCallback(Int32

I don’t see a custom code widget in the EFx designer. I also see no way to iterate over records in a tableset. This is the very first thing I want to do in my very first EFx.

Do you have this check box checked?

Also there are security groups that need to be added to get all of the functionality of functions available to you. Make sure you add those as well. (even if you are a security manager, you need those)

image

2 Likes

I was already a member of those groups. I checked that box, saved, and closed and reopened Functions Maintenance. There is still no custom code widget in the designer.

Edit: Oh, I see. I have to delete my function and recreate it as a “function with code.”

I wonder, if I use the Set Argument/Variable widget to set a variable to something there’s 0…n of like SalesOrderTableset.OrderRel.Plant, does everything downstream run once for every value? Is that how to iterate?

1 Like

I was just going to ask if you did that.

Funny that you just mentioned this yesterday. Loading the assembly list used to give you plenty of time to go make a cup of coffee or something. Today was the first time I ever noticed it actually loading fast. Maybe someone’s listening to you! Or maybe the services I needed were just closer to the top of the list. :rofl:

1 Like

I believe it caches the list after the first time so you don’t have to sit through it again. It’s always slow for me the first time, but after that it’s quick.

I agree it does cache, initial load is still slow. If anyone can enlighten me on the filtering I’d be happy to listen.

The filter always worked for me. The results are just blank until it loads something that matches the filter. For example, type “NextValue” and wait a few minutes for the Ice.Lib.NextValue assembly to show up.

There’s some interesting stuff in there. Try typing “JSON”. Epicor has the expected Newtonsoft lib, which I suppose means you can use it in BPMs, EFs, etc. I was surprised to also see JsonDiffPatch, which is a cool library that I’ve used to write unit tests for integrations. Take some poorly documented JSON from some third party API, unmarshal it to your POCO, marshal it back to JSON, and use JsonDiffPatch to ensure the two JSONs are semantically identical. This helps validate that your POCO represents the JSON accurately.

2 Likes