Business Event Create and Implement – Dynamics 365 For Finance and Operations – X++

Introduction:

Business event introduced in Microsoft Dynamics 365 for Finance and operations to trigger the business process based events and to talk to external systems and by default Microsoft provide some default business(example VendorInvoicePostedBusinessEvent to understand how it works.

Scenario:

Whenever sales invoice is posted then business event should be trigger only in case of specific item. To implement this below is the procedure.

Implementation steps:

3 steps for every business event

1. Build the contract
2. Build the event
3. Code to send the event

Two Classes involves:

Business Event -This class extends the BusinessEventBase , supports constructing the business event, building payload and sending business event

Example of BusinessEvent Class (SalesOrderCreation, update, Delete in that case the BusinessEvent class name should be like SalesOrderCRUDOperation) same goes for Purchase order etc

Business Event Contract – This class extends the BusinessEventsContract class. it defines the payload of business event and allows for population of contract at runtime.

 

 

Implementation :

Example is on Creation of Customer Invoice Transactions return specific item number,name, quantity and amount
Define the contract class
[DataContract]
public final class CustomerInvoiceTransactionItem90Contract extends BusinessEventsContract
{
    private ProdName productName;
    private ItemId itemId;
    private int quantity;
    private amount itemAmount;
    /// <summary>
    /// Initialise method
    /// </summary>
    /// <param name = “_invoiceTrans”> </param>
    private void initialize(CustInvoiceTrans _invoiceTrans)
    {
        CustInvoiceJour custInvoiceJour =                CustInvoiceJour::findFromCustInvoiceTrans(_invoiceTrans.SalesId,_invoiceTrans.InvoiceId,_invoiceTrans.InvoiceDate,_invoiceTrans.numberSequenceGroup);
SalesTable salesTable = SalesTable::find(_invoiceTrans.SalesId);
CustTable custTable = CustTable::find(salesTable.CustAccount);
        // get the variable values
        productName =    EcoResProduct::findByProductNumber(_invoiceTrans.ItemId).productName();
 itemId = _invoiceTrans.itemId;
 quantity = _invoiceTrans.quantity;
 itemAmount = _invoiceTrans.LineAmount;
}
    /// <summary>
    ///
    /// </summary>
    /// <param name = “_invoiceLine”></param>
    /// <returns></returns>
    public static CustomerInvoiceTransactionItem90Contract newFromInvoice(CustInvoiceTrans _invoiceLine)
    {
           CustomerInvoiceTransactionItem90Contract contract = new
                                                                              CustomerInvoiceTransactionItem90Contract();
           contract.initialize(_invoiceLine);
           return contract;
    }
    private void new()
    {
    }
    [DataMember(‘ProductName’), BusinessEventsDataMember(“Product Name”)]
    public ProdName parmProdName(str _productName = productName)
    {
        productName = _productName;
        return productName;
    }
    [DataMember(‘itemId’), BusinessEventsDataMember(“Item Number”)]
    public str parmSerialNumber(str _itemId = itemId)
    {
        itemId = _itemId;
        return itemId;
    }
    [DataMember(‘quantity’), BusinessEventsDataMember(“Quantity”)]
    public str parmLineId(str _quantity = quantity)
    {
        quantity = _quantity;
        return quantity;
    }
    [DataMember(‘itemAmount’), BusinessEventsDataMember(“itemAmount”)]
    public str parmfoPartyType(str _itemAmount = itemAmount)
    {
        itemAmount = _itemAmount;
        return itemAmount;
    }
}
Define the Business Event Class
 [BusinessEvents(classStr(CustomerInvoiceTransactionItem90Contract),
    “Customer Invoice Transaction”,
    “This business event is triggered when an invoice is created.”,
    ModuleAxapta::SalesOrder)]
     public class CustInvoiceTransCreatedBusinessEvent extends BusinessEventsBase
 {
     CustInvoiceTrans custInvoiceTrans;
      private custInvoiceTrans parmInvoiceTrans(CustInvoiceTrans _custInvoiceTrans =              custInvoiceTrans)
     {
         custInvoiceTrans = _custInvoiceTrans;
         return custInvoiceTrans;
     }
     private void new()
     {
     }
     [Wrappable(true), Replaceable(true)]
     public BusinessEventsContract buildContract()
     {
         return      CustomerInvoiceTransactionItem90Contract::newFromInvoice(custInvoiceTrans);
     }
    static public CustInvoiceTransCreatedBusinessEvent    newFromInvoice(CustInvoiceTrans _custInvoiceTrans)
     {
         CustInvoiceTransCreatedBusinessEvent event = new       CustInvoiceTransCreatedBusinessEvent();
        event.parmInvoiceTrans(_custInvoiceTrans);
         return event;
     }
}
Code to invoke the event : below is the code that invoke the business event classes that we define above
 [DataEventHandler(tableStr(CustInvoiceTrans), DataEventType::Inserted)]
    public static void CustInvoiceTrans_onInserted(Common sender, DataEventArgs e)
    {
        CustInvoiceTrans invoiceTrans = sender as CustInvoiceTrans;
        boolean isEvent = BusinessEventsConfigurationReader::isBusinessEventEnabled(classStr(CustInvoiceTransCreatedBusinessEvent));
        if (isEvent)
        {
            if(invoiceTrans.itemid==’item90′)
            {
                CustInvoiceTransCreatedBusinessEvent::newFromInvoice(sender).send();
            }
        }
    }
  • After finishing the above code and rebuilding the project then you have to go business event catalogue in the system administration
  • You will find your newly created business event in the list
  • Then from your end point application register the business event , once successfully registered than you will find the end point in your business event catalog Endpoint tab
  • Activate the business event , you are ready to use the newly created business event.

 

Note: Business event can be activated only in 1 legal entity  or all , if you don’t selected any legal entity during activation then it will be activated for all else only for selected legal entity

General Electronic Reporting (GER) or Electronic Reporting (ER) in Dynamics 365 for Finance – Part 1

It is a configureable tool  for regulatory reporting, payments and electronic reporting.

The ER engine is targeted on the business users instead of developers. Because you configure formats instead of code.

ER supports :

  • TEXT
  • XML
  • PDF
  • Microsoft word document
  • Open XML Worksheets

 

The ER tool allows you to configure formats for electronic documents in accordance with the legal requirements of various countries or regions. ER lets you manage these formats during their life cycle.

 

ER engine capabilities:

  • single shared tool for electronic reporting in different domains, and replace more than 20 engines that do some electronic reporting for Finance.
  • Its reports formats is applicable to different versions of Finance means report dependancy not on the version of the finance.
  • Custom formats can be created based on original formats. Easily can change the format based on the requirement due its support for localisation.
  • It becomes the primary standard tool of electronic reporting for both Microsoft and Microsoft Partners.

 

 

 

Mark record in the grid get on the form data source – AX2012 R3 – Dynamics 365 for Finance and Operations

Scenario: You have 10 records in the grid and want to select(mark) on 5 and perform operations.  Then use below code to select mark records

Solution 1:

 

Hcmworker hcmWorker; // table

hcmWorker = this.getfirst(1);// 1 is reflecting the mark records

while (hcmworker)

{

//write custom code to perform operations

 

hcmworker = this.getNext()

}

 

Solution 2:

 

Hcmworker hcmWorker; // table

for(hcmWorker=hcmWorker_ds.getFirst(1);hcmworker;hcmworker=hcmworker_ds.getNext())

{

}

 

Batch job could not be found. Dynamics 365 for Finance and Operations, Ax2012 R3

Scenario/Problem:

Sometimes users facing an issue in the batch jobs when they delete the batch job in executing state from the back end or for any other reason(like batch job stuck in executing stage). Then they need to perform below steps to resolve the issue.

In my  case i was facing issue in the workflow batch job and my workflow are not working even after restarting the server or service.

Solution:

 

Perform select query on the below tables with caption filter by typing the keyword of the job you are looking for.

Batch and Batchjobs

Deleted batchjob has been deleted from Batchjob table but not from Batch table. So, I performed below query and my issue has been resolved.

 

First select query on both tables and then delete query to delete the records.

 

Screen Shot 2019-12-15 at 10.12.09 AM

The natural key for the table was not found. Microsoft Dynamics 365 for Finance and Operations – Microsoft Visual Studio

Scenario: Sometimes users facing the error ‘The natural key for the table was not found‘.

 

Screen Shot 2019-12-06 at 4.16.23 PM.png

 

Solution:

Open the table on which you are facing error. Then add the primary index like below

 

Screen Shot 2019-12-06 at 4.19.25 PM.png

 

After adding index synchronize the table and then try to create Data entity again.

Warning: Package folder already exists in deployment pipeline azure devops – Dynamics 365 For Finance and Operations

Issue:

When package creation is in routine work or often then users will receive below warning.

“Package folder already exists in deployment pipeline azure devops””

Resolution:

This is just a warning so users can ignore this message and check the other errors in the log file.

A financial dimension value is based on the ” record and has been used on a transaction. You cannot delete the ” record – Dynamics 365 for finance and operations – AX2012 R3

Scenario:

Sometime user trying to delete a record from the customer master or any data that relates to financial dimension. So, user is facing above error upon deletion.

Reason:

Error occurred because data exists in the table DimensionAttributeLevelValue

Solution:

  1. Access the open the table DimensionAttributeLevelValue 
  2. filter the record by Display Value field with the desired record to delete like customer number or employee number etc etc
  3. Select the filtered records
  4. Delete the selected records
  5. Then go back to customer master or where you facing the error
  6. Now try to delete you will be able to delete

 

AX 2012: you can directly delete the record by opening table

D365 : you can delete by access the SQL or write the runnable class to delete

 

How to apply platform update on local VM or development VM Dynamics 365 for Finance and Operations

Scenario: We were using dev environment of Dynamics Finance and Operations with Application release version 10.0 platform update 24. Microsoft released a new version 10.0.5 with platform update 26.

Now we have two options to use the new version.

  1.  Download new VM and moved the custom models to the newly created VM
  2. upgrade the current VM on the latest update

In first option we need to create and setup the testing data again to test the code.

2nd option everything will remain same and no extra effort needed other than the applying update.

Definitely we selected the 2nd option and below steps were performed to update the environment.

Steps:

  • Download the latest release package from the asset library to the local VM development environment
  • Unzip the zip file to the local VM in C drive by creating a custom folder (folder should not be in the users folder directory). I created  with below name FnO10.0.234.10001App
  • Stop the following services (Batch, Data import and IIS)
  • Close Visual studio instances
  • open command prompt as administrator
  • set the directory to your custom folder contains the unzip files
    • C:\FnO10.0.234.10001App>
  • Run the below command to check the list of components installed
    • C:\FnO10.0.234.10001App>AxUpdateInstaller.exe list
  • From the above command you will get all the components already installedCommponents versions before update.png
  • update the DefaultTopologyData.xml file located in the update folder in my case located in below location
    • FnO10.0.234.10001App -> DefaultTopologyData.xml

 

  • Best way to update this file copy on another location edit like below and replace in the above folderDefaultTopologyData file.png

 

  • Generate the run book thru command prompt using below command
    • Actual command: AXUpdateInstaller.exe generate -runbookid=[runbookID] -topologyfile=[topologyFile] -servicemodelfile=[serviceModelFile] -runbookfile=[runbookFile]
    • [runbookID]– A parameter that is specified by the developer who applies the deployable package.
    • [topologyFile]– The path of the DefaultTopologyData.xml file.
    • [serviceModelFile]– The path of the DefaultServiceModelData.xml file.
    • [runbookFile]– The name of the runbook file to generate (for example, AOSRunbook.xml).
    • Should be modify as below
    • AXUpdateInstaller.exe generate -runbookid=”Dev-runbook” -topologyfile=”DefaultTopologyData.xml -servicemodelfile=”DefaultServiceModelData.xml” -runbookfile=”Dev-runbook.xml”

 

  • Import the run thru command prompt using below command
    • AXUpdateInstaller.exe import -runbookfile=”Dev-runbook.xml”

 

  • Execute the runbook thru command prompt using below command
    • AXUpdateInstaller.exe execute -runbookid=”Dev-runbook”

runbook execute.png

This step is the longest step involving many sub-steps performed during this step.

Some steps even takes 2,3 or may more hours. please make sure system will not logout neither shutdown.

if any step fails during this step use below command to rerun

For me its fails on 19 step

runbook step rerun.png

 

Wait till last step completed

 

runbook execution complete.png

 

  • Verify the installation by running below command
    • AXUpdateInstaller.exe list

updated version list.png

You can check the version also by login to the dynamics browser about option.

 

Screen Shot 2019-11-26 at 11.37.19 AM.png

 

Please leave comment in the comments section if you are facing any issue while updating. I will try to assist.

 

Good luck!!!

 

Uninstall a deployable package from sandbox(UAT) environment or production- Dynamics 365 for Finance and Operations

Scenario: Sometime we need to uninstall a deployable package from the UAT or Production environment.

 

Solution:

Below are the steps that need to be performed to uninstall a package.

 

  • Create a deployable package using visual studio or Build server
  • Do not extract the deployable package that is in ZIP folder (If you extract the zip folder you will face issue invalid HotfixInstallationInfo.xml file)
  • Just open the deployable package zip folder
  • Go to Deployable package zip folder -> AOS service -> Scripts folder
  • create a text file name ‘ModuleToRemove’
  • Write the module name to be removed in the the ModuleToRemove file

Screen Shot 2019-11-23 at 9.10.48 PM

 

  •  If you have multiple models to remove then write mode name per line as below
    • Model1
    • Model2
    • Model3
  • Note: In multiple models removing write the models name in sequence as per dependency sequence
  • Go back to main zip folder and find the file HotfixInstallationInfo.xml ,copy the file to some other location and edit the file like below

<MetadataModuleList>
</MetadataModuleList>

 

<AllComponentList>
<ArrayOfString>
</ArrayOfString>
</AllComponentList>

  • Edit the file should be same as above.
  • Copy and replace the HotfixInstallationInfo.xml file in the deployable folder
  • upload the file in the asset library and apply the package to the UAT environment first if applied successfully then apply to the production environment.

 

Please leave comments if you are facing any issue.

 

 

 

How to connect Power BI with Dynamics 365 for Finance and Operations

Below are the steps to connect Power BI with Microsoft Dynamics 365 for Finance and Operations

 

  1. Download and install the Power BI Desktop
  2. Sign in with the Licensed account
  3. In Power BI desktop ribbon click on Get Data
  4. Select OData Feed
  5. Enter the URL of the environment
  6. URL should be look like this https://operations.dynamics.com/data
  7. Enter the credentials of the user account in AX/D365. Organizational account account should be better rest base upon the requirement.
  8. Once everything done , next step is downloading the tables based on the security rights and privileges of the user.
  9. Now you can select the table from the list and start working on it for your workspace.

 

 

Follow the steps to connect and do let us know if you are facing any issue.

Report Name dynamic change -attachment file Thru print management – Ax2012 – Dynamics 365 for Finance and operations

Scenario: Sometime a requirement to change the report name in the email thru print management need to change dynamically.

Solution:

Class name where changes need to be done.

Report name update in the email

Class.Method: SRSReportRunPrinter.ToEmail()

check the report name in this method and update the file name as per requirement.

 

Report name update in the PDF and screen viewer

Class.Method: PrintMgmtReportRun.Execute()

  • check the report name
  • check the conditions for file and screen viewer
  • update the file name for file condition
  • update the file name and caption for the report

 

For Dynamics 365 for finance and operations use the post events of both methods

 

 

 

What’s new or changed in Dynamics Finance version 10.0.7 , – (January 2020)

Below are summary about the new update of Microsoft Dynamics Finance and Operations apps version 10.0.7

  1. Budget Register Entry Enhancements
  2. Ability to export records from the accounts payable invoice pool
  3. Ledger Settlements by User
  4. Forecast position reports(Public sector)
  5. Mark a Purchase agreement as closed
    • Users can now mark a Purchase agreement as “Closed” to signal the agreement is no longer actively used, making it so users will not be able to create release orders from the purchase agreement.
  6. Delayed Tax calculation on journal
  7. Reverse Journal posting
  8. Stop workflow submission when there are unallocated charges on a vendor invoice
  9. Account group selection for Chinese voucher types
  10. Sort resource in the project by invoice proposal
  11. Run Settle and post sales tax in batch mode
  12. Tax engine GTE (only available for India

For more details visit Microsoft Documentation using below link

 

Whats changed in 10.0.7

Entity Relationship – Common Data Service – CDS

Entity Relationships:

Entity relationships are metadata. Entity relationships define the different ways of entity records can be associated to different entity records from other entities or the same entity. Entity relationships allows the query to retrieve data efficiently.

Types of Entity relationships:

There are two types of entity relationships

One-to-many relationships:

Many related entity records associated with a single entity record (1:N) ,a parent/child relation.

Many-to-many relationships:

Many entity records are associated with many other entity records. A N to N( N:N) relation.

Entity relationship (1:N) do the following tasks, other than define the relations between the entities:

  • If record deleted on the parent entity then the record associated in the child entities also deleted.
  • When assign a record to a new owner, associated records also assign to the new owner.
  • How the record and related records will be visible to the users.

 

Previous Topic:

Entities – Common Data Service – CDS

 

 

Entities – Common Data Service – CDS

Entity:

Data is stored in the Common Data Service database is defined as entity. Entity corresponds to a database table and each field within an entity represents a column in that table.

Common Data service, metadata(data about data), is a collection of entities. Entity metadata controls the kinds of records you can create and type of actions performed on them. When we create or edit the entities,fields relationships, we are editing this metadata.

Common data service comes with a number of  standard entities that support the core business applications.We need to become familiar with the catalog of standard entities.

For minor changes we don’t need to create new custom entities:

  • To change the field display name or label we don’t need to create custom entity.
  • We cannot delete the standard entities but we can hide them by changing the security role assignment.

 

Previous Topic:

What is Common Data Service?

Next Topic:

Entity Relationship – Common Data Service – CDS

How delete a specific model/package? Uninstall deployable package. Microsoft Dynamics 365 for Finance and Operations

Sometimes we need to delete the model and deployable package from the dev environments.

 

Model Deletion:

use Modelutil.exe to delete the model file from the packages local directory.

 

Package installation or deletion:

 

  1. Stop IIS (kill the IIS worker process from the task manager)
  2. Stop batch job DynamicsAXBatch job
  3. Delete the package folder located on C:\ or K:\AosService\PackagesLocalDirectory (make sure folder completely deleted)
  4. Open VS Dynamics -> Model Management -> Refresh models