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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.05.2008, 15:40   #1  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Ускорение стандартного импорта
Промаявшись с импортом проводок по клиентам, решил в классе SysDataImport заменить пару временных таблиц на Map
X++:
class SysDataImport extends SysDataExpImp implements sysDeleteTables
{
...
    // шустрый импорт -->
//    TmpTransactionIdMap     old2NewCreatedTransactionId;
//    TmpTransactionIdMap     old2NewModifiedTransactionId;
    Map     old2NewCreatedTransactionId;
    Map     old2NewModifiedTransactionId;
    // шустрый импорт <--
...
}
X++:
void new()
{
...
    // шустрый импорт -->
    old2NewCreatedTransactionId = new Map(Types::Integer, Types::Integer);
    old2NewModifiedTransactionId = new Map(Types::Integer, Types::Integer);
    // шустрый импорт <--
}
X++:
private void updateTransactionId(TableId _tableId, CreatedTransactionId _oldCreatedTransId, ModifiedTransactionId _oldModifiedTransId)
{
    CreatedTransactionId    newTransId = 0;
    ;

    if (!hasTransIdSupport)
    {
        return;
    }

    if (hasCreatedTransId[tableIds[_tableId]])
    {
    // шустрый импорт -->
//        select old2NewCreatedTransactionId where old2NewCreatedTransactionId.Id == _oldCreatedTransId;
//        if (old2NewCreatedTransactionId)
//        {
//            newTransId = old2NewCreatedTransactionId.RefId;
//        }
        if(old2NewCreatedTransactionId.exists(_oldCreatedTransId))
        {
            newTransId = old2NewCreatedTransactionId.lookup(_oldCreatedTransId);
        }
    // шустрый импорт <--

        if (newTransId)
        {
            curCommon.(new DictTable(curCommon.TableId).fieldName2Id(extendedtypestr(CreatedTransactionId))) = newTransId;
        }
        else
        {
            curCommon.(new DictTable(curCommon.TableId).fieldName2Id(extendedtypestr(CreatedTransactionId))) = nextTransId;
    // шустрый импорт -->
//            old2NewCreatedTransactionId.Id    = _oldCreatedTransId;
//            old2NewCreatedTransactionId.RefId = nextTransId;
//            old2NewCreatedTransactionId.insert();
            old2NewCreatedTransactionId.insert(_oldCreatedTransId, nextTransId);
    // шустрый импорт <--
            nextTransId++;
        }
    }

    newTransId = 0;
    if (hasModifiedTransId[tableIds[_tableId]])
    {
    // шустрый импорт -->
//        select old2NewModifiedTransactionId where old2NewModifiedTransactionId.Id == _oldModifiedTransId;
//        if (old2NewModifiedTransactionId)
//        {
//            newTransId = old2NewModifiedTransactionId.RefId;
//        }
        if(old2NewModifiedTransactionId.exists(_oldModifiedTransId))
        {
            newTransId = old2NewModifiedTransactionId.lookup(_oldModifiedTransId);
        }
    // шустрый импорт <--

        if (newTransId)
        {
            CurCommon.(new DictTable(curCommon.TableId).fieldName2Id(extendedtypestr(ModifiedTransactionId))) = newTransId;
        }
        else
        {
            curCommon.(new DictTable(curCommon.TableId).fieldName2Id(extendedtypestr(ModifiedTransactionId))) = nextTransId;
    // шустрый импорт -->
//            old2NewModifiedTransactionId.Id    = _oldModifiedTransId;
//            old2NewModifiedTransactionId.RefId = nextTransId;
//            old2NewModifiedTransactionId.insert();
            old2NewModifiedTransactionId.insert(_oldModifiedTransId, nextTransId);
    // шустрый импорт <--
            nextTransId++;
        }
    }
}
X++:
private void updateTransactionIdReference()
{
    Counter     fieldCount;
    Counter     fieldCounter;
    FieldId     fieldId;
    container   fields;
    ;

    if (!hasTransIdSupport)
    {
        return;
    }

    fields = createdTransField[curCommon.TableId];
    if (fields)
    {
        fieldCount = conlen(fields);
        for (fieldCounter=1;fieldCount<=fieldCounter;fieldCount++)
        {
            fieldId = conpeek(fields,fieldCount);
            if (isSysId(fieldId))           // If is a system field, it's already been handled through updateTransactionId
            {
                continue;
            }

    // шустрый импорт -->
//            select old2NewCreatedTransactionid where old2NewCreatedTransactionId.Id == curCommon.(fieldId);
//            if (old2NewCreatedTransactionId)
//            {
//                curCommon.(fieldId) = old2NewCreatedTransactionId.RefId;
//            }
            if (old2NewCreatedTransactionId.exists(curCommon.(fieldId)))
            {
                curCommon.(fieldId) = old2NewCreatedTransactionId.lookup(curCommon.(fieldId));
            }
    // шустрый импорт <--
            else
            {
                curCommon.(fieldId) = nextTransId;
    // шустрый импорт -->
//                old2NewCreatedTransactionId.Id    = curCommon.(fieldId);
//                old2NewCreatedTransactionId.RefId = nextTransId;
//                old2NewCreatedTransactionId.insert();
                old2NewCreatedTransactionId.insert(curCommon.(fieldId), nextTransId);
    // шустрый импорт <--
                nextTransId++;
            }
        }
    }

    fields = modifiedTransField[curCommon.TableId];
    if (fields)
    {
        fieldCount = conlen(fields);
        for (fieldCounter=1;fieldCount<=fieldCounter;fieldCount++)
        {
            fieldId = conpeek(fields,fieldCount);
            if (isSysId(fieldId))           // If is a system field, it's already been handled through updateTransactionId
            {
                continue;
            }

    // шустрый импорт -->
//            select old2NewModifiedTransactionid where old2NewModifiedTransactionid.Id == curCommon.(fieldId);
//            if (old2NewModifiedTransactionid)
//            {
//                curCommon.(fieldId) = old2NewModifiedTransactionid.RefId;
//            }
            if (old2NewModifiedTransactionid.exists(curCommon.(fieldId)))
            {
                curCommon.(fieldId) = old2NewModifiedTransactionid.lookup(curCommon.(fieldId));
            }
    // шустрый импорт <--
            else
            {
                curCommon.(fieldId) = nextTransId;
    // шустрый импорт -->
//                old2NewModifiedTransactionid.Id    = curCommon.(fieldId);
//                old2NewModifiedTransactionid.RefId = nextTransId;
//                old2NewModifiedTransactionid.insert();
                old2NewModifiedTransactionid.insert(curCommon.(fieldId), nextTransId);
    // шустрый импорт <--
                nextTransId++;
            }
        }
    }
}
Результат:
Импорт занял 2889 секунд для 1801345 записей.
Таблицы: CustTrans, VendTrans, LedgerTrans, CustTransOpen, CustSettlement и т.д.
За это сообщение автора поблагодарили: Vadik (1), gl00mie (5).
Теги
faq, импорт данных, оптимизация, полезное, производительность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вспомогательный класс для импорта из Excel через ADO gl00mie DAX: База знаний и проекты 80 10.04.2017 10:55
Функциональность импорта из КЛАДРа адресных сокращений RAN7 DAX: Программирование 3 06.03.2009 14:55
Использование OWC.Spreadsheet для ускорения экспорта/импорта в/из Excel. storer DAX: Программирование 24 28.03.2005 19:10
Как выбрать объект для создания шаблона импорта Excel? MagisterLudi DAX: Функционал 2 15.08.2003 16:42
Шаблона для импорта Excel 2000 vs XP blokva DAX: Функционал 3 15.07.2003 13:46

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

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

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