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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.10.2003, 13:46   #21  
Vasilenko Alexsandr is offline
Vasilenko Alexsandr
Участник
Дети Юза
 
90 / 16 (1) ++
Регистрация: 05.09.2002
Адрес: Одесса
Российская отчетность это хорошо, но как было отмечено выше, уж очень утомительно, а еще бы украинскую отчетность бы иметь, было бы вообще прелесть!!! И еще есть один фактор, мне кажется, что бухгалтера это люди, которые очень любят выстраивать различные "цифровые комбинации" на базе одних и тех же данных, ну вот выгрузить их в Excel и пусть над ними издеваются!!!!)))) А еще дело привычки, очень сильная штука!!!
Старый 31.10.2003, 13:54   #22  
Alex_K is offline
Alex_K
Участник
 
531 / 36 (3) +++
Регистрация: 07.02.2003
Цитата:
Изначально опубликовано mazzy
Посмотрите на документооборот и постарайтесь не париться с программированием.
Сергей, как жы вы это дело не любите... (в смысле, программирование).

А касаемо документооборота - в тот и дело, что смотрю и остатки волос иной раз дыбом встают...
Старый 31.10.2003, 14:07   #23  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано Alex_K
Сергей, как жы вы это дело не любите... (в смысле, программирование).
На самом деле очень люблю.
Поэтому и берегу только для исключительных случаев

Цитата:
Изначально опубликовано Alex_K
А касаемо документооборота - в тот и дело, что смотрю и остатки волос иной раз дыбом встают...
Что да, то да. Но это действительно универсальный инструмент. Лучше освоить и развить его. Остальные гарантировано придется дописывать или переписывать.
Старый 04.11.2003, 10:36   #24  
andreynikolai is offline
andreynikolai
Участник
 
133 / 10 (1) +
Регистрация: 11.04.2002
Вообще то можно выгружать еще и с помощью класса CommaIo и его функции
writeExp в формат файла с расширением ' *.csv '.
По моим наблюдениям ето где-то в 3 раза быстрее.
Конечно сервиса класса comExcelDocument_ru там нет, зато функция вставки
отрабатывает не так долго в отличие от insertValue.
От пользователя требуется лишь сохранить файл как документ Excel.
При отработке winapi::ShellExecute csv - файл сам откроется в Excel.

Вот только беда: когда у нас стояла версия 2.5 сервис-пак 2 все было отлично, но
как перешли на сервис-пак 3 система упорно не разбивает csv - файл по ячейкам
, а все пишет в одну ячейку через запятую. Хрен знает в чем проблема.
Старый 04.11.2003, 13:45   #25  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Посмотрите региональные настройки.
Может у вас сейчас разделитель ; а не запятая
Старый 04.11.2003, 21:16   #26  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,263 / 982 (37) +++++++
Регистрация: 03.04.2002
Поигрался с DDEClient. Хоть и не модно, зато шустро и удобно:

X++:
void run()
{
    DDEClient   DDEClient;
    boolean     FirstTry = TRUE;
;
    try
    {
        DDEClient      = new DDEClient('excel','[1.xls]list1');
        if  (! DDEClient.isValid())
            return;
       // R1C1 означает row 1 column 1, т.е. адресс ячейки
        DDEClient.poke('R1C1' , "Hell World!");
    }
    catch(Exception::Internal)
    {
        // Only try to start excel once ...
        if (FirstTry)
        {
            FirstTry = FALSE;
            winApi::shellExecute( "excel.exe", "c:\\test\\1.xls");
            sleep(1000);  // wait some time to allow excel to start
            retry;
        }
        else
        {
         Box::warning("Unable to start DDE with excel","Error","Sorry !");
        }
    }
}
P.S. Списано с Tutorial_DDETest
P.S.S. 2 Vasilenko Alexsandr: не сочти за демпинг ;-)
Старый 06.11.2003, 21:07   #27  
ANVA is offline
ANVA
Участник
 
24 / 10 (1) +
Регистрация: 04.08.2003
Адрес: Mocква
2 andreynikolai

Приблизительно такого же результата можно добиться используя ADO. Если интересно, посмотрите как реализована печать налоговых регистров. Конкретно - класс RTax25Report_RegisterTransToExcel. Если нужны комментарии - welcome.
Старый 10.11.2003, 10:51   #28  
andreynikolai is offline
andreynikolai
Участник
 
133 / 10 (1) +
Регистрация: 11.04.2002
А это шустрее работает чем ComExcelDocument_RU ???
Старый 10.11.2003, 11:08   #29  
ANVA is offline
ANVA
Участник
 
24 / 10 (1) +
Регистрация: 04.08.2003
Адрес: Mocква
Гораздо быстрее Попробуйте сами. При данном подходе, работа с листом Excel ведется как с таблицей базы данных. Т.е. Вы сможете быстро вывести данные, но не отформатировать их. Для форматирования нужно иметь доступ к объектной модели. Принципиально технология может быть следующей:

1. Открыть(создать) книгу excel
2. Сформировать структуру таблицы с помощью ADOX. Т.е. определить количество и тип колонок. Обратите внимание на строку подключения.
3. С помощью ADO вывести табличные данные.
4. С помощью объектной модели Excel произвести форматирование данных. Построить нужные обрамления, заливки, вставить нужную шапку и т.д.

Мы использовали эти технологии для печати налоговых регистров. Работает очень быстро. Правда с шапкой поступили не очень хорошо, можно было поумнее сделать. Так, как я описал выше. У нас шапка выводится как обычная запись.
Старый 10.11.2003, 12:35   #30  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,263 / 982 (37) +++++++
Регистрация: 03.04.2002
ANVA, у нас 2.5 sp2, и класса RTax25Report_RegisterTransToExcel нет :-( Может приведете кусочек кода?
P.S. IHMO DDE все равно будет работать быстрее, т.к. пишет непосредственно в память Excel, но для удобства можно пожертвовать быстродействием. Все равно на порядок быстрее, чем через COM будет ;-)
Старый 10.11.2003, 12:42   #31  
ANVA is offline
ANVA
Участник
 
24 / 10 (1) +
Регистрация: 04.08.2003
Адрес: Mocква
Не думаю, что медленнее DDE, а прогрммировать на порядок удобнее. Работа идет через родной драйвер Microsoft Excel, в axapta исполняется минимум кода. Постараюсь до вечера запостить вам пример.
Старый 10.11.2003, 12:54   #32  
andreynikolai is offline
andreynikolai
Участник
 
133 / 10 (1) +
Регистрация: 11.04.2002
Хотите я вам пришлю этот класс, он не наследован ни от кого и следовательно
безболезненно пройдет инкрементную компиляцию.
Старый 10.11.2003, 13:23   #33  
ANVA is offline
ANVA
Участник
 
24 / 10 (1) +
Регистрация: 04.08.2003
Адрес: Mocква
Компиляцию он вряд-ли пройдет, поскольку использует функционал, отсутствующий в sp2. Но вы правы, идею можно будет посмотреть и так. Просто хотелось бы чтобы эта идея сохранилась в форуме, может еще кому понадобится
Старый 10.11.2003, 17:23   #34  
ANVA is offline
ANVA
Участник
 
24 / 10 (1) +
Регистрация: 04.08.2003
Адрес: Mocква
Сначала необходимо создать файл Excel.

X++:
boolean createExcelFile(container _fieldLabels)
{
    COM     workBook;
    COM     application = new COM('Excel.application');
    ;
    try
    {
        workBook = this.createEmptyBook(application);

        if (! workBook)
            return false;
    }
    catch(Exception::Error)
    {
        infolog.clear();
        info("@SYS55051");
    }

    if(application)
    {
        if(workBook)
        {
            workBook.Save();
        }
        application.quit();
    }

    return true;
}
После того как файл подготовлен и сохранен на диске, к нему можно подключаться, используя ADO. Для подключения используется следующая строка:

X++:
protected str connectionString()
{

    return 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + fileName +
           ';Mode=ReadWrite|Share Deny None;Extended Properties="Excel 8.0;HDR=No";Persist Security Info=False;';
}
Следующим шагом надо создать таблицу. В качестве таблиц используются листы Excel. В нашем случае, мы будем использовать таблицу с именем Axapta.

X++:
    COM adx  = new COM("ADOX.Catalog");
    COM     adoConnection, adoErrors, adoError;
    str txtError;
    ;    
    adoConnection = new COM("ADODB.Connection");

    if(! adoConnection)
        throw error("Ошибка подключения к источнику данных");

        adoConnection.open(this.connectionString(), "", "", -1);

        if(adoConnection.state() != #adStateOpen)
            throw error("Ошибка подключения к источнику данных ");

        adx.ActiveConnection(adoConnection);

        tbls = adx.Tables();
        tbl  = new COM("ADOX.Table");
        tbl.name("Axapta");
        cols = tbl.Columns();
По какому-то принципу создаем нужные нам поля, указываем их тип, ширину и название колонок. Я не очень уверен, но, по-моему, русский язык в названиях не поддерживается. Потому я использовал латинские названия.

X++:
    for (i=1;..)
    {   
        _col = new COM("ADOX.Column");
        _col.Name(strfmt("F%1", i));
        _col.Type(#adWChar); // Эта и другие константы ADO объявлены в макросе CCADO
        _cols.Append(_col);
     }
Далее можно вставлять записи, используя стандартную команду insert SQL. При этом не забывать брать в одинарные кавычки строки и даты. Обратите внимание на переменную table. Название таблицы в должно быть заключено именно в такие `` кавычки. FieldList - строка вида F1..Fn. Это те названия колонок, которые были определены выше.

X++:
While (queryRun.next())
{
        table     = strfmt("`%1$`", 'Axapta');
        queryString  = "insert into " + table + "(" + fieldsList + ") values (" + labelsList + ")";
        _adoConnection.execute(queryString);
}
Можно так же использовать объектную модель ADO (Объекты RecordSet и т.д) если это больше подходит. Последний момент - обработка ошибок:

X++:
     catch(Exception::Error)
    {
        if(adoConnection)
        {
            adoErrors = adoConnection.Errors();

            for(i=0; i < adoErrors.Count(); i++)
            {
                adoError = adoErrors.Item(i);
                txtError = adoError.Description();
                error(txtError);
            }
            adoConnection.close();
        }
Рекомендую посмотреть статью MSDN Knowledge Base (KB Q257819) "HOWTO: Use ADO and ADOX with Excel Data from Visual Basic or VBA".
Старый 12.11.2003, 08:37   #35  
storer is offline
storer
Участник
 
24 / 11 (1) +
Регистрация: 28.08.2003
Адрес: Москва
Попробуте посмотреть: здесь
Старый 12.11.2003, 11:36   #36  
dumf is offline
dumf
Участник
 
46 / 10 (1) +
Регистрация: 13.12.2001
Адрес: Москва
:(
Знали бы бухгалтера какие умы пропадают ))

Ничего не понятно... а внушает уважение и доверие.


оммммм........
Старый 13.11.2003, 13:19   #37  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,263 / 982 (37) +++++++
Регистрация: 03.04.2002
2 dumf : бухгалтерам такие вещи знать не за чем, но это уже обсуждение для курилки ;-)
ANVA, storer, спасибо большое, за приведенные примеры :-)
Старый 06.07.2004, 12:00   #38  
lp is offline
lp
Участник
 
12 / 10 (1) +
Регистрация: 06.07.2004
Можно ия свою лепту внесу . Очень быстро данные переносяться массивом . Т.е . массив формирутся , а затем все мскопом переносите в Excel. Быстрее чем , допустим , по одному элементу закидывать . Попробуйте сравнить
Старый 07.07.2004, 12:12   #39  
StasD is offline
StasD
Участник
 
24 / 15 (1) ++
Регистрация: 10.09.2003
Адрес: Хабаровск
Цитата:
Изначально опубликовано lp
Можно ия свою лепту внесу . Очень быстро данные переносяться массивом . Т.е . массив формирутся , а затем все мскопом переносите в Excel. Быстрее чем , допустим , по одному элементу закидывать . Попробуйте сравнить
Да, можно ещё применить в некоторых случаях следующий общий подход:

1. Формируем нужные сроки, заносим их в TextBuffer c разделителем табуляция между полями.
2. Затем TextBuffer.toClipboard()
3. Становимся на нужное место в документе Excel и делаем paste() (имеется ввиду не ручками, а из того же кода). Данные очень шустренько вставляются, в отличие от поячеистого прохода.

Правда несколько надо подправить стандартный COMExcelDocument_RU. Например сделать в нём метод paste().
Старый 02.03.2005, 02:42   #40  
MassarakshI is offline
MassarakshI
Участник
 
1 / 10 (1) +
Регистрация: 02.03.2005
Адрес: Москва
Jet, ADO (OLEDB) и Excel
MS Jet - это замечательно, но для него надо заранее средствами самого Excel'я разметить типы данных используемых ячеек, иначе он всё пытается запихнуть как строки (с апострофом). Ешё он напрочь отказывается понимать адресацию ячеек вида R1C1, т.е. написать
select * from [Sheet1$A1:B2]
можно, а
select * from [Sheet1$R1C1:R2C2]
нельзя, хотя так было бы удобнее. Лечится или нет - не знаю, думал, что надо указать какой-нибудь Extended Property, но ничего не нашёл.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Быстрый способ вывода данных в Excel с картинками Zlojbarsuk DAX: Программирование 10 23.10.2008 20:13
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Вызов Item() для коллекций Excel Владимир Максимов DAX: Программирование 15 17.08.2006 19:47
Excel быстрый вывод Кирилл DAX: Программирование 14 03.06.2004 12:23

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

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

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