PDF Rendered File Naming

Is there a way to change this file to name to include additional data like Customer Names AND/OR Order Numbers?

I know it can be done with Break/Routing in email but curious if it can be changed for standard previewing and emailing via the interface.

Thanks,
Ross

1 Like

No sir! Would be great if you could, but no dice.

Okay, thanks! I agree that it would be nice.

Ross

How about to change spelling of the word acknowledgment?

Hello @rosshughes

This is the work-a-round that I use, if you want you can change the file path to a local drive on the user’s computer, and you can add different data to be included in the file naming… and you can also leave the emailing part out if you just want to save the file to a location

Final working code for generating a pdf with your own filename… and emailing it with Outlook

// You will need the following Custom Assembly References

// Erp.Contracts.Rpt.SalesOrderAck
// Erp.UIRpt.SalesOrderAck
// Ice.Contracts.BO.ReportMonitor
// Microsoft.Office.Inerop.Outlook   <<<<this can be tricky to locate, when you find it, deploy it you epicor client folder, I found it here:-  C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Outlook
// Microsft.ReportViewer.Common
// Microsft.ReportViewer.WebForms
// Microsft.ReportViewer.WinForms

//Add these using's

using Outlook = Microsoft.Office.Interop.Outlook;
using Microsoft.Reporting.WebForms.Internal.Soap.ReportingServices2005.Execution;
using System.Windows.Forms;
using System.IO;


//Add this to the script
public class Script

{
	private Erp.UI.Controls.Combos.cboCustCnt soldToName; 
	private Erp.UI.Controls.Combos.cboCustCnt shipToName;
}

//Add this to InitializeCustomCode
public void InitializeCustomCode()

{
	
	soldToName = (Erp.UI.Controls.Combos.cboCustCnt)csm.GetNativeControlReference("0bd70f62-56fa-4a05-b15f-ea3cbdd18f43");
	shipToName = (Erp.UI.Controls.Combos.cboCustCnt)csm.GetNativeControlReference("50a5e4e4-46cd-4397-a600-5fb8ac57e16f");	
}

//Add this to DestroyCustomCode
public void DestroyCustomCode()
{
	
		soldToName = null;
		shipToName = null;
}		

////Prepare SOA/////////////////////////////////////////////\\\\\\\\\\\//////
		private void prepareSOAPDF()
		{
		EpiDataView orderDtl = ((EpiDataView)(this.oTrans.EpiDataViews["OrderDtl"]));
		int lineCount = orderDtl.dataView.Count;
		EpiDataView edvOrderHed1 = ((EpiDataView)(this.oTrans.EpiDataViews["OrderHed"]));
		DataRow editRow = edvOrderHed1.CurrentDataRow;
			
		int soNum = Convert.ToInt32(editRow["OrderNum"]);
		
			//Get the customers info - code could be cleaned up
			String name1 = "";
			String name2 = "";
			String toName = "";
			String email1 = "";
			if(editRow["SoldToContactEMailAddress"].ToString() != "")
			{
			 email1 = editRow["SoldToContactEMailAddress"].ToString() + "; ";
			}
			
			String email2 = "";
			
			if(editRow["ShipToContactEMailAddress"].ToString() != editRow["SoldToContactEMailAddress"].ToString())
			{
			if(editRow["ShipToContactEMailAddress"].ToString() != "")
			{
			 email1 = editRow["ShipToContactEMailAddress"].ToString() + "; "; 
			}
			}
			
			if(Convert.ToInt32(soldToName.Value.ToString()) >0)
			{
			  name1 = soldToName.Text.ToString().Split(' ')[0];
			}
			if(Convert.ToInt32(shipToName.Value.ToString()) >0)
			{
			  name2 = shipToName.Text.ToString().Split(' ')[0];
			}			
			
			if(name1 == name2)
			{
				toName = name1;
			}
			else if(name2 != "" && name1 != "" )
			{
				toName = name1 + " and " + name2;
			}
			else if (name1 == "")
			{
				toName = name2;
				
			}
			

		salesOrderAckAdapter soa = new salesOrderAckAdapter(oTrans);
		soa.BOConnect();
		soa.GetNewParameters();
		soa.ReportData.SalesOrderAckParam[0].OrderNum = soNum;
		soa.ReportData.SalesOrderAckParam[0].AgentID = "SystemTaskAgent";
		soa.ReportData.SalesOrderAckParam[0].ReportStyleNum = 1001; //Change to suit your requirements 
	
		Guid workstationid = Guid.NewGuid();
		soa.ReportData.SalesOrderAckParam[0].WorkstationID = String.Format("{0}",workstationid);
		soa.ReportData.SalesOrderAckParam[0].ArchiveCode = 1;
		soa.ReportData.SalesOrderAckParam[0].AutoAction = "SSRSGenerate"; //generate
		soa.SubmitToAgent("SystemTaskAgent",0,0);
		MessageBox.Show("Print Job Has been submitted - This will take approx. 10 seconds.");
	
		Ice.Proxy.BO.ReportMonitorImpl RM = WCFServiceSupport.CreateImpl<Ice.Proxy.BO.ReportMonitorImpl>((Ice.Core.Session)oTrans.Session, Epicor.ServiceModel.Channels.ImplBase<Ice.Contracts.ReportMonitorSvcContract>.UriPath);

		int timer=0;
		
		bool morepages;
		SysRptLstListDataSet RptList;
		RptList = RM.GetList(@"WorkStationID ='"+workstationid+"'", 0, 0, out morepages);

		while (RptList.SysRptLstList.Count == 0 ) // setup a loop to look for when the report has been generated.
			{					
			System.Threading.Thread.Sleep(1000 * lineCount);
			timer = timer + 1;
			if (timer > 100 * lineCount)
				{
				MessageBox.Show("Attempts to generate a SOA pdf has timed-out. Please try again, and if that does not work, contact ERP Support");
				return;
				}
			RptList = RM.GetList(@"WorkStationID ='"+workstationid+"'", 0, 0, out morepages);
			}

		string tableguid;
		tableguid = RptList.SysRptLstList[0].FileName.Replace("REPORT DATABASE: ","");
		// make a pdf of the PO from the report
		   
	//	string FileName = String.Format(@"\\SERVER\EpicorData\PrintReports\Sales_Order_Acknowledgement_{0}.pdf", soNum); // use this path to save to SERVER
			string FileName = String.Format(@"C:\EpicorData\PrintReports\Sales_Order_Acknowledgement_{0}.pdf", soNum); // use this path to save to LOCAL

		GenerateReportPDF(tableguid,FileName);
		
		//The Email part - Comment out below to not do the email part
		try
			{
			//MessageBox.Show("Attaching to email...");
			Outlook.Application oApp = new Outlook.Application();
			Outlook.MailItem oMsg = (Outlook.MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem);
			Outlook.Inspector  MsgInspector =  oMsg.GetInspector; 
			string Signature = oMsg.HTMLBody; //capture signature for appending to custom message later.
			oMsg.Subject =  "TWG Sales Order Acknowledgement " + soNum ;
			oMsg.HTMLBody = "<p>Hello " + toName + "<br><br>Please see attached Sales Order Acknowledgement for your approval<br><br>Please check that the Bill To and Ship To details are correct</p>" + Signature;
			
			Outlook.Recipients oRecips = (Outlook.Recipients)oMsg.Recipients;
			Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add(email1 + email2);
			oRecip.Resolve();	
				
			oMsg.Attachments.Add(FileName,Outlook.OlAttachmentType.olByValue, Type.Missing,Type.Missing);	
					
			MsgInspector.Activate();   // shows the new email message as topmost window.	

			}
		catch (Exception Ex)
			{
			MessageBox.Show("SOA Email was attempted but failed. Please try again. If that doesn't work, please contact ERP Support");
			}	
			
		//End of Email part	
		}
	
	private void GenerateReportPDF(String tableguid, String PDFfilename)
        {
		 // Create a Report Execution object
            Microsoft.Reporting.WebForms.Internal.Soap.ReportingServices2005.Execution.ReportExecutionService rsExec = new ReportExecutionService();
			rsExec.Url = "http://SERVER:80/ReportServer/ReportExecution2005.asmx"; //ServerURL Change to suit
			rsExec.PreAuthenticate = true;
			rsExec.Credentials = System.Net.CredentialCache.DefaultCredentials;
		// Render arguments  
      	  byte[] result = null;  
			string report = "/reports/CustomReports/SalesOrderAcknowledgement/SOForm_LIVE"; // Change to suit
      	  string format = "PDF";  
			string historyId = null;
			string deviceInfo = null;
		// Prepare report parametes
			ParameterValue[] parameters = new ParameterValue[1];
     	   parameters[0] = new ParameterValue();  
     	   parameters[0].Name = "TableGuid";  
    	    parameters[0].Value = tableguid;			 
            string extension;
            string mimeType;
            string encoding;
            Warning[] warnings = null;
            string[] streamIDs = null;	
         // Load the report
            rsExec.LoadReport(report,  historyId);
         // pass parameters
            rsExec.SetExecutionParameters(parameters, null);
         // get pdf of report
            result = rsExec.Render(format, deviceInfo, out extension, out mimeType, out encoding, out warnings, out streamIDs);
			
            File.WriteAllBytes(PDFfilename, result); 
			
        }
////END Prepare SOA/////////////////////\\\\\\\\\\\\\\\\////\\\\\\\\//////	
4 Likes

Thanks, Lawson! I appreciate it and will take a look.

@rosshughes, Saving to a local drive will give you fewer security issues as opposed to sharing network drives

You will need to create the local drive, this can also be done with C#

a simple check if path exists, if not create