Skip to main content

🚀 How to Dynamically Copy Matching Fields Between Tables in X++ using DictTable

 In Microsoft Dynamics AX (X++), there are many scenarios where you need to duplicate data from one table to another—especially during custom import, duplication, or versioning processes. Traditionally, this is done by manually assigning each field: targetTable.Field1 = sourceTable.Field1; targetTable.Field2 = sourceTable.Field2; ... But what if the tables have many fields ? Or maybe you’re dealing with multiple similar table pairs? That’s where the powerful DictTable class comes in. Let’s walk through how to use it to copy matching fields dynamically between two tables. đź’ˇ Use Case: Copy Customer Templates Let’s assume you have these tables: CustTemplateHeader – stores predefined customer templates. CustTemplateHeaderHistory – a historical copy of templates for versioning. You want to copy records from CustTemplateHeader to CustTemplateHeaderHistory , but only for fields that exist in both tables. âś… The Solution Using DictTable SalesHeaderTemplate   ...

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...");
        formRun.task(#taskRefresh); // This triggers a full UI refresh
    }
    else
    {
        warning("FormRun is NULL. Refresh skipped.");
    }
}


🔍 How It Works

  1. Gets the form instance using this.formRun().
  2. Checks if formRun is not null (to avoid errors).
  3. Calls formRun.task(#taskRefresh) to refresh the entire UI.
  4. Displays an info message when the refresh happens.

đź’ˇ When to Use?

  • After inserting or updating records that affect multiple data sources.
  • When you want to ensure all changes are reflected in the UI.

🔄 Refreshing a Specific Data Source

Instead of refreshing the entire form, sometimes you just need to refresh a specific data source. This can improve performance by reloading only the required data.

📌 X++ Code for Data Source Refresh


public void refreshDataSource()
{
   Table_ds.research(); // Refreshes only this data source
}

🔍 How It Works

  1. Calls research() on the specific data source to reload data.
  2. Does not affect other data sources in the form.

đź’ˇ When to Use?

  • When only a single table is updated, and you don’t need to refresh the full form.
  • To improve performance by avoiding unnecessary UI reloads.

🔄 Bonus: Ensuring Data Accuracy with reread()

If you're updating records but haven’t committed the changes to the database yet, you should use reread() before research().


public void refreshDataSource()

{

    Table_ds.reread(); // Reloads the latest uncommitted data

    Table_ds.research(); // Refreshes the UI

}


📝 Conclusion

Refreshing forms in D365FO is crucial for ensuring a smooth user experience. Depending on your needs, you can:
âś… Use taskRefresh to reload the entire form.
âś… Use research to refresh a single data source.
âś… Combine reread() + research() to handle unsaved changes.

By implementing these best practices, you’ll improve form responsiveness and data accuracy in your D365FO applications! 🚀



Comments

Popular posts from this blog

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