There are lot of blogs and community pages available that shows enthusiasm of ever increasing professionals and reach of MS Dynamics products to Customers. As D365 FnO and its functionalities are expanding so the need for learning materials and forum participation increases to tackle day to day issues we may face while implementing AX/D365. This is one more blog to distribute and spread knowledge I have gained throughout the years in D365 FnO. (load the scripts for better view of the codes)
Wednesday, 27 September 2023
Service update failure due to Globalupdate script for service model: AOSService on VM failed due to report deployment
Thursday, 19 January 2023
Perform operation at Entity level post all Target data Insert in D365 FnO
There are often requirements where we need to perform some operation(s) Just after target data is inserted/updated fully for all records.
There is a method that can be used at Entity level known as postTargetProcess
Drawback of this method is that It only can be used with Data management framework in non-set based entities.
It can also not be used with Odata operations.
Method can be implemented as below
public class SaddafDemoEntity extends common { /// <summary> /// Post insert into target /// </summary> /// <param name = "_dmfDefinitionGroupExecution">DMFDefinitionGroupExecution</param> public static void postTargetProcess(DMFDefinitionGroupExecution _dmfDefinitionGroupExecution) { TestHeaderTable headerTable; SaddafDemoStaging staging; select firstonly forupdate integrationImportTable where integrationImportTable.DMFExecutionId == _dmfDefinitionGroupExecution.ExecutionId; select count(Recid) from staging where staging.DefinitionGroup == _dmfDefinitionGroupExecution.DefinitionGroup && staging.ExecutionId == _dmfDefinitionGroupExecution.ExecutionId && staging.TransferStatus == DMFTransferStatus::Completed; ttsbegin; headerTable.RecordCount = staging.RecId headerTable.update(); ttscommit; } }For Entities using set based operations, we have a tricky workaround by using an Post event handler for a write method of DmfEntityWriter class.
[PostHandlerFor(classStr(DmfEntityWriter), methodStr(DmfEntityWriter, write))] public static void DmfEntityWriter_Post_write(XppPrePostArgs args) { DMFDefinitionGroupExecution dmfDefinitionGroupExecution = args.getArg('_definitionGroupExecution'); str entityName = dmfDefinitionGroupExecution.EntityXMLName; switch (entityName) { case 'SaddafDemoEntity': TestHeaderTable headerTable; SaddafDemoStaging staging; select firstonly forupdate integrationImportTable where integrationImportTable.DMFExecutionId == dmfDefinitionGroupExecution.ExecutionId; select count(Recid) from staging where staging.DefinitionGroup == dmfDefinitionGroupExecution.DefinitionGroup && staging.ExecutionId == dmfDefinitionGroupExecution.ExecutionId && staging.TransferStatus == DMFTransferStatus::Completed; ttsbegin; headerTable.RecordCount = staging.RecId headerTable.update(); ttscommit; break; } }Unfortunately there is nothing similar for Odata, but Odata has its own set of capabilities to supersede all shortcomings.
Perform operation at Entity level post all Staging data Insert or Before Target insert starts in D365 FnO
As the title suggests, there are sometimes requirements where we need to perform some operation(s) Just before target data insert operation triggers (or in between the whole DMF cycle) but not at the any datasource event or at the Entity insert method.
One of such requirement can where the Any Header data to be populated before line insertion.
Good news is we have a way to achieve it via postGetStagingData method at Entity level, Bad news is it works only after staging is inserted and works even if all target data fails validation.
Below is the implementation way for that
public class SaddafDemoEntity extends common { /// <summary> /// Post staging data /// </summary> /// <param name = "_dmfDefinitionGroupExecution">DMFDefinitionGroupExecution</param> public static void postGetStagingData(DMFDefinitionGroupExecution _dmfDefinitionGroupExecution) { TestHeaderTable headerTable; SaddafDemoStaging staging; select firstonly staging where staging.DefinitionGroup == _dmfDefinitionGroupExecution.DefinitionGroup && staging.ExecutionId == _dmfDefinitionGroupExecution.ExecutionId; headerTable.DMFExecutionId = staging.ExecutionId; //Just the example, you can use any field needed headerTable.insert();
ttsbegin; staging = null; update_recordset staging setting ParentRefRecId = headerTable.RecId
where staging.DefinitionGroup == _dmfDefinitionGroupExecution.DefinitionGroup && staging.ExecutionId == _dmfDefinitionGroupExecution.ExecutionId; ttscommit; } }
-
This way of setting Multiselectlookup(Lookup that allows Multiple value selections) can be used on any module (SSRS, Service, Batch or simp...
-
Below method can be used to mark the Invoice amounts for settlement in very easy way. In your code to loop through ledgerjournaltrans(ass...
-
In my case, I am going to create Payment journal and vouchers based on multiple Free text invoices. Same process can also be followed for m...