|  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? Или там по смыслу так и нужно чтобы полное декартово произведение получалось?
		 | 
|  |