Modern software design sucks eggs. When you use an application like YouTube, you expect the primary purpose is to find certain videos you want to watch. Instead, you realize its purpose is to keep your eyeballs on the screen. When you use Microsoft Teams, you realize the purpose of the application is to tell you about new features or features they moved on you. I am not old, but old enough to remember a time when most software was designed for a user-centered purpose and did its job well. You could get in, get it, and get out.
Folks, we can do better.
"I am not old, but old enough to remember a time when most software was designed for a user-centered purpose..."
At Deft Flux, we value Relationships, Humor, and Beauty.
When we say we value relationships, it means we sacrifice technology on the altar of relationships (not the other way round); it means we value people over mammon; it means we believe efficiency often comes at a price that we are unwilling to pay.
We bend technology to our will.
Note that this is categorically different from saying "we value good system architecture" or "we strive for well-written code." Those goals are nebulous and change over time. We might compromise on them to meet some higher goal. Staying true to the things we love, however, affects how we do business, and we pursue them without compromise, even when costs us.
Just now, I started to set up my own Microsoft Bookings page, and noticed that the informational bubble says, "Schedule with ease and create your personal booking page to share your availability without any back and forth with others." This phrasing stopped me short. I know they are getting at the frustration that can happen when you go back and forth forever, trying to get a meeting time, but that sentence also says, "...without any unnecessary [interaction] with [people]." The heading should say "Impersonal booking page."
Most of us have been receiving a few "schedule time with me" links, and while helpful, even necessary, they are impersonal. Furthermore, when you simply start by sending two or three options for meeting times, you eliminate 98% of the back and forth, without giving up the personal touch.
We bend technology to our will.
Recently, we have had to find the answer to an important question: Why does pasting into a grid cell overwrite the whole cell and refresh the page?
The answer it seems, is complicated. JDE 9.2 has two paste functions you should be aware of - grid paste, and value (normal) paste.
Recently, we have made a determination. If you are standing up an enterprise database to support mission critical applications, Oracle is the only database worth considering.
Microsoft SQL Server is fine as far as you can throw it. If you plan to go beyond a mid-tier application, however, you will eventually wish you had used Oracle.
At IBM databases, we only scoff....unreliable, slow, buggy, arcane. What else can we say?
Save yourself a lot of headaches, and go with Oracle.
Oh, you want evidence to back up our claims? Someday soon...we promise. Right now, we have to go write more software because the IBM database is taking up all of our time.
If you have been using Epicor for some time at your place of business, you have encountered the need to send the output of a report to a directory on the network. If you only need to do this once, you can simply print to your PDF writer and send it to the directory. If you need to do this multiple times, on schedule, then you will want to use APM. Setting up APM is simple, but not trivial, (more…)
Several of our clients have experienced the infamous 7175 error and the subsequent "Tried to call a method in an invalid procedure. (7224)" error. This error normally indicates a broken network connection between the client machine and the server, so after a user sees this error, Epicor will stop functioning withal. For users with elusive but persistent network hiccups, this is especially aggravating. (more…)
At Deft Flux, we are often asked how users might customize the Epicor MES menu. For example, a company may want to allow all employees who use MES to access the PO Tracker. The empty buttons in the standard MES menu are not created to readily call new programs, so the path to customize the menu buttons is not obvious. We will step through one method of customization:
- Copy the Epicor <environment> MES menu item and rename it to Epicor <environment> MESC.
- Edit the properties of the new menu item and change the -MES at the end of the command line to -MESC.
public class Script
{
// ** Wizard Insert Location - Do Not Remove 'Begin/End Wizard Added Module Level Variables' Comments! **
// Begin Wizard Added Module Level Variables **
// End Wizard Added Module Level Variables **
// Add Custom Module Level Variables Here **
public void InitializeCustomCode()
{
// ** Wizard Insert Location - Do not delete 'Begin/End Wizard Added Variable Initialization' lines **
// Begin Wizard Added Variable Initialization
this.btnPOTracker.Click += new System.EventHandler(this.btnPOTracker_Click);
this.MESControl_Column.ColumnChanging += new DataColumnChangeEventHandler(this.MESControl_BeforeFieldChange);
// End Wizard Added Variable Initialization
// Begin Wizard Added Custom Method Calls
// End Wizard Added Custom Method Calls
}
public void DestroyCustomCode()
{
// ** Wizard Insert Location - Do not delete 'Begin/End Wizard Added Object Disposal' lines **
// Begin Wizard Added Object Disposal
this.btnPOTracker.Click -= new System.EventHandler(this.btnPOTracker_Click);
this.MESControl_Column.ColumnChanging -= new DataColumnChangeEventHandler(this.MESControl_BeforeFieldChange);
// End Wizard Added Object Disposal
// Begin Custom Code Disposal
// End Custom Code Disposal
}
private void btnPOTracker_Click(object sender, System.EventArgs args)
{
// ** Place Event Handling Code Here **
ProcessCaller.LaunchForm(oTrans, "PMGO2002");
}
private void MESControl_BeforeFieldChange(object sender, DataColumnChangeEventArgs args)
{
// ** Argument Properties and Uses **
// args.Row["FieldName"]
// args.Column, args.ProposedValue, args.Row
// Add Event Handler Code
switch (args.Column.ColumnName)
{
case "LoggedIn":
btnPOTracker.Enabled = !(bool)args.Row["LoggedIn"];
break;
}
}
private void MESMenu_Load(object sender, EventArgs args)
{
// Add Event Handler Code
btnPOTracker.Enabled = false;
}
}
Now, when you run the custom version of the MES menu, you should have the custom PO tracker button, and it should only be enabled when an employee is logged in to MES. The problem we will have is that running MES in standard mode will still run the standard version. We need to tell Epicor to run our custom version of MES:
- Set the program to Epicor.Mfg.Menu.Mes.dll and set the Customization to the one we have just created (POTracker in our case).
- Set the Parent Menu Id to "PROCESS". This will remove the new menu item from Main Menu and place it under Processes. This menu is for processes that need to be called by other processes, but should not be on the main menu.
How have we at Deft Flux made life easier by implementing elegant solutions to real business requirements? Herewith, we present two examples.
Company A needs to produce an XML file for the Job Order Interface of its Trumpf Inventory Manager Machine. Company A also needs to produce a tab-delimited advanced ship notice (ASN) for upload to a customer's system. Both of these cases are interesting because they cannot be solved with a Business Activity Query (BAQ) or simple Business Process Management (BPM) Method Directive. Although a BAQ can be exported, the XML is not in the right format for the Trumpf machine. A simple BPM cannot handle file output, let alone tab delimited. How do we proceed? (more…)