AXForum  
Вернуться   AXForum > Прочие обсуждения > Курилка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.09.2016, 10:31   #201  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от kashperuk Посмотреть сообщение
RAMESH кстати уже давно у нас не работает.
Но комменты, похоже, до сих пор остались
А теперь их уже нет
Точнее, в Platform Update 3 их уже не будет

Магия
Старый 25.11.2016, 11:55   #202  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
Обратите внимание на очень неприятную особенность работы catch:
https://blogs.msdn.microsoft.com/mfp...4/x-the-catch/
__________________
Ален ноби, ностра алис.
Что означает - если один человек построил, другой завсегда разобрать может.
Старый 25.11.2016, 11:56   #203  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Это скорее неприятная особенность определенного способа обработки исключений, который практикуют некоторые отступники от Best Practices
Старый 06.12.2016, 18:31   #204  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
View не понимает FirstOnly
AX2012R3
Понадобилось сделать View, в котором должна отображаться одна запись с максимальным значением определенного поля.
Делаю в АОТ Query, с одним источником данных, задаю сортировку по нужному полю, в параметрах источника пишу свойство FirstOnly = Yes.
Делаю в АОТ View, на основании созданного query.
Открываю посмотреть что получилось - и вижу все записи таблицы.

В результате разбора выяснил, что View не обращает внимания на опцию FirstOnly в Query.
Пришлось делать обходной маневр в виде двух view с получением max поля и потом отфильтровывать по нему данные.
__________________
Ален ноби, ностра алис.
Что означает - если один человек построил, другой завсегда разобрать может.
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 09.12.2016, 09:45   #205  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от AlGol Посмотреть сообщение
В результате разбора выяснил, что View не обращает внимания на опцию FirstOnly в Query.
Это проблема не view, а игнорирование опции firstOnly в Query dynamicsaxhints: Query datasource FirstOnly property
__________________
Sergey Nefedov
Старый 09.12.2016, 18:48   #206  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
Цитата:
Сообщение от SRF Посмотреть сообщение
Это проблема не view, а игнорирование опции firstOnly в Query dynamicsaxhints: Query datasource FirstOnly property
что-то я не уловил в приведенном посте один момент: каким образом выполнялась трансляция Query в SQL запрос ( в местах где написано "The query is translated into SQL Server query").

Но по большому счету, именно в применении к данной проблеме, мне неинтересны ньюансы формирования запросов на SQL. Я хочу чтобы если в запросе установлен хинт FirstOnly то он бы возвращал одну запись.

Через X++ все так и происходит, я получаю одну запись. Если я делаю форму где структура источников формируется на основании Query тоже вижу поддержку Firstonly.

При реализации View посредством Query, это свойство просто игнорируется.
__________________
Ален ноби, ностра алис.
Что означает - если один человек построил, другой завсегда разобрать может.
Старый 12.12.2016, 23:18   #207  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от AlGol Посмотреть сообщение
что-то я не уловил в приведенном посте один момент: каким образом выполнялась трансляция Query в SQL запрос ( в местах где написано "The query is translated into SQL Server query").
Обычным, когда пытаетесь выполнить указанный запрос с хинтом firstOnly, на SQL сервер уходит запрос без него, можно например в журнале трассировки запросов посмотреть.

Цитата:
Сообщение от AlGol Посмотреть сообщение
Но по большому счету, именно в применении к данной проблеме, мне неинтересны ньюансы формирования запросов на SQL. Я хочу чтобы если в запросе установлен хинт FirstOnly то он бы возвращал одну запись.

Через X++ все так и происходит, я получаю одну запись. Если я делаю форму где структура источников формируется на основании Query тоже вижу поддержку Firstonly.

При реализации View посредством Query, это свойство просто игнорируется.
View это просто частный случай общей проблемы, в форме и X++ работает, потому что отсекает ядро AX(в действительности же на SQL запрос уходит другой), View же объект SQL, который создан на основании ошибочного запроса.
__________________
Sergey Nefedov
Старый 02.02.2017, 07:58   #208  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1630 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Из индусского - типа все бест-практис соблюдены
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  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
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  
Slava Chernenko is offline
Slava Chernenko
Участник
Самостоятельные клиенты AX
Соотечественники
 
34 / 15 (0) ++
Регистрация: 30.04.2008
Адрес: Copenhagen, Denmark
Наткнулся на ошибку, полез смотреть откуда ноги растут, оказалось так всегда было, в смысле в 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;
}
Проблема в комбинации ttsabort в середине кода и ttscommit в конце.
Интересно, куда этот код разползся в следующих версиях и выжил ли в AX 7...
Старый 06.02.2017, 16:31   #211  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от 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;
}
Проблема в комбинации ttsabort в середине кода и ttscommit в конце.
Интересно, куда этот код разползся в следующих версиях и выжил ли в AX 7...
EmplTable больше нет.
Может этот код где-то и существует, но я не имею ни малейшего представления, где это сейчас.
Старый 07.02.2017, 15:22   #212  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
AX 2012 R2
Десериализация структуры Struct::create(_container) в CIL, которая была упакована методом pack() в обычном исполняемом коде. Разъезжаются пары Ключ-Значение
Слева на скриншоте десериализация в обычном коде (ошибок нет), справа - выполненная в CIL. Как говорится, результат на лицо. Т.е. порядок значений в структуре остался прежним, а порядок ключей изменился.
Нажмите на изображение для увеличения
Название: Struct.png
Просмотров: 769
Размер:	34.5 Кб
ID:	11188
__________________
Кононов Пётр
За это сообщение автора поблагодарили: mazzy (5), macklakov (2), Logger (3).
Старый 07.02.2017, 15:24   #213  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от pedrozzz Посмотреть сообщение
AX 2012 R2
Десериализация структуры Struct::create(_container) в CIL, которая была упакована методом pack() в обычном исполняемом коде. Разъезжаются пары Ключ-Значение
Слева на скриншоте десериализация в обычном коде (ошибок нет), справа - выполненная в CIL. Как говорится, результат на лицо. Т.е. порядок значений в структуре остался прежним, а порядок ключей изменился.
Вложение 11188
оО!
1. спасибо
2. пожалуйста, зарегистрируйте багу. лучше от лица клиента. да, регистрация - это гемор. И очень сильный гемор. но эту - зарегистрируйте. пожалуйста.

и еще одно:
а можно попросить у вас еще и код, который у вас приводит к подобному "результату"?
Старый 07.02.2017, 16:06   #214  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Цитата:
Сообщение от mazzy Посмотреть сообщение
2. пожалуйста, зарегистрируйте багу. лучше от лица клиента. да, регистрация - это гемор. И очень сильный гемор. но эту - зарегистрируйте. пожалуйста.
Никогда не сталкивался с процессом регистрации и проект сейчас в стадии запуска, так что немного не до этого. Но если кто-то желает помочь с этим и займется - я не возражаю и только всячески приветствую.
Цитата:
Сообщение от mazzy Посмотреть сообщение
а можно попросить у вас еще и код, который у вас приводит к подобному "результату"?
Сам код разбросан по кускам разных классов, которые в силу NDA я не имею права выкладывать. Но в целом идея такая:
  1. Создаете в таблице YourTableName поле типа контейнер PackedData
  2. Заполняете структуру значениями в обычном исполняемом коде и через .pack() сохраняете его в таблицу. Например так:
    X++:
        YourTableName                           yourTableName;
        Struct                                  struct;
    
        struct  = new Struct();
        
        struct.add('ScenarioHistoryRecId', someRecId);
        struct.add('ResponseCode'        , someText);
        struct.add('InvoiceDateDispute'  , someDateTime);
        struct.add('OrigInvoiceDueDate'  , anotherDateTime);
        struct.add('OutstandingAmount'   , someRealValue);
        struct.add('DateReminderSent'    , oneMoreDateTime);
        struct.add('NewDueDateRemind'    , someDate);
        
        yourTableName.clear();
        yourTableName.PackedData = struct.pack();
        yourTableName.insert()
  3. Создаете наследника RunBaseBatch, в методе run() десереализируете сохраненную структуру через create() и запускаете один раз просто так, а второй раз в пакете.
    X++:
        YourTableName                           yourTableName = YourTableName::find(yourTableRecId);
        Struct                                  dataStruct    = yourTableName.PackedData
                                                              ? Struct::create(yourTableName.PackedData)
                                                              : new Struct();
        Counter                                 i;
    
        info(strFmt("Record id: %1", yourTableName.RecId));
        
        for (i = 1; i <= dataStruct.fields(); i++)
        {
            info(strFmt("%1: %2", dataStruct.fieldName(i), dataStruct.value(dataStruct.fieldName(i))));
        }
  4. Удивляетесь увиденному

Похоже, что в AX ключи следуют в порядке их добавления, а в CIL в алфавитном порядке. Мне вот абсолютно на порядок плевать, но хотелось бы, раз они меняют порядок ключей, то чтобы и порядок значений изменился соответствующим образом. У нас R2, проверьте кто-нибудь в R3, может уже исправили.
__________________
Кононов Пётр

Последний раз редактировалось pedrozzz; 07.02.2017 в 16:20.
За это сообщение автора поблагодарили: mazzy (5).
Старый 07.02.2017, 18:03   #215  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Проверил в 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  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Вместо утренней зарядки, перед первым запуском Аксапты, быстро удаляем кеш на компьтере. В командной строке Windows вводим:
del /s ax*.auc
Старый 10.02.2017, 19:56   #217  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
AX 2012 R3 \Classes\RetailTransactionServiceOrders\getCustomerOrder
AX 2012 R2 \Classes\RetailTransactionService\getCustomerOrder
X++:
select InventTransOrigin from inventTransOriginSalesLine
where inventTransOriginSalesLine.SalesLineInventTransId == salesLine.InventTransId;
Люди тестировали код, как обычно, на своей 10-гиговой игрушечной базе, и им было невдомек, что в кластерном индексе на первом месте стоит поле SalesLineDataAreaId - в итоге этот чудо запрос ни разу не попадает в индекс и на нормальных объемах данных приводит к зависанию на минуты. Из-за этого AX POS при попытке поднять заказ на продажу через RTS отваливается по таймауту. Если исправить на нормальный вызов InventTransOriginSalesLine::findInventTransOriginId(), то все отрабатывает за секунды.
За это сообщение автора поблагодарили: kashperuk (5).
Старый 10.02.2017, 19:58   #218  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от gl00mie Посмотреть сообщение
...приводит к зависанию на минуты...
ты лучше посмотри как поиск по номеру чека происходит...
Старый 17.02.2017, 15:20   #219  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Табличка TMSRouteSegmentLoadLine
AX 2012 R3, к словам об игрушечной базе Отсутствие индекса и непонятный cross join к WHSLoadLine.
Миниатюры
Нажмите на изображение для увеличения
Название: TMSRouteSegmentLoadLine.png
Просмотров: 420
Размер:	72.9 Кб
ID:	11215  
__________________
Sergey Nefedov

Последний раз редактировалось SRF; 17.02.2017 в 15:57.
Старый 17.02.2017, 15:57   #220  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,436 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А почему там джойнится курсор с именем Line, а условие накладывается на курсор с именем loadLine? Или там по смыслу так и нужно чтобы полное декартово произведение получалось?
Теги
axapta, cil, d365fo, guid, rasset, uuid, uuidv7, баг

 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:21.