D365 Finance Archives - Page 2 of 2 - - Page 2

Tag Archives: D365 Finance

Create security role in D365 Finance and operation

In D365 Finance and Operations when you need to provide and restrict users from a certain operation you can make use of security roles. You can create security roles from Finance and operations environment itself or from its development tool i.e Visual Studio. In this blog, we are going to create a security role in Visual Studio as follows.   Create privilege    First of all we need to create privilege as follows now we need to add new entry point and set  object type in our case display menu item from properties Now add object name(display menu item  name) as follows   create role   Now we need to create role where above created privilege will be needed create new security role  as follows now we need to add new privilege in role as shown And from properties select privilege which we have created in previous step Create Duty   Now we have to create new duty and assign previously created privilege in its properties as shown Now we can see security role in FnO environment select any user from system administration>>users and click on assign role as follows and now search for priviously created role and click on Ok button now your security role is assigned to user with our role will be able to see the object like form, report etc except user with system administrator.  

Customize Purchase order approval status

In the case of D365 Finance and Operations when you approve purchase requisition by default system creates Purchase order with approval status as “Approved” as follows     To change this default behavior of system such that once purchase requisition is approved the approval status of the purchase order as a draft you can use the following class class CFSPOStatus {     /// <summary>     ///     /// </summary>     /// <param name=”args”></param>     [PostHandlerFor(classStr(PurchAutoCreate_PurchReq), methodStr(PurchAutoCreate_PurchReq, endUpdate))]     public static void PurchAutoCreate_PurchReq_Post_endUpdate(XppPrePostArgs args)     {         //PurchTable  purchTable = args.getThis(‘purchTable’);         PurchAutoCreate_PurchReq purchReq = args.getThis() as PurchAutoCreate_PurchReq;         PurchTable  purchTable, purchTablenew;         purchTable = purchReq.parmPurchTable();         ttsbegin;         select forupdate purchTablenew where purchTableNew.PurchId == purchTable.PurchId;         if(purchTablenew && purchTablenew.DocumentState == VersioningDocumentState::Approved)         {             purchTablenew.DocumentState = VersioningDocumentState::Draft;             purchTablenew.update();         }         ttscommit;     } }and your final result looks like And after changing status you can apply your own purchase order workflow on it. For purchase order workflow you can refer to my blog

Develop Custom Workflow:Counting Journals workflow

In this blog, you will learn how to develop a custom workflow that is not present out of the box in D365 Finance. For this blog I’m creating a workflow for Counting Journal (Inventory management>>Journal Entries>>Item Counting>>Counting) because there is no such workflow for inventory management module. The followings are steps that are to be followed. Steps:- 1.       Create a base Enum for Document Status 2.       Create a table extension and add Enum to table 3.       Add document status field to form extension 4.       Create query 5.       Create workflow category 6.       Create a workflow type 7.       Now add can submit workflow and updateworkflow methods to tables class extension 8.       Update submitmanager class 9.       Update EventHandler class 10.   Workflow approval creation 11.   Add an element to workflow Type 12.   Now add workflow setup form to the inventory management module Now we are performing steps in detail 1.       Create a base enum for Document Status Make sure you have created a solution, project and assign the model to the project. Now add new item and select Base Enum. And Add Base Enum and name it as CFS_InventoryCountingWorkflow   2.       Create a table extension and add enum to table We are creating a workflow for inventory management so we need to create an extension of InventoryJournalTable and drag above created base enum to table which will create a new field of type Enum.   3.       Add Document status field to form extension Now we need to create an extension of form InventJournalCount and add newly created table field to forms grid by dragging it from data source to form grid control and assign label as approval status.   4.       Create query Now again add a new query to project and name it as CFS_InventoryCountingWorkflow and add the InventJournalTable and set properties as follows   5.       Create workflow category Now we are going to add Workflow category to project and name it as   CFS_InventJournalCounting and set the properties as follows   6.       Create a workflow type After adding workflow category its time to add workflow type name it as CFS_InventoryJournalCounting  and set its properties as follows this will create new elements such as classes and action menu items for submit and all actions.   7.       Now add can submit workflow and updateworkflow methods to tables To add a method to the table we need to create a table class extension for that add a new class and name it as InventJournalTable_CFSExtension and need to add updateWorkflow and canSubmitWorkflow methods. You can use the following code [Extensionof(tableStr(InventJournalTable))] final class InventJournalTable_Extension {     public boolean canSubmitToWorkflow(str _workflowType)     {         boolean ret = next cansubmitToWorkflow(_workflowType);             ret = this.CFS_InventoryCountingWorkflow == CFS_InventoryCountingWorkflow::Draft;             return ret;     }     public static void updateWorkflowStatus(RecId _documentRecId, CFS_InventoryCountingWorkflow _status)     {         ttsbegin;             InventJournalTable document;             update_recordset document         setting CFS_InventoryCountingWorkflow = _status         where document.RecId == _documentRecId;             ttscommit;     } } 8.       Update submitmanager class Make sure you have the same name for submitting manager class or rename it as follows and following code to that public class CFS_InventoryJournalCountingSubmitManager {     private InventJournalTable document;     private WorkflowVersionTable versionTable;     private WorkflowComment comment;     private WorkflowWorkItemTable workItem;     private SysUserId userId;     private boolean isSubmission;     private WorkflowTypeName workflowType;     public static void main(Args args)    {           //  TODO:  Write code to execute once a work item is submitted.         if (args.record().TableId != tableNum(InventJournalTable))         {             throw error(‘Error attempting to submit document’);         }         InventJournalTable document = args.record();         FormRun caller = args.caller() as FormRun;         boolean isSubmission = args.parmEnum();         MenuItemName menuItem = args.menuItemName();         CFS_InventoryJournalCountingSubmitManager manager = CFS_InventoryJournalCountingSubmitManager::construct();         manager.init(document, isSubmission, caller.getActiveWorkflowConfiguration(), caller.getActiveWorkflowWorkItem());         if (manager.openSubmitDialog(menuItem))         {             manager.performSubmit(menuItem);         }         caller.updateWorkflowControls();    }     /// <summary>     /// Construct method     /// </summary>     /// <returns>new instance of submission manager</returns>     public static CFS_InventoryJournalCountingSubmitManager construct()     {         return new CFS_InventoryJournalCountingSubmitManager();     }     /// <summary>     /// parameter method for document     /// </summary>     /// <param name = “_document”>new document value</param>     /// <returns>current document</returns>     public Inventjournaltable parmDocument(Inventjournaltable _document = document)     {         document = _document;         return document;     }     /// <summary>     /// parameter method for version     /// </summary>     /// <param name = “_versionTable”>new version table value</param>     /// <returns>current version table</returns>     public WorkflowVersionTable parmVersionTable(WorkflowVersionTable _versionTable = versionTable)     {         versionTable = _versionTable;         return versionTable;     }     /// <summary>     /// parameter method for comment     /// </summary>     /// <param name = “_comment”>new comment value</param>     /// <returns>current comment value</returns>     public WorkflowComment parmComment(WorkflowComment _comment = comment)     {         comment = _comment;         return comment;     }     /// <summary>     /// parameter method for work item     /// </summary>     /// <param name = “_workItem”>new work item value</param>     /// <returns>current work item value</returns>     public WorkflowWorkItemTable parmWorkItem(WorkflowWorkItemTable _workItem = workItem)     {         workItem = _workItem;         return workItem;     }     /// <summary>     /// parameter method for user     /// </summary>     /// <param name = “_userId”>new user value</param>     /// <returns>current user value</returns>     public SysUserId parmUserId(SysUserId _userId = userId)     {         userId = _userId;         return userId;     }     /// <summary>     /// parameter method for isSubmission flag     /// </summary>     /// <param name = “_isSubmission”>flag value</param>     /// <returns>current flag value</returns>     public boolean parmIsSubmission(boolean _isSubmission = isSubmission)     {         isSubmission = _isSubmission;         return isSubmission;     }     /// <summary>     /// parameter method for workflow type     /// </summary>     /// <param name = “_workflowType”>new workflow type value</param>     /// <returns>current workflow type</returns>     public WorkflowTypeName parmWorkflowType(WorkflowTypeName _workflowType = workflowType)     {         workflowType = _workflowType;         return workflowType;     }     /// <summary>     /// Opens the submit dialog and returns result     /// </summary>     /// <returns>true if dialog closed okay</returns>     protected boolean openSubmitDialog(MenuItemName _menuItemName)     {         if (isSubmission)         {             return … Continue reading Develop Custom Workflow:Counting Journals workflow

How to Add Workflow form for D365 finance and Operation modules

In D365 Finance and Operation for some modules, there is no Workflow setup. eg:- Inventory management module. In such a case, we need to perform the following steps after which you can see the workflow setup form which will include all the workflows for that specific module. First, we need to add the Display menu item and set properties as: Enum Type parameter to ModuleAxapta and Enum Parameter to the module ( in our case Inventory ) Object Type to form. Object to WorkflowtableListPageRnr   After this create a menu extension of the module where we need to place the form. Drag the display menu item to the menu extension.   After a successful build,  we are set to enlist new workflows for an inventory module using workflow forms. The same way you can attach workflow form to the new module as follows:- Create an extension of ModuleAxapta Base Enum Add a new element to base enum and name it your custom module name and label it Create a new Display Menu Item and set its properties as follows Create a new menu and set its label and name as per your requirement And insert your display menu item to your custom menu/module Create an extension of “MainMenu” Menu and add new menu item reference and set its properties as follows Build the solution your Workflow setup form will be visible for that module

SEARCH :

FOLLOW CLOUDFRONTS BLOG :

[gravityform id="36" ajax="true"]

FOLLOW CLOUDFRONTS BLOG :