AXForum  
Вернуться   AXForum > Прочие обсуждения > Курилка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.08.2018, 14:03   #1  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
У него от скорости печатания работает ветряк, который питает ноутбук?
__________________
Ivanhoe as is..
Старый 08.08.2018, 14:29   #2  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
396 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Или ветряк охлаждает клавиатуру, чтобы дым от быстрого печатания не мешал смотреть в монитор.
Старый 10.08.2018, 10:41   #3  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
885 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
2009 SP1 5.0.1500.6491 (хотя оно вполне справедливо и для старших/младших версий)

Уже давненько замечал, что есть такая практика в различных обработчиках модульных движений по части использования методов lastAmountCur()/lastAmountMST() от доступного в тех краях объекта LedgerVoucher для наполнения суммовых полей своих родных модульных проводок.

До сих пор отношение к этому далее и конкретнее, чем "чую бесовщину, но обосновать не могу", не шло...

Однако на днях коллеги в "песочнице" попытались разнести накладную по заказу на продажу, в которой было две строки с разными знаками (-/+) в качестве исправления ранее сделанной (изменялась цена продажи одной строки).
Все красиво и хорошо, склад и налоги -/+ прошли как и ожидалось, только вот проводка по клиенту сформировалась на сумму последней строки накладной вместо суммы всех строк.

Исследования показали, что эта "радость" возникает при сложении двух обстоятельств:
  1. Накопление разнознаковых частей и разбивка по ним в российской функциональности проводок ГК по клиенту в CustVendVoucher'е при наличии в дебете или кредите позиций с разным знаком (наполняется в SalesFormLetter_Invoice.createCustTrans(), будущие проводки ГК разбиваются далее в CustVendVoucher.postMultipleBalances_RU, вызываемом из post() этого же класса)
  2. Использование в инициализации суммы проводки по поставщику/клиенту в CustVendVouchere.initCustVendTrans() вышеозначенных методов, lastAmountCur()/lastAmountMST(), из LedgerVoucher'а

Есть мнение, что вышеозначенные методы небезопасны и их использование за пределами LedgerVoucher'а суть есть зло и рытье ямы самому себе.

P.S. <GEUU> в комментах тамошнего кода, наполнявший разбиение и поклавший на оное в своем же коде - это же наш здешний EVGL, если не ошибаюсь ?
Миниатюры
Нажмите на изображение для увеличения
Название: накладная клиента.jpg
Просмотров: 356
Размер:	263.1 Кб
ID:	12009  
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 10.08.2018, 10:58   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
P.S. <GEUU> в комментах тамошнего кода, наполнявший разбиение и поклавший на оное в своем же коде - это же наш здешний EVGL, если не ошибаюсь ?

Это страновые теги. EU - это Eвропа.
Старый 10.08.2018, 11:06   #5  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
885 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от belugin Посмотреть сообщение
EU - это Eвропа.
Виноват, возвел на Евгения напраслину

Нет счас под рукой 2012-й (и тем более 365FO) - там оно как, радости сии остались ?
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 10.08.2018, 11:20   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Как-то так:


X++:
custVendTrans.ReasonRefRecId = reasonRefRecID;

        // If the amount, which is the total invoice amount, is zero, then the amountMST and amountCur also must be zero
        if (amountCur)
        {
            if (_useSubLedger)
            {
                // <GIN>
                if (TaxWithholdParameters_IN::checkTaxParameters())
                {
                    amountCur += taxWithholdAmount;
                }
                // </GIN>

                custVendTrans.AmountMST = CurrencyExchangeHelper::mstAmount(amountCur, currencyCode, transDate, Currency::noYes2UnknownNoYes(triangulation), exchRate, exchRateSecondary);
            }
            else
            {
                // <GEERU>
                if (ledgerBalances)
                {
                    custVendTrans.AmountMST = CurrencyExchangeHelper::amount(postedAmountMST, Ledger::accountingCurrency());
                }
                else
                {
                    // </GEERU>
                    custVendTrans.AmountMST = CurrencyExchangeHelper::amount(ledgerPostingReference.lastAmountMST(), Ledger::accountingCurrency());
                    // <GEERU>
                }
                // </GEERU>
            }
        }
        else
        {
            custVendTrans.AmountMST = 0;
        }
X++:
 /// <summary>
    /// Calculates the total of the multiple posted balance amount based on
    /// the specific currency code and the object of <c>CurrencyExchangeHelper</c>.
    /// </summary>
    /// <param name = "_curencyCode">The transaction currency originating the conversion.</param>
    /// <param name = "_currencyExchangeHelper">The <c>CurrencyExchangeHelper</c> class which manages calculations between currencies.</param>
    /// <returns>A container of AmountCur and AmountMst.</returns>
    private container calculatePostedMultipleBalanceAmounts_RU(CurrencyCode _curencyCode, CurrencyExchangeHelper _currencyExchangeHelper)
    {
        int i;
        boolean correction;
        AmountCur balanceValue;
        AmountCur retAmountCur;
        amountMST retAmountMst;
        for (i = 1; i<=conLen(ledgerBalances); i++)
        {
            [correction, balanceValue] = conPeek(ledgerBalances, i);
            retAmountCur += balanceValue;
            retAmountMST += _currencyExchangeHelper.calculateTransactionToAccounting(
                    _curencyCode,
                    balanceValue,
                    true
            );
        }
        return [retAmountCur, retAmountMst];
    }


X++:
if (countryRegion_RU)
        {
            custVoucher.parmSalesInvoicePostingType_RU(custInvoiceJour_RU.InvoicePostingType_RU);
            if (this.postBalanceAsManyLedgerTransactions_RU())
            {
                custVoucher.parmLedgerBalances_RU([[false, salesTotals.totalAmountBySign_RU(false)], [this.parmStorno(), salesTotals.totalAmountBySign_RU(true)]]);
            }
        }
Старый 10.09.2018, 14:33   #7  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Смотрю код сделанный предыдущим интегратором и... о божечки!
X++:
    switch (jobType)
    {
        case RouteJobType::Process:
            select _prodRoute
                where _prodRoute.ProdId     == prodTable.ProdId
                   && _prodRoute.OprNum     == oprNum
                   && _prodRoute.JobType    == RouteJobType::Process;
            break;

        case RouteJobType::Setup:
            select _prodRoute
                where _prodRoute.ProdId  == prodTable.ProdId
                   && _prodRoute.OprNum  == OprNum
                   && _prodRoute.JobType == RouteJobType::Setup;
            break;
    }
Оно как бы работает, это радует... но нельзя ли было подумать головой, а не плодить условную логику?..
X++:
    select _prodRoute
        where _prodRoute.ProdId     == prodTable.ProdId
           && _prodRoute.OprNum     == oprNum
           && _prodRoute.JobType    == jobType;
__________________
// no comments
Старый 10.09.2018, 15:08   #8  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
У вас же не тоже самое получилось, значений то в енуме больше
За это сообщение автора поблагодарили: dech (1).
Старый 10.09.2018, 18:26   #9  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Да, действительно! Под вечер уже мозг задеревенел)))
Но все равно можно проще сделать:
X++:
    switch (jobType)
    {
        case RouteJobType::Process:
        case RouteJobType::Setup:
            select _prodRoute
                where _prodRoute.ProdId     == prodTable.ProdId
                   && _prodRoute.OprNum     == oprNum
                   && _prodRoute.JobType    == jobType;
            break;
    }
__________________
// no comments
Старый 17.09.2018, 02:37   #10  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Коллеги наткнулись. оказывается кому-то из МС пришла здравая мысль денормализовать DIMENSIONATTRIBUTEVALUECOMBINATION(это AX7.3) - теперь там кол-во столбцов по кол-ву аналитик * 3.
Cделали втихую и никак не анонсировали, по видимому в движке синхронизации(т.е. в АОТ эта таблица имеет 5 полей).
Нажмите на изображение для увеличения
Название: DIMENSIONATTRIBUTEVALUECOMBINATION.jpg
Просмотров: 479
Размер:	276.1 Кб
ID:	12096
Старый 17.09.2018, 02:56   #11  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от trud Посмотреть сообщение
Коллеги наткнулись. оказывается кому-то из МС пришла здравая мысль денормализовать DIMENSIONATTRIBUTEVALUECOMBINATION(это AX7.3) - теперь там кол-во столбцов по кол-ву аналитик * 3.
Cделали втихую и никак не анонсировали, по видимому в движке синхронизации(т.е. в АОТ эта таблица имеет 5 полей).
Вложение 12096
А почему в WTF и почему "втихую" ? Add dimensions to Excel templates довольно давно сделали - мы еще на 1611 это использовали
__________________
-ТСЯ или -ТЬСЯ ?
За это сообщение автора поблагодарили: trud (5).
Старый 17.09.2018, 04:21   #12  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от Vadik Посмотреть сообщение
А почему в WTF и почему "втихую"
О, как-то пропустил, спасибо
WTF - ибо странно почему бы не дать доступ к этим данным из X++ изначально. т.е. сейчас для получения значения аналитик надо сильно заморочиться(т.е. ссылку на атрибут надо как-то хранить, писать методы). а тут получается альтернативный подход где все уже есть, просто по ID получай конкретную запись где будут все поля(по сути также как было в AX2009 с енумом аналитики)
а каким образом обновляются эти невидимые столбцы в этой таблице DIMENSIONATTRIBUTEVALUECOMBINATION?

Последний раз редактировалось trud; 17.09.2018 в 04:23.
За это сообщение автора поблагодарили: Logger (3), gl00mie (3).
Старый 17.09.2018, 04:52   #13  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от trud Посмотреть сообщение
О, как-то пропустил, спасибо
WTF - ибо странно почему бы не дать доступ к этим данным из X++ изначально. т.е. сейчас для получения значения аналитик надо сильно заморочиться(т.е. ссылку на атрибут надо как-то хранить, писать методы). а тут получается альтернативный подход где все уже есть, просто по ID получай конкретную запись где будут все поля(по сути также как было в AX2009 с енумом аналитики)
а каким образом обновляются эти невидимые столбцы в этой таблице DIMENSIONATTRIBUTEVALUECOMBINATION?
Все на SQL триггерах, смотрите в классы DimensionSQLObjectsDAVCInsertTrigger и ему подобные.
За это сообщение автора поблагодарили: trud (3).
Старый 17.09.2018, 09:39   #14  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от Vadik Посмотреть сообщение
А почему в WTF и почему "втихую" ? Add dimensions to Excel templates довольно давно сделали - мы еще на 1611 это использовали
У меня не работает lookup в excel, что бы выбрать нужное значение. Как это сделать в 8.0?
Старый 17.09.2018, 04:10   #15  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от trud Посмотреть сообщение
Коллеги наткнулись. оказывается кому-то из МС пришла здравая мысль денормализовать DIMENSIONATTRIBUTEVALUECOMBINATION(это AX7.3) - теперь там кол-во столбцов по кол-ву аналитик * 3.
Cделали втихую и никак не анонсировали, по видимому в движке синхронизации(т.е. в АОТ эта таблица имеет 5 полей).
Оно так года с 2016, с открытием вас!
Старый 17.09.2018, 09:35   #16  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Из DAX они тоже доступны через (fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(MainAccountValue)))

https://community.dynamics.com/ax/f/33/t/222182
За это сообщение автора поблагодарили: trud (3), Logger (3), gl00mie (3).
Старый 17.10.2018, 08:05   #17  
axm2017 is offline
axm2017
Участник
 
1,772 / 293 (13) ++++++
Регистрация: 15.05.2017
Случайно глянул пару методов Cust/VendTransOpen

Видимо уже давно не смотрел в код стандарта

на update
X++:
        ttsbegin;
        //..какие то изменения данных
        if (this.validateWrite())
        {
            super();
        }
        ttscommit;
Что в 12 и в новой версии присутствует
За это сообщение автора поблагодарили: trud (2).
Старый 22.10.2018, 20:02   #18  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
PurchLine.update() в D365FO стал просто великолепен: мало того, что метод раздулся до 370 строк (что, PurchLineType.update()? не, не слышали), так он еще и начал пересчитывать налоги по заказу на покупку - видать, какой-то костыль для отображения итогов по заказу в виде FormPart.
X++:
if (this.distributionUpdateNeeded(purchLineOrig))
{
    if (purchTable.InclTax &&
        (this.hasAmountChanged(purchLineOrig) || this.hasTaxChanged(purchLineOrig)))
    {
        PurchTotals::newPurchTable(purchTable).calc(false, false, true);
        PurchLine::logMeasure(instrumentation, classStr(PurchTotals), methodStr(PurchTotals, calc), stopWatch);
    }
Конечно, на тестовых данных с 10-ю строками всё прекрасно, а вот в реальных условиях, когда строк эдак под 600 и более, какая-нить отмена недопоставленного количества превращается в десятки минут ожидания, так еще и блокировки на PurchTableVersion вешаются, так что несколько заказов на покупку в параллель штатно не отменишь.
Цитата:
Сообщение от Blog bot Посмотреть сообщение
How much telemetry are we collecting? A lot, like, really a lot!
Да, спасибо, в последней версии всё стало работать еще тормознее за счет того, что каждый чих пишется в EventLog, и по нему можно найти проблемное место. Но толку-то? Как вот надо извратиться, чтобы при запрете оверлеинга, одними extension'ами отрубить этот холостой пересчет налогов на каждой строке? Чтоб служба медом не казалась, PurchLine.distributionUpdateNeeded() сделан закрытым (private), так что свой пост-обработчик туда не повесишь.

Последний раз редактировалось gl00mie; 22.10.2018 в 20:08.
За это сообщение автора поблагодарили: fed (3), raz (5), sukhanchik (4).
Старый 23.10.2018, 08:58   #19  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от gl00mie Посмотреть сообщение
PurchLine.update() в D365FO стал просто великолепен: мало того, что метод раздулся до 370 строк (что, PurchLineType.update()? не, не слышали), так он еще и начал пересчитывать налоги по заказу на покупку - видать, какой-то костыль для отображения итогов по заказу в виде FormPart.
Этот успешный код появился еще в AX 2012, но там он живет в PurchLineType.update() (в котором, к слову, примерно 340 строк, совпадение ? или может они просто всю начинку из него вытянули в purchLine.update() ? ) и пока еще может быть легко изменен. Не думаю, что сделали для расчета итогов, для этого есть еще один вызов в другом классе , в том же методе update.

Скорее всего вызов необходим для корректного пересчета распределений, к тому же название метода как бы намекает, сам пересчет распределения идет ниже в том же методе, вызывается для всей покупки целиком, правда в последних версиях AX2012, ребята поняли или им кто-то подсказал, что бывают проблемы с производительностью. Поэтому они добавили флажок(purchline.SkipDistributionUpdate) для скипа пересчета распределения всей покупки при обновлении строки и его используют при некоторых массовых действиях со строками, а про InclTax возможно забыли, т.к. чек скорее всего не был активирован


Цитата:
Сообщение от gl00mie Посмотреть сообщение
Как вот надо извратиться, чтобы...
Я так понимаю вопрос больше риторический ? PurchTotals нельзя переопределить разве ?
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: gl00mie (3).
Старый 13.11.2018, 13:02   #20  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,895 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Да, спасибо, в последней версии всё стало работать еще тормознее за счет того, что каждый чих пишется в EventLog, и по нему можно найти проблемное место.
Кстати, у меня есть сильное подозрение, что замечательное новое логирование быстро съедает IOT Quote и Azure начинает зажимать дисковые операции. (Aka IOT Throttling.) Возможно из за этого микрософт и вынужден был перевести подписные VM на DS12 (где, как я понимаю, ограничения по IOT не такие жесткие).
Теги
axapta, cil, d365fo, guid, rasset, uuid, uuidv7, баг

 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:46.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.