Цитата:
Сообщение от
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.
Какие будут соображения?