Не уверен, есть ли в 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;
}
}
Чувствую, надо опять блог написать.