AXForum  
Go Back   AXForum > Прочие обсуждения > Курилка
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 29.09.2016, 10:31   #201  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Quote:
Originally Posted by kashperuk View Post
RAMESH кстати уже давно у нас не работает.
Но комменты, похоже, до сих пор остались
А теперь их уже нет
Точнее, в Platform Update 3 их уже не будет

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

В результате разбора выяснил, что View не обращает внимания на опцию FirstOnly в Query.
Пришлось делать обходной маневр в виде двух view с получением max поля и потом отфильтровывать по нему данные.
__________________
Ален ноби, ностра алис.
Что означает - если один человек построил, другой завсегда разобрать может.
This post has been rated by: S.Kuskov (2).
Old 09.12.2016, 09:45   #205  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Join Date: 08.08.2007
Blog Entries: 1
Quote:
Originally Posted by AlGol View Post
В результате разбора выяснил, что View не обращает внимания на опцию FirstOnly в Query.
Это проблема не view, а игнорирование опции firstOnly в Query dynamicsaxhints: Query datasource FirstOnly property
__________________
Sergey Nefedov
Old 09.12.2016, 18:48   #206  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Join Date: 24.12.2001
Location: Тверь.
Quote:
Originally Posted by SRF View Post
Это проблема не 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, это свойство просто игнорируется.
__________________
Ален ноби, ностра алис.
Что означает - если один человек построил, другой завсегда разобрать может.
Old 12.12.2016, 23:18   #207  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Join Date: 08.08.2007
Blog Entries: 1
Quote:
Originally Posted by AlGol View Post
что-то я не уловил в приведенном посте один момент: каким образом выполнялась трансляция Query в SQL запрос ( в местах где написано "The query is translated into SQL Server query").
Обычным, когда пытаетесь выполнить указанный запрос с хинтом firstOnly, на SQL сервер уходит запрос без него, можно например в журнале трассировки запросов посмотреть.

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

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

При реализации View посредством Query, это свойство просто игнорируется.
View это просто частный случай общей проблемы, в форме и X++ работает, потому что отсекает ядро AX(в действительности же на SQL запрос уходит другой), View же объект SQL, который создан на основании ошибочного запроса.
__________________
Sergey Nefedov
Old 02.02.2017, 07:58   #208  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1635 (57) ++++++++
Join Date: 07.06.2003
Blog Entries: 1
Из индусского - типа все бест-практис соблюдены
X++:
   if (custInvoiceJour.company() == "@LIN103")                 
   {
        if(CustInvoiceJour.CurrencyCode == "@LIN63")               
        {
            bankName = strfmt("%1 %2","@LIN73","@LIN104");  
        }
This post has been rated by: macklakov (1), Vadik (1), 6a6kin (1).
Old 05.02.2017, 12:42   #209  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 646 (26) +++++++
Join Date: 27.11.2001
Location: 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
This post has been rated by: mazzy (2), kashperuk (5), gl00mie (3).
Old 06.02.2017, 15:33   #210  
Slava Chernenko is offline
Slava Chernenko
Участник
Самостоятельные клиенты AX
Соотечественники
 
34 / 15 (0) ++
Join Date: 30.04.2008
Location: 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...
Old 06.02.2017, 16:31   #211  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: Atlanta, GA, USA
Quote:
Originally Posted by Slava Chernenko View Post
Наткнулся на ошибку, полез смотреть откуда ноги растут, оказалось так всегда было, в смысле в 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 больше нет.
Может этот код где-то и существует, но я не имею ни малейшего представления, где это сейчас.
Old 07.02.2017, 15:22   #212  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
pedrozzz's Avatar
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Join Date: 18.02.2010
Location: Краснодар
AX 2012 R2
Десериализация структуры Struct::create(_container) в CIL, которая была упакована методом pack() в обычном исполняемом коде. Разъезжаются пары Ключ-Значение
Слева на скриншоте десериализация в обычном коде (ошибок нет), справа - выполненная в CIL. Как говорится, результат на лицо. Т.е. порядок значений в структуре остался прежним, а порядок ключей изменился.
Click image for larger version

Name:	Struct.png
Views:	921
Size:	34.5 KB
ID:	11188
__________________
Кононов Пётр
This post has been rated by: mazzy (5), macklakov (2), Logger (3).
Old 07.02.2017, 15:24   #213  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Quote:
Originally Posted by pedrozzz View Post
AX 2012 R2
Десериализация структуры Struct::create(_container) в CIL, которая была упакована методом pack() в обычном исполняемом коде. Разъезжаются пары Ключ-Значение
Слева на скриншоте десериализация в обычном коде (ошибок нет), справа - выполненная в CIL. Как говорится, результат на лицо. Т.е. порядок значений в структуре остался прежним, а порядок ключей изменился.
Attachment 11188
оО!
1. спасибо
2. пожалуйста, зарегистрируйте багу. лучше от лица клиента. да, регистрация - это гемор. И очень сильный гемор. но эту - зарегистрируйте. пожалуйста.

и еще одно:
а можно попросить у вас еще и код, который у вас приводит к подобному "результату"?
Old 07.02.2017, 16:06   #214  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
pedrozzz's Avatar
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Join Date: 18.02.2010
Location: Краснодар
Quote:
Originally Posted by mazzy View Post
2. пожалуйста, зарегистрируйте багу. лучше от лица клиента. да, регистрация - это гемор. И очень сильный гемор. но эту - зарегистрируйте. пожалуйста.
Никогда не сталкивался с процессом регистрации и проект сейчас в стадии запуска, так что немного не до этого. Но если кто-то желает помочь с этим и займется - я не возражаю и только всячески приветствую.
Quote:
Originally Posted by mazzy View Post
а можно попросить у вас еще и код, который у вас приводит к подобному "результату"?
Сам код разбросан по кускам разных классов, которые в силу 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, может уже исправили.
__________________
Кононов Пётр

Last edited by pedrozzz; 07.02.2017 at 16:20.
This post has been rated by: mazzy (5).
Old 07.02.2017, 18:03   #215  
Stitch_MS is offline
Stitch_MS
Участник
Stitch_MS's Avatar
Соотечественники
 
397 / 483 (17) +++++++
Join Date: 27.02.2006
Location: Дания
Проверил в 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)));
    }

Last edited by Stitch_MS; 07.02.2017 at 18:48.
This post has been rated by: pedrozzz (4).
Old 09.02.2017, 17:29   #216  
Ace of Database is offline
Ace of Database
Участник
Ace of Database's Avatar
 
877 / 649 (23) +++++++
Join Date: 14.10.2004
Вместо утренней зарядки, перед первым запуском Аксапты, быстро удаляем кеш на компьтере. В командной строке Windows вводим:
del /s ax*.auc
Old 10.02.2017, 19:56   #217  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Join Date: 28.11.2005
Location: Москва
Blog Entries: 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(), то все отрабатывает за секунды.
This post has been rated by: kashperuk (5).
Old 10.02.2017, 19:58   #218  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Quote:
Originally Posted by gl00mie View Post
...приводит к зависанию на минуты...
ты лучше посмотри как поиск по номеру чека происходит...
Old 17.02.2017, 15:20   #219  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Join Date: 08.08.2007
Blog Entries: 1
Табличка TMSRouteSegmentLoadLine
AX 2012 R3, к словам об игрушечной базе Отсутствие индекса и непонятный cross join к WHSLoadLine.
Attached Thumbnails
Click image for larger version

Name:	TMSRouteSegmentLoadLine.png
Views:	542
Size:	72.9 KB
ID:	11215  
__________________
Sergey Nefedov

Last edited by SRF; 17.02.2017 at 15:57.
Old 17.02.2017, 15:57   #220  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Join Date: 28.04.2007
Location: Калуга
А почему там джойнится курсор с именем Line, а условие накладывается на курсор с именем loadLine? Или там по смыслу так и нужно чтобы полное декартово произведение получалось?
Tags
axapta, cil, d365fo, guid, rasset, uuid, uuidv7, баг

 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 17:48.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.