Skip to Content

In AX 2012, user has to create a sales order manually. First, he or she has to create sales order header, then sales order line. After confirmation, he or she has to create picking list and then packing list. After that, the user has to invoice that sales order. We suggest using import utility to save time and effort. This is the biggest advantage of import utility. Here, we will share the code that a user would require to import sales order through the job.

Purpose: The purpose of this blog is to illustrate how to write a required minimum X++ code in Microsoft Dynamics AX 2012 to import sales orders.

Challenge: Data model changes in Microsoft Dynamics AX 2012 related to high normalization and introduction of surrogate keys made some imports more complex. However, the structure of tables comprising sales order header/lines didn’t change. Please note that after you import sales orders, you may need to perform full/partial physical and/or financial update if required.

Solution: Appropriate tables buffers (SalesTable, SalesLine) will be used when writing X++ code in Microsoft Dynamics AX 2012 to import sales orders. Alternatively, AxBC classes may be used instead of table buffers.

Data Model

Table Name Table Description
SalesTable The SalesTable table contains all sales order headers regardless of whether they have been posted.
SalesLine The SalesLine table contains all sales order lines regardless of whether they have been posted.
InventDim The InventDim table contains values for inventory dimensions.

 

Data Model Diagram

In data model diagram,there is linking between selectable> salesline > Inventdim.

 

Development

ttsBegin: Use ttsBegin to start a transaction.

 

clear: The clear method clears the contents of the record.

 

initValue: The initValue method initializes the fields of the record.

 

initFrom*: The initFrom* methods usually populate the fields of the child record based on the fields on the parent record. Example is initFromSalesTable method on SalesLine table.

 

validateWrite: The validateWrite method checks whether the record can be written.

 

write: The write method writes the record to the database.

 

insert: The insert method inserts the record into the database.

 

doInsert: The doInsert method inserts the record into the database. Calling doInsert ensures that any X++ code written in the insert method of the record is not executed. Calling insert always executes the X++ code written in the insertmethod of the record.

ttsCommit: Use ttsCommit to commit a transaction. 

Source Code

static void SalesOrdersXppImport(Args _args)

{

#define.Customer(“US-001”)

#define.DeliveryDate(“1/1/2014”)

#define.ItemId(“M0001”)

#define.Qty(10)

#define.Unit(“ea”)

 

SalesTable      salesTable;

SalesLine       salesLine;

InventDim       inventDim;

 

try

{

ttsbegin;

 

//Order header

salesTable.clear();

salesTable.initValue(SalesType::Sales);

salesTable.SalesId = NumberSeq::newGetNum(SalesParameters::numRefSalesId()).num();

salesTable.DeliveryDate = str2Date(#DeliveryDate, 213);

salesTable.CustAccount = #Customer;

salesTable.initFromCustTable();

 

if (salesTable.validateWrite())

{

salesTable.insert();

 

//Order line

inventDim.clear();

inventDim.InventSiteId = “1”;

inventDim.InventLocationId = “12”;

 

salesLine.clear();

salesLine.initValue(salesTable.SalesType);

salesLine.initFromSalesTable(salesTable);

salesLine.ItemId = #ItemId;

salesLine.initFromInventTable(InventTable::find(#ItemId));

 

salesLine.InventDimId = InventDim::findOrCreate(inventDim).inventDimId;

salesLine.SalesQty = #Qty;

salesLine.RemainSalesPhysical = salesLine.SalesQty;

salesLine.SalesUnit = #Unit;

salesLine.QtyOrdered = salesLine.calcQtyOrdered();

salesLine.RemainInventPhysical = salesLine.QtyOrdered;

 

salesLine.setPriceDisc(InventDim::find(salesLine.InventDimId));

 

if (salesLine.validateWrite())

{

salesLine.insert();

}

else

throw error(“Order line”);

}

else

throw error(“Order header”);

 

ttscommit;

}

catch

{

error(“Error!”);

return;

}

info(“Done!”);

}

 

 

Result: Please note that we assigned SalesId programmatically from Number sequence

 

Product – Sales price

 

 

Sales Order Processing in AX 2012

 

 

First, we have to create sales order> then confirm the sales order > then go for the picking route > then go for the packing slip > then finally make the invoice. We have to follow these steps to make a sales invoice.

 

Results After Importing the Sales Order

 

After importing the data, we have to check all the form to be sure that the data in the form is correct.

 

Follow the Steps to Create Sales Order to Sales Invoice

 

Sales Header Form

In the sales header form, we have to have specify the details in which the sales order is going to the customer. Likewise, we have to have specify customer details like name, address, phone number, email ID, site, warehouse and much more.

General Tab

In the general tab, we have to specify customer’s basic details like:

 

1) Customer name

2) Customer address

3) Customer account

4) Email ID

5) Site

6) Warehouse

 

Setup Tab

 

 In the setup tab, we have to define:

  • Tax information
  • Posting information
  • Inventory
  • Withholding tax
  • Date and time
  • Administration part also

Address Tab

In the address tab, we have to add address delivery address information of the customer.

 

Price and Discount Tab

 

 In the price discount tab, users have to fill the:

  • Currency that is used for the transaction.
  • Payment mode that is by cash or check.
  • Discount that has been provided to the customer group.

 

Foreign Trade Tab

In the foreign trade tab, we have to specify the:

  • Transport mode that is by road, by air, etc.
  • Port where the delivery has been made like Mudra etc.

 

Financial Dimension Tab

Depending upon the requirement, user has to fill the dimension for the financial impact with details like:

  • Branch
  • Department
  • Months
  • Purpose
  • Sales order.

Sales Line Form

In this form, we have to define the:

  • Item
  • Quantity
  • Unit price
  • Line amount is automatically calculated i.e., qty * Unit price.

 

 

Packing Slip

Path: Accounts receivable>Common>Sales orders>All sales orders>Pick and Pack tab.

In this, we have to create packing slip for the customer. All the sales order confirmation line has been put in the packing slip line and we have to check and create packing slip for the same sales order followed by creation of invoice.

 

Sales Invoice

 

Path: Accounts receivable>Common>Sales orders>All sales orders>Sales Invoice Tab.

In this, we have to justify the mandatory fields that are:

  • Sales invoice number
  • Sales invoice date

After that, we have to post the sales invoice and bill has to be sent to the customer for payment.

Note: After that, we have to check the posting entries to ensure that these are going to right transaction. We have to check ledger transaction and the physical voucher for this sales order in AX 2012.

 

 

Inventory Transaction

Check that item in the ledger transaction that the quantity you have defined in the sales order has to be reduced in the ledger transaction or not.

 

Voucher Transaction

 

Check the Voucher Transaction report to ensure that the entries have been posted into the correct ledger. If yes, then the sales order you imported is correct.

Conclusion

In this blog, Microsoft Dynamics AX development team explained how to write a required minimum X++ code in Microsoft Dynamics AX 2012 to import sales orders. Appropriate table buffers were used when writing X++ code in Microsoft Dynamics AX 2012. This approach can be very handy for POC’s or in situation with always changing requirements. You can also use Microsoft Dynamics AX Excel Add-in to import relatively small amounts of data. Please consider using DIXF (Data Import Export Framework) for import of significant amounts of data when performance is an important consideration. DIXF (Data Import Export Framework) provides a standard template for import of sales orders. With this, Import Utility user can save a lot of time. This helps in creating sales order through the job rather than creating it manually.

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply