Skip to main content

AX 2009: Citrix & Terminal Server Printing

Errors, or no output when printing from AX to a locally mapped Printer

If you are mapping local printers to your TS or Citrix environment and have an issues where nothing is printed or the following error is generated: startDoc: rc:SP_ERROR you will need to change the Print Processor data type from Raw to EMF.
This problem occurs because the UPD requires the Enhanced Metafile (EMF) format. By default, Microsoft Dynamics AX creates the print job in the RAW format. (As of AX
To modify these printer settings.
1. Click Start, and then click Control Panel.
2. Double-click Printers and Faxes.
3. Right-click the printer that you want to use, and then click Properties.
4. On the Advanced tab, click Print Processor.
5. In the Default data type pane, click NT EMF 1.008, and then click OK.
Microsoft Dynamics AX will recognize the EMF format. Additionally, Microsoft Dynamics AX will send the report to the spool file in the EMF format.
This is described in further detail in this KB 947524
Printers do not stay set as default
Symptoms:
Printers do not stay as default when running reports in AX.
1) You connect using RDP with printers redirected (say session 1)
2) You print in AX ->> Printer selection is saved to SysLastValue (say „HP Laserjet (session 1)”
3) Now you connect with another RDP session (session 2)
4) This time you’re logged on with session 2, and session 1 is also present in the system
5) When you now open the same report, you’ll see that the selected printer is „Unavailable” – This is because „HP LaserJet (session 1)” isn’t available, since we’re in session 2. So we only have „HP Laserjet (session 2)”.
Cause:
The use of printers for reports and or printing is often stored in usage data within Dynamics AX. The local printers that are directed from your local workstation and created on TS and Citrix often time have a uniquely generated printer name that includes a session id.  If you log out and then log back in a different printer name can be generated. In cases like this usage data is invalidated because so it sets your printer back to the clients default printer.
Resolution:
There is a KB fix that address this.  KB 981681.
AX Printer recommendations regarding UPD (Universal Print Driver)
When printer issues are experienced and the Universal Print Driver is used on a Terminal Server or Citrix environment we suggest  that you load the specific printer driver on the Terminal Server or Citrix machine.  After loading the driver on the Terminal Server or Citrix the proper postscript is generated and then sent to the printer. and anomalies.
Network Printers are not mapped to the Terminal Service or Citrix machines
Network printers that have this format \\\ are not always mapped to Terminal Service or Citrix machines.*  Installing printers locally or using TPC\IP based printers allows them to map to your remote environment and are then available for use.
*depending on the environment configuration and the version of TS or Citrix in use.
Tips for troubleshooting AX Printing issues
  • Try printing directly from a client that has its own local printers installed.  This will help you determine if the printing issue common with AX or with Citrix/TS
  • Check to ensure that your client version and AOS kernel versions match
  • Make sure your AX application and kernel version do not cross service pack levels
  • Test printing from multiple applications to ensure that there is not an underlying issue with the printer itself

Popular posts from this blog

Dynamics Axapta: Sales Orders & Business Connector

Well, again folllowing my same idea of writting close to nothing and pasting code, I'll paste in some code to create a sales order from some basic data and the invoice it. I'll try to explain more in the future. AxaptaObject axSalesTable = ax.CreateAxaptaObject("AxSalesTable"); AxaptaRecord rcInventDim = ax.CreateAxaptaRecord("InventDim"); AxaptaRecord rcCustTable = ax.CreateAxaptaRecord("CustTable"); rcCustTable.ExecuteStmt("select * from %1 where %1.AccountNum == '" + MySalesOrderObject.CustAccount + "'"); if (MySalesOrderObject.CurrencyCode.Trim().Length == 0) MySalesOrderObject.CurrencyCode = rcCustTable.get_Field("Currency").ToString().Trim(); string sTaxGroup = rcCustTable.get_Field("taxgroup").ToString().Trim(); //set header level fields axSalesTable.Call("parmSalesName", MySalesOrderObject.SalesName.Trim()); axSalesTable.Call("parmCustAccount", M

Passing values between form and class

Class name is EmplDuplication and Form is EmplTable . void clicked() {    MenuFunction mf;    args args = new Args();    ;     args.record(EmplTable);     mf = new menufunction(identifierstr(EmplDuplication), MenuItemType::Action); mf.run(args); } Meanwhile, in the main() method of the EmplDuplication class, we need to put this Axapta x++ code to get the datasource: static void main(Args args) {     EmplDuplication EmplDuplication; EmplTable localEmplTable; ;     if(args.record().TableId == tablenum(EmplTable)) localEmplTable = args.record();     ... }