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).
Старый 14.05.2008, 16:54   #2  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Я, конечно, понимаю, что такое комментирование - это так называемые "Best Practices", но не кажется ли вам, что они лишь мешают чтению кода?
Не лучше ли, чтобы история изменений хранилась в системе контроля версий, а в коде был код и комментарии к нему?
Старый 14.05.2008, 19:03   #3  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Я, конечно, понимаю, что такое комментирование - это так называемые "Best Practices", но не кажется ли вам, что они лишь мешают чтению кода?
Не лучше ли, чтобы история изменений хранилась в системе контроля версий, а в коде был код и комментарии к нему?
Если честно я вопрос не понял.
Можно поподробнее как и чем нужно было закоментировать или вообще не нужно.
Старый 14.05.2008, 22:40   #4  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Цитата:
Сообщение от Wamr Посмотреть сообщение
Результат:
Импорт занял 2889 секунд для 1801345 записей.
Таблицы: CustTrans, VendTrans, LedgerTrans, CustTransOpen, CustSettlement и т.д.


2889 секунд - а предыдущий результат??
Старый 15.05.2008, 10:51   #5  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Пару лет
За сутки даже не доделал CustTrans, так как очень скоро временные таблицы вылезали на диск и при каждом обращении к ним делалось чтение построчно (по 48 байт). Интервалы между вставками записей в SQL-таблицу становятся больше 1 секунды уже через несколько минут непрерывного импорта.
Старый 15.05.2008, 11:24   #6  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
А можно этот код проектом выложить? Имхо это можно в базу знаний.
Старый 15.05.2008, 11:43   #7  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Я не могу, так как на всех приложениях, которые у меня есть, этот класс различается в classDeclaration и new. А делать проектики под разные версии лениво. Думаю, кому захочется попробовать смогут и отсюда скопировать и все вставить куда надо.
Старый 17.05.2008, 10:37   #8  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Небольшой штрих
Цитата:
Сообщение от Wamr Посмотреть сообщение
Промаявшись с импортом проводок по клиентам, решил в классе SysDataImport заменить пару временных таблиц на Map

...

X++:
void new()
{
...
    // шустрый импорт -->
    old2NewCreatedTransactionId = new Map(Types::Integer, Types::Integer);
    old2NewModifiedTransactionId = new Map(Types::Integer, Types::Integer);
    // шустрый импорт <--
}
...
В DAX 4.0
typeId2Type( typeid( CreatedTransactionId ) ) == Types::Int64
typeId2Type( typeid( ModifiedTransactionId ) ) == Types::Int64

Для совместимости кода Axapta 3.0 и DAX 4.0 небольшая поправка в инициализации Map'ов :

X++:
void new()
{
...
    // шустрый импорт -->
    old2NewCreatedTransactionId = new Map( typeId2Type( typeid( CreatedTransactionId ), typeId2Type( typeid( CreatedTransactionId ) ) );
    old2NewModifiedTransactionId = new Map( typeId2Type( typeid( ModifiedTransactionId ) ), typeId2Type( typeid( ModifiedTransactionId ) ) );
    // шустрый импорт <--
}
За это сообщение автора поблагодарили: Wamr (3).
Теги
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, время: 08:45.