03.09.2021, 10:29 | #1 |
Участник
|
AX 2012 R3 Добавить значение в одну из финансовых аналитик в разнесенной проводке ГК
Привет!
AX 2012 R3 Нужно заполнить одну пустую аналитику в таблице GeneralJournalAccountEntry. Ссылка на комбинации счет ГК + аналитики хранится в поле LedgerDimension. Я нашел много примеров, как подменять значения аналитик в поле DefaultDimension в строках заказов, журналов и прочих черновых документах. Но проблема в том, что в DefaultDimension нет информации о счете ГК. А мне нужно именно поменять значение одной из аналитик (сменить с пустого на непустое) и сохранить информацию о счете ГК в LedgerDimeson Подскажите пожалуйста, как это сделать. Вариант через сторнирование проводки через журнал ГК и разноска нового журнала ГК категорически отвергнут (не мной). По ссылке ниже один из примеров как менять аналитику в DefaultDimension . Но мне нужно поменять аналитику в LedgerDimension (поле GeneralJournalAccountEntry.LedgerDimension) How to lookup and set a new value for Financial dimension
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
03.09.2021, 10:43 | #2 |
Banned
|
Не уверен, есть ли в 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). |
03.09.2021, 10:48 | #3 |
Banned
|
Извините, не понял основного: "в разнесенной проводке". Когнитивный диссонанс: чего не должно быть, не бывает.
Покалечить сегмент, изменить хэш, изменить DisplayValue, жуть. А если такая комбинация уже есть? Пересчитать балансы. Остается только пожелать удачи. Вот, лучше всего создать новую или получить существующую комбинацию с помощью LedgerDimensionFacade::serviceCreate..., потом обновить проводку (или проводкИ) и записать туда этот новый LedgerDimensionRecId, потом пересчитать балансы. P.S. Прямо как SRF написал. Последний раз редактировалось EVGL; 03.09.2021 в 10:58. |
|
03.09.2021, 10:54 | #4 |
Участник
|
Примерно так можно
X++: generalJournalAccountEntry = GeneralJournalAccountEntry::find(generalJournalAccountEntry.RecId, true);
defaultDimension = DimensionStorage::getDefaultDimensionFromLedgerDimension(generalJournalAccountEntry.LedgerDimension);
defaultDimension = DimensionDefaultingService::serviceReplaceAttributeValue(defaultDimension, custInvoiceTrans.DefaultDimension, cfoRecId);
generalJournalAccountEntry.LedgerDimension = DimensionDefaultingService::serviceCreateLedgerDimension(DimensionStorage::getLedgerDefaultAccountFromLedgerDim(generalJournalAccountEntry.LedgerDimension), defaultDimension);
generalJournalAccountEntry.LedgerAccount = DimensionAttributeValueCombination::find(generalJournalAccountEntry.LedgerDimension).DisplayValue;
generalJournalAccountEntry.update(); X++: defaultDimension = DimensionDefaultingService::serviceReplaceAttributeValue(defaultDimension, custInvoiceTrans.DefaultDimension, cfoRecId);
__________________
Sergey Nefedov Последний раз редактировалось SRF; 03.09.2021 в 10:58. |
|
|
За это сообщение автора поблагодарили: EVGL (10), Ace of Database (10). |
03.09.2021, 11:53 | #5 |
Участник
|
Цитата:
Поэтому иногда даже при разговоре с утонченными людьми у меня выскакивают неотёсанные словечки.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
|
|