web
You’re offline. This is a read only version of the page.
close
Skip to main content

Notifications

Announcements

No record found.

Community site session details

Community site session details

Session Id :
Finance | Project Operations, Human Resources, ...
Suggested Answer

Disable Purchase Order Line financial dimension based on custom condition through X++ code in D365 F&O

(0) ShareShare
ReportReport
Posted on by 758

Hi,

I want to disable Purchase order line financial dimension based on some conditions. 

I have already referred below link,

https://d365dev.com/2018/04/20/disable-editing-of-specific-financial-dimensions-on-form/

But above link explains disabling of dimensions in header level. Please suggest how disabling of line dimensions can be achieved. Thank you in advance.

I have the same question (0)
  • Ludwig Reinhard Profile Picture
    Microsoft Employee on at

    Hi,

    What would be an example of the condition that you plan to use?

    Best regards,

    Ludwig

  • Rhushikesh R Profile Picture
    758 on at

    Hi Ludwig,

    Thank you for your reply. Based on item group associated with PO Line item, I need to enable and disable some of the dimensions.

  • Suggested answer
    Ludwig Reinhard Profile Picture
    Microsoft Employee on at

    Hi,

    Can't you do this with the standard advanced rule structures that are available in the GL account structures?

    The only prerequisite is that your items are setup with a link to their item group financial dimension.

    If you use this standard feature you won't need to code something.

    Best regards,

    Ludwig

  • André Arnaud de Calavon Profile Picture
    300,917 Super User 2025 Season 2 on at

    Hi Rhushikesh,

    Using account structures, you will define which dimensions will be used for posting on ledger accounts. If the main accounts for posting are the same, regardless the item group, you will need a customization. The blog explains how to disable dimensions with an example for the sales order header. I think you can apply it on each form and each table.

  • huijij Profile Picture
    19,811 on at

    i Rhushikesh,

    You can use this the standard feature as mentioned.

    And You can disable Purchase Order Line financial dimension in x code:

      [FormEventHandler(formStr(PurchTable), FormEventType::Initialized)]
        public static void PurchTable_OnInitialized(xFormRun _sender, FormEventArgs _e)
        {
            DimensionEntryControl dimControl = _sender.design().controlName(identifierStr(DimensionEntryControlTable));
            DimensionEnumeration dimensionSetId = DimensionCache::getDimensionAttributeSetForLedger();
            DimensionAttributeSetStorage dimensionAttributeSetStorage;
            DimensionAttribute dimensionAttribute;
            DimensionAttributeSetItem dimAttrSetItem;
    
            const str contractNumber = 'ContractNo';
            const str contractType = 'ContractType';
    
            dimensionAttributeSetStorage = new DimensionAttributeSetStorage();
    
            while select dimensionAttribute
            where dimensionAttribute.Name != contractNumber // Exclude specific dimension which should be not editable
            //&& dimensionAttribute.Name != contractType // Exclude specific dimension which should be not editable
            join dimAttrSetItem
                where dimAttrSetItem.DimensionAttribute == dimensionAttribute.RecId
                    && dimAttrSetItem.DimensionAttributeSet == dimensionSetId
            {
                dimensionAttributeSetStorage.addItem(
                dimensionAttribute.RecId,
                dimensionAttribute.HashKey,
                NoYes::Yes);
            }
    
            dimControl.parmEditableDimensionSet(dimensionAttributeSetStorage.save());
        }

    regards

  • Suggested answer
    Rhushikesh R Profile Picture
    758 on at

    Hi Everyone,

    Managed this by using below code,

    Used Item Id condition for testing. It can be modified and set as per requirement.

    class MSPurchTableEventHandler
    {
        
        
        public static DimensionAttributeSetStorage allowEditCostCenter(boolean _disableCostCenter)
        {
            DimensionAttributeSetStorage    dimensionAttributeSetStorage;
            DimensionAttribute              dimensionAttribute;
            QueryBuildDataSource            dimensionAttributeDs;
            QueryBuildDataSource            dimAttrSetItemDs;
            QueryRun                        queryrun;
            query                           Query           = new query();
            DimensionEnumeration            dimensionSetId  = DimensionCache::getDimensionAttributeSetForLedger();
            const str                       costCenter      = 'CostCenter';
            
            dimensionAttributeSetStorage    = new DimensionAttributeSetStorage();
            dimensionAttributeDs            = Query.addDataSource(tableNum(DimensionAttribute));
    
            if (_disableCostCenter)
            {
                dimensionAttributeDs.addRange(fieldNum(DimensionAttribute, Name)).value(strfmt('!%1',costCenter));
            }
            dimAttrSetItemDs = dimensionAttributeDs.addDataSource(tableNum(DimensionAttributeSetItem));
            dimAttrSetItemDs.joinMode(JoinMode::InnerJoin);
            dimAttrSetItemDs.addLink(fieldNum(DimensionAttribute, RecId),fieldNum(DimensionAttributeSetItem, DimensionAttribute));
            dimAttrSetItemDs.addRange(fieldNum(DimensionAttributeSetItem, DimensionAttributeSet)).value(int642Str(dimensionSetId));
    
            queryrun = new QueryRun(Query);
            while(queryrun.next())
            {
                dimensionAttribute  = queryrun.get(tableNum(dimensionAttribute));
                dimensionAttributeSetStorage.addItem(dimensionAttribute.RecId, dimensionAttribute.HashKey, NoYes::Yes);
            }
            return dimensionAttributeSetStorage;
        }
    
        /// 
        ///
        /// 
        /// 
        /// 
        [FormDataSourceEventHandler(formDataSourceStr(PurchTable, PurchLine), FormDataSourceEventType::Activated)]
        public static void PurchLine_OnActivated(FormDataSource sender, FormDataSourceEventArgs e)
        {
            PurchLine      purchLine  = sender.cursor();
            DimensionEntryControl   financialDimension  = sender.formRun().design().controlName(formControlStr(PurchTable, DimensionEntryControlLine));
    
            if (purchLine.ItemId == '1030')
            {
                financialDimension.parmEditableDimensionSet(MSPurchTableEventHandler::allowEditCostCenter(false).save());
                financialDimension.ccbModifyDimensionAttrEditableMap();
            }
            else
            {
                financialDimension.parmEditableDimensionSet(MSPurchTableEventHandler::allowEditCostCenter(true).save());
                financialDimension.ccbModifyDimensionAttrEditableMap();
            }
        }
    
    }

    [Extensionof(classStr(DimensionEntryControl))]
    public final class MSDimensionEntryControls_Extension
    {
       
        
        public void ccbModifyDimensionAttrEditableMap()
        {
            DimensionAttribute          ccbDimAttrLoc;
            DimensionEnumeration        ccbDimensionSetIdToDisplay;
            DimensionEnumeration        ccbDimensionSetIdNotToDisplay;
            DimensionAttributeSetItem   ccbDimAttrSetItem;
            DimensionAttributeSetItem   ccbDimAttrSetItemEditable;
            DimensionAttributeSetItem   ccbDimAttrSetItemNotDisplay;
            DimensionEnumeration        ccbDimensionSetIdToAllowEdit;
    
            int dimAttrCount = 0;
    
            if (displayedDimensionSet)
            {
                // user-specified dimension attribute set
                ccbDimensionSetIdToDisplay = displayedDimensionSet;
            }
            else
            {
                // Use the dimension attribute set associated with the current ledger
                if (dimensionEntryController)
                {
                    ccbDimensionSetIdToDisplay    = dimensionEntryController.parmDimensionsToDisplay();
                    ccbDimensionSetIdNotToDisplay = dimensionEntryController.parmDimensionsToNotDisplay();
                }
            }
    
            if (isEditableSetOverridden)
            {
                // Use the user-specified dimension attribute set.
                ccbDimensionSetIdToAllowEdit = editableDimensionSet;
            }
            else if (dimensionEntryController)
            {
                // Use the dimension attribute set from the controller.
                ccbDimensionSetIdToAllowEdit = dimensionEntryController.parmDimensionsToAllowEdit();
            }
            else
            {
                // Allow editing all dimension attributes.
                ccbDimensionSetIdToAllowEdit = ccbDimensionSetIdToDisplay;
            }
    
            while select * from ccbDimAttrLoc
                order by Name
                join RecId from ccbDimAttrSetItem
                    where ccbDimAttrSetItem.DimensionAttribute == ccbDimAttrLoc.RecId 
                        && ccbDimAttrSetItem.DimensionAttributeSet == ccbDimensionSetIdToDisplay
                outer join RecId from ccbDimAttrSetItemEditable                                                     // the intersection between the displayed and editable dimension attribute sets
                    where ccbDimAttrSetItemEditable.DimensionAttributeSet == ccbDimensionSetIdToAllowEdit 
                        && ccbDimAttrSetItemEditable.DimensionAttribute == ccbDimAttrLoc.RecId 
                        && ccbDimAttrSetItemEditable.EnumerationValue == NoYes::Yes
                notexists join ccbDimAttrSetItemNotDisplay
                    where ccbDimAttrSetItemNotDisplay.DimensionAttributeSet == ccbDimensionSetIdNotToDisplay 
                        && ccbDimAttrSetItemNotDisplay.DimensionAttribute == ccbDimAttrLoc.RecId
            {
                dimAttrCount  ;            
                
                if (dimAttrEditableMap.exists(dimAttrCount))
                {
                    //boolean ccbEditStatus = dimAttrEditableMap.lookup(dimAttrCount));
                    dimAttrEditableMap.remove(dimAttrCount);
                    dimAttrEditableMap.insert(dimAttrCount, ccbDimAttrSetItemEditable.RecId != 0);
                }
                else
                {
                    dimAttrEditableMap.insert(dimAttrCount, ccbDimAttrSetItemEditable.RecId != 0);
                }
                // Determine the editability of the current dimension attribute
                // editable dimension set has been specified - editability depends upon existence of the dimAttrSetItemEditable record from the select
                // a non-empty record indicates editable, an empty record indicates non-editable            
            }
        }
    }

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

Responsible AI policies

As AI tools become more common, we’re introducing a Responsible AI Use…

Neeraj Kumar – Community Spotlight

We are honored to recognize Neeraj Kumar as our Community Spotlight honoree for…

Leaderboard > Finance | Project Operations, Human Resources, AX, GP, SL

#1
Martin Dráb Profile Picture

Martin Dráb 664 Most Valuable Professional

#2
André Arnaud de Calavon Profile Picture

André Arnaud de Cal... 522 Super User 2025 Season 2

#3
Sohaib Cheema Profile Picture

Sohaib Cheema 303 User Group Leader

Last 30 days Overall leaderboard

Product updates

Dynamics 365 release plans