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 *...

Introduction to X++ Variables

 X++ is a high-level programming language used primarily in Microsoft Dynamics 365 Finance and Operations. Understanding how variables work in X++ is fundamental for managing data and performing various operations within the ERP system.

What is a Variable?

A variable in X++ is an identifier that points to a memory location where data of a specific type is stored. The characteristics of a variable, such as size, precision, default value, and range, depend on its data type. Variables are crucial for storing and manipulating data during the execution of a program.

Variable Scope

The scope of a variable defines where it can be accessed within the code:

  • Instance Variables: Declared in class declarations and accessible from any method within the class or its extensions.
  • Local Variables: Declared within a method and can only be accessed within that method.

Declaring Variables

When you declare a variable, memory is allocated, and the variable is initialized to its default value. Variables can be declared anywhere within a code block, not necessarily at the beginning.

Constants

Constants are variables whose values cannot be changed after declaration. They are defined using the const or readonly keywords. Constants differ from read-only fields as they can only be assigned a value once, either at the declaration or in the constructor.

Variable Examples

Here are some examples of variable declarations and usage in X++:


// Variable declarations str variableName; CustInfo custNumber; // Simultaneous declaration and initialization real pi = 3.14159265359; // Initializing an object Access accessObject = new Access(); // Multiple declarations int i, j; int a[100, 5], b = 1; // Variable scope example class ScopeExample { int a; // Instance variable void aNewMethod() { int b; // Local variable } } // Inline field assignments public class FieldAssignmentExample { int field1 = 1; str field2 = "Banana"; void new() {} } // Constant declaration class ConstantExample { public const str MyContent = 'SomeValue'; public int ResultSoFar() { return 1; } }

Using var Keyword

The var keyword allows you to declare a variable without explicitly specifying its type, provided the type can be inferred from the initialization expression. This can make the code easier to read.

// Using var for clear types var var1 = "This is a string."; var var2 = 27; // Avoid using var for unclear types int var4 = myObject.ResultSoFar();

Variable Scope and Lifetime

Variables can be declared wherever statements are allowed, giving precise control over their scope and lifetime. This approach enhances readability, reduces the risk of inappropriate reuse, and simplifies code refactoring.

// Declaring variables within a loop void MyMethod() { for (int i = 0; i < 10; i++) { info(strfmt("i is %1", i)); } }

Constants, Read-only Variables, and Macros

Constants and read-only fields are essential for maintaining fixed values throughout the code. Macros offer similar functionality but without scope limitations and other features like documentation comments and IntelliSense support.


// Constant declaration private const str MyConstant = 'SomeValue'; str value = MyClass::MyConstant; // Inline constants { const int Blue = 0x0000FF; const int Green = 0x00FF00; const int Red = 0xFF0000; }

Null Values

X++ handles null values differently compared to other DBMSs. For each data type, a specific value is considered null:

TypeNull Value
Date1900-01-01
EnumElement with value 0
Integer0
Real0.0
StringEmpty string
Time00:00:00
Utcdatetime1900-01-01T00:00:00

Casting

Casting allows assignments between variables within the same inheritance chain. X++ supports both up-casting and down-casting, but down-casting should be used cautiously.


// Up-casting Animal a = new Horse(); // Down-casting (dangerous) Horse h = new Animal(); // Throws InvalidCastException at runtime

Example - Casting


public class MyClass2 { public static void Main(Args a) { Object obj = new Car(); Horse horse = obj; // exception now thrown horse.run(); // Used to call car.run()! } }

Use the is and as operators for safe casting:


// Safe casting with 'is' and 'as' if (obj is Horse) { Horse horse = obj as Horse; horse.run(); }

Understanding and using variables effectively in X++ is essential for efficient programming and data management in Dynamics 365 Finance and Operations. By mastering these concepts, you can write more robust, readable, and maintainable code.

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 ...