- Do a get latest on your dev box
- Clear any of your pending changes, if feasible. Or at least make them error free.
- Do a full build and synch, make sure there are no errors.
- Close the VS and any other application running on your machine.
- Close the RDP.
- Try to update your VM now.
Search This Blog
August 13, 2025
[Solved]The specified module 'C:\Program Files\Microsoft Security Client\MpProvider' was not loaded because no valid module file was found in any module directory.
July 11, 2025
WorthKnowing: Where to add new fields on Item master
When customizing the item master in Dynamics 365
Finance and Operations (D365FO), one common question is:
Should I extend InventTable or EcoResProduct?
Here’s a WorthKnowing guide to help you decide:
1. InventTable
- Purpose:
Holds inventory-specific data for released products.
- Scope:
Company-specific (per legal entity).
- Use
When:
You need to add fields related to: - Inventory
management
- Warehousing
- Sales
or purchasing
- Any
data that varies by company
- Examples:
Item group, inventory dimensions, default warehouse, sales price.
2. EcoResProduct
- Purpose:
Stores the core product definition (product master).
- Scope:
Shared across all companies (global).
- Use
When:
You need to add fields related to: - Product
identity
- Technical
specifications
- Data
that should be consistent across all legal entities
- Examples:
Product name, product type, product number, technical specs.
Knowing the difference between these two tables can save you
time and ensure your customizations align with D365FO’s architecture. Choose
wisely based on the scope and nature of your data.
July 08, 2025
New post series 'WorthKnowing'
- Hidden gems that have been around for a while but often go unnoticed
- New features and their best use cases
- Common functionalities you might be using differently than intended
- Similar looking things with their core differences
July 01, 2025
How to Remove a Model or ISV Solution from Dynamics 365 Finance and Operations (D365FO)
Hi Folks,
Removing a model or ISV solution from a Dynamics 365 Finance
and Operations (D365FO) environment can be a necessary step during system
cleanup, decommissioning unused features, or resolving conflicts. However, it
must be done carefully to avoid breaking dependencies or corrupting the
application metadata.
In this post I’ll Walk through the safe and structured
process of removing a model or ISV solution from D365FO.
Before you begin, ensure:
- You have access to a development
environment (Tier 1).
- You have admin rights in Visual
Studio and Lifecycle Services (LCS).
- You’ve taken a full backup of model you want to delete/remove.
- You’ve identified dependencies and verified that no other models rely on the one you’re removing.
1. Identify the Model
Open Visual Studio in your D365FO development environment:
·
Go to Dynamics 365 > Model Management
> Model Management.
·
Use the Model Util tool or
PowerShell to list installed models:
Get-AXModel -Details
Identify the model name, publisher, and layer (e.g., ISV, VAR, CUS).
2. Check for Dependencies
Use the Model Dependencies Report in Visual
Studio:
·
Go to Dynamics 365 > Model Management
> Model Dependencies.
·
Select the model and generate the report.
· Ensure no other models depend on the one you want to remove.
3. Uninstall the Model
If the model was installed via a deployable package (e.g., from an ISV), you’ll need to:
·
Remove the package from the
AOSService\PackagesLocalDirectory.
·
Delete the model folder manually.
·
Optionally, use PowerShell: (This command only
works for models installed via XPO or model store, not for package-based
deployments.)
Uninstall-AXModel -Model <ModelName
4. Rebuild and Synchronize
After removal:
- Open Visual Studio.
- Rebuild the solution to ensure no broken
references.
- Run Database Synchronization to update the schema.
5. Check in the changes
Do the code check in for deleted objects, make sure you select all deleted objects from your ‘pending changes’ tab.
6. Prepare package for Sandbox
·
Create DefaultModelDelete.txt This file tells
the system which models to remove. It must contain the exact model name as
registered in the model manifest. Just add exact model name in this file, if
there are multiple models pl add into next line for example,
§ Model1
§ MyISVModel
- Create a
new deployable package using your build pipeline or manually.
- Place
the DefaultModelDelete.txt file in the root of
the deployable package folder (same level as AXDeployablePackage).
- Ensure the model binaries and metadata are not included in the package.
7. Package deployment
· Upload the package to LCS Asset Library.
· Apply it to your sandbox or production environment.
· Monitor the deployment logs for confirmation that the model was removed.
Removing a model—especially in production—requires precision and planning. Using the DefaultModelDelete.txt method ensures a clean and supported way to decommission ISV or custom solutions without manual intervention in higher-tier environments.
June 30, 2025
Custom web service in D365FO - Part-II
In Part 1, we covered the foundational elements of creating
custom services in Dynamics 365 Finance and Operations (D365FO), including the
architecture, request/response contracts, and service class. In this second
part, we’ll explore how to implement business logic, test
your service, and handle errors effectively to ensure your
service is robust and production ready. Its important you take a look to my previous
post as I will carry on example from that post.
Implementing Business Logic
Once your service class is set up, the next step is to
implement meaningful business logic. This could involve querying tables,
performing validations, or updating records. Here's an enhanced version of
the processMsg() method with actual logic:
Testing the Service
Once deployed, you can test your service using tools
like Postman or SoapUI. Here's how to do it with
Postman:
- Set
the URL:
https://<your-environment>.cloudax.dynamics.com/api/services/TheAxaptaInterface/TheAxaptaService/processMsg
- Set
Headers:
- Content-Type: application/json
- Authorization:
Bearer token (use OAuth 2.0)
- Request
Body (JSON):
- Send
Request and inspect the response.
Error Handling and Logging
Robust error handling is essential for production-grade
services. Here are some best practices:
- Use
try-catch blocks to handle both X++ and CLR exceptions.
- Log
errors using the EventLog or custom logging frameworks.
- Return
meaningful messages in the response contract to help consumers
understand what went wrong.
- Avoid
exposing sensitive data in debug messages.
Example of logging:
EventLog::add(EventLogCategory::Application, EventLogLevel::Error, "CustomServiceError", response.parmDebugMessage());
June 23, 2025
[Solved] Unable to connect with Dev box Error code: 0xd07
- Log in to the VM using the alternate user.
- Open the Run dialog (press Win + R) and type: lusrmgr.msc
- This opens the Local Users and Groups management console.
- Find the admin user, right-click on it, and select Properties.
- Uncheck the option that says “Account is locked out” (or similar).
- Apply the changes and try logging in again with the admin account.
June 09, 2025
QuickFix: Unable to do PITR from Prod to sandbox
June 04, 2025
Configuring MT940 Bank Reconciliation in D365FO Using Electronic Reporting
May 29, 2025
Top 5 New Features in Dynamics 365FO
Microsoft’s 2025 Release Wave 1 for Dynamics 365 Finance and Operations brings a fresh wave of innovation, with AI, automation, and smarter data handling at its core. In this post I will share my thoughts on top 5 feature which I think will make huge difference in your day-to-day operations in near future.
1. Copilot-Powered Financial Task Assistance
What it does: Copilot now integrates directly into finance workspaces, allowing users to interact with financial data using natural language. It can generate reports, surface insights, and even guide users through complex processes. It helps users resolve financial tasks directly within their workspace using natural language prompts.
Why it matters: Imagine reconciling accounts or generating reports just by asking
Copilot. This reduces time spent navigating menus and boosts productivity for
finance teams.
ü Reduces reliance on IT or power users for data queries.
ü Speeds up decision-making with instant access to insights.
ü Minimizes training time for new users.
Some Use case:
ü A finance manager can ask Copilot to “show unreconciled transactions
for April” or “generate a cash flow forecast,” saving hours of manual work.
ü A CFO types: “Show me overdue customer invoices over £10,000” — Copilot
instantly returns a filtered list.
ü An accountant asks: “What’s the variance in budget vs actuals for Q1?”
— Copilot generates a visual report.
ü A finance analyst says: “Create a journal entry for payroll accruals” — Copilot guides them through the process.
2. Prepayment Sales Invoices
What it does: This feature allows businesses to issue and manage prepayment invoices as part of the sales order process. It supports partial or full prepayments and automatically applies them to final invoices. It enables businesses to create and manage prepayment invoices directly within the sales process.
Why it matters: This is a game-changer for industries where upfront payments are
standard (e.g., manufacturing, construction). It ensures better cash flow and
reduces manual tracking.
ü Improves cash flow by collecting payments earlier.
ü Reduces manual tracking of prepayments.
ü Enhances customer transparency and compliance.
Some Use case: A sales team can issue a prepayment invoice before shipping
goods, and the system automatically applies it to the final invoice.
ü A construction company requires 30% upfront before starting a project.
The system generates a prepayment invoice and applies it to the final billing
automatically.
ü A manufacturing firm selling custom machinery can issue a 50% prepayment invoice upon order confirmation, ensuring financial commitment before production begins.
3. Bank Foreign Currency Reconciliation
Automation
What it does: This feature automates the reconciliation of foreign currency transactions by matching bank statement lines with ledger entries, even when exchange rates differ. Automates the reconciliation of foreign currency transactions in bank statements.
Why it matters: Manual reconciliation of multi-currency accounts is
time-consuming and error-prone. Automation ensures accuracy and saves time.
ü Saves hours of manual reconciliation work.
ü Reduces errors in multi-currency environments.
ü Improves audit readiness and financial accuracy.
Some use case: A global finance team can reconcile USD, EUR, and GBP
transactions with minimal manual intervention, improving month-end closing
speed.
ü A global retailer with bank accounts in USD, EUR, and GBP can
automatically reconcile daily transactions, even when exchange rates fluctuate.
ü A finance team can close books faster by letting the system auto-match 90% of foreign currency entries, flagging only exceptions for review.
4. Create Dimensions and Cubes with Copilot
What it does: Users can now define financial dimensions and analytical cubes
using natural language. Copilot helps configure these for use in reporting and
Power BI dashboards.
Why it matters: This democratizes data modeling—no need for deep technical skills
to build powerful analytics.
ü Empowers business users to build analytics without technical help.
ü Accelerates time-to-insight for decision-makers.
ü Reduces dependency on IT or BI teams.
Some Use case: A business analyst can say, “Create a cube for sales by region
and product line,” and Copilot builds it, ready for Power BI integration.
ü A controller says: “Create a dimension for marketing spend by campaign
and region” — Copilot sets it up and links it to the general ledger.
ü A business analyst asks: “Build a cube showing sales, cost, and margin by product category” — Copilot generates the model, ready for Power BI.
5. Streamlined Integration with Business
Performance Analytics
What it does: This feature enhances the integration between D365FO and Business Performance Analytics (BPA), enabling real-time data refresh and seamless KPI tracking.
Why it matters: Real-time data refresh and seamless integration mean faster
insights and better decision-making.
ü Ensures executives always have access to the latest data.
ü Reduces manual data exports and refresh cycles.
ü Supports proactive decision-making with live dashboards.
Some use case: Executives can view up-to-date KPIs and forecasts in dashboards
without waiting for manual data exports or refreshes.
ü A CEO views a live dashboard showing revenue, gross margin, and
customer churn — all updated in real time from D365FO.
ü A finance team builds a rolling forecast model in BPA that pulls actuals from D365FO every hour, ensuring up-to-date planning.
Final Thoughts
[To try them
out, head to the Feature Management workspace in D365FO and
enable them in a test environment first.]
These features
reflect Microsoft’s commitment to AI-first, user-centric design.
Whether you're in finance, operations, or analytics, these tools are built
to save time, reduce errors, and empower smarter decisions.
If you're considering enabling these features, check the Feature Management workspace in D365FO to toggle them on and explore their setup.
April 09, 2025
How to trigger Business event using x++ code
March 17, 2025
Update admin user in Dev box
January 24, 2025
Custom web service in D365FO - Part-I
Introduction
Custom services in Dynamics 365 Finance and Operations (D365FO) allow you to expose custom business logic and data to external systems. This first part of the blog post will walk you through the basics of creating and consuming custom services in D365FO. Custom services are used to expose X++ business logic to external systems via SOAP or RESTful endpoints. They are ideal for scenarios where you need to implement complex business processes that are not covered by standard services.
In later posts, we will discuss some complex scenarios and best practices around web services.
Architecture
Service Request Contract
The service contract defines the operations that the service will expose. This is done by creating a new class with the [DataContractAttribute]
and [DataMemberAttribute]
attributes. There must be two contract classes: one for the request message and another for the response message. (We will cover this in detail in future posts).
Example:
[DataContractAttribute]
public class TheAxaptaRequestContract
{
private boolean isShipped;
private String255 dataAreaId;
private String255 storeNumber;
private String255 trackingNumber1;
[DataMember("TrackingNumber1")]
public String255 parmTrackingNumber1(String255 _trackingNumber1 = trackingNumber1)
{
trackingNumber1 = _trackingNumber1;
return trackingNumber1;
}
[DataMember("IsShipped")]
public boolean parmIsShipped(boolean _isShipped = isShipped)
{
isShipped = _isShipped;
return isShipped;
}
[DataMember("DataareaId")]
public String255 parmdataAreaId(String255 _dataAreaId = dataAreaId)
{
dataAreaId = _dataAreaId;
return dataAreaId;
}
[DataMember("StoreId")]
public String255 parmStoreNumber(String255 _storeNumber = storeNumber)
{
storeNumber = _storeNumber;
return storeNumber;
}
}
Service Response Contract
Example:
[DataContractAttribute]
public class TheAxaptaResponseContract
{
private boolean success;
private str errorMessage;
private str debugMessage;
private System.String salesOrder;
[DataMember("Message")]
public str parmMessage(str _value = errorMessage)
{
if (!prmIsDefault(_value))
{
errorMessage = _value;
}
return errorMessage;
}
[DataMember("Success")]
public Boolean parmSuccess(Boolean _value = success)
{
if (!prmIsDefault(_value))
{
success = _value;
}
return success;
}
[DataMember("DebugMessage")]
public str parmDebugMessage(str _value = debugMessage)
{
if (!prmIsDefault(_value))
{
debugMessage = _value;
}
return debugMessage;
}
}
Service Class
This is the class where the actual business operation executes. It takes the request message from the respective contract class and processes it to create a response message. Create a new class to implement the service. This class should extend the SysOperationServiceBase
class and include the business logic for the service operations.
Example:
public class TheAxaptaService extends SysOperationServiceBase
{
TheAxaptaResponseContract response = new TheAxaptaResponseContract ();
[AifCollectionType('salesOrder', Types::Class, classStr(TheAxaptaRequestContract)),
AifCollectionType('return', Types::Class, classStr(TheAxaptaResponseContract ))]
public processMsg()
{
TheAxaptaRequestContract request;
// Now you can access the parm methods of the request class to get different values from the request
Str StoreId = request.paramStoreNumber();
response.parmSuccess(True);
response.parmMessage("Message read");
}
}
Register the Service
Register the service in the AOT (Application Object Tree) by creating a new service node. Set the class and method properties to point to your service implementation.
- In the AOT, right-click Services and select New Service. (e.g. TheAxaptaInterface)
- Set the Class property to your service class (e.g., TheAxaptaService).
- Set the Method property to the service method (e.g., processMsg).
Deploy the Service
Deploy the service to make it available for consumption. This can be done by right-clicking the service node in the AOT and selecting Deploy Service Group.