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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.12.2003, 18:53   #1  
POS is offline
POS
Участник
 
8 / 10 (1) +
Регистрация: 17.11.2003
Вот - про быстр. Ексель, буфер обмена, и т.д.
PHP код:
//Сначала

    
com         XLSBookXLSWorkSheetXLScellsXLSrangeXLSTemp;

    
integer     hGlobalTextLocked;
    
integer     hGlobalText;
    
binary      bText;
    
str             s1 'Бла Бла Бла'
    
;


    
//Для последующего использования определяем XLSWorkSheet и XLScells. XLSrange будет определяться позже.
    
XLSBook excelDocument.getComDocument();
    
XLSWorkSheet =  XLSBook.ActiveSheet();
    
XLScells XLSWorkSheet.Cells();

   
s1+=num2char(9)+s1;

//Потопали выводить
        
XLSrange XLScells.Range(ComExcelDocument_RU::numToNameCell(,counter+1  ));
        
XLSrange.select();
//Подготовили
        
bText = NEW Binary(45);
        
hGlobalText WinAPI::globalAlloc(8256,45); // (флаги, размер - можно и 2500 ставить)
        
hGlobalTextLocked WinAPI::globalLock(hGlobalText);
        
bText.attach(hGlobalTextLocked,45);
        
bText.String(0s1);
        
WinAPI::openClipboard(clpBrd);
        
WinAPI::emptyClipboard();
        
SmmUtility::setClipboardData(1,hGlobalText);
        
WinAPI::closeClipboard();
//вставили
        
XLSWorkSheet.paste();
//почистили буфер
        
WinAPI::openClipboard(clpBrd);
        
WinAPI::emptyClipboard();
        
WinAPI::closeClipboard();
//почистили память
        
hGlobalTextLocked WinAPI::globalUnLock(hGlobalText);
        
hGlobalText WinAPI::globalFree(hGlobalText);
        
bText.finalize();
        
s1='';

//Примерно так 

Эта зараза встраивается методом в ComExcelDocument_RU, и использует для массового вывода данных системный буфер обмена.
Если где чего ошибся, или непонятно буит, могу не эти "размышления" подкинуть, а готовый метод для вышеназванного класса. Почти (только по стрингам) совместимый с InsertValue...


Просьба помидорами не кидать!:D
Старый 04.12.2003, 19:01   #2  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Я отключил смайлики в Вашем сообщении. Было неудобно читать.

Надеюсь, вы на меня не в обиде
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 04.12.2003, 19:08   #3  
POS is offline
POS
Участник
 
8 / 10 (1) +
Регистрация: 17.11.2003
И какого лешего :О превратилось в непотребщину?
О! В ответе на сообшение нормально кажет!

+++
Большое человеческое спасибо!
А то у меня как-то все мысли о том, чтобы этот код хоть у кого-нить заработал...
Старый 05.12.2003, 09:34   #4  
DSV is offline
DSV
Участник
 
129 / 10 (1) +
Регистрация: 12.06.2003
Адрес: Novocybers
А как забороли проблему с NT-операционками, когда в вызывающем приложении обязательно должна раскладка клавиатуры русская стоять?
Старый 27.02.2004, 12:09   #5  
DSV is offline
DSV
Участник
 
129 / 10 (1) +
Регистрация: 12.06.2003
Адрес: Novocybers
Случилось чудо!
Мне дама подсказала решение под 2К - нужно делать не просто вставку, а специальную. "Только текст".
В макросе VBA это выглядит
Цитата:
ActiveSheet.PasteSpecial Format:="Текст", Link:=False, DisplayAsIcon:= False
на Х++ счас попробуем прикрутить и протестировать быстродействие.

...

Добавка:

PHP код:
     //вставили       
XLSWorkSheet.pastespecial(1); 
Скорость не упала!
Ураааа!!!

З.Ы.
А вот так можно выставить параметры страницы в Excel-e - :
PHP код:
COMVariant        TTTT = new COMVariant();

TTTT.boolean(False);       
XLSBook excelDocument.getComDocument();
XLSWorkSheet =  XLSBook.ActiveSheet();          
XLSPrintArea XLSWorkSheet.PageSetup();      
XLSPrintArea.Orientation(2);      
XLSPrintArea.Zoom(TTTT);      
XLSPrintArea.FitToPagesWide(1);      
XLSPrintArea.FitToPagesTall(50); 
вдруг кому-нить поможет...

... еще добавка:

попробуйте вставить в ячейку А1 вот такую беду - 'a'+num2char(9)+'b'+num2char(13)+num2char(10)+'c'+num2char(9)+'d' ...
Старый 27.02.2004, 12:38   #6  
bucken is offline
bucken
Участник
Аватар для bucken
 
259 / 12 (1) ++
Регистрация: 04.09.2003
Адрес: Москва
Это что быстрее?
Можно немного уточнить:
1) Вставлять в ексель посредством свзяки COM+буфер обмена, оказывается быстрее чем просто COM ? (Если да - то во скоко раз быстрее примерно ?)
2) Или какие то еще приемущества дает?
__________________
Уточните значение слов и вы избавите человечество от половины его заблуждений. (Рене Декарт) / Axapta 2.5
Старый 27.02.2004, 13:10   #7  
DSV is offline
DSV
Участник
 
129 / 10 (1) +
Регистрация: 12.06.2003
Адрес: Novocybers
1) заметно быстрее. Раз эдак в 10 выводит ОДИН ДИАПАЗОН. Т.е. если этим методом вставлять один большой массив значений с соотв. разделителями, то будет махом. Если же много маленьких ячеечек - то всего процентов 10-15 выигрыш.

Например, на табеле, с его обозначениями дней/времен, вставка только этих самых строчек по 16 полей за раз делает процесс... Гм... внушающим доверие пользователя.
А есть отчет, где 1,5 тыс записей на 22 поля (по строке на вставку) выводятся за 45-50 сек.

2) Дешево и сердито.
Быстро и тупо.
В общем-то, других преимуществ не знаю...

Старый 27.02.2004, 14:52   #8  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
1) заметно быстрее. Раз эдак в 10 выводит ОДИН ДИАПАЗОН. Т.е. если этим методом вставлять один большой массив значений с соотв. разделителями, то будет махом. Если же много маленьких ячеечек - то всего процентов 10-15 выигрыш.
Подтверждаю!!!
И спасибо автору!!!
Старый 27.02.2004, 18:01   #9  
POS is offline
POS
Участник
 
8 / 10 (1) +
Регистрация: 17.11.2003
"Сэнк ю, сэнк ю!" (с)

А еще у меня припасена фигня, которая из ActiveX MS Web Sheet (милая имитация листа Экселя) контрола на форме читает вставленные пользователем записи с одновременной проверкой и обратной связью с пользователем. Импорт с юзверевским лицом, так сказать...
Никому не нужно?
Старый 27.02.2004, 19:44   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано DSV
1) заметно быстрее. Раз эдак в 10 выводит ОДИН ДИАПАЗОН. Т.е. если этим методом вставлять один большой массив значений с соотв. разделителями, то будет махом. Если же много маленьких ячеечек - то всего процентов 10-15 выигрыш.
DSV, можно этот совет в FAQ вставить?
Старый 27.02.2004, 19:49   #11  
DSV is offline
DSV
Участник
 
129 / 10 (1) +
Регистрация: 12.06.2003
Адрес: Novocybers
Цитата:
DSV, можно этот совет в FAQ вставить?
Запросто.
Особенно учитывая тот факт, что участник POS тоже не возражает.
Старый 27.02.2004, 19:51   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
ok. спасибо
Старый 27.02.2004, 19:52   #13  
POS is offline
POS
Участник
 
8 / 10 (1) +
Регистрация: 17.11.2003
Абсолютно всеми своими лапами за!

З.Ы. Да, действительно, это не показалось - с одного IP мы...
Старый 27.02.2004, 22:18   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
два молодца, одинаковых с... ip.
панимаешь. хорошо, спасибо.
Старый 28.02.2004, 23:35   #15  
LCh is offline
LCh
Участник
 
104 / 10 (1) +
Регистрация: 13.11.2002
Адрес: Санкт-Петербург
Тоже решал проблему скорости экспорта - результат действительно (очень) зависит от количества ячеек. Можно ещё целыми блоками копировать-вставлять, т.е. по несколько строк (я для теста кидал 10000 строк по 40 столбцов, но не суть).

Comma separated текстовый файл, открытый через ShellExecute ("excel.exe мой файл") работает быстрее, чем copy\paste.

Проблем две
- Excel конвертирует данные как захочет. Особенно это касается дат. Если научится такое отключать, то через тхт будет лучше всего. После DDE.
- Проблема с кодировкой. Уже не помню, как победил.

А ещё можно использовать Microsoft Spreadsheet ActiveX прямо в Axapta. Путь по системе меньше, скорость намного больше. Только опять же проблема с кодировкой. Зато юзверь может нажать кнопку и получить то же самое уже в самом Excel (и тоже очень быстро).

А вообще, посмотрите с какой скоростью работает экспорт MS SQL Server, и всем всё сразу станет ясно.
Старый 29.02.2004, 10:14   #16  
DSV is offline
DSV
Участник
 
129 / 10 (1) +
Регистрация: 12.06.2003
Адрес: Novocybers
Ну да.
Это когда много и строк.
А форматированный документ?
Старый 29.02.2004, 11:22   #17  
LCh is offline
LCh
Участник
 
104 / 10 (1) +
Регистрация: 13.11.2002
Адрес: Санкт-Петербург
Строгое ИМХО, исходя из опыта.

- Форматированый документ - это либо типовая форма, либо какой-то специализированый документ компании.
- В первом случае документ разумнее рисовать в Аксапте. Тем более, что в компаниях-внедренцах на одних и тех же проектах используются одни и те же документы. И каждый раз их почему-то рисуют заново. До сих пор не понимаю, почему MBS и Локализатор не создали проект по сопровождению отчётных документов (ОС-Х, М-Х и т.п.). Вместо этого они почему-то создали печать в Excel.
- Во втором случае в 99% случаев можно обойтись автоотчётами.
- Привязка к Excel - это неправильно с точки зрения проектирования. Вы не должны расчитывать на сторонний продукт - это вызывает больше накладных расходов чем вы предполагаете.
- Расчитывать на "малое количество строк" - прямой путь к ограничению возможностей системы.
Старый 29.02.2004, 13:22   #18  
DSV is offline
DSV
Участник
 
129 / 10 (1) +
Регистрация: 12.06.2003
Адрес: Novocybers
Ок.
Как средствами автоотчета реализовать функционал сводных таблиц Excel?
Как быстро выкрыжить два произвольно-случайных набора данных?
Старый 29.02.2004, 13:45   #19  
LCh is offline
LCh
Участник
 
104 / 10 (1) +
Регистрация: 13.11.2002
Адрес: Санкт-Петербург
Прошу прощения. Речь шла про автодизайн.

Сводные таблицы формируются при помощи OLAP.

И не забывайте про ActiveX - вместо того, чтобы полностью использовать иную программу, сократите привязку хотя бы до ActiveX объекта (Microsoft Office Privot Table 9\10). Опять же - внутри процесса (системного) обмен с COM-обьектом быстрее.

Поймите, это не Excel разработал сводные таблицы. Просто в Excel есть реализация функций работы с ними. Как и ещё у миллиона продуктов.
Старый 29.02.2004, 16:09   #20  
DSV is offline
DSV
Участник
 
129 / 10 (1) +
Регистрация: 12.06.2003
Адрес: Novocybers
OLAP - это, конечно, круто. И автодизайн - тоже круто.
Но их программировать все ж таки надо.

У нас применяется несколько отчетов, выгружающих строки в Эксель, данные положены со значительным запасом.
Юзеры на их основе могут предаться различного рода извращениям.
Так, мне к примеру, жутко лень делать отчет для профкома, сортированный по полу, отделу и фамилии. А из полуфабрикатного отчета "его любая баба сделает" (с) Профессор Преображенский
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
фильтр на копировании в буфер обмена Nikolaich DAX: Программирование 15 26.02.2009 21:10
Тормозит копирование строк в буфер обмена ivas DAX: Программирование 20 21.08.2007 15:05
Системный буфер обмена LiSA DAX: Программирование 15 01.04.2006 13:00
Не копирует из display-метода в буфер обмена akvi DAX: Программирование 6 08.12.2005 13:14
Буфер обмена novic DAX: Программирование 1 06.06.2005 08:11

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

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

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