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