Create Return Order in Dynamics AX using X++

A customer may return an item to a company for various reasons. For example, it may be defect or not fulfill the customer’s expectations.
The return process begins when you receive a request from a customer to return an item and create a Return order in Microsoft Dynamics AX 2009.

Below code will help you to create a return order of already invoiced Sales order.
Note: This code will return all the items by looping through the CustInvoiceTrans. However, code can be tweaked as per your requirement and can select only a particular line and specific qty [custInvoiceTrans.Qty].

Return orders are avaialble from AR>> Common Forms >> Return order details

static void SR_CreateReturnOrderAfterInvoice(Args _args)
CustInvoiceJour _invoiceRec;
str _returnReason;
CustInvoiceTrans custInvoiceTrans;
SalesLine salesLine;
SalesTable newRetOrder;
CustInvoiceJour custInvoiceJour;

SalesTable createReturnOrderHeader(CustInvoiceJour invoiceRec)

SalesTable old, newRec;
boolean bChecksOk = true;

old = SalesTable::find(invoiceRec.SalesId);
newRec.CustAccount = old.CustAccount;


newRec.CustInvoiceId = invoiceRec.InvoiceId;
newRec.ReturnDeadline = today();
newRec.ReturnReasonCodeId = ’21’; // Defective
newRec.SalesType = SalesType::ReturnItem;
newRec.SalesTaker = SysCompanyUserInfo::current().EmplId;

if ( newRec.ReturnReasonCodeId == ” && CustParameters::find().ReturnOrdersReasonReq ||
newRec.ReturnReasonCodeId != ” && !ReturnReasonCode::exist(newRec.ReturnReasonCodeId) )
checkFailed(strfmt(“@SYS26332”, fieldid2pname(tablenum(SalesTable), fieldnum(SalesTable, ReturnReasonCodeId))));
bChecksOk = false;

if ( bChecksOk && newRec.validateWrite())
throw error(“@SYS18722”);

return newRec;


// first we need to create the sales order header for the return order
select custInvoiceJour where custInvoiceJour.RefNum == RefNum::SalesOrder && custInvoiceJour.InvoiceId == ‘101231’;

newRetOrder = createReturnOrderHeader(custInvoiceJour);

while select * from custInvoiceTrans where custInvoiceTrans.SalesId == custInvoiceJour.SalesId
&& custInvoiceTrans.InvoiceId == custInvoiceJour.InvoiceId
&& custInvoiceTrans.InvoiceDate == custInvoiceJour.InvoiceDate
&& custInvoiceTrans.numberSequenceGroup == custInvoiceJour.numberSequenceGroup
// now we need to populate all the necessary fields for the new salesline
// using the existing invoice and the new sales order

// udpate the quantity
salesLine.ExpectedRetQty = -custInvoiceTrans.Qty;

if (salesLine.ExpectedRetQty > 0)

// set the quantity and amount fields
salesLine.LineAmount = salesLine.returnLineAmount();
salesLine.SalesQty = 0;
salesLine.InventTransIdReturn = custInvoiceTrans.InventTransId;

//create the line
salesLine.createLine(true, false, false, false, false, false, false, false, salesLine.InventTransId);

// clear the buffer


info(strfmt(‘Newly created return order is %1’, newRetOrder.SalesId));



2 Responses to “Create Return Order in Dynamics AX using X++”

  1. Myrl Stadnick Says:

    When i use this code my return order comes up as canceled. any idea why?


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: