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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.08.2011, 10:01   #1  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Спасибо за открытие новых горизонтов! Все-таки технологии 1998-2001 годов до сих пор рулят! Это было время наступления сингулярности в программировании
Жаль, что в Аксапте можно программировать на Бейсике только в строковых константах!

PS: я конечно немножко преувеличиваю

PS2: для лучшей популярности темы, лучше было бы ее назвать как-нибудь вроде "Найден новый способ выгрузки в Excel" или "Интегрируем Visual Basic в Аксапту".

Последний раз редактировалось Ace of Database; 31.08.2011 в 10:08.
За это сообщение автора поблагодарили: Gustav (5).
Старый 31.08.2011, 12:10   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Все-таки технологии 1998-2001 годов до сих пор рулят! Это было время наступления сингулярности в программировании
Ace, шикарное философское замечание! Прочитал - несколько минут просто сидел, приятно размышляя и ностальгируя. Впрочем, ностальгируя ли, если что-то из того мы открываем (наконец-таки!) только сейчас? К слову, я ж теперь в SAP'е на ABAP'е практикую, так там мне видится достаточный простор для внедрения технологий 1998-2001.

Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Жаль, что в Аксапте можно программировать на Бейсике только в строковых константах!
Согласен. Хотя это же лишь финальная форма представления отлаженного кода. А программировать можно вполне комфортно в любом VB-хосте (Visual Studio, Excel и др.), не забывая об ограниченности скриптовой версии языка. Хотя, справедливости ради, Basic и в урезанном виде велик!

Цитата:
Сообщение от Ace of Database Посмотреть сообщение
лучше было бы ее назвать как-нибудь вроде "Найден новый способ выгрузки в Excel"
Как я уже написал выше, "выгрузка в Excel" просто хорошая возможность демонстрации законченного примера. Следует сразу настроиться на более широкий кругозор. Например, можно применить тот же ADODB.Recordset для решения задач сортировки и фильтрации в оперативной памяти, без какой-либо связи с Excel'ем, конкурируя с такими родными средствами Аксы, как Set или Map.

Цитата:
Сообщение от Ace of Database Посмотреть сообщение
или "Интегрируем Visual Basic в Аксапту".
MSScriptControl в качестве языка может использовать и JScript, так что не Бейсиком единым. Кстати, будет здорово, если кто-нибудь смастерит и выложит здесь примерчик со скриптом на Джаве. Welcome!

Не, не будем переименовывать. В конце концов дайте же мне потешить мои скромные амбиции - уже вторая тема с заголовком "Поговорим o...". Рубрика-с, однако!

Последний раз редактировалось Gustav; 07.09.2011 в 12:44.
Старый 31.08.2011, 20:16   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Thumbs up Импорт из Excel (тоже с изюминкой)
Не откладывая в долгий ящик, сразу решение обратной задачи - импорт из Excel в том же духе.

Перед запуском нижеследующего джоба следует прогнать вышеупомянутый джоб, который выводит матрицу 50000х10 и сохранить получившийся файл (у меня это mssc_output.xls - у себя пропишите свой). Далее скорее запускайте джоб из этого поста и обнаружьте, что это реально "нечеловеческая музыка" (с):
X++:
static void Job_ReadFromExcel(Args _args)
{
    COM sc;
    str vbCode;
    int i,j;
    int timeStart = timenow();
    str file  = @'C:\Documents and Settings\kulvinov\My Documents\mssc_output.xls';
    str range =  'A2:J50001'; // 50000 x 10
    COMVariant dummy, rowsCount, colsCount;
    ;

    vbCode =
    'Option Explicit                                                        \r\n' +
    'Dim varArray                                                           \r\n' +
    'Sub readRangeToVarArray(fileName, rngAddr)                             \r\n' +
    '    Dim xlApp                                                          \r\n' +
    '    Dim rng                                                            \r\n' +
    '    Dim wbk                                                            \r\n' +
    '    Set xlApp = CreateObject("Excel.Application")                      \r\n' +
    '    With xlApp                                                         \r\n' +
    '        Set rng = .Workbooks.Open(fileName).Application.Range(rngAddr) \r\n' +
    '        varArray = rng.Value                                           \r\n' +
    '        Set rng = Nothing                                              \r\n' +
    '        For Each wbk In .Workbooks                                     \r\n' +
    '            wbk.Close False                                            \r\n' +
    '        Next                                                           \r\n' +
    '        Set wbk = Nothing                                              \r\n' +
    '        .Quit                                                          \r\n' +
    '    End With                                                           \r\n' +
    '    Set xlApp = Nothing                                                \r\n' +
    'End Sub                                                                \r\n'
    ;

    sc = new COM('MSScriptControl.ScriptControl');
    sc.Language('vbscript');

    sc.AddCode( vbCode );
    sc.ExecuteStatement(strFmt('readRangeToVarArray "%1", "%2"',file,range));

    info(strFmt('Время окончания считывания, %1 сек',timenow()-timeStart));

    rowsCount = sc.Eval('UBound(varArray,1)');
    info(strFmt('Количество строк в массиве: %1',rowsCount.long()));
    colsCount = sc.Eval('UBound(varArray,2)');
    info(strFmt('Количество столбцов в массиве: %1',colsCount.long()));

    for (i=1; i<=rowsCount.long(); i++) // цикл по строкам varArray
    {
        for (j=1; j<=colsCount.long(); j++) // цикл по столбцам varArray
        {
            dummy = sc.Eval(strFmt('varArray(%1,%2)',i,j));
            //print strFmt('%1 -- %2 -- %3 -- %4 -- %5',
            //             i,j,dummy.bStr(),dummy.double(),dummy.date());
        }
    }

    info(strFmt('Время окончания перебора всех значений, %1 сек',timenow()-timeStart));
}
Как можно понять, джоб (в его VB-части) считывает из листа Excel диапазон A2:J50001 в одну переменную varArray (одной операцией присваивания! с невероятной скоростью этой операции! и это обещанная изюминка), после чего Excel отпускается, и уже Аксапта в двойном цикле "трогает" по очереди все значения массива в операторе присваивания "dummy = ...". Можно раскомментировать оператор print, чтобы убедиться, что данные реально считываются. Несколько нелепый (и bStr, и double, и date в одном флаконе) print сделан на скорую руку по принципу "уж в одной из позиций strFmt правильное значение ячейки да отобразится".

С закомментированным print мои результаты в инфологе таковы:

Info Сообщение (20:02:24) Время окончания считывания, 0 сек
Info Сообщение (20:02:24) Количество строк в массиве: 50000
Info Сообщение (20:02:24) Количество столбцов в массиве: 10
Info Сообщение (20:02:24) Время окончания перебора всех значений, 21 сек

И данные-то можно читать в совершенно произвольном порядке, никакие "только вперёдные" курсоры нас не лимитируют! Красота!

Ну, вот. На сегодня я, пожалуй, всё сказал. Пошёл в отпуск на недельку. До встречи!
За это сообщение автора поблагодарили: gl00mie (5), mallard (1).
Старый 01.09.2011, 10:21   #4  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Вот это да!
Прощайте, буфер обмена и преобразование строк в контейнеры!
Теги
excel, импорт из excel, полезное, экспорт в excel

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
X++: X++ script host. Blog bot DAX Blogs 1 22.06.2020 15:13
axinthefield: Journals - Balance Control Accounts Blog bot DAX Blogs 0 21.06.2011 12:11
axinthefield: Podcast: Dynamics AX Shop Floor Control Blog bot DAX Blogs 0 17.06.2011 18:11
Solutions Monkey: Refreshing one user control webpart from another user control webpart through code. Blog bot DAX Blogs 0 25.01.2011 22:11
emeadaxsupport: Renaming an AOT object in Dynamics AX 2009 that is under source control with Team Foundation Server Blog bot DAX Blogs 0 06.10.2009 02:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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