Thursday 6 May 2021

File upload for entity '' in data project 'xxx' did not succeed.

 Error:

  1. File upload for entity '' in data project 'xxx' did not succeed.


Above error raised during file upload on project with package option.


  1. Unable to connect to remote server

This error raised when try to load default templates on data management > templates


Resolution:


start the Azure storage emulator by following the steps below:


on server, run command prompt as administrator.

Navigate to “C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator\”

Run “AzureStorageEmulator.exe start”

This should resolve the issue reported above which surfaces while exporting data through data entities in Dynamics 365 for Operations.


Tuesday 22 September 2020

Create custom workflow D365 finance & Operations

Create custom workflow D365 finance & Operations


Create customized workflow on service management module for service agreement. There isn’t any workflow available for this module.
  • Enum

  • add field on the table

  • query

  • workflow category

  • workflow type

  • workflow Approval

  • add workflow approval to workflow type

  • Enable workflow on form

  • Create workflow


Difference between AX 2012 and D365 F&O Customizing workflow, which I came across, is the extension of methods on table as overlayering is now not allowed on D365 F&O. The rest of the process is the same.


Create Enum


  • Create new enum for the workflow status

Create a new field on the table

  • Here we use a table SMAAgreementTable. Create extension of table and Drag enum to table.

Create methods on table


  • Create a new class. Name it “devSMAAgreementTable_Extension”

  • Extend for table “SMAAgreementTable”.

  • Create methods

    • canSubmitToWorkflow

    • UpdateCustWorkflowState

  • “canSubmitToWorkflow” method will be using a chain of command. (use of next keyword)


public boolean canSubmitToWorkflow(str _workflowType)

    {

        boolean ret = next canSubmitToWorkflow(_workflowType);


        ret = this.RecId != 0 && this.workflowStatus == workflowstatus::Draft;


        return ret;

    }



 

Create new query

  • Here we use SMAAgreementTableListPage query


Create workflow category


  • Click on Add > New item > Business process and workflow > Workflow category

  • Enter proper name 


  • Set property as below.

    • Label = “Service agreement workflow category”

    • Module = Salesorder (as of now we add workflow to AR. So workflow will list under AR module)


Create workflow type


Create new workflow type as below:

Click on Add > New item > Business process and workflow > Workflow type 



  • Edit devServiceAgreementWFTypeEventHandler class as below 

public void started(WorkflowEventArgs _workflowEventArgs)

{

        SMAAgreementTable::UpdateCustWorkflowState(_workflowEventArgs.parmWorkflowContext().parmRecId(), workflowstatus::Pending);

}


     public void canceled(WorkflowEventArgs _workflowEventArgs)

{

        SMAAgreementTable::UpdateCustWorkflowState(_workflowEventArgs.parmWorkflowContext().parmRecId(), workflowstatus::Cancel);

}


     public void completed(WorkflowEventArgs _workflowEventArgs)

{

        SMAAgreementTable::UpdateCustWorkflowState(_workflowEventArgs.parmWorkflowContext().parmRecId(), workflowstatus::Completed);

}



  • Write code on submit manager class

public static void main(Args _args)

{

        SMAAgreementTable ObjSMAAgreementTable;

        devServiceAgreementWFTypeSubmitManager submitManger = new devServiceAgreementWFTypeSubmitManager();

        recId _recId = _args.record().RecId;

        WorkflowCorrelationId _workflowCorrelationId;

 

        workflowTypeName _workflowTypeName = workFlowTypeStr("devServiceAgreementWFType");

        WorkflowComment note = "";

        WorkflowSubmitDialog workflowSubmitDialog;

                    

        //Opens the submit to workflow dialog.

        workflowSubmitDialog = WorkflowSubmitDialog::construct(_args.caller().getActiveWorkflowConfiguration());

        workflowSubmitDialog.run();


        if (workflowSubmitDialog.parmIsClosedOK())

        {

            ObjSMAAgreementTable = _args.record();

            // Get comments from the submit to workflow dialog.

            note = workflowSubmitDialog.parmWorkflowComment();


            try

            {

                ttsbegin;

                // Activate the workflow.

                _workflowCorrelationId = Workflow::activateFromWorkflowType(_workflowTypeName, ObjSMAAgreementTable.RecId, note, NoYes::No);



                ObjSMAAgreementTable.workflowstatus = workflowstatus::Submitted;

                ObjSMAAgreementTable.update();

                ttscommit;


                // Send an Infolog message.

                info("Submitted to workflow.");

            }

            catch (Exception::Error)

            {

                error("Error on workflow activation.");

            }

        }



        _args.caller().updateWorkFlowControls();

}


Create workflow Approval


Click on Add > New item > Business process and workflow > Workflow Approval



  • Update devServiceAgreementWFApprovalEventHandler eventhandler class

public void started(WorkflowElementEventArgs _workflowElementEventArgs)

{

        SMAAgreementTable::UpdateCustWorkflowState(_workflowElementEventArgs.parmWorkflowContext().parmRecId(),workflowstatus::Submitted);

}


     public void canceled(WorkflowElementEventArgs _workflowElementEventArgs)

{

        SMAAgreementTable::UpdateCustWorkflowState(_workflowElementEventArgs.parmWorkflowContext().parmRecId(),workflowstatus::Cancel);

}


    public void completed(WorkflowElementEventArgs _workflowElementEventArgs)

{

        SMAAgreementTable::UpdateCustWorkflowState(_workflowElementEventArgs.parmWorkflowContext().parmRecId(),workflowstatus::Approved);

}


     public void denied(WorkflowElementEventArgs _workflowElementEventArgs)

{

        SMAAgreementTable::UpdateCustWorkflowState(_workflowElementEventArgs.parmWorkflowContext().parmRecId(),workflowstatus::Rejected);

}


     public void changeRequested(WorkflowElementEventArgs _workflowElementEventArgs)

{

        SMAAgreementTable::UpdateCustWorkflowState(_workflowElementEventArgs.parmWorkflowContext().parmRecId(),workflowstatus::ChangeRequest);

}





Add workflow approval to workflow type

Create approval supported element on workflow type under devServiceAgreementWFType > Supported elements

Enable workflow on form



Create workflow 


  • Create workflow from AR > AR workflow.

  • Create service agreement and verify