![]() |
#201 |
Участник
|
Цитата:
![]() Точнее, в Platform Update 3 их уже не будет Магия ![]() |
|
![]() |
#202 |
Участник
|
Обратите внимание на очень неприятную особенность работы catch:
https://blogs.msdn.microsoft.com/mfp...4/x-the-catch/
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
![]() |
#203 |
Участник
|
Это скорее неприятная особенность определенного способа обработки исключений, который практикуют некоторые отступники от Best Practices
![]() |
|
![]() |
#204 |
Участник
|
View не понимает FirstOnly
AX2012R3
Понадобилось сделать View, в котором должна отображаться одна запись с максимальным значением определенного поля. Делаю в АОТ Query, с одним источником данных, задаю сортировку по нужному полю, в параметрах источника пишу свойство FirstOnly = Yes. Делаю в АОТ View, на основании созданного query. Открываю посмотреть что получилось - и вижу все записи таблицы. В результате разбора выяснил, что View не обращает внимания на опцию FirstOnly в Query. Пришлось делать обходной маневр в виде двух view с получением max поля и потом отфильтровывать по нему данные.
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
![]() |
#205 |
Участник
|
Цитата:
__________________
Sergey Nefedov |
|
![]() |
#206 |
Участник
|
Цитата:
Сообщение от SRF
![]() Это проблема не view, а игнорирование опции firstOnly в Query dynamicsaxhints: Query datasource FirstOnly property
Но по большому счету, именно в применении к данной проблеме, мне неинтересны ньюансы формирования запросов на SQL. Я хочу чтобы если в запросе установлен хинт FirstOnly то он бы возвращал одну запись. Через X++ все так и происходит, я получаю одну запись. Если я делаю форму где структура источников формируется на основании Query тоже вижу поддержку Firstonly. При реализации View посредством Query, это свойство просто игнорируется.
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
![]() |
#207 |
Участник
|
Цитата:
Цитата:
Сообщение от AlGol
![]() Но по большому счету, именно в применении к данной проблеме, мне неинтересны ньюансы формирования запросов на SQL. Я хочу чтобы если в запросе установлен хинт FirstOnly то он бы возвращал одну запись.
Через X++ все так и происходит, я получаю одну запись. Если я делаю форму где структура источников формируется на основании Query тоже вижу поддержку Firstonly. При реализации View посредством Query, это свойство просто игнорируется.
__________________
Sergey Nefedov |
|
![]() |
#208 |
Участник
|
Из индусского - типа все бест-практис соблюдены
X++: if (custInvoiceJour.company() == "@LIN103") { if(CustInvoiceJour.CurrencyCode == "@LIN63") { bankName = strfmt("%1 %2","@LIN73","@LIN104"); } |
|
|
За это сообщение автора поблагодарили: macklakov (1), Vadik (1), 6a6kin (1). |
![]() |
#209 |
Administrator
|
AX2012 R3 CU12 (6.3.5000.133)
(встречается начиная с AX2012 R3 RTM) \Data Dictionary\Tables\WHSWorkTable\Methods\lockUnlockWork X++: public static void lockUnlockWork(WHSWorkId _workId, WHSUserId _userId) { WHSWorkLine workLine; WHSDimTracking dimTracking; ... #localmacro.WorkLineFieldsToResetStatus WorkStatus = WHSWorkStatus::Open, UserId = '', WorkInProcessUTCDateTime = utcDateTimeNull(), AskForNewLicensePlate = NoYes::No #endmacro #localmacro.WorkLineStatusInProcessButNotStarted workLine.WorkId == _workId && workLine.WorkStatus == WHSWorkStatus::InProcess && workLine.QtyWork == workLine.QtyRemain #endmacro ... // If we already have some work finished, we only reset the InProcess work lines, // where no actual work has been performed so far update_recordset workLine setting #WorkLineFieldsToResetStatus where #WorkLineStatusInProcessButNotStarted; if (workTable.isWorkTransTypeOutbound()) { delete_from dimTracking exists join workLine where #WorkLineStatusInProcessButNotStarted && dimTracking.WorkId == workLine.WorkId && dimTracking.LineNum == workLine.LineNum && dimTracking.Processed == NoYes::No; } ... } Программиста явно подвело чрезмерное увлечение макросами. Если макросы развернуть, ошибка становится очевидной: X++: update_recordset workLine setting WorkStatus = WHSWorkStatus::Open, // <-- (1) UserId = '', WorkInProcessUTCDateTime = utcDateTimeNull(), AskForNewLicensePlate = NoYes::No where workLine.WorkId == _workId && workLine.WorkStatus == WHSWorkStatus::InProcess // <-- (2) && workLine.QtyWork == workLine.QtyRemain; if (workTable.isWorkTransTypeOutbound()) { delete_from dimTracking exists join workLine where workLine.WorkId == _workId && workLine.WorkStatus == WHSWorkStatus::InProcess // <-- (3) && workLine.QtyWork == workLine.QtyRemain && dimTracking.WorkId == workLine.WorkId && dimTracking.LineNum == workLine.LineNum && dimTracking.Processed == NoYes::No; }
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
|
За это сообщение автора поблагодарили: mazzy (2), kashperuk (5), gl00mie (3). |
![]() |
#210 |
Участник
|
Наткнулся на ошибку, полез смотреть откуда ноги растут, оказалось так всегда было, в смысле в SYS слое такой код.
AX 2009, EmplTable form, datasource EmplTable write(): X++: public void write() { ..... ttsbegin; ...... if (emplTable.PartyId && dirPartyTable.Name && !DirPartyTable::exist(emplTable.PartyId)) { ....... if (dirPartyTable.validateWrite()) { // Create a new DirPartyTable row. dirPartyTable.write(); lastNewUnusedId = ""; } else { // Abort the transaction. ttsabort; } } else if (emplTable.PartyId && dirPartyTable.Name && dirPartyTableChanged && DirPartyTable::exist(emplTable.PartyId)) { if (dirPartyTable.validateWrite()) { // Update the existing DirPartyTable row. dirPartyTable.write(); } else { // Abort the transaction. ttsabort; } } super(); ..... ttscommit; } Интересно, куда этот код разползся в следующих версиях и выжил ли в AX 7... |
|
![]() |
#211 |
Участник
|
Цитата:
Сообщение от Slava Chernenko
![]() Наткнулся на ошибку, полез смотреть откуда ноги растут, оказалось так всегда было, в смысле в SYS слое такой код.
AX 2009, EmplTable form, datasource EmplTable write(): X++: public void write() { ..... ttsbegin; ...... if (emplTable.PartyId && dirPartyTable.Name && !DirPartyTable::exist(emplTable.PartyId)) { ....... if (dirPartyTable.validateWrite()) { // Create a new DirPartyTable row. dirPartyTable.write(); lastNewUnusedId = ""; } else { // Abort the transaction. ttsabort; } } else if (emplTable.PartyId && dirPartyTable.Name && dirPartyTableChanged && DirPartyTable::exist(emplTable.PartyId)) { if (dirPartyTable.validateWrite()) { // Update the existing DirPartyTable row. dirPartyTable.write(); } else { // Abort the transaction. ttsabort; } } super(); ..... ttscommit; } Интересно, куда этот код разползся в следующих версиях и выжил ли в AX 7... Может этот код где-то и существует, но я не имею ни малейшего представления, где это сейчас. |
|
![]() |
#212 |
Молодой, подающий надежды
|
AX 2012 R2
Десериализация структуры Struct::create(_container) в CIL, которая была упакована методом pack() в обычном исполняемом коде. Разъезжаются пары Ключ-Значение ![]() Слева на скриншоте десериализация в обычном коде (ошибок нет), справа - выполненная в CIL. Как говорится, результат на лицо. Т.е. порядок значений в структуре остался прежним, а порядок ключей изменился. |
|
|
За это сообщение автора поблагодарили: mazzy (5), macklakov (2), Logger (3). |
![]() |
#213 |
Участник
|
Цитата:
Сообщение от pedrozzz
![]() AX 2012 R2
Десериализация структуры Struct::create(_container) в CIL, которая была упакована методом pack() в обычном исполняемом коде. Разъезжаются пары Ключ-Значение ![]() Слева на скриншоте десериализация в обычном коде (ошибок нет), справа - выполненная в CIL. Как говорится, результат на лицо. Т.е. порядок значений в структуре остался прежним, а порядок ключей изменился. Вложение 11188 1. спасибо 2. пожалуйста, зарегистрируйте багу. лучше от лица клиента. да, регистрация - это гемор. И очень сильный гемор. но эту - зарегистрируйте. пожалуйста. и еще одно: а можно попросить у вас еще и код, который у вас приводит к подобному "результату"? |
|
![]() |
#214 |
Молодой, подающий надежды
|
Цитата:
Цитата:
Похоже, что в AX ключи следуют в порядке их добавления, а в CIL в алфавитном порядке. Мне вот абсолютно на порядок плевать, но хотелось бы, раз они меняют порядок ключей, то чтобы и порядок значений изменился соответствующим образом. У нас R2, проверьте кто-нибудь в R3, может уже исправили. Последний раз редактировалось pedrozzz; 07.02.2017 в 16:20. |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
![]() |
#215 |
Участник
|
Проверил в R3 CU11 - не исправили.
Чем отвечать на каверзные вопросы в регистрационной форме, я бы использовал Map, который вроде не глючит, если сделать так: Запись X++: map = new Map(Types::String, Types::Container); map.insert('ScenarioHistoryRecId', [123456789]); map.insert('ResponseCode' , ['my text']); packedMap = map.pack(); X++: Map map = Map::create(_packedMap); MapEnumerator enumerator; enumerator = map.getEnumerator(); while (enumerator.moveNext()) { info(strFmt("%1: %2", enumerator.currentKey(), conPeek(enumerator.currentValue(), 1))); } Последний раз редактировалось Stitch_MS; 07.02.2017 в 18:48. |
|
|
За это сообщение автора поблагодарили: pedrozzz (4). |
![]() |
#216 |
Участник
|
Вместо утренней зарядки, перед первым запуском Аксапты, быстро удаляем кеш на компьтере. В командной строке Windows вводим:
del /s ax*.auc |
|
![]() |
#217 |
Участник
|
AX 2012 R3 \Classes\RetailTransactionServiceOrders\getCustomerOrder
AX 2012 R2 \Classes\RetailTransactionService\getCustomerOrder X++: select InventTransOrigin from inventTransOriginSalesLine where inventTransOriginSalesLine.SalesLineInventTransId == salesLine.InventTransId; |
|
|
За это сообщение автора поблагодарили: kashperuk (5). |
![]() |
#218 |
Участник
|
|
|
![]() |
#219 |
Участник
|
Табличка TMSRouteSegmentLoadLine
AX 2012 R3, к словам об игрушечной базе
![]()
__________________
Sergey Nefedov Последний раз редактировалось SRF; 17.02.2017 в 15:57. |
|
![]() |
#220 |
Участник
|
А почему там джойнится курсор с именем Line, а условие накладывается на курсор с именем loadLine? Или там по смыслу так и нужно чтобы полное декартово произведение получалось?
|
|