AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.09.2021, 10:29   #1  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
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  
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).
Старый 03.09.2021, 10:48   #3  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Извините, не понял основного: "в разнесенной проводке". Когнитивный диссонанс: чего не должно быть, не бывает.

Покалечить сегмент, изменить хэш, изменить DisplayValue, жуть. А если такая комбинация уже есть? Пересчитать балансы. Остается только пожелать удачи.
Вот, лучше всего создать новую или получить существующую комбинацию с помощью LedgerDimensionFacade::serviceCreate..., потом обновить проводку (или проводкИ) и записать туда этот новый LedgerDimensionRecId, потом пересчитать балансы.

P.S. Прямо как SRF написал.

Последний раз редактировалось EVGL; 03.09.2021 в 10:58.
Старый 03.09.2021, 10:54   #4  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Примерно так можно

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  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от EVGL Посмотреть сообщение
Извините, не понял основного: "в разнесенной проводке". Когнитивный диссонанс: чего не должно быть, не бывает.
Это славянский менталитет Сейчас общался с грузчиками на складе, у них еще похлеще словечки выскакивают. Особенности работы программиста: сначала общаешься с утонченным директором, а уже через пять минут находишься в аду на складе.
Поэтому иногда даже при разговоре с утонченными людьми у меня выскакивают неотёсанные словечки.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxse: February release – Dynamics AX 2012 R3 Blog bot DAX Blogs 0 02.03.2017 01:11
emeadaxsupport: How to slip-stream AX 2012 R3 Cu 8 Blog bot DAX Blogs 0 21.04.2015 11:11
emeadaxsupport: AX Performance Troubleshooting Checklist Part 1B [Application and AOS Configuration] Blog bot DAX Blogs 0 05.09.2014 21:11
amer-ax: It was a great day! Blog bot DAX Blogs 3 29.12.2012 01:02
emeadaxsupport: New Content for Microsoft Dynamics AX 2012 : October 2011 Blog bot DAX Blogs 0 27.10.2011 17:11

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:07.