Skip to main content

πŸ”„ Convert Available Inventory to Kilograms (KG) in X++ – D365 F&O

When working with raw materials in Dynamics 365 Finance & Operations (D365 F&O), it’s common to encounter situations where the inventory is stored in one unit (like Liters or Packs), but needs to be viewed or calculated in Kilograms (KG) for costing, reporting, or analysis. In this blog, we’ll walk through a practical X++ code snippet that demonstrates how to convert available inventory (AvailPhysical) into KG using D365’s standard Unit of Measure (UOM) conversion. πŸ“Œ Business Scenario Suppose you have a chemical item stored in Liters , but the production or costing team needs to see its available inventory in KG . You’ll need to: Fetch the item’s AvailPhysical from the InventSum table. Get the current unit of measure (UOM) for the item. Convert that quantity into KG , based on predefined unit conversion. πŸ’» X++ Code – Inventory Conversion to KG Here’s the code block that does exactly that: //******************** Avail Physical as per KG Unit conversion *...

πŸ”„ Convert Available Inventory to Kilograms (KG) in X++ – D365 F&O

When working with raw materials in Dynamics 365 Finance & Operations (D365 F&O), it’s common to encounter situations where the inventory is stored in one unit (like Liters or Packs), but needs to be viewed or calculated in Kilograms (KG) for costing, reporting, or analysis.

In this blog, we’ll walk through a practical X++ code snippet that demonstrates how to convert available inventory (AvailPhysical) into KG using D365’s standard Unit of Measure (UOM) conversion.


πŸ“Œ Business Scenario

Suppose you have a chemical item stored in Liters, but the production or costing team needs to see its available inventory in KG.

You’ll need to:

  1. Fetch the item’s AvailPhysical from the InventSum table.

  2. Get the current unit of measure (UOM) for the item.

  3. Convert that quantity into KG, based on predefined unit conversion.


πŸ’» X++ Code – Inventory Conversion to KG

Here’s the code block that does exactly that:


//******************** Avail Physical as per KG Unit conversion ********************


select sum(AvailPhysical) from inventSum

    where inventSum.ItemId == this.ItemId;


select firstonly inventTable 

    where inventTable.ItemId == this.ItemId;


if (inventTable)

{

    // Get the item's current inventory unit and the target 'KG' unit

    UnitOfMeasure fromUOM = UnitOfMeasure::findBySymbol(inventTable.inventUnitId());

    UnitOfMeasure toUOM   = UnitOfMeasure::findBySymbol('KG'); // Change symbol if your UOM          setup differs


    if (fromUOM && toUOM)

    {

        // Find the conversion factor between item's unit and KG for the product

        UnitOfMeasureConversion conversion = UnitOfMeasureConversion::findByConversion(

            fromUOM.RecId,

            toUOM.RecId,

            inventTable.Product

        );


        // If a valid conversion factor is found, apply it

        if (conversion)

        {

            this.AvailableInventory = inventSum.AvailPhysical * conversion.Factor;

        }

        else

        {

            // Fallback if no conversion found

            this.AvailableInventory = inventSum.AvailPhysical;

        }

    }

    else

    {

        // Fallback if UOMs are not found

        this.AvailableInventory = inventSum.AvailPhysical;

    }

}

else

{

    // Fallback if item not found

    this.AvailableInventory = inventSum.AvailPhysical;

}


πŸ” Explanation

πŸ”Έ Step 1: Fetch Available Inventory

The first select statement grabs the total AvailPhysical quantity from the InventSum table for a given item.

πŸ”Έ Step 2: Get Item’s Inventory Unit

The InventTable record gives you the default inventory unit (inventUnitId) for the item.

πŸ”Έ Step 3: Get Unit of Measure Records

We retrieve both:

  • fromUOM: The item's current unit (e.g., Liter)

  • toUOM: The target unit, in this case 'KG'

πŸ”Έ Step 4: Apply Conversion Factor

Using the UnitOfMeasureConversion class, we get the factor needed to convert from one unit to another — considering the specific product context.

Example: If 1 Liter = 0.9 KG for the product, and AvailPhysical = 100, the result will be 90 KG.

πŸ”Έ Step 5: Handle Missing Data Gracefully

Fallback logic ensures the system doesn’t break if:

  • Conversion is missing

  • UOMs are not found

  • Item is invalid


Comments

Popular posts from this blog

How to Refresh a Form or Data Source in D365FO Using X++

  Introduction In Microsoft Dynamics 365 Finance & Operations (D365FO), refreshing the form after an action (like inserting, updating, or deleting a record) is essential for keeping the UI updated with the latest data. In this blog, we’ll explore two ways to refresh the form in X++: ✅ Refreshing the entire form using taskRefresh ✅ Refreshing a specific data source using research Let's dive into the best practices for implementing these refresh methods! πŸ”„ Refreshing the Entire Form If you need to refresh the whole form , use the taskRefresh method. This method is useful when multiple data sources are involved, and you want to reload everything. πŸ“Œ X++ Code for Full Form Refresh public void refreshForm() {     // Get the current form instance     FormRun formRun = this.formRun();     // Check if formRun is valid before refreshing     if (formRun)     {         info("Refreshing the form...");     ...

How to Open a Form with Filtered Data Using a Button in X++ – A Step-by-Step Guide

 In Dynamics 365 for Finance and Operations (D365FO), a common requirement is to open a form dynamically from another form and pass filtered data based on a specific condition. This functionality can enhance user experience by allowing them to interact with multiple forms seamlessly, while keeping the data relevant and focused. In this blog, we’ll explore how to implement such a solution using X++, where a user clicks a button on Form 1 (such as a list of sales orders), and based on a selected record, Form 2 (such as invoice details) opens with only the relevant filtered data. Scenario Overview Let’s assume the following scenario: Form 1 : Displays a list of sales orders, and each order has an OrderID , CustomerID , and OrderAmount . Form 2 : Displays details of invoices (from the InvoiceDetails table) that are linked to the selected OrderID from Form 1 . The goal is to click a button on Form 1 , pass the OrderID to Form 2 , and display only the relevant invoice records relate...

Sorting Data in X++ (D365FO) Grids Using Form Data Source Events

  Introduction : In Dynamics 365 Finance and Operations, form grids often display data retrieved from a table or query. However, the default sorting applied may not always align with business requirements. Customizing sorting behavior at runtime ensures that the grid data is presented in a meaningful order for users. This blog post demonstrates how to use the Initialized event of a form data source to apply custom sorting to a grid. We will sort the grid rows based on a specific field ( DisplayOrder ) in ascending order. Understanding the Code : Here’s the complete code snippet: --------------------------------------------------------------------------------------------------------------- [FormDataSourceEventHandler(formDataSourceStr(MyFormDataSource,  MyTable), FormDataSourceEventType::Initialized)] public static void MyFormDataSource_OnInitialized(FormDataSource sender, FormDataSourceEventArgs e) {     // It will clear if any other sorting is applied on the grid ...