AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.01.2014, 00:06   #1  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Параметр [Common table] для RecordSortedList и RecordInsertList
Коллеги, кто-нибудь может объяснить назначение необязательного параметра [Common table] для классов RecordSortedList и RecordInsertList?
__________________
Felix nihil admirari
Старый 28.01.2014, 10:29   #2  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Я подумал, что может быть он сразу копирует данные из этого параметра, если по нему заранее сделать выборку. Но тесты показали, что ничего не происходит.
Еще один странный случай происходит при использовании RecordSortedList. Если не сделать сортировку, вернет только первую запись, а если раскомментировать строку в примере, то все будет ок:
X++:
static void testRecordSortedList(Args _args)
{
    SalesTable          salesTable, st;
    RecordSortedList    list = new RecordSortedList(tableNum(SalesTable));
    boolean             more;
    ;

    // list.sortOrder(fieldNum(SalesTable, SalesId));
    
    while select salesTable where
        salesTable.CustAccount  == 'CPG-000002'
    {
        list.ins(salesTable);
    }
    
    for (more = list.first(st); more; more = list.next(st))
    {
        info(st.SalesId);
    }
    info('Done');
}
Бага?
__________________
// no comments
Старый 29.01.2014, 00:33   #3  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от dech Посмотреть сообщение
Бага?
Извините, но RTFM: http://msdn.microsoft.com/en-US/libr...(v=ax.50).aspx
(когда будете читать, учтите, что ключ в RecordSortedList определяется именно с помощью sortOrder)
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 29.01.2014, 00:34   #4  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от wojzeh Посмотреть сообщение
Коллеги, кто-нибудь может объяснить назначение необязательного параметра [Common table] для классов RecordSortedList и RecordInsertList?
Параметр какого именно метода этих классов вас интересует?
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 29.01.2014, 07:16   #5  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
Извините, но RTFM: http://msdn.microsoft.com/en-US/libr...(v=ax.50).aspx
(когда будете читать, учтите, что ключ в RecordSortedList определяется именно с помощью sortOrder)
Спасибо, все это я читал, но если не определен ключ, почему вдруг нельзя показать записи в последовательном порядке, в котором они были вставлены в коллекцию?
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
Параметр какого именно метода этих классов вас интересует?
RTFM
__________________
// no comments
Старый 29.01.2014, 13:51   #6  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от dech Посмотреть сообщение
Спасибо, все это я читал, но если не определен ключ, почему вдруг нельзя показать записи в последовательном порядке, в котором они были вставлены в коллекцию?
Потому что в RecordSortedList не может быть дубликатов записей. Почитайте повнимательнее про метод ins() . Две записи считаются одинаковыми, если у них совпадают значения ключевых полей. Если ключевых полей нет, то любые две записи автоматически будут считаться одинаковыми.

Цитата:
Сообщение от dech Посмотреть сообщение
Для тех, кто как и я (если такие есть), не понял сразу, о чём спрашивает автор темы, поясню. Вопрос про AX2012, метод new() классов RecordSortedList и RecordInsertList. Я ответа на него не знаю. Возможно, кто-то из присутствующих на форуме представителей Microsoft сможет помочь.

А вообще, Как правильно задать вопрос, чтобы быть услышанным
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
За это сообщение автора поблагодарили: wojzeh (1), S.Kuskov (1).
Старый 29.01.2014, 15:12   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Может быть туда можно курсор временной таблицы передать? Допустим не InMemory, а TempDB, было бы вполне логично.
За это сообщение автора поблагодарили: Maxim Gorbunov (1).
Старый 29.01.2014, 16:12   #8  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Может быть туда можно курсор временной таблицы передать? Допустим не InMemory, а TempDB, было бы вполне логично.
Да, судя по всему, вы правы. Пример можно посмотреть в классе LedgerBalanceSheetDimPrint, метод generateKnownCombinations().
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 29.01.2014, 16:54   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
В исходниках переменная называется pTempDBCursor
Старый 29.01.2014, 22:46   #10  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
Да, судя по всему, вы правы. Пример можно посмотреть в классе LedgerBalanceSheetDimPrint, метод generateKnownCombinations().
Да, Макс, ты прав, речь идёт о методе new -- пропустил ключевое слово, когда писал!

Теперь о самом параметре в контексте самого класса RecordInsertList. Вот данный кусок, где, видимо, данные будут вставлены во временный буфер.

X++:
        recordInsertList = new RecordInsertList(tableNum(LedgerBalanceSheetUsedDimensionsTmp), false, false, false, false, false, _usedTmp);

        queryRun = new QueryRun(query);

        while (queryRun.next())
        {
            _usedTmp.clear();

            for (i = 1; i <= usedDimensions.lastIndex(); i++)
            {
                dimensionAttributeLevelValueAllView = queryRun.get(tableNum(DimensionAttributeLevelValueAllView), i);
                _usedTmp.EntityValue[i] = dimensionAttributeLevelValueAllView.DisplayValue;
                _usedTmp.EntityInstance[i] = dimensionAttributeLevelValueAllView.EntityInstance;
            }

            recordInsertList.add(_usedTmp);
        }

        recordInsertList.insertDatabase();
Теперь вопрос следующий: в чём смысл (профит) использования этого класса с временной таблицей, если в документации сказано:

Код:
The array insert operation automatically falls back to classic record-by-record inserts when non-SQL based tables are used (for example, temporary tables)...
Теперь сравним, как работают эти братские классы при передаче им в качестве параметра временной таблицы (InMemory).

RecordInsertList
X++:
private void runRIL() //RIL, temporary buffer contains two records
{
    uapTestTable        t;
    uapTestTable        t2;
    RecordInsertList    ril;

    t.setTmp();
    ril = new RecordInsertList(t.TableId, true, true, true, false, false, t);

    ttsBegin;

    t.code = "001";
    t.value = 1;
    ril.add(t);
    
    t.code = "002";
    t.value = 10;
    ril.add(t);

    ril.insertDatabase();
    ttsCommit;
    
    info('temporary uapTestTable');
    while select t
    {
        info(strFmt("%1 %2", t.code, t.value));
    }
    info('normal uapTestTable');
    while select t2
    {
        info(strFmt("%1 %2", t2.code, t2.value));
    }
/*    
Info	Message (01:40:51 pm)	temporary uapTestTable
Info	Message (01:40:51 pm)	001 1
Info	Message (01:40:51 pm)	002 10
Info	Message (01:40:51 pm)	normal uapTestTable
*/
}
RecordSortedList
X++:
private void runRSL()
{
    uapTestTable        t;
    uapTestTable        t2;
    RecordSortedList    rsl;

    t.setTmp();
    rsl = new RecordSortedList(t.TableId, t);
    rsl.sortOrder(fieldNum(uapTestTable, Code));

    ttsBegin;

    t.code = "001";
    t.value = 1;
    rsl.ins(t);

    t.code = "002";
    t.value = 10;
    rsl.ins(t);
    
    rsl.insertDatabase();
    ttsCommit;
    
    info('RecordSortedList temporary buffer contains no records, but two inserted in uapTestTable table');
    info('temporary uapTestTable');
    while select t
    {
        info(strFmt("%1 %2", t.code, t.value));
    }
    info('normal uapTestTable');
    while select t2
    {
        info(strFmt("%1 %2", t2.code, t2.value));
    }
    
/*
Info	Message (01:42:07 pm)	RecordSortedList temporary buffer contains no records, but two inserted in uapTestTable table
Info	Message (01:42:07 pm)	temporary uapTestTable
Info	Message (01:42:07 pm)	normal uapTestTable
Info	Message (01:42:07 pm)	001 1
Info	Message (01:42:07 pm)	002 10
*/
   
}
Выходит, что внутри у них что-то по-разному устроено, и под temporary table подразумевается именно InMemory, но не TempDB.

Какие будут соображения?
__________________
Felix nihil admirari
Старый 29.01.2014, 23:28   #11  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от wojzeh Посмотреть сообщение
Выходит... под temporary table подразумевается именно InMemory, но не TempDB.
wojzeh, честно говоря, совсем не понял, почему ты делаешь такой вывод. Пояснишь?

Как мне кажется, нет смысла использовать RecordSortedList/RecordInsertList для временных таблиц InMemory, потому что в некотором смысле это альтернативные механизмы, а не взаимодополняющие.

Цитата:
Сообщение от wojzeh Посмотреть сообщение
Теперь вопрос следующий: в чём смысл (профит) использования этого класса с временной таблицей, если в документации сказано:

Код:
The array insert operation automatically falls back to classic record-by-record inserts when non-SQL based tables are used (for example, temporary tables)...
Ну да, в документации сказано про non-SQL based tables, а временная таблица TempDB - она очень даже SQL based Соответственно, профит тот же самый, что и при использовании этих классов с обычными таблицами: вставляемые записи собираются в пакеты большего размера и за счёт этого происходит меньше вызовов клиент/сервер.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 29.01.2014, 23:43   #12  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
wojzeh, честно говоря, совсем не понял, почему ты делаешь такой вывод. Пояснишь?

Как мне кажется, нет смысла использовать RecordSortedList/RecordInsertList для временных таблиц InMemory, потому что в некотором смысле это альтернативные механизмы, а не взаимодополняющие.

Ну да, в документации сказано про non-SQL based tables, а временная таблица TempDB - она очень даже SQL based Соответственно, профит тот же самый, что и при использовании этих классов с обычными таблицами: вставляемые записи собираются в пакеты большего размера и за счёт этого происходит меньше вызовов клиент/сервер.
ну, так вот я теперь и понял, что временная, но всё же сикель-базированная! именно её имеет смысл передавать в качестве параметра для ускорения.

при этом можно так же лихо подсунуть ей и настоящую "времянку", но только не в случае с RecordSortedList.

в любом случае это пробел в документации, и неплохо было бы его восполнить.

у меня как раз тут задача о быстрой вставке сотен тысяч записей, но именно во временную таблицу для последующих расчётов.
__________________
Felix nihil admirari
Старый 26.10.2021, 20:07   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А кто-нибудь юзал RecordInsertList совместно с UserConnection ?
Старый 18.02.2022, 15:33   #14  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Вот гадство.
При выполнении на клиенте кода аналогичного этому
X++:
recordInsertList = new RecordInsertList(tableNum(LedgerBalanceSheetUsedDimensionsTmp), false, false, false, false, false, _usedTmp);
не работает, но выдает ошибочное сообщение об ошибке
Цитата:
Операции RecordInsertList или RecordSortedList с временными таблицами базы данных не разрешены.
Объект "RecordInsertList" не может быть создан
из сообщения можно ошибочно подумать что с времянками в tempdb в принципе не работает.
А оно работает, но нужно объект на сервере создавать.
Теги
ax2012, recordinsertlist, tempdb

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ax-erp: How to get a Common object from a table id? Blog bot DAX Blogs 0 26.04.2012 00:12
workflowax: How do I select from table Common in AX? Blog bot DAX Blogs 0 16.11.2011 15:11
palleagermark: Not enough rights to use table 'Common' (Common) error i Purchase Totals (PurchTotals) Blog bot DAX Blogs 0 07.06.2011 19:11
axzaptech: RecordSortedList and RecordInsertList Blog bot DAX Blogs 0 28.01.2011 23:14
PatrickChua: Temporary table Blog bot DAX Blogs 0 04.05.2009 14:05

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

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

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