Thursday, July 12, 2012

Status Update

As you can probably tell, I haven't posted on Epicor for awhile as I have switched jobs, and no longer have access to an Epicor system.

I am currently working for Catapult ERP, acting as an application consultant for a product called Agreeement Express created by Recombo. Although promoted as Contract Management Software, its actually useful for all types of operations where documents need to be filled out and flow between people/departments.

If you have an insight or code you'd like to share regarding Epicor, but don't have a good home for it, please feel free to email me and I will post it here, crediting it to you.

Thanks for all the positive comments and feedback.

Saturday, January 14, 2012

BL Tester Utility

I can't believe I didn't know about this before now. On the Epicor Server, in the folder Epicor905/Utility are the setup files for an application called BL Tester (presumably short for Business Logic Tester). The first time you run BL Tester, you will have to specify the Epicor server your are connecting to. Once it is installed, click File, Open, and choose the dll for the business object you want to test. Ie. Epicor.MFG.BO.SalesOrder.dll You can then use the application to specify the parameters and call any business object method. For instance, you could call SalesOrder.GetRows, and specify different where conditions. After clicking "Invoke" button, BL Tester will display the result of the method, usually a dataset, in a tree view control.

Friday, December 23, 2011

Workflow Locked

Recently, I had Workflow Designer crash on me, and when I tried to re-open the workflow, I got this error message: Workflow Designer The process is locked can cannot be saved under the same name. Open the process? Because my session crashed, the lock was not released. I couldn't find a proper way to release the lock, but the following procedure worked for me to unlock the workflow. Use at your own risk! On the Service Connect server, I stopped and restarted this service: ScaLockSrv - Allows users to work simultaneously with shared data.

Thursday, October 27, 2011

What is the Epicor ICE SDK?

A couple people have asked me if I know what the Epicor ICE SDK (aka. Vantage SDK) is.

Here is all I know about the Software Developer's Kit:

  1. It allows you to customize the Epicor itself by adding new tables, business objects, and forms.

  2. It seems to be geared more for developing features which run inside of Epicor, as opposed to integrating Epicor with other systems.

  3. There is no trial version to try before you buy.

  4. The best place to find out more is to ask your sales rep. He or she should be able to email you some PDFs regarding the capabilities.

  5. It's not cheap.

If anyone has any experience with it, please comment below, or, if you have something more to say, I can post an entry for you.

Tuesday, September 27, 2011

Set ReportParam in Epicor Customization

In Epicor, I needed to customize the Sales Order Pick List report screen so it defaults to a wider From and To Ship By date range. In customization, this means updating the ReportParam value when the form loads:

private void SOPickListForm_Load(object sender, EventArgs args)
// wrong approach, change data source of control
// EpiTokenDate tdtFrom = (EpiTokenDate) csm.GetNativeControlReference("1f043839-c70e-41e0-8d1b-c33fd3d7e3c5");

// change from date
EpiDataView epiDataView = (EpiDataView) oTrans.EpiDataViews["ReportParam"];
epiDataView.dataView[epiDataView.Row]["FromDate"] = DateTime.Now.AddMonths(-6);

Normally, to access the text field for a control in a customization you use csm.GetNativeControlReference. But, in this case, I needed to change the ReportParam, which is accessed through oTrans.EpiDataViews["ReportParam"] dataset.

Friday, September 23, 2011

Get Results of Epicor BAQ as DataSet in C#

One of the easiest, and fastest ways to get data out of Epicor is to use C# and the Epicor client library assemblies. This article provides sample code to export the results of a business activity query created using the BAQ Designer into a C# .Net framework dataset.

Step 1 - Add References
In you project, at a minimum you will need to reference the following assemblies:


DynamicQuery is the business object to manage BAQs (it replaces QueryDesignDataSet in Vantage). BLConnectionPool & SessionMod are necessary to explicitly set the company for the session. This is important, because otherwise the company will be whatever company was last selected for the user account used to create the session, which can yield unpredictable results.

Step 2 - Add class to create business object
The following is my class to create Epicor business objects for me:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

using Epicor.Mfg.Core;
using Epicor.Mfg.Proxy;
using Epicor.Mfg.BO;
using Epicor.Mfg.Lib;

namespace ExecuteDynamicQuery
public class BOFactory
private BLConnectionPool m_cnVantage = null;
private static string m_strKeyVantageServer = "VantageServer";
private static string m_strKeyVantagePort = "VantagePort";
private string company;
private string companyName;
private string plantID;
private string plantName;
private string workstationID;
private string workstationDescription;
private string employeeID;
private string countryGroupCode;
private string countryCode;

public BOFactory(string company)
{ = company;
string user = ConfigurationSettings.AppSettings["UserName"];
string password = ConfigurationSettings.AppSettings["Password"];

m_cnVantage = new BLConnectionPool(user, password, "AppServerDC://"
+ ConfigurationSettings.AppSettings[m_strKeyVantageServer] + ":"
+ ConfigurationSettings.AppSettings[m_strKeyVantagePort]);


/// Returns the DyanmicQuery object which manages BAQs

public Epicor.Mfg.BO.DynamicQuery GetDynamicQueryBO()
return new Epicor.Mfg.BO.DynamicQuery(m_cnVantage);

/// returns the session mod

public Epicor.Mfg.Lib.SessionMod GetSessionMod()
SessionMod sessionMod = new SessionMod(m_cnVantage);
return sessionMod;

/// changes the company associated with the current session

public void SetCompany(string company)
{ = company;
Epicor.Mfg.Lib.SessionMod sessionMod = GetSessionMod();

out companyName, out plantID, out plantName, out workstationID, out workstationDescription,
out employeeID, out countryGroupCode, out countryCode);

Step 3 - Add the call to your dynamic query

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ExecuteDynamicQuery
class Program
static void Main(string[] args)
string company = "12";
string queryID = "12-MyQuery";
string orderNum = "726250";

BOFactory factory = new BOFactory(company);
var dynamicQuery = factory.GetDynamicQueryBO();

// get query
var queryDesignDataSet = dynamicQuery.GetByID(queryID);

// get only specific order
// QueryWhereItem is a criteria on OrderHed table
queryDesignDataSet.QueryWhereItem[0]["RValue"] = orderNum;

// execute query
DataSet ds = dynamicQuery.Execute(queryDesignDataSet);

// print results
for (int i = 0; i < ds.Tables[0].Columns.Count; i++ )

Above, I'm passing in an order number as the constant value to a criteria that already exists on the OrderHed table in the design of the query.

Monday, July 18, 2011

Epicor Customizations and Personalizations

If a user has a personalization for an existing form in Epicor, and you create a new customization, as soon as you "deploy" the customization by linking it to the form in Menu Maintenance, the user's personalization will be ignored.

Personalizations are always based on either the default form, or a customization (referred to as the parent layer).

To hook the personalization to the new customization you must:
1. Export the personalization to an .xml file by either:
a) Using System Maintenance, Utilities, Customization Maintenance (sic)
b) As the user, open the personalization designer, and choose Export button.

2. Attach the new customization to the menu.

3. As the user, log into Epicor, open the form (customization should now be loaded), start personalization, and click Import button.

Note that the only way associate the personalization being importing to the new customization is to log in as the user. You can not do this from any other account.

That said, Epicor does not recommend re-importing personalizations under a different customization. Instead, they suggest the user should recreate the personalization, because moving the personalization to the new customization may yield unexpected results. This is because part of the user's personalization is not actually exported to the personalization xml file, but instead is saved locally on the user's computer (such as the location of certain grids).