Skip to main content

Create Transfer Order Line by Scanning Barcode in Dynamics 365 Finance & Operations X++

Create Lines By Scanning Barcode on Transfer Order / Sales Order / Purchase Order Forms

When working with Transfer Order / Sales Order / Purchase Order in Dynamics 365 F&O, the standard behavior requires the user to manually select the Item ID every time they add a new line.

But in many warehouses, users simply want to scan the barcode and automatically have the related item appear on the line — saving time and reducing manual errors.

Recently, I implemented this exact requirement:

When a user scans the item barcode on the Transfer Order line, the system should automatically fetch the Item ID linked with that barcode and populate the line.

To achieve this, I created a custom barcode field on the InventTransferLine table named MZNFRItemBarCode, and then added logic to validate the barcode and populate the ItemId automatically.

Below is the code I used.

X++ Code — Auto Populate Item ID By Scanning Barcode

 [ExtensionOf(tableStr(InventTransferLine))]  
 final class MZNFRInventTransferLine_Extension  
 {  
   public boolean validateField(FieldId _fieldIdToCheck)  
   {  
     boolean ret = next validateField(_fieldIdToCheck);  
     switch (_fieldIdToCheck)  
     {  
       case(fieldNum(InventTransferLine, MZNFRItemBarCode)):  
       
         InventItemBarcode InventItemBarcode;  
         
         select * from InventItemBarcode  
         where InventItemBarcode.itemBarCode == this.MZNFRItemBarCode;  
         
         if(InventItemBarcode.itemId)  
         {  
           this.ItemId = InventItemBarcode.ItemId;
           //call ItemId modified method here to follow system behaviour.
         }  
         else  
         {  
           ret = checkFailed("ItemId not found with this barcode.");  
         }  
       break;  
     }  
     return ret;  
   }  
 }  

How This Code Works

1. Custom Field for Barcode

I added a custom field MZNFRItemBarCode to InventTransferLine.
This is where the scanned barcode gets stored.

2. Overriding validateField

The validateField() method is triggered when the user enters data in a field.
So when the barcode field is filled (e.g., by a scanner), this method runs.

3. Lookup in InventItemBarcode Table

The code searches the InventItemBarcode table:

  • If the barcode exists → get the associated ItemId

  • If the barcode is invalid → show an error

4. Auto-Fill the Item ID

When a valid barcode is found, the system automatically sets:

this.ItemId = InventItemBarcode.ItemId;

Thus, the transfer order line gets created without manual selection.


Result

✔ User scans the barcode
✔ Item ID automatically populates
✔ Faster data entry
✔ No manual item selection
✔ Reduced errors in warehouse operations

Popular posts from this blog

Consuming an External REST API in Dynamics 365 Finance & Operations (X++) and Saving Data into a Custom Table

  Introduction In this blog, I will explain how I consumed an online REST API in Microsoft Dynamics 365 Finance & Operations (D365 FO) using X++ and CLR Interop , deserialized the JSON response using Data Contract classes , and finally stored the data in a custom table . This is a common real-world integration scenario where external systems expose data via REST APIs and D365 FO needs to consume and persist that data. For this demo, I used the following public REST API : API URL: https://api.restful-api.dev/objects Solution Overview The solution consists of four X++ classes : MZNFRConsumeRestAPI – Main logic class (API call, deserialization, DB insert) MZNFRConsumeRestAPIParentContract – Parent contract (wraps JSON list) MZNFRConsumeRestAPIHeaderContract – Header contract (id, name) MZNFRConsumeRestAPILinesContract – Child contract (nested data node) 📌 Class Structure Diagram API Response Structure The API returns a JSON array like this: [ { ...

How to Create a Custom Data Entity in Dynamics 365 Finance and Operations

  Creating a Data Entity in Dynamics 365 Finance and Operations (D365FO) is essential for enabling data import/export, integrations, and public APIs. In this blog, we’ll walk through both the basic shortcut method and the advanced method for creating a custom Data Entity, using a table named MZNFRCustomTable as our example. 🧩 Step 1: Create a Custom Table Start by creating a new table in your project. Go to Solution Explorer → Right-click your project → Add New Item Select Table under FinanceOperations > Data Model Name it MZNFRCustomTable 🧱 Step 2: Add Fields to Your Table Define the fields you need in your table. For example: CustomerAccount CustomerName Currency PaymentNote Balance  Step 3: Shortcut Method – Create Data Entity via Addins Right-click on your table → Addins → Create Data Entity This method is quick but limited in customization. ❗ Common Error If you haven’t created an index, you’ll get this error: "The natural key for the table MZNFRCusto...

Modified Field Method in X++

  In Dynamics 365 Finance and Operations, user experience is everything. If a user enters an ItemId , they shouldn't have to manually type the ItemName . We can automate this using the modifiedField override on the table level. The ModifiedField  method is a kernel method that triggers after a field's value has been changed. It's the perfect place to put logic for fetching related data or resetting dependent fields. The Implementation On your custom table MNZFRSalesLine , you will override the  ModifiedField  method. We use a switch  statement on the _fieldId parameter to ensure our code only runs when the ItemId is the field being touched. public void modifiedField(FieldId _fieldId) { super(_fieldId); switch (_fieldId) { case fieldNum(MNZFRSalesLine, ItemId): if (this.ItemId) { // Fetch the Item Name using the InventTable find method // inventTable.itemName() is a common helper method ...