![]() |
#321 |
Участник
|
У него от скорости печатания работает ветряк, который питает ноутбук?
![]()
__________________
Ivanhoe as is.. |
|
![]() |
#322 |
Участник
|
Или ветряк охлаждает клавиатуру, чтобы дым от быстрого печатания не мешал смотреть в монитор.
|
|
![]() |
#323 |
Мрачный тип
|
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
![]() |
#324 |
Мрачный тип
|
2009 SP1 5.0.1500.6491 (хотя оно вполне справедливо и для старших/младших версий)
Уже давненько замечал, что есть такая практика в различных обработчиках модульных движений по части использования методов lastAmountCur()/lastAmountMST() от доступного в тех краях объекта LedgerVoucher для наполнения суммовых полей своих родных модульных проводок. До сих пор отношение к этому далее и конкретнее, чем "чую бесовщину, но обосновать не могу", не шло... Однако на днях коллеги в "песочнице" попытались разнести накладную по заказу на продажу, в которой было две строки с разными знаками (-/+) в качестве исправления ранее сделанной (изменялась цена продажи одной строки). Все красиво и хорошо, склад и налоги -/+ прошли как и ожидалось, только вот проводка по клиенту сформировалась на сумму последней строки накладной вместо суммы всех строк. Исследования показали, что эта "радость" возникает при сложении двух обстоятельств:
Есть мнение, что вышеозначенные методы небезопасны и их использование за пределами LedgerVoucher'а суть есть зло и рытье ямы самому себе. P.S. <GEUU> в комментах тамошнего кода, наполнявший разбиение и поклавший на оное в своем же коде - это же наш здешний EVGL, если не ошибаюсь ?
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
![]() |
#325 |
Участник
|
|
|
![]() |
#326 |
Мрачный тип
|
Виноват, возвел на Евгения напраслину
![]() Нет счас под рукой 2012-й (и тем более 365FO) - там оно как, радости сии остались ?
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
![]() |
#327 |
Участник
|
Как-то так:
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)]]); } } |
|
![]() |
#328 |
Участник
|
|
|
![]() |
#329 |
Участник
|
Смотрю код сделанный предыдущим интегратором и... о божечки!
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 |
|
![]() |
#330 |
Участник
|
У вас же не тоже самое получилось
![]() |
|
|
За это сообщение автора поблагодарили: dech (1). |
![]() |
#331 |
Участник
|
Да, действительно! Под вечер уже мозг задеревенел)))
Но все равно можно проще сделать: 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 |
|
![]() |
#332 |
Участник
|
Коллеги наткнулись. оказывается кому-то из МС пришла здравая мысль денормализовать DIMENSIONATTRIBUTEVALUECOMBINATION(это AX7.3) - теперь там кол-во столбцов по кол-ву аналитик * 3.
Cделали втихую и никак не анонсировали, по видимому в движке синхронизации(т.е. в АОТ эта таблица имеет 5 полей). |
|
![]() |
#333 |
Модератор
|
Цитата:
Сообщение от trud
![]() Коллеги наткнулись. оказывается кому-то из МС пришла здравая мысль денормализовать DIMENSIONATTRIBUTEVALUECOMBINATION(это AX7.3) - теперь там кол-во столбцов по кол-ву аналитик * 3.
Cделали втихую и никак не анонсировали, по видимому в движке синхронизации(т.е. в АОТ эта таблица имеет 5 полей). Вложение 12096
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: trud (5). |
![]() |
#334 |
Участник
|
Цитата:
Сообщение от trud
![]() Коллеги наткнулись. оказывается кому-то из МС пришла здравая мысль денормализовать DIMENSIONATTRIBUTEVALUECOMBINATION(это AX7.3) - теперь там кол-во столбцов по кол-ву аналитик * 3.
Cделали втихую и никак не анонсировали, по видимому в движке синхронизации(т.е. в АОТ эта таблица имеет 5 полей). |
|
![]() |
#335 |
Участник
|
О, как-то пропустил, спасибо
WTF - ибо странно почему бы не дать доступ к этим данным из X++ изначально. т.е. сейчас для получения значения аналитик надо сильно заморочиться(т.е. ссылку на атрибут надо как-то хранить, писать методы). а тут получается альтернативный подход где все уже есть, просто по ID получай конкретную запись где будут все поля(по сути также как было в AX2009 с енумом аналитики) а каким образом обновляются эти невидимые столбцы в этой таблице DIMENSIONATTRIBUTEVALUECOMBINATION? Последний раз редактировалось trud; 17.09.2018 в 04:23. |
|
|
За это сообщение автора поблагодарили: Logger (3), gl00mie (3). |
![]() |
#336 |
Участник
|
Цитата:
Сообщение от trud
![]() О, как-то пропустил, спасибо
WTF - ибо странно почему бы не дать доступ к этим данным из X++ изначально. т.е. сейчас для получения значения аналитик надо сильно заморочиться(т.е. ссылку на атрибут надо как-то хранить, писать методы). а тут получается альтернативный подход где все уже есть, просто по ID получай конкретную запись где будут все поля(по сути также как было в AX2009 с енумом аналитики) а каким образом обновляются эти невидимые столбцы в этой таблице DIMENSIONATTRIBUTEVALUECOMBINATION? |
|
|
За это сообщение автора поблагодарили: trud (3). |
![]() |
#337 |
NavAx
|
Из DAX они тоже доступны через (fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(MainAccountValue)))
https://community.dynamics.com/ax/f/33/t/222182 |
|
|
За это сообщение автора поблагодарили: trud (3), Logger (3), gl00mie (3). |
![]() |
#338 |
NavAx
|
Цитата:
Сообщение от Vadik
![]() А почему в WTF и почему "втихую" ? Add dimensions to Excel templates довольно давно сделали - мы еще на 1611 это использовали
|
|
![]() |
#339 |
Участник
|
Случайно глянул пару методов Cust/VendTransOpen
Видимо уже давно не смотрел в код стандарта на update X++: ttsbegin; //..какие то изменения данных if (this.validateWrite()) { super(); } ttscommit; |
|
|
За это сообщение автора поблагодарили: trud (2). |
![]() |
#340 |
Участник
|
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); } Да, спасибо, в последней версии всё стало работать еще тормознее за счет того, что каждый чих пишется в EventLog, и по нему можно найти проблемное место. Но толку-то? Как вот надо извратиться, чтобы при запрете оверлеинга, одними extension'ами отрубить этот холостой пересчет налогов на каждой строке? ![]() Последний раз редактировалось gl00mie; 22.10.2018 в 20:08. |
|
|
За это сообщение автора поблагодарили: fed (3), raz (5), sukhanchik (4). |