Показать сообщение отдельно
Старый 03.09.2021, 10:43   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Не уверен, есть ли в AX2012 метод типа LedgerDimensionFacade::replace...()

Вот код, который написал вчера на сходную темy
X++:
        DimensionDefault        affiliateDimensionDefault;
        LedgerDimensionBase     ledgerDimensionAffiliate;
        // Add or replace the Affiliate dim segment with the origin IC company ID
        affiliateDimensionDefault = EGCDimensionAffiliateHelper::getDefaultDimensionForCompany(_parameters.parmOriginatingCompany());
        ledgerDimensionAffiliate = LedgerDimensionFacade::serviceCreateLedgerDimForDefaultDim(affiliateDimensionDefault, interCompanyTrans.LedgerDimension);
        interCompanyTrans.LedgerDimension = LedgerDimensionFacade::serviceMergeLedgerDimensions(interCompanyTrans.LedgerDimension, ledgerDimensionAffiliate);
Обратите внимание на предпоследнюю строку.

Ну и класс-хелпер впридачу:
X++:
/// <summary>
/// Eugen Glasow:
/// Part of the 20929 "Add 'Affiliate' dimension to intercompany GL vouchers" user story
/// Identify the Affiliate dim, find an attribute value by str etc.
/// </summary>
public class EGCDimensionAffiliateHelper
{
    private const GlobalObjectCacheScope sgocScope = classStr(EGCDimensionAffiliateHelper);
    private const int sgocKey = 1;

    /// <summary>
    /// Affiliate is the only dimension backed by the Legal entity, and will ever be
    /// </summary>
    /// <returns>The RecId of the dimension Affiliate</returns>
    public static DimensionAttributeRecId getAffiliateAttributeRecId()
    {
        SysGlobalObjectCache        sgoc = classFactory.globalObjectCache();
        DimensionAttributeRecId     ret;

        [ret] = sgoc.find(sgocScope, [sgocKey]);
        if (! ret)
        {
            ret = (select firstonly RecId from DimensionAttribute
                    where DimensionAttribute.BackingEntityType == tableNum(DimAttributeCompanyInfo)).RecId;

            sgoc.insert(sgocScope, [sgocKey], [ret]);
        }

        return ret;
    }

    /// <summary>
    /// Affiliate is the only dimension backed by the Legal entity, and will ever be
    /// </summary>
    /// <returns>The record of the dimension Affiliate</returns>
    public static DimensionAttribute getAffiliateAttribute()
    {        
        return DimensionAttribute::find(EGCDimensionAffiliateHelper::getAffiliateAttributeRecId());
    }

    /// <summary>
    /// DimAttributeCompanyInfo is the same as CompanyInfo but just 3 major fields, join the dimValues with CompanyInfo
    /// </summary>
    /// <param name = "_dataAreaId">Company ID</param>
    /// <returns>Affiliate attribute value backed by the given company</returns>
    public static DimensionAttributeValue  getAffiliateAttributeValueByDataAreaId(DataAreaId _dataAreaId = curExt())
    {
        DimAttributeCompanyInfo     dimAttributeCompanyInfo;
        DimensionAttributeValue     affiliateAttributeValue;
        
        // As fast as it can be, little overhead
        select firstonly affiliateAttributeValue
            where affiliateAttributeValue.DimensionAttribute == EGCDimensionAffiliateHelper::getAffiliateAttributeRecId()
        exists join dimAttributeCompanyInfo
            where dimAttributeCompanyInfo.Key   == affiliateAttributeValue.EntityInstance
               && dimAttributeCompanyInfo.Value == _dataAreaId;

        if (! affiliateAttributeValue)
        {
           // A mirror dimensionAttributeValue record shall actively be created for the company if not exists
           affiliateAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(
                EGCDimensionAffiliateHelper::getAffiliateAttribute(),
                _dataAreaId,
                false,
                true); // Create if needed
        }

        return affiliateAttributeValue;
    }

    /// <summary>
    /// Make or fetch a DimensionDefault set with one Affiliate segment for the given companyId,
    /// Use it in a Merge with a ledger main account or other dimensions or both
    /// </summary>
    /// <param name = "_dataAreaId">Company ID</param>
    /// <returns>Dimension set with one Affiliate</returns>
    public static DimensionDefault getDefaultDimensionForCompany(DataAreaId _dataAreaId)
    {
        DimensionAttributeValueSetStorage   valueSetStorage = new DimensionAttributeValueSetStorage();       

        valueSetStorage.addItem(EGCDimensionAffiliateHelper::getAffiliateAttributeValueByDataAreaId(_dataAreaId));
        DimensionDefault dimensionDefault = valueSetStorage.save();

        return dimensionDefault;
    }

}
Чувствую, надо опять блог написать.
За это сообщение автора поблагодарили: Ace of Database (10).