Auto Print Issue in Epicor 10

We have used the auto print functionality since Vantage 8 through multiple versions of E9 with no issues. Since we have upgraded to E10 we have not been able to get the desired results for both Genjob and GenRcpt labels. We have worked with Epicor CSG, Tech Support, and 3rd party consulting and have not found a solution yet. I am hoping someone in the community uses Data Directives for auto print and has encountered and solved the issues we are having or at least have some fresh ideas on what we can try. If you want more details then the document offers let me know and I will provide them.

Attached document for issue details around GenJob labels

AutoPrintLabelsEpicor10Issue.docx (594.2 KB)

Just to be clear, is the issue?

A. The data directive doesn’t fire
B. The called method directive (MD) doesn’t fire
C. Neither of the MD’s Autoprint widgets fire
D. The output of Autoprint Widget is incorrect.

Everything fires exactly where we want it to. The issue is the results are not what we expect. If you look at page 9-11 of attachment. We want only 1 label to print out. We get 1 label per operation on the job unless I add the specific expression on the AssemblySeq for the report parameters section. That is the only time we have gotten it to return 1 label as we desire, the issue is it then drops all data off the generated file except items on JobHead.

Print Qty shouldn’t be confused with number of labels that would be printed.

Print Qty will multiple the number of labels that report creates.

If you manually print the report does it produce multiple labels? If so, are they duplicates of what you expect, or individual labels, one for each record in the dataset?

You probably need to limit the dataset generated by the RDD, to just include the data you want labels for.

The text for BT appears to be showing that the dataset should generate two labels. Is this correct (my interpretation of the text file, not your desired results)?
image

Yes the print quantity would be the number of the returned data results on the auto generated text file times the print quantity setting. That example is showing 2 dataset returns for operation 10 and operation 20. We want to return only Operation 10 for the dataset and have 1 label printed in reference to Op 10. We do not want to see any other operations getting sent to the text file. The rules in the data directive are set to only equal true for the specific operation. We would like to be able to filter the report parameters to only print for the operation specified to trigger the true choice on the data directive which in this case is operation 10. But like the document shows, I have only found one way to achieve that but we drop all other tables data outside of JobHead.

I have not tried creating an RDD specifically for each data directive, but if we have to limit the RDD dataset to specific scenarios then we would have to have a separate RDD now for each individual part that we need Auto Labels to print out? Current state then we would have to build ~100 different RDD’s and have a 1 to 1 relationship for each data directive we have set up. Also we would have to build matching report styles as well to reference each RDD in the auto print setup. In my opinion this is not a good option or really worth the time to look into as it just creates a ton of overhead and maintenance. Also seems to defeat the purpose of having rules and report parameters in the data directive printing function as well. At that point I would rather build a complete custom solution.

Not saying to make individual RDD’s but to have the RDD include a criteria (like Op #) that is driven from the BPM.

When the DD fires, you have the Op# that is being updated. That needs to pass to the RDD, to limit the dataset to just that Op#. Or pass it to SSRS to use as a filter in the RDL. Not sure if Bartender throws a wrench into that.

FWIW - You really should start with a method directive that fires when the operation is reported and is complete (all materials issued), instead of the Data Directive on the JobOper table.

That way you’d have the info you’re interested (which operation), right when it happens.

I just started to try an duplicate what you are doing, and there is way to many hard coded values. Like the table criteria that looks for a specific PartNumber and MtlSeq. While you might get this working, it’s bound to give you trouble in the future. Like if more mtl is added to that MOM, or the P/N changes.

Maybe I’m way off base, but I think you want the label (just for the operation entered) to print when the operation is complete and ALL the material has been issued. Not just as long as the specific MtSeq and Part Number, have been issued.

In regards to the criteria sets. We have many different rules pending on the Part and based on the MOM and designed for the specific point they want a label to be generated. We have about 100 of them working as expected. They were designed to that level of detail on purpose years ago, with that said we are looking at getting more detailed with the rules on when an auto label will be triggered. We currently live with the dataset loss from auto printing mainly for joboper.qtycompleted on the labels since these are internal usage labels. We are now looking to incorporate this process for external usage labels and can no longer have any data missing from those types of labels. Also these requirements will be printing labels for jobs at the start of operations, in the middle of operations after a certain material/part has been issued complete, and/or at operation complete etc. Regardless none of this has been an issue with getting to work. It goes back to being able to get the desired results out of the auto print data directive functionality

1 Like

I will have to look into your suggestions around using Method Directives and Passing value via the DD back to the RDD from the DD results for Auto printing. Since this is specific to Bartender Labels = Text File generation, I am not sure how to do this exactly at the moment.

There was a time when GenShip didnt pass in a PackLine and I needed ShipDtl to print a specific line, not the whole batch.

Here is what I did.


You can apply something similar probably to your scenario.

Basically:
When you hit the JobOper Data Directive - you can update a column you make on JobHead called JobHead.CurrentOperationRowID_c and you assign the JobOper.SysRowID to JobHead.CurrentOperationRowID_c and then in your RDD you simply JOIN JobOper and JobHead by those fields.

hasokeric - Thanks for sharing that info, that helps solidify what I was thinking and seeing on my end. Moving forward we are going to proceed with a custom printing solution Vs customizing inside the OOB solution to get something to work.

Another thing you can do is Epicor has something called “Electronic Compliance” which lets you basically do a BAQ Report but it will output the BAQ to a XML or CSV. If you ever need to create your own Custom Label Event, you could then Invoke the EI in a BPM and it takes care of the rest.

Of course you can always make a BPM that writes the .csv out to BarTender yourself.

Good Item to Have:

The Electronic Interface (EI) stuff was a “tool” we had on the shelf for running custom code. We needed that in the “Multiple BAQ” reports to be able to support everything from calculated columns to stuff that could radically change how the report worked.

Another place that people probably don’t know even exists is Electronic Compliance. This area is much more general purpose than the name implies. Basically, this will let you take the output of an RDD and create an XML, JSON or CSV file.

Both the Multiple BAQ and Electronic Compliance were built at the same time. When you look at it from above, you start seeing the how and why.

Master @JeffLeBert

This doesn’t seem to be the same issue, but I have an autoprint action and the only error I am getting for the genJob label is:

Program Ice.Services.Lib.RunTask raised an unexpected exception with the following message: RunTask:
System.ArgumentException: ‘’, hexadecimal value 0x1E, is an invalid character.
at System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(Int32 ch, Byte* pDst, Boolean entitize)
at System.Xml.XmlUtf8RawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd)
at System.Xml.XmlUtf8RawTextWriter.WriteString(String text)
at System.Xml.XmlWellFormedWriter.WriteString(String text)
at System.Data.XmlDataTreeWriter.XmlDataRowWriter(DataRow row, String encodedTableName)
at System.Data.XmlDataTreeWriter.Save(XmlWriter xw, Boolean writeSchema)
at System.Data.DataSet.WriteXml(XmlWriter writer, XmlWriteMode mode)
at Ice.Core.RptBase.ReportDataSetBuilder.XMLClose() in C:_Releases\ICE\UD10.2.500.8FW\Source\Server\Internal\Lib\TaskLib\RptBase\ReportDataSetBuilder.cs:line 94
at Ice.Core.RptTaskBase1.XMLClose() in C:\_Releases\ICE\UD10.2.500.8FW\Source\Server\Internal\Lib\TaskLib\RptBase\RptTaskBase.cs:line 229 at Ice.Core.TaskBase1.StartProcess(Int64 instanceTaskNum, String outputFileName) in C:_Releases\ICE\UD10.2.500.8FW\Source\Server\Internal\Lib\TaskLib\TaskBase\TaskBase.cs:line 83
at Ice.Hosting.TaskCaller.InnerExecuteTask(IceDataContext newContext) in C:_Releases\ICE\UD10.2.500.8FW\Source\Framework\Epicor.Ice\Hosting\TaskCaller\TaskCaller.cs:line 117
at Ice.Hosting.TaskCaller.ExecuteTask() in C:_Releases\ICE\UD10.2.500.8FW\Source\Framework\Epicor.Ice\Hosting\TaskCaller\TaskCaller.cs:line 59
at Ice.Lib.RunTask.BpmFriendlyTaskLauncher.Run(String sessionIdPrefix, IceContext db, Action taskRunner) in C:_Releases\ICE\RL10.2.500.0FW\Source\Server\Services\Lib\RunTask\BpmFriendlyTaskLauncher.cs:line 63
at Ice.Services.Lib.RunTaskSvc.InnerRunTask(Int64 ipTaskNum, Boolean suppressTransaction) in C:_Releases\ICE\RL10.2.500.0FW\Source\Server\Services\Lib\RunTask\RunTask.cs:line 452

Is there way to see where this xml is or what character is causing this??