• Skip to main content
  • Skip to primary sidebar
  • Home
  • About
  • Recommended Readings
    • 2022 Book Reading
    • 2023 Recommended Readings
    • Book Reading 2024
    • Book Reading 2025
  • Supply Chain Management Guide
  • PKM
  • Microsoft Excel
  • Microsoft Copilot in Office 365
  • Public Wiki Page

Ali Raza Zaidi

A practitioner’s musings on Dynamics 365 Finance and Operations

X++

Embedding Websites in Microsoft Dynamics 365 Finance & Operations (D365FO)

July 1, 2026 by alirazazaidi

esterday, I worked on a small proof of concept (POC) to embed an external web page inside Microsoft Dynamics 365 Finance & Operations.

Initially, I thought the solution would require using an iframe. However, after some research, I discovered that WebsiteHostControl provides a much cleaner and more suitable approach.

The implementation is straightforward:

  1. Create a custom form.
  2. Apply the appropriate form pattern.
  3. Add a Tab control with a Tab Page.
  4. Add a Group control inside the Tab Page.
  5. Set the Group control’s Width Mode and Height Mode properties to Size to Available.

From there, you can add the WebsiteHostControl to the group and configure it to display the required external web page within the D365 Finance & Operations form.

Overall, it turned out to be much simpler than I initially expected, and WebsiteHostControl is the recommended approach for hosting external web content inside a D365 F&O form.

Then add a website host
Set its properties auto declaration to true
and Height mode and Width Mode to size to available

Inside form Initialize method just give url

public class FormTest extends FormRun
{
    /// <summary>
    ///
    /// </summary>
    public void init()
    {
        super();

        WebsiteHostControl1.url("https://www.tech.alirazazaidi.com");
    }

}



On running the form it will look like this

Error Log level – Error | Infolog diagnostic message: ‘Cannot create a record in Entity (DMFEntity) – D365 Finance and operations

July 10, 2025 by alirazazaidi

During development, I initially used the arbitrary name for the custom data entity. Later, during the review session, I updated the Label property of the data entity to align with proper naming conventions.

🔍 Best practice: Always use the label for the data entity display name, not hardcoded strings.

Since this was a small customization, I had directly written string values in some places, bypassing the label. However, when I triggered database synchronization, I encountered the following error:


❌ Error Message:

Error Log level - Error | Infolog diagnostic message:
'Cannot create a record in Entity (DMFEntity). 
Entity: ProductCreationValidationEntityV2, DSTProductCreationValidationStaging.'

🧪 Root Cause:

Upon investigation, I found that the DMFEntity table contained multiple entries with conflicting labels for the same data entity names. This typically occurs when:

  • You change the label or name of a data entity without cleaning up old records
  • The model or metadata has inconsistencies after refactoring

✅ Solution:

You need to identify and delete the duplicate or orphaned records from the DMFEntity table.


🔍 Sample Queries:

Run the following queries in SQL Server Management Studio (SSMS) against your AXDB database:

-- View existing records for the custom entities
SELECT * FROM DMFENTITY WHERE ENTITYNAME = 'ProductCreationValidationEntityV2';
SELECT * FROM DMFENTITY WHERE ENTITYNAME = 'ProductCreationValidationEntityV2Lines';
SELECT * FROM DMFENTITY WHERE ENTITYNAME = 'DSTProductCreationValidationEntity';

-- Delete the orphan/conflicting records
DELETE FROM DMFENTITY WHERE ENTITYNAME = 'ProductCreationValidationEntityV2';
DELETE FROM DMFENTITY WHERE ENTITYNAME = 'ProductCreationValidationEntityV2Lines';
DELETE FROM DMFENTITY WHERE ENTITYNAME = 'DSTProductCreationValidationEntity';

⚠️ Warning: Always take a database backup before running any DELETE operation.


🧰 Next Steps:

  • Perform a full build of your model
  • Run database synchronization again
  • Re-deploy the data entities, if required

Json deserialize issue in service class An exception occured when invoking the operation – Type ‘Class’ is not supported by serializer. D365 Finance and operations

April 10, 2025 by alirazazaidi

Yesterday, I was working on integration, and everything was going fine. However, when I tried to retrieve a string from the DataContract, it threw an error: “Type ‘Class’ is not supported by the serializer.” The issue persisted even when I used Newtonsoft. The rest of the logic was functioning correctly.

Eventually, I discovered that the issue was due to missing AX 2012 attributes on the list’s getter/setter or parameter. Once I added those attributes, the actual getter/setter started working as expected.

 [
    DataMemberAttribute('transactions'),  
    DataCollectionAttribute(Types::Class, classStr(DSTTransactionDC))  
  ]  
  public List Parmtransactions(List _transactions = transactions)  
  {  
    transactions = _transactions;  
return transactions;
  }

I have to add following

  AifCollectionTypeAttribute('_transactions', Types::Class, classStr(DSTTransactionDC)),
  AifCollectionTypeAttribute('return', Types::Class, classStr(DSTTransactionDC))

After that getter setter become something similar

 [
    DataMemberAttribute('transactions'),  
    DataCollectionAttribute(Types::Class, classStr(DSTTransactionDC)),  
    AifCollectionTypeAttribute('_transactions', Types::Class, classStr(DSTTransactionDC)),  
    AifCollectionTypeAttribute('return', Types::Class, classStr(DSTTransactionDC))  
  ]  
  public List Parmtransactions(List _transactions = transactions)  
  {  
    transactions = _transactions;  
 return transactions;
  }

after this change, datacontract easily serialise. 
Also change attribute at class header from datacontracattribute to dataContract.

Hope you like this post.

A Model with the same name already exists in the Metadata Store

March 19, 2025 by alirazazaidi

I learned a tough life lesson—greatness isn’t about doing big things. True greatness lies in doing small things with excellence.

Haha, this sounds familiar! I remember reading a quote from Napoleon Hill:

“If you cannot do great things, do small things in a great way.”

So here is small tip from my Personal Knowledge Management

I was importing a model to dev environment to built a common package for deployment. I found following error,

A Model with the same name already exists in the Metadata Store. Please delete the existing model if you want to install this model.

So I need to delete existing one and then import it again through command line

k:\AOSService\PackagesLocalDirectory\bin\ModelUtil.exe -delete -metadatastorepath=k:\AOSService\PackagesLocalDirectory -modelname="RanjahJogi"

After you can import model in some temp table in c drive.

k:\AOSService\PackagesLocalDirectory\bin\ModelUtil.exe -import -metadatastorepath=k:\aosservice\packageslocaldirectory -file=c:\temp\RanjahJogi.axmodel

How to fetch un-Invoiced Delivery notes for sales order – D365 Finance and Operations

March 1, 2025 by alirazazaidi

So here is another code snippet, that I develop after two hours of testing and understanding the D365 F&O that get all non invoiced , delivery notes or packingslip. I want to restrict the code to invoice against Delivery note, If no non posted delivery note exists, Code will not generate the invoice.

 public static str getUninvoicedPackingSlipsBySalesId(SalesId _salesId)
 {
     CustPackingSlipJour custPackingSlipJour;    // Packing slip journal
     InventTrans         inventTrans;            // Inventory transaction

     str packingSlipIds = "";
     container distinctPackingSlips;             // Container to store unique Packing Slip IDs
     int i = 0;

     // Fetch only un-invoiced Packing Slips based on Sales ID
     while select inventTrans
     where inventTrans.InvoiceId == ""
     
     join custPackingSlipJour
     where custPackingSlipJour.PackingSlipId == inventTrans.PackingSlipId
       && custPackingSlipJour.SalesId == _salesId
     {
         // Check if the Packing Slip ID is already in the container
         if (conFind(distinctPackingSlips, custPackingSlipJour.PackingSlipId) == 0)
         {
             distinctPackingSlips += custPackingSlipJour.PackingSlipId;  // Add to container if unique
                          
         }
     }

     return con2Str(distinctPackingSlips);  // Return the comma-separated string or empty if none found
 }

Sales order cancellation validation through event handler X++

November 30, 2024 by alirazazaidi

Hi friends, small tip, I got chancel to add validation in Cancel functionality of D365 Finance and operations.Interestingly the menu button called the class. So I have to write the pre event handler for main method.

Following is the [[Code Snippet]]

public static void SalesCancelOrder_Pre_main(XppPrePostArgs _args)
    {
     

        Args args =_args.getArg("args");
        SalesTable salesTable = args.record();
        CustmTable _Response;

        select * from _Response where _Response.PrimaryKey == salesTable.SalesId && _Response.TransType == CustmTransType::SalesOrder;
         
        if (_Response.RecId !=0)
        {
           // validateEventArgs.parmValidateResult(false);
           Error("This sales order is integrationed with wms, Cancellation is not recommended, use the cancellation dailog for Cancel in wms.");
            if (Box::yesNo("Sales order is integrated with WMS, Do you really want to cancel it.", DialogButton::No) == DialogButton::No)
            {
                throw Exception::Error;
            }
        }

       
    }

How write a simple dialog for input In D365 Finance and Operations X++

September 1, 2024 by alirazazaidi

What a difference between RunBase and RunBaseBatch.

RunBase is used to create dialog. While runBaseBatch can be used to set dialog box as batch job.

/

Today I have a simple tip. that help you to create a input box to get values. this class will create a dialog box. You can use this to replace your runable class logic.


class RequestCopyJob extends RunBase
{
DialogField fieldInvoice;
DialogField fieldName;

// Variables to store user input

CustomerInvoiceId _InvoiceId;

// pack() and unpack() methods are used to load the last value from user
// for our simple example we are not going to use them.
public container pack()
{
return conNull();
}

public boolean unpack(container packedClass)
{
return true;
}

public Object dialog()
{
Dialog dialog = super();

// Set a title for dialog
dialog.caption( ‘Simple Dialog’);

// Add a new field to Dialog
fieldInvoice = dialog.addField(extendedTypeStr(DSACustomerInvoiceId), ‘Invoice’);

return dialog;
}

public boolean getFromDialog()
{
_InvoiceId = fieldInvoice.value();
return super();
}

public void run()
{
// Set Dialog field value to find CustTable

EInvoiceServiceRequests _EInvoiceServiceRequest;

select forupdate * from _EInvoiceServiceRequest where _EInvoiceServiceRequest.CustomerInvoiceId ==_InvoiceId;
ttsbegin;
_EInvoiceServiceRequest.ResponseStatus = ServiceStatus::SUCCESS;
_EInvoiceServiceRequest.update();
ttscommit;

}

public static void main(Args _args)
{
RequestCopyJob Job = new RequestCopyJob();
// Prompt the dialog, if user clicks in OK it returns true
if (Job.prompt())
{
Job.run();
}
}

}

Json empty string to Null D365 finance and operations

June 10, 2024 by alirazazaidi

Small tip today

str myJson = FormJsonSerializer::serializeClass(sContract);
        myJson = strReplace(myJson,":"",",": null,");
        return myJson;

Like this

Relation between VendPackingSlipTrans and VendInoiceTRans D365 Finance and Operation

May 27, 2024 by alirazazaidi

One of my young colleuge needs a query so he can get packingslip line agains vend inoice trans. He was developing some report for procurement and sourcing.

I found my documentation about something similar almost 9 years ago.

Relation between VendPackingSlipTrans and VendInoiceTRans Dynamics Ax 2012

But a lot of things change from Ax 2012 to d365 Finance and operations.

Now if you required something similar following query will work.

VendInvoicePackingSlipQuantityMatch vendInvoicePackingSlipQuantityMatch;
        VendPackingSlipTrans vendPackingSlipTrans;

        select firstonly vendPackingSlipTrans
            exists join vendInvoicePackingSlipQuantityMatch
                where vendInvoicePackingSlipQuantityMatch.InvoiceSourceDocumentLIne == VendPackingSlipTrans.SourceDocumentLine &&
                      vendPackingSlipTrans.SourceDocumentLine == vendInvoicePackingSlipQuantityMatch.PackingSlipSourceDocumentLine;

application cannot be started. Contact the application vendor – Workflow Dynamics 365 for finance and operations

August 17, 2019 by alirazazaidi

Hi all, today, while opening Workflow designer, I found following error

application cannot be started. Contact the application vendor

For this I have to clear the cache with following statement, in Command prompt

rundll32 dfshim CleanOnlineAppCache

If still problem remains, install click Once extension in Chrome.

Other wise use dynamics in Microsoft Edge. I tried on Microsoft Edge. It works perfectly fine.

Happy Daxing.

Next Page »

Primary Sidebar

About

I am Dynamics AX/365 Finance and Operations consultant with years of implementation experience. I has helped several businesses implement and succeed with Dynamics AX/365 Finance and Operations. The goal of this website is to share insights, tips, and tricks to help end users and IT professionals.

Legal

Content published on this website are opinions, insights, tips, and tricks we have gained from years of Dynamics consulting and may not represent the opinions or views of any current or past employer. Any changes to an ERP system should be thoroughly tested before implementation.

Categories

  • Accounts Payable (2)
  • Advance Warehouse (2)
  • AI (3)
  • Asset Management (3)
  • Azure Functions (1)
  • Books (6)
  • Certification Guide (3)
  • ChatGPT (3)
  • Claude (1)
  • Customization Tips for D365 for Finance and Operations (63)
  • D365OF (60)
  • Data Management (1)
  • database restore (1)
  • Dynamics 365 (59)
  • Dynamics 365 for finance and operations (139)
  • Dynamics 365 for Operations (174)
  • Dynamics AX (AX 7) (134)
  • Dynamics AX 2012 (274)
  • Dynamics Ax 2012 Forms (13)
  • Dynamics Ax 2012 functional side (16)
  • Dynamics Ax 2012 Reporting SSRS Reports. (31)
  • Dynamics Ax 2012 Technical Side (52)
  • Dynamics Ax 7 (65)
  • Exam MB-330: Microsoft Dynamics 365 Supply Chain Management (7)
  • Excel Addin (1)
  • Favorites (12)
  • Financial Modules (6)
  • Functional (8)
  • General Journal (1)
  • Implementations (1)
  • Ledger (1)
  • Lifecycle Services (1)
  • Logseq (4)
  • Management Reporter (1)
  • Microsoft Excel (4)
  • MS Dynamics Ax 7 (64)
  • MVP summit (1)
  • MVP summit 2016 (1)
  • New Dynamics Ax (19)
  • Non Defined (9)
  • Note taking Apps (2)
  • Obsidian (4)
  • Personal Knowledge Management (3)
  • PKM (16)
  • Power Platform (6)
  • Procurement (5)
  • procurement and sourcing (6)
  • Product Information Management (4)
  • Product Management (6)
  • Production Control D365 for Finance and Operations (10)
  • Sale Order Process (10)
  • Sale Order Processing (10)
  • Sales and Distribution (5)
  • Soft Skill (1)
  • Supply Chain Management D365 F&O (5)
  • Tips and tricks (278)
  • Uncategorized (165)
  • Upgrade (1)
  • Web Cast (7)
  • White papers (4)
  • X++ (10)

Wiki

  • SCM

Copyright © 2026 · Magazine Pro On Genesis Framework · WordPress · Log in