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
}
}
}