Bartender Label Printing - System Design Ideas?

I have a dream of simplifying how we do label printing. I’ve inherited a system that gives our users extensive label printing functionality, but it’s a maintenance nightmare.

We’re not using SSRS/Auto Print, rather generating .bt files directly in code and pushing them to a folder that Commander is monitoring. This works and I like generating the .bt file manually because there’s a lot of flexibility there, but we have similar code in dozens of places, and I can barely keep track of it all (let alone respond to change requests). Worse, most of the label functionality was highly catered to the departments / product lines / processes that we had 8 years ago. We’ve grown quite a bit since then but our label functionality is stuck in the past.

I have some ideas on the general logic required for some kind of generic label printing “function/app/service”, but I don’t know what form it wants to take, whether it be an Epicor Function, external DLL, ESC, something with REST, etc…

One hang-up is thinking about what solution form could work for two main “sources” of print jobs:

  1. BPMs – mostly method directives on inventory transaction Business Objects. For example, a user issues material on a handheld and an inventory tag prints out automatically. These are event-based labels.

  2. Customizations – these labels are not event-based; a user prints them with a button click after making some selections / inputs. For example, re-printing a damaged inventory tag, or using a dashboard of open Jobs for product type X where labels are printed out and sewn into product X as part of the mfg process.

Maybe I am on the wrong track and the whole idea is a fool’s errand. All I know is that I can hardly maintain what we have now…

Obviously not looking for a full solution design here, just wondering if others have thought about or done something like this? Thanks in advance.

Hi Tom,

I’ve never used BT but would just write small programs with the printer code directly and used templates to replace values. Basically, rolled our own BT. We started with printing locally but then the program had to be installed at each computer. Then we thought of using file shares and centralizing the printing on a server (ala BT) but with the threat of malware, I’ve been trying to limit the attack surface by using SMB as little as possible.

The solution I started a few companies ago was to create a label printing web service. I never got it to full fruition but it would look like this.

Create a web api that looks something like:

/LabelSvc/template - list all templates
/LabelSvc/template?<label data including quantity and workstation/printer>

For example:


So, what does this buy us?

  • We can call the service from a BPM or a Customization and not have to worry about rights for files.
  • One line of code to print making upgrades easier
  • A simple web interface could be used to reprint lost or damaged labels in only the quantity required
  • All logic for creating your .bt files is in one place
  • You can dynamically choose printers based on other options besides workstation. For example, one could use beacons to identify the nearest printer and pass that it from a handheld or a forklift.
  • Works on-prem and in Azure
  • Works with or without BT

Food for thought…


Tom i think this will be an easier approach instead of have customizations all around the system and the BPMs why dont you create a manu UD01Entry where you place your code to generate the label and you call that menu from whatever screen you need to print and use a BAQ to fill out a grid where they can select the line they want to print in case they are several lines and click print and done also you adjust your BPM to look at that menu.

Are you on 10.2.500? If so use EFx to consolidate your code. If you are not, we use updatable BAQs to fire off common code. I have about 30 different labels we print and 6 different datasets (BAQs) that generate that data. After the data is generated in post GetList the CSV .bt file is generated and dropped for integration to pick up. When I call the BAQ I send the printer I want to print to, the label format I need, and the number of copies (along with any serialization I need). I pass those to a calculated field so I can use them in the Update method when I build the commander line.