Creating new financial dimension while creating a new Sales Order using SalesTable Table Event Handler Class in AX7/D365

Hi All, In the post i would like share you the scenerio, Whiling creating the Sales order and im trying to create new dimension values using current salesTable buffer values. 

I have crated a new event handler classes for post eventHandler of insert method in salesTable level.  

Please check the below code to achieve this.

class MDLSalesOrderDimesionsEventHandler
{
    /// 
    /// When new SO is created this method will be called and new custom SalesOrders dimension will be created and populated on SO.
    /// 
    /// 
    [PostHandlerFor(tableStr(SalesTable), tableMethodStr(SalesTable, insert))]
    public static void SalesTable_Post_insert(XppPrePostArgs args)
    {
        DimensionDefault                        defDim;
        DimensionAttribute                      dimensionAttribute;
        DimensionAttributeValue                 newValue,dimensionAttributeValue;
        DimensionAttributeValueSetStorage       dimensionStorage;
        DimensionAttributeValueSet              dimAttrValueSet; //Contains default dimension records
        DimensionAttributeValueSetItem          dimAttrValueSetItem; //Contains individual records for default dimensions
        DimensionFinancialTag                   dimensionFinancialTag ; //Backing entity view for Custome type dimension //>> you can change other view contain existing Dimension
        DimensionAttributeValue                 dimAttrValue; // Contains used financial dimension values
        int                                     backEntityType;
        DimensionSHA1Hash                       hash;
        HashKey                                 valueKeyHashArray[];
        int                                     dimAttrCount;
        Map                                     dimAttrIdx      = new Map(Types::Integer, Types::Integer);
        SalesTable                              salesTable      = args.getThis() as SalesTable;
        const
        var                                     salesOrder  = "SalesOrders";
                
        dimensionAttribute      = DimensionAttribute::findbyName(salesOrder);
        dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValueNoError(dimensionAttribute,salesTable.SalesId,false,true);
        if(!dimensionAttributeValue)
        {
            dimensionFinancialTag.Value = salesTable.SalesId;
            dimensionFinancialTag.FinancialTagCategory = dimensionAttribute.financialTagCategory();
            dimensionFinancialTag.insert();
        }
        dimAttrValue = DimensionAttributeValue::findByDimensionAttributeAndEntityInst(dimensionAttribute.RecId, dimensionFinancialTag.RecId, false, true);
        backEntityType = tableNum(DimensionFinancialTag);
        dimAttrIdx.insert(dimensionAttribute.BackingEntityType, dimAttrCount);
        valueKeyHashArray[dimAttrIdx.lookup(backEntityType)] = dimAttrValue.HashKey;
        hash = DimensionAttributeValueSetStorage::getHashFromArray(valueKeyHashArray, dimAttrCount);
        dimAttrValueSet = DimensionAttributeValueSet::findByHash(hash);
        // This value set does not exist, so it must be persisted
        if (!dimAttrValueSet)
        {
            ttsbegin;
            // Insert the value set with appropriate hash
            dimAttrValueSet.Hash = hash;
            dimAttrValueSet.insert();
            //Insert Custom dimension set item
            dimAttrValueSetItem.clear();
            dimAttrValueSetItem.DimensionAttributeValueSet = dimAttrValueSet.RecId;
            dimAttrValueSetItem.DimensionAttributeValue = dimAttrValue.RecId;
            dimAttrValueSetItem.DisplayValue = dimensionFinancialTag.Value;
            dimAttrValueSetItem.insert();
            ttscommit;
        }
        newValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,salesTable.SalesId,false,true);
        
        defDim              = salesTable.Defaultdimension;
        dimensionStorage    = DimensionAttributeValueSetStorage::find(defDim);
        dimensionStorage.addItem(newValue);
        defDim = dimensionStorage.save();
        ttsbegin;
        salesTable.selectForUpdate(true);
        salesTable.DefaultDimension = salesTable.mergeDimension(salesTable.DefaultDimension,defDim);
        salesTable.doUpdate();
        ttscommit;
    }

}

No comments:

Post a Comment