Показать сообщение отдельно
Старый 29.01.2014, 22:46   #10  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 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