28.01.2014, 00:06 | #1 |
Участник
|
Параметр [Common table] для RecordSortedList и RecordInsertList
Коллеги, кто-нибудь может объяснить назначение необязательного параметра [Common table] для классов RecordSortedList и RecordInsertList?
__________________
Felix nihil admirari |
|
28.01.2014, 10:29 | #2 |
Участник
|
Я подумал, что может быть он сразу копирует данные из этого параметра, если по нему заранее сделать выборку. Но тесты показали, что ничего не происходит.
Еще один странный случай происходит при использовании 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 |
Administrator
|
Извините, но 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 |
Administrator
|
Параметр какого именно метода этих классов вас интересует?
__________________
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 |
Участник
|
Цитата:
Сообщение от Maxim Gorbunov
Извините, но RTFM: http://msdn.microsoft.com/en-US/libr...(v=ax.50).aspx
(когда будете читать, учтите, что ключ в RecordSortedList определяется именно с помощью sortOrder) RTFM
__________________
// no comments |
|
29.01.2014, 13:51 | #6 |
Administrator
|
Цитата:
Для тех, кто как и я (если такие есть), не понял сразу, о чём спрашивает автор темы, поясню. Вопрос про 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 |
Участник
|
Может быть туда можно курсор временной таблицы передать? Допустим не InMemory, а TempDB, было бы вполне логично.
|
|
|
За это сообщение автора поблагодарили: Maxim Gorbunov (1). |
29.01.2014, 16:12 | #8 |
Administrator
|
Да, судя по всему, вы правы. Пример можно посмотреть в классе 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 |
Участник
|
В исходниках переменная называется pTempDBCursor
|
|
29.01.2014, 22:46 | #10 |
Участник
|
Цитата:
Теперь о самом параметре в контексте самого класса 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)... 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 */ } 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 */ } Какие будут соображения?
__________________
Felix nihil admirari |
|
29.01.2014, 23:28 | #11 |
Administrator
|
Цитата:
Как мне кажется, нет смысла использовать 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)...
__________________
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 |
Участник
|
Цитата:
Сообщение от Maxim Gorbunov
wojzeh, честно говоря, совсем не понял, почему ты делаешь такой вывод. Пояснишь?
Как мне кажется, нет смысла использовать RecordSortedList/RecordInsertList для временных таблиц InMemory, потому что в некотором смысле это альтернативные механизмы, а не взаимодополняющие. Ну да, в документации сказано про non-SQL based tables, а временная таблица TempDB - она очень даже SQL based Соответственно, профит тот же самый, что и при использовании этих классов с обычными таблицами: вставляемые записи собираются в пакеты большего размера и за счёт этого происходит меньше вызовов клиент/сервер. при этом можно так же лихо подсунуть ей и настоящую "времянку", но только не в случае с RecordSortedList. в любом случае это пробел в документации, и неплохо было бы его восполнить. у меня как раз тут задача о быстрой вставке сотен тысяч записей, но именно во временную таблицу для последующих расчётов.
__________________
Felix nihil admirari |
|
26.10.2021, 20:07 | #13 |
Участник
|
А кто-нибудь юзал RecordInsertList совместно с UserConnection ?
|
|
18.02.2022, 15:33 | #14 |
Участник
|
Вот гадство.
При выполнении на клиенте кода аналогичного этому X++: recordInsertList = new RecordInsertList(tableNum(LedgerBalanceSheetUsedDimensionsTmp), false, false, false, false, false, _usedTmp); Цитата:
Операции RecordInsertList или RecordSortedList с временными таблицами базы данных не разрешены.
Объект "RecordInsertList" не может быть создан А оно работает, но нужно объект на сервере создавать. |
|
Теги |
ax2012, recordinsertlist, tempdb |
|
|