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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.06.2006, 10:45   #1  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Еще один вариант - при помощи DDE.
Время выгрузки - 20-21 с

PS Так как пользователь может в настройках отключить возможность обработки запросов DDE, то, перед созданием класса clientDDE, можно вставить сброс этого флага
X++:
    app.IgnoreRemoteRequests(false);
    ddeClient = new DDEClient("Excel", sheet.Name());
PPS По просьбе Gustav перемещаю код в окно.
Заодно добавил выгрузку ч/з буфер обмена. Для выгрузки использую TextBuffer.toClipboart().
Для переключения используется макрос DDE. Значение TRUE - выгрузка ч/з DDE, значение FALSE - clipboard
Время выгрузки примерно одинаковое для обоих вариантов

X++:
static void ExportExcelDDE(Args _args)
{
    LedgerTrans ledgerTrans;
    LedgerTable ledgerTable;
    int timeFullStart, timeFullFinish, timeFullTotal;
    int cnt = 0;
    str Buf, s;
    ComExcelDocument_Ru excel;
    COM                 doc;
    COM                 app;
    COM                 sheet;
    COM                 range;
    DDEClient           ddeClient;
    TextBuffer          tb;

    #define.RowsCount(5000)
    #define.DDE(false)
    #define.xlR1C1(0xFFFFEFCA)

    #if.DDE(false)
        void LoadKeyboardLayout()
        {
            dll dll = new dll("user32");
            dllFunction dllFunction = new dllFunction(dll, "LoadKeyboardLayoutA");
            #define.KLF_ACTIVATE(1)
            ;
            dllFunction.arg(ExtTypes::String, ExtTypes::DWord);
            dllFunction.returns(ExtTypes::DWord);
            dllFunction.call("00000419", #KLF_ACTIVATE);
        }
    #endif
    ;
    // засекаем время
    timeFullStart = timenow();

    excel = new ComExcelDocument_Ru();
    excel.newFile("", false);
    doc = excel.getComDocument();
    app = doc.application();
    sheet = app.ActiveSheet();

    buf = "RecId\tAccountNum\tAccountName\tAccountPlType\tBondBatchTrans_RU\tBondBatch_RU\tTransDate\tTxt\tAmountMST\tCrediting\n";

    range = sheet.range("A:A;E:E");
    range.NumberFormat("0");
    range = sheet.range("B:D;F:F;H:H;J:J");
    range.NumberFormat("@");
    range = sheet.range("G:G");
    range.NumberFormat("ДД.ММ.ГГГГ");
    range = sheet.range("I:I");
    range.NumberFormat("# ##0,00");

    #IF.DDE(true)
        app.IgnoreRemoteRequests(false);
        ddeClient = new DDEClient("Excel", sheet.Name());
    #ENDIF
    #IF.DDE(false)
        tb = new textBuffer();
        LoadKeyboardLayout();
    #ENDIF

    cnt++;
    while select  ledgerTrans
            join  ledgerTable
            where ledgerTrans.AccountNum == ledgerTable.AccountNum
               && ledgerTrans.TransDate >= str2date('dd.mm.yy',123) && ledgerTrans.TransDate <= str2date('DD.MM.YY',123)
    {
            // 10 полей
        buf +=
            strfmt(
                "%1\t%2\t%3\t%4\t%5\t%6\t%7\t%8\t%9\t%10\n",
                ledgerTrans.RecId, ledgerTrans.AccountNum, ledgerTable.AccountName, ledgerTable.AccountPlType,
                ledgerTrans.BondBatchTrans_RU, ledgerTrans.BondBatch_RU,
                date2str(ledgerTrans.TransDate, 321, 2, 3, 2, 3, 4), ledgerTrans.Txt,
                strltrim(strrem(num2str(ledgerTrans.AmountMST, 10, 2, 2, 0), "+")), ledgerTrans.Crediting);

        cnt++;
        if (cnt > 0 && (cnt mod #RowsCount == 0))
        {
            s = strfmt("A%1:J%2",  cnt-#RowsCount+1, cnt);
            range = sheet.range(s);
            #IF.DDE(true)
                ddeClient.poke(range.Address(true, true, #xlR1C1), buf);
            #ENDIF
            #IF.DDE(false)
                tb.setText(buf);
                tb.toClipboard();
                sheet.paste(range);
            #ENDIF

            buf = "";
        }
        if (cnt >= 65000) break;
    }
    if (cnt < #RowsCount)
        range = sheet.range("A1:J" + int2str(cnt));
    else
        range = sheet.range(strfmt("A%1:J%2",  cnt-(cnt mod #RowsCount)+1, cnt));
    #IF.DDE(true)
        ddeClient.poke(range.Address(true, true, #xlR1C1), buf);
    #ENDIF
    #IF.DDE(false)
        tb.setText(buf);
        tb.toClipboard();
        sheet.paste(range);
    #ENDIF

    excel.visible(true);

    timeFullFinish = timenow();
    timeFullTotal = timeFullFinish - timeFullStart;
    info('Время выполнения, сек');
    info(int2str(timeFullTotal));
}
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 14.06.2006 в 14:39.
За это сообщение автора поблагодарили: konopello (1), Gustav (2), JuniorAx (1).
Старый 14.06.2006, 11:42   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от sukhanchik
2Gustav: Читаю - прям как энциклопедию .... классно. Здорово получилось. (Пока еще раз одобрить не могу) Если выкрою время (в чем сомневаюсь, но можно постараться) - то надо будет еще 2 механизма проверить - через OWC и буфер обмена.
Гы! Спасибо за поддержку. Было бы здорово проверить эти механизмы, а время, думаю, выкроится - мы ж не торопимся особо
Цитата:
Сообщение от AndyD
Еще один вариант - при помощи DDE.
Время выгрузки - 20-21 с
Спасибо! Только чего-то там, мне кажется, не совсем согласовано с проверкой по кол-ву строк - проверьте, пожалуйста, вот эти моменты:
Код:
#define.RowsCount(105000)
..........................
if (cnt > 0 && (cnt mod #RowsCount == 0))
..........................
if (cnt >= 65000) break;
и надо удалить на фиг строку:
Код:
..........................
 
&& ledgerTrans.TransDate >= str2date('dd.mm.yy',123) && ledgerTrans.TransDate <= str2date('DD.MM.YY',123)
..........................
раз уж мы в процессе эксперимента решили прерывать цикл брейком после вывода точно 50 тыс. записей, не заморачиваясь с подбором дат

P.S. AndyD, и лучше бы, мне кажется, выложить джоб в окно, а не во вложение. Он небольшой, а просматривать и обсуждать будет значительно удобнее.

Последний раз редактировалось Gustav; 14.06.2006 в 11:45.
Теги
benchmark, download, excel, faq, xml, законченный пример, производительность, экспорт/импорт

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Axapta программирует Excel на VBA Gustav DAX: База знаний и проекты 10 13.03.2006 11:42
Использование OWC.Spreadsheet для ускорения экспорта/импорта в/из Excel. storer DAX: Программирование 24 28.03.2005 19:10
Передача данных из 1С в Axapta 3.0 через COM Connector isbist DAX: Программирование 10 03.12.2004 10:58
Особенности экспорта данных в Excel Roman-sp DAX: Функционал 18 01.03.2004 12:07
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

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