04 July 2026

Service class to get the selected record and deleted matching records and refresh the form data source in D365 F&O

 [DataContractAttribute]

class ABCUserProfilesBulkDeleteContract

{    

    UserId userId;

    [DataMemberAttribute('UserId')]

    public UserId parmUserId(UserId _userId = userId)

    {

        userId = _userId;

        return userId;

    }

}

==controller class================

internal final class ABCUserProfilesBulkDeleteController   extends SysOperationServiceController

{    

    protected void new()

    {

        super(classStr(ABCUserProfilesBulkDeleteService),

              methodStr(ABCUserProfilesBulkDeleteService, process),

              SysOperationExecutionMode::Synchronous);


        this.parmShowDialog(false);

        this.parmLoadFromSysLastValue(false);

    }


    public static ABCUserProfilesBulkDeleteController construct()

    {

        return new ABCUserProfilesBulkDeleteController();

    }


    public static void main(Args _args)

    {

        ABCUserProfilesBulkDeleteController controller;

        ABCUserProfilesBulkDeleteContract   contract;

        UserInfo                              userInfo;


        userInfo = _args.record();


        if (!userInfo || !userInfo.id)

        {

            throw error("@ABCFinanceLabel:SelectedUserInfoRecordIsNotValid");

        }


        controller = ABCUserProfilesBulkDeleteController::construct();

        controller.parmArgs(_args);


        contract = controller.getDataContractObject() as ABCUserProfilesBulkDeleteContract;


        if (!contract)

        {

            throw error("@ABCFinanceLabel:UnableToInitializeContractClass");

        }


        contract.parmUserId(userInfo.id);


        controller.startOperation();

    }


    /// <summary>

    ///

    /// </summary>

    /// <param name = "_executionMode"></param>

    /// <param name = "_asyncResult"></param>

    protected void afterOperation(SysOperationExecutionMode _executionMode, AifAsyncResult _asyncResult)

    {

        super(_executionMode, _asyncResult);

        

        FormRun         callerForm;

        FormDataSource  associationDs,userInfoDS;

        

        

        callerForm = this.parmArgs().caller() as FormRun;


        if (callerForm)

        {

            associationDs = callerForm.dataSource(formDataSourceStr(SysUserManagement, CARM_JobProfileSysUserAssociation));

            userInfoDS    = callerForm.dataSource(formDataSourceStr(SysUserManagement, UserInfo));

            if (associationDs)

            {

                associationDs.research(true);

                associationDs.refresh();

                userInfoDS.research(true);

                userInfoDS.refresh();

            }

        }

    }

}

============service class======

[SysEntryPoint(true)]

class ABCUserProfilesBulkDeleteService

{   

    public void process(ABCUserProfilesBulkDeleteContract _contract)

    {

        UserId                              userId;

        UserInfo                            userInfo;

        CARM_JobProfileSysUserAssociation   association;

        int64                               recordsToDelete;

        

        userId = _contract.parmUserId();


        if (!userId)

        {

            throw error("@ABCFinanceLabel:UserIDIsRequired");

        }


        select firstonly RecId

                from userInfo

                where userInfo.id == userId;


        if (!userInfo.RecId)

        {

            throw error(strFmt("@ABCFinanceLabel:UserDoesNotExistInUserInfo", userId));

        }

        select count(RecId)

                from association

                where association.UserId == userId;

        recordsToDelete = association.RecId;


        if (recordsToDelete == 0)

        {

            info(strFmt("@ABCFinanceLabel:NoJobProfileAssociationRecordsFoundForUser", userId));

            return;

        }

        ttsbegin;

        delete_from association

                where association.UserId == userId;

        ttscommit;

  info(strFmt("@ABCFinanceLabel:JobProfileAssociationRecordsDeletedForUser",recordsToDelete,userId));

    }

}

06 May 2026

Merge Dimensions (MainAccountId and LedgerDimensions) defaultDimension in D365 F&O and X++

 public DimensionDynamicAccount getLedgerDimension(container _conData, TransDate _transDate = today())

{

    int                                         hierarchyCount;

    int                                         hierarchyIdx;

    DimensionDynamicAccount                     ledgerRecId;

    MainAccountNum                              mainAccountId = conPeek(_conData, 1);

    MainAccount                                 mainAccount;

    RefRecId                                    recordvalue;

    DimensionAttribute                          dimensionAttribute;

    DimensionAttributeValue                     dimensionAttributeValue;

    DimensionSetSegmentName                     DimensionSet;

    DimensionStorage                            dimStorage;

    LedgerAccountContract                       LedgerAccountContract = new LedgerAccountContract();

    DimensionAttributeValueContract             ValueContract;

    List                                        valueContracts = new List(Types::Class);

    int                                         currentYear;

    Name                                        PopDim;

    str                                         dimValue;

   

 

    dimensionAttributeValueCombination dimensionAttributeValueCombination;

 

    mainAccount             = MainAccount::findByMainAccountId(mainAccountId);

    recordvalue             = DimensionHierarchy::getAccountStructure(mainAccount.RecId,Ledger::current());

    hierarchyCount          = DimensionHierarchy::getLevelCount(recordvalue);

    DimensionSet            = DimensionHierarchyLevel::getDimensionHierarchyLevelNames(recordvalue);

 

    for(hierarchyIdx = 1;hierarchyIdx<=hierarchyCount;hierarchyIdx++)

    {

        if(hierarchyIdx == 1)

        {

            continue;

        }

        dimensionAttribute = DimensionAttribute::findByLocalizedName(DimensionSet[hierarchyIdx],false, CompanyInfo::find().LanguageId);

 

        if(dimensionAttribute)

        {

            dimValue = conPeek(_conData,hierarchyIdx);

            

            dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue);

 

            if(dimensionAttributeValue)

            {

                ValueContract = new DimensionAttributeValueContract();

                ValueContract.parmName(dimensionAttribute.Name) ;

                ValueContract.parmValue(dimensionAttributeValue.CachedDisplayValue);

                valueContracts.addEnd(ValueContract);

            }

        }

    }

    LedgerAccountContract.parmMainAccount(mainAccountId);

    LedgerAccountContract.parmValues(valueContracts);

 

    dimStorage                         = DimensionServiceProvider::buildDimensionStorageForLedgerAccount(LedgerAccountContract);

    dimensionAttributeValueCombination = DimensionAttributeValueCombination::find(dimStorage.save());

    ledgerRecId                        = dimensionAttributeValueCombination.RecId;

 

    return ledgerRecId;

}

Service class to get the selected record and deleted matching records and refresh the form data source in D365 F&O

 [DataContractAttribute] class ABCUserProfilesBulkDeleteContract {         UserId userId;     [DataMemberAttribute('UserId')]     pu...