29.09.2016, 10:31 | #201 |
Участник
|
Цитата:
Точнее, в Platform Update 3 их уже не будет Магия |
|
25.11.2016, 11:55 | #202 |
Участник
|
Обратите внимание на очень неприятную особенность работы catch:
https://blogs.msdn.microsoft.com/mfp...4/x-the-catch/
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
25.11.2016, 11:56 | #203 |
Участник
|
Это скорее неприятная особенность определенного способа обработки исключений, который практикуют некоторые отступники от Best Practices
|
|
06.12.2016, 18:31 | #204 |
Участник
|
View не понимает FirstOnly
AX2012R3
Понадобилось сделать View, в котором должна отображаться одна запись с максимальным значением определенного поля. Делаю в АОТ Query, с одним источником данных, задаю сортировку по нужному полю, в параметрах источника пишу свойство FirstOnly = Yes. Делаю в АОТ View, на основании созданного query. Открываю посмотреть что получилось - и вижу все записи таблицы. В результате разбора выяснил, что View не обращает внимания на опцию FirstOnly в Query. Пришлось делать обходной маневр в виде двух view с получением max поля и потом отфильтровывать по нему данные.
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
09.12.2016, 09:45 | #205 |
Участник
|
Цитата:
__________________
Sergey Nefedov |
|
09.12.2016, 18:48 | #206 |
Участник
|
Цитата:
Сообщение от SRF
Это проблема не view, а игнорирование опции firstOnly в Query dynamicsaxhints: Query datasource FirstOnly property
Но по большому счету, именно в применении к данной проблеме, мне неинтересны ньюансы формирования запросов на SQL. Я хочу чтобы если в запросе установлен хинт FirstOnly то он бы возвращал одну запись. Через X++ все так и происходит, я получаю одну запись. Если я делаю форму где структура источников формируется на основании Query тоже вижу поддержку Firstonly. При реализации View посредством Query, это свойство просто игнорируется.
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
12.12.2016, 23:18 | #207 |
Участник
|
Цитата:
Цитата:
Сообщение от AlGol
Но по большому счету, именно в применении к данной проблеме, мне неинтересны ньюансы формирования запросов на SQL. Я хочу чтобы если в запросе установлен хинт FirstOnly то он бы возвращал одну запись.
Через X++ все так и происходит, я получаю одну запись. Если я делаю форму где структура источников формируется на основании Query тоже вижу поддержку Firstonly. При реализации View посредством Query, это свойство просто игнорируется.
__________________
Sergey Nefedov |
|
02.02.2017, 07:58 | #208 |
Участник
|
Из индусского - типа все бест-практис соблюдены
X++: if (custInvoiceJour.company() == "@LIN103") { if(CustInvoiceJour.CurrencyCode == "@LIN63") { bankName = strfmt("%1 %2","@LIN73","@LIN104"); } |
|
|
За это сообщение автора поблагодарили: macklakov (1), Vadik (1), 6a6kin (1). |
05.02.2017, 12:42 | #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). |
06.02.2017, 15:33 | #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... |
|
06.02.2017, 16:31 | #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... Может этот код где-то и существует, но я не имею ни малейшего представления, где это сейчас. |
|
07.02.2017, 15:22 | #212 |
Молодой, подающий надежды
|
AX 2012 R2
Десериализация структуры Struct::create(_container) в CIL, которая была упакована методом pack() в обычном исполняемом коде. Разъезжаются пары Ключ-Значение Слева на скриншоте десериализация в обычном коде (ошибок нет), справа - выполненная в CIL. Как говорится, результат на лицо. Т.е. порядок значений в структуре остался прежним, а порядок ключей изменился.
__________________
Кононов Пётр |
|
|
За это сообщение автора поблагодарили: mazzy (5), macklakov (2), Logger (3). |
07.02.2017, 15:24 | #213 |
Участник
|
Цитата:
Сообщение от pedrozzz
AX 2012 R2
Десериализация структуры Struct::create(_container) в CIL, которая была упакована методом pack() в обычном исполняемом коде. Разъезжаются пары Ключ-Значение Слева на скриншоте десериализация в обычном коде (ошибок нет), справа - выполненная в CIL. Как говорится, результат на лицо. Т.е. порядок значений в структуре остался прежним, а порядок ключей изменился. Вложение 11188 1. спасибо 2. пожалуйста, зарегистрируйте багу. лучше от лица клиента. да, регистрация - это гемор. И очень сильный гемор. но эту - зарегистрируйте. пожалуйста. и еще одно: а можно попросить у вас еще и код, который у вас приводит к подобному "результату"? |
|
07.02.2017, 16:06 | #214 |
Молодой, подающий надежды
|
Цитата:
Цитата:
Похоже, что в AX ключи следуют в порядке их добавления, а в CIL в алфавитном порядке. Мне вот абсолютно на порядок плевать, но хотелось бы, раз они меняют порядок ключей, то чтобы и порядок значений изменился соответствующим образом. У нас R2, проверьте кто-нибудь в R3, может уже исправили.
__________________
Кононов Пётр Последний раз редактировалось pedrozzz; 07.02.2017 в 16:20. |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
07.02.2017, 18:03 | #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). |
09.02.2017, 17:29 | #216 |
Участник
|
Вместо утренней зарядки, перед первым запуском Аксапты, быстро удаляем кеш на компьтере. В командной строке Windows вводим:
del /s ax*.auc |
|
10.02.2017, 19:56 | #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). |
10.02.2017, 19:58 | #218 |
Участник
|
|
|
17.02.2017, 15:20 | #219 |
Участник
|
Табличка TMSRouteSegmentLoadLine
AX 2012 R3, к словам об игрушечной базе Отсутствие индекса и непонятный cross join к WHSLoadLine.
__________________
Sergey Nefedov Последний раз редактировалось SRF; 17.02.2017 в 15:57. |
|
17.02.2017, 15:57 | #220 |
Участник
|
А почему там джойнится курсор с именем Line, а условие накладывается на курсор с именем loadLine? Или там по смыслу так и нужно чтобы полное декартово произведение получалось?
|
|