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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.08.2011, 16:38   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от raniel Посмотреть сообщение
И как сворачивание всех окон или разворачивание может влиять на работу AX-Excel (к томуже когда Excel в фоновом режиме)???
Аксапта 2009-ой версии.
У-у-у, сворачивание окон в 2009-й при работе с Excel через COM наинепосредственнейшим образом влияет на стабильность работы с Excel! Это смех сквозь слезы... см.
Ошибка времени выполнения в ComExcelDocument_RU.findRange()
Ошибка чтения файлов XLS под Windows 7 - тут предложено решение: переписать взаимодействие с Excel на использование .NET вместо COM. К слову, тут вот предлагают запускать клиента на терминальном сервере, так я по своему скромному опыту скажу, что это лишь усугубит ситуацию, потому что на настольном компе у вас несколько десятков процессов и 300-800 потоков, и все вылетает из-за этих <censored> таймаутов, а на терминальном сервере будет несколько сотен процессов и эдак под 4-5 тысяч потоков, так что вылетать будет куда чаще.
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Переписал семейство классов SysExcel на .NET, по ходу дела пришлось добавить несколько новых оберток для интерфейсов Excel, чтобы избавиться от необходимости работать напрямую через COM. Пока повсеместно включать не решился, но результат превзошел все ожидания! При запуске на терминальном сервере с полусотней параллельно работающих пользовательских сессий импорт из Excel через .NET несмотря на нещадные переключения между окнами (которые раньше валили импорт на раз) не только стабильно завершался без ошибок, но и отрабатывал при этом достаточно шустро - в отличие от "залатанного" импорта через COM, где за счет дополнительных try/catch/retry ошибки вроде как маскировались, но приводили к очень ощутимому замедлению работы.
Старый 24.08.2011, 17:22   #2  
Serg is offline
Serg
Участник
 
118 / 35 (2) +++
Регистрация: 12.02.2002
2 gl00mie

Можете поподробней рассказать, что значить переписать на .NET ?

Проблема взаимодействия Axapta c com-объектами под Windows7 и Winserver 2008 общеизвестна и на сколько я знаю в Microsofte пытаются ее решить, но как то не очень удачно (заплатки с периодическим обращением к объектами и т.д.)
Старый 25.08.2011, 14:15   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Serg Посмотреть сообщение
Можете поподробней рассказать, что значить переписать на .NET?
Взять классы-обертки для работы с Excel и переделать их как-то так (на примере SysExcelCells):
X++:
public static client SysExcelCells construct(MSOfficeVersion _version, COM _cells, Microsoft.Office.Interop.Excel.Range _cells_net = null)
{
    if (_cells_net)
    {
        return SysExcelCells_NET::construct( _version, _cells_net );
    }
    return new SysExcelCells(_cells, _version);
}
///////////////////////////////////////////////////////////////////////////////
// реализация обертки для работы с Excel через Microsoft.Office.Interop.Excel
class   SysExcelCells_NET
extends SysExcelCells
{
    Microsoft.Office.Interop.Excel.Range    cells_net;
}
// возвращает ClrObject из пространства имен Microsoft.Office.Interop.Excel, оберткой для которого является экземпляр класса
// это часть внутренней инфраструктуры семейства классов SysExcel*, реализующих работу через .NET
protected CLRObject clrObject()
{
    return cells_net;
}
public final COM comObject()
{
    // copy-paste кода метода-обработчика comObject(), общего для классов SysExcel*, реализующих работу через .NET
    str   methodName = strfmt( '%1.%2', classid2name( classidget( this ) ), methodstr(SysExcel, comObject) );
    throw error( strfmt( "@SYS75628", methodName, "@SYS95798" ) );
}
// способ, которым класс взаимодействует с Excel
// это часть внутренней инфраструктуры семейства классов SysExcel* для реализации кое-каких проверок
protected final InteropKind getXlInteropKind()
{
    return InteropKind::ClrInterop;
}
public SysExcelCell item(int _row, int _column)
{
    // предполагаем, что класс может работать и на сервере, при этом вызывающий код не должен знать детали взаимодействия с Excel
    new InteropPermission( InteropKind::ClrInterop ).assert();
    // BP deviation documented
    return SysExcelCell::construct( version, null, cells_net.get_Item( _row, _column ) );
}
protected void new(Microsoft.Office.Interop.Excel.Range _cells_net, MSOfficeVersion _version)
{
    super( null, _version );
    cells_net = _cells_net;
}
public SysExcelRange range(str _range = '')
{
    SysExcelRange   ret;
    ;
    if (_range != '')
    {
        new InteropPermission( InteropKind::ClrInterop ).assert();
        // BP deviation documented
        ret = SysExcelRange::construct( version, null, cells_net.get_Range( _range, this.getClrMissingArg() ) );
    }
    else
    {
        ret = SysExcelRange::construct( version, null, cells_net );
    }
    return ret;
}
public static SysExcelCells_NET construct(MSOfficeVersion _version, Microsoft.Office.Interop.Excel.Range _cells_net)
{
    return new SysExcelCells_NET( _cells_net, _version );
}
Соотв., аналогично переписываем остальные классы, в SysExcelApplication::construct() реализуем возможность создания экземпляра класса-наследника, работающего через .NET, вычищаем весь код, дергающий SysExcel.comObject() - и готово

Последний раз редактировалось gl00mie; 25.08.2011 в 14:20. Причина: очепятки
За это сообщение автора поблагодарили: Stainless (1).
Старый 25.08.2011, 23:33   #4  
BOAL is offline
BOAL
Участник
Аватар для BOAL
MCBMSS
Злыдни
1C
Лучший по профессии 2015
 
626 / 460 (17) +++++++
Регистрация: 28.04.2003
Адрес: Москва
Да уж, тема грустная для АХ2009, на АХ4 не было таких явных проблем при шевелении мышкой или кликом на запуск другой проги в момент построения Ехель отчетов.
Мы переписали на .НЕТ проблема снялась, но возникла несовместимость с разными офисами на клиентских местах - решение обсуждалось в какой-то теме, нужно ДЛЛ от офиса 2007 засунуть в БИН на клиенте, тогда на Офис2003 заработает.

А тут начала сбоить даже стандартная выгрузка формы (фича АХ2009) в Ехель по кнопочке на форме или Ctrl-E
Она ж тоже СОМ и ее наш перепис не коснулся.... и чинят это в МС, судя по году возникновения темы, давно... точнее вообще не чинят, тк потуги try-catch 4 раза - это бутафория, пробовали, фигня-с

Вторая панацея помимо .НЕТ, это запуск в потоках (для Ворда решили именно так, так на .Нет он не пошел, лезли неисправимые баги).
С потоками все ок, там никто мышкой не пошевелит и не поломает хрупкую конструкцию СОМ вызова.
Минус - проблемы с выводом инфолога, тк строится все это "где-то там".
Старый 25.08.2011, 23:56   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от BOAL Посмотреть сообщение
Минус - проблемы с выводом инфолога, тк строится все это "где-то там".
Вроде в отдельном потоке можно "вырезать" выведенные в нем сообщения через infolog.cut(), вернуть его через Thread.setErrorLog(), и потом вывести это все в основном потоке через infolog.view(). По-моему, куда больше проблем в случае отдельного потока с созданием "обертки" для запуска куска функционала в отдельном потоке, передачи нужных ему данных, etc...
Старый 26.08.2011, 00:08   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,342 / 3563 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от BOAL Посмотреть сообщение
Минус - проблемы с выводом инфолога, тк строится все это "где-то там".
Это скажем так - не проблема. Это особенность, про которую не нужно забывать и выводить надо через Thread.setoutputParm()

Цитата:
Сообщение от gl00mie Посмотреть сообщение
По-моему, куда больше проблем в случае отдельного потока с созданием "обертки" для запуска куска функционала в отдельном потоке, передачи нужных ему данных, etc...
Эта проблема одноразовая - один раз сделал, а потом забыл. Правда один раз сделать надо.
__________________
Возможно сделать все. Вопрос времени
Теги
ax2009, excel

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Выгрузка данных в Excel и их группировка... NetBus DAX: Программирование 8 09.12.2013 11:28
Очень медленно происходит выгрузка отчетов в Excel Leopold Stotch DAX: Программирование 8 31.05.2011 13:47
Sample Design Patterns: Microsoft Dynamics AX - Remedy for slow Microsoft Excel import Blog bot DAX Blogs 0 29.05.2011 17:13
Не идет выгрузка отчета в Excel. Слабая машина. asabin DAX: Администрирование 27 29.06.2005 10:48
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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