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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.03.2013, 15:21   #1  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
Bega
В данном случае не вчитался и подумал о ком объекте. А раз тут дотНет, то есть еще вот такой момент, в C# после Collect вызывал метод WaitForPendingFinalizers.
Старый 06.03.2013, 15:23   #2  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
Цитата:
Сообщение от LeonDerCom Посмотреть сообщение
Bega
В данном случае не вчитался и подумал о ком объекте. А раз тут дотНет, то есть еще вот такой момент, в C# после Collect вызывал метод WaitForPendingFinalizers.
Да, видел этот метод, но без него тоже работает, посчитал что "wait" тут не нужно.
Старый 07.03.2013, 16:30   #3  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
Есть какой-то способ вставки в range массива, как это было возможно с COM?
Вот пример для COM, он работает:
X++:
ComExcelDocument_RU         comExcel;
    ArrayExtend_RU              arrayStr = new ArrayExtend_RU(Types::String, 10);
    ;
    comExcel = new ComExcelDocument_RU();
    comExcel.newFile("", false);
    
    arrayStr = new ArrayExtend_RU(Types::String, 2);
    arrayStr.value(1, "AAA");
    arrayStr.value(2, "БББ");
    
    comExcel.insertValue("A1:B1", arrayStr);
    
    comExcel.visible(true);
А для .NET не работает:
X++:
SysExcelApplication_NET     sysExcelApplication;
    SysExcelWorksheet_NET       sysExcelWorksheet;
    SysExcelRange_NET           range;
    ArrayExtend_RU              arrayStr = new ArrayExtend_RU(Types::String, 10);
    ;
    sysExcelApplication = SysExcelApplication_NET::construct();
    sysExcelApplication.workbooks().add("");
    sysExcelWorksheet = sysExcelApplication.worksheets().itemFromNum(1);
    arrayStr = new ArrayExtend_RU(Types::String, 2);
    arrayStr.value(1, "AAA");
    arrayStr.value(2, "БББ");
    range = sysExcelWorksheet.range("A1:B1");

    range.value2(arrayStr);

    sysExcelApplication.visible(true);
Пытался различными способами передать массив, прямая передача или упаковка через CLRInterop::getObjectForAnyType(arrayStr ) выдает ошибку о невозможности преобразования.
Старый 07.03.2013, 16:46   #4  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
Нашел способ через System.Array:
X++:
SysExcelApplication_NET     sysExcelApplication;
    SysExcelWorksheet_NET       sysExcelWorksheet;
    SysExcelRange_NET           range;
    System.Array                array;
    System.Type                 type;
    ;
    sysExcelApplication = SysExcelApplication_NET::construct();
    sysExcelApplication.workbooks().add("");
    sysExcelWorksheet = sysExcelApplication.worksheets().itemFromNum(1);
    
    type = System.Type::GetType('System.String');
    array = System.Array::CreateInstance(type, 2);
    
    array.SetValue(CLRInterop::getObjectForAnyType("AAA"), 0);
    array.SetValue(CLRInterop::getObjectForAnyType("БББ"), 1);
    
    range = sysExcelWorksheet.range("A1:B1");
    range.value2(array);
    
    sysExcelApplication.visible(true);
За это сообщение автора поблагодарили: BOAL (2), Pustik (2), Logger (5), IvanS (1).
Старый 21.01.2014, 21:23   #5  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от Bega Посмотреть сообщение
Нашел способ через System.Array:
Если весь array состоит из System.String, то всё получается корректно. А если в некоторых ячейках числа (переведённые в строковый вид), то они потом экселем всё равно воспринимаются как строки Даже если при этом используется шаблон xlt, в котором у этой ячейки стоит формат данных числовой.
Числа нужно вставлять отдельным массивом с числовым типом ?
__________________
Дмитрий
Старый 14.01.2015, 12:02   #6  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Цитата:
Сообщение от Bega Посмотреть сообщение
Нашел способ через System.Array:


Если данный код запустить в клиентском режиме - работает, как только переключаю класс в серверный - аксапта вылетает.

Причем если вместо array вставлять обычную строку все нормально работает

X++:
    SysExcelApplication_NET     sysExcelApplication;
    SysExcelWorksheet_NET       sysExcelWorksheet;
    SysExcelRange_NET           range;
    System.Array                array;
    System.Type                 type;
    ;

    new InteropPermission( InteropKind::ClrInterop ).assert();
    // BP deviation documented

    sysExcelApplication = SysExcelApplication_NET::construct();
    sysExcelApplication.visible(true);
    sysExcelApplication.workbooks().add("");
    sysExcelWorksheet = sysExcelApplication.worksheets().itemFromNum(1);

    type = System.Type::GetType('System.String');
    array = System.Array::CreateInstance(type, 2);
    array.SetValue(CLRInterop::getObjectForAnyType("AAA"), 0);
    array.SetValue(CLRInterop::getObjectForAnyType("БББ"), 1);

    range = sysExcelWorksheet.range("A1:B1");
    range.value2(array); // !!!! здесь вылетает Axapta
Старый 14.01.2015, 13:33   #7  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от ex3em Посмотреть сообщение
range.value2(array); // !!!! здесь вылетает Axapta
С какой ошибкой вылетает ? AifUtil::getClrErrorMessage() что говорит ?

Я кстати CLRInterop::getObjectForAnyType("AAA") не использую, вставляю значение (строковое, числовое и т.д.) без конвертирования. Работает и в пакетном и в обычном режиме.
__________________
Дмитрий

Последний раз редактировалось Damn; 14.01.2015 в 13:37.
Старый 14.01.2015, 14:28   #8  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Вылетает с стандартной критической ошибкой (Приложение выполнело недопустимую операцию и будет закрыто, отправить отчет в microsoft или запустить дебагер и т.д.), до catch не доходит. В Событиях операционки ничего не говорящее сообщение
Faulting application name: Ax32.exe, version: 5.0.1600.2596, time stamp: 0x53171f5d
Faulting module name: Ax32.exe, version: 5.0.1600.2596, time stamp: 0x53171f5d
Exception code: 0xc0000005
Fault offset: 0x001dbf2f
Faulting process id: 0x1b78
Faulting application start time: 0x01d02fec081571f8
Faulting application path: C:\Program Files (x86)\Microsoft Dynamics AX\50\Client\Bin\Ax32.exe
Faulting module path: C:\Program Files (x86)\Microsoft Dynamics AX\50\Client\Bin\Ax32.exe
Report Id: 8818c4b7-9bdf-11e4-80ea-0050569a5ddc
Faulting package full name:
Faulting package-relative application ID:

CLRInterop::getObjectForAnyType - убрал, но ситуацию не спасает ((

Procmon.exe - тоже толком ничего не выдает, отказ на доступ к файлам/папкам не заметил.
Office 2013.
Интересно у кого-нибудь данный код не вышибает Аксапту?

Последний раз редактировалось ex3em; 14.01.2015 в 14:36.
Теги
.net, ax2009, excel, законченный пример, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
проблема использования Excel через clr Batuev Artem DAX: Программирование 8 22.08.2011 18:01
AX.NET: интеграция .NET-приложений с Аксаптой и (будущие) возможности облачных вычислений gl00mie DAX: Программирование 2 23.04.2010 00:47
Импорт даты через Excel OliaM DAX: Функционал 2 13.12.2007 10:32
Экспорт в Excel через WorkBooks.OpenText() Владимир Максимов DAX: Программирование 2 09.04.2004 17:16
Чтение Excel-ячейки в Аксапте (2.5) через COM AKIS DAX: Программирование 3 25.03.2004 20:18

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:40.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.