Bulk Print/Email Order Acknowledgments

Anyone have a good way of bulk printing/emailing order acknowledgments?

Due to a poorly designed custom from an Epicor partner we can’t use APR. We are joining columns with different types. In 10.2.400 APR won’t work with a data definition that has joins of different types. So, currently we have a single person opening each sales order and printing the report. With hundreds of orders per day this isn’t feasible. Looking for suggestions as to what others do.

What’s the trigger to print the forms? Can you queue them up somehow and then have custom code to process the print on a schedule?

Currently, there isn’t one. It’s a hand written list being given to someone to go manually do.

In the perfect solution the PDF would be generated and saved to a network folder when a OrderRel_UD field value is changed to ‘APPROVED’.

A Data Directive with an Auto Print block could easily do this. (Well most of it).

Set the Auto Print widget to email it (like if you select the mail tool on a report form’s toolbar). Send it to a specific mailbox, and set a rule to save the attachment when new mail arrives.


I think that’s doable, although writing to a network folder is limited to the server folder of the user who generates the request.
Solution could be a data directive on OrderRel, check the value to that field, if true, then print. In the Report Style that you’re printing, the argument “File:” plus whatever you want to name the document will put a copy of it out on the server.

This puts it to image

Programatically running a report looks something like this, but you’ll have to trace the transaction for your specific report:

/    *Run Inventory Wip Recon report for Prior Day at 12AM*/
    using(var inventoryWIPReconRpt = Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.InvWIPReconSvcContract>(Db))
      //Validate Date Range from inputs. Using "Today" for now
      string opWarningMsg = string.Empty;
      inventoryWIPReconRpt.ValidateDateRange(today, today, "", "", "", out opWarningMsg);  
        //invoke SubmitToAgent with params
        InvWIPReconTableset wipTS = inventoryWIPReconRpt.GetNewParameters();
        InvWIPReconParamRow paramRow = wipTS.InvWIPReconParam[0];
        paramRow.StartDt = today;
        paramRow.EndDt = today;
        paramRow.FiscalYear = year;
        paramRow.JournalNum = 0;
        paramRow.Account = "";
        paramRow.IncludeOffset = false;
        paramRow.ActLvlDtl = 1;
        paramRow.PostingStatus = "Unposted";    
        paramRow.CurPlantOnly = false;
        paramRow.StartDtToken = "";
        paramRow.EndDtToken = "";        
        paramRow.RptUserID = Session.UserID;
        paramRow.CurrentPlant = "MfgSys";
        paramRow.BookID = "JRFB";
        paramRow.BookDescription = "JRF Main Financial Book";
        paramRow.COACode = "JRFCOA";
        paramRow.SegValue1 = "";
        paramRow.SegValue2 = "";
        paramRow.SegValue3 = "";
        paramRow.SegValue4 = "";
        paramRow.SegValue5 = "";
        paramRow.SegValue6 = "";
        paramRow.SegValue7 = "";
        paramRow.SegValue8 = "";
        paramRow.SegValue9 = "";
        paramRow.SegValue10 = "";
        paramRow.SegValue11 = "";
        paramRow.SegValue12 = "";
        paramRow.SegValue13 = "";
        paramRow.SegValue14 = "";
        paramRow.SegValue15 = "";
        paramRow.Segvalue16 = "";
        paramRow.SegValue17 = "";
        paramRow.SegValue18 = "";
        paramRow.SegValue19 = "";
        paramRow.SegValue20 = "";  
        paramRow.DispAccount = "";
        paramRow.FiscalYearSuffix = "";
        paramRow.JournalCode = "";   
        paramRow.FiscalCalendarID = "JRF";    
        paramRow.ProjectID = "";
        paramRow.PhaseID = "";   
        paramRow.DateType = "SysDate";
        paramRow.SortByOption = "AD";
        paramRow.IncludeFSA = false;
        paramRow.SysRowID = Guid.Empty;
        paramRow.AutoAction = "SSRSPREVIEW"; //or "SSRSGenerate";
        paramRow.PrinterName = "";
        paramRow.AgentSchedNum = 0;    
        paramRow.AgentID = "SystemTaskAgent";
        paramRow.AgentTaskNum = 0;
        paramRow.RecurringTask = false;
        paramRow.RptPageSettings = "";
        paramRow.RptPrinterSettings = "";
        paramRow.RptVersion = "";
        paramRow.ReportStyleNum = 2; //or 1001;
        paramRow.WorkstationID = "";
        paramRow.TaskNote = "";
        paramRow.ArchiveCode = 0;
        paramRow.DateFormat = "m/d/yyyy"; 
        paramRow.NumericFormat= ",.";
        paramRow.ProcessTaskNum = 0;
        paramRow.DecimalsGeneral = 0;
        paramRow.DecimalsCost = 0;
        paramRow.DecimalsPrice = 0;
        paramRow.ReportCurrencyCode = "USD";
        paramRow.ReportCultureCode = "en-US";
        paramRow.SSRSRenderFormat = "PDF";
        paramRow.PrintReportParameters = false;
        paramRow.SSRSEnableRouting = false;
        paramRow.RowMod = "A";
        string jsonString = JsonConvert.SerializeObject(wipTS); 
        string debugPath = @"\\dev01\C$\TEMP\DEBUG_InventoryProcess.txt";
        string content = jsonString;
          string createText = "First Line:" + Environment.NewLine;
          File.WriteAllText(debugPath, createText);
        string appendText = Environment.NewLine + "Response "+DateTime.Now.ToString() + Environment.NewLine + content;
        File.AppendAllText(debugPath, appendText);

        //submit to Agent   
        inventoryWIPReconRpt.SubmitToAgent(wipTS, "SystemTaskAgent", 0, 0, "Erp.UIRpt.InvWipRecon");   

FWIW - the Print Order Ack can print multiple Orders at once. It has a Filter tab with an Orders grid.

But there’s some down sides:

  • There’s no search, so you have to manually enter the order numbers (or Paste Insert), to be printed
  • Multiple orders show as one report. 1st order is on pgs 1-3, 2md on 4-8, 3rd on 9-10, etc… Previewing this group provides a single PDF containing all the orders.

This wouldn’t be a huge issue. We could have a script that runs to copy anything from sub-folders of \EpicorData\Reports to a network folder. The script could ignore any file that’s not named correctly.

1 Like

Yes good idea

I never clicked into the filter tab on the Order Acks. I wish Epicor had a bulk print option like they do for Job Travs.

Would the Batch Sales Order Ack printing screen be of any help? Maybe in conjunctions with some BPMs and a scheduled run of the batch acks?

Is this a built-in form / report?

I’m not aware of batch print Sales Order Ack.

1 Like

It’s not included in the menu for some reason or another, but it’s a ui library you can add in, been there since 9 just hiding.

Hot damn… looks like it’s added in 10.2.400 by default. I’ll have to check this out.

I do want to explore the ideas that @Aaron_Moreng and @ckrusen had. Either would be ideal as it would require no intervention from users. But until we get there a mass print would help a lot.

So its the same program/form as the one that launches from within Order Entry (or Order Tracker). But with a button to select the Orders.

“Mass Print” on the left, and Print Order (from within Order Entry) on the right


one more thing… The Sales Order Ack (launched from within Order Entry), is modal. No other E10 client window will respond while that window is open.

They should just use the mass print window in Order Entry… :upside_down_face:

As I pointed out earlier, it prints as a “single report”. So if you selected 10 orders, you get one PDF with all 10 orders in it. Would need to use Break Routing (which the OP said they can’t) to break that into separate PDFs or emails.

I noticed that. I ran quick test and got a 100 page PDF. That won’t work to send to a customer. I would have to add something in our document management system to break them. Which it could do but not ideal.

The Data Directive with an Auto Print widget would make individual print jobs (i.e. just the one order).

Exactly what I need. Just need to get it saved to a folder somewhere so I can pick it up outside of Epicor.