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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.03.2004, 11:30   #1  
bms is offline
bms
Участник
 
17 / 10 (1) +
Регистрация: 30.10.2003
Адрес: Донецк
? Обработка исключений COM-объектов
Как нужно описать в коде исключение для COM-объекта, чтобы Аксапта не генерировала сообщение об ошибке?

Объясню ситуацию:
Есть две версии COM-объекта “Word.Application”. В одной версии, этого COMа, есть функция InsertRowsBelow, в другой, в место неё есть функция InsertRows. Необходимо сделать так, чтобы в случае неудачного вызова первой функции (InsertRowsBelow) вызывалась вторая (InsertRows).
Вот как я пытался это сделать:

try
{
selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке
}
catch(exception::Error)
{
selection.InsertRows(_num);
}
Старый 31.03.2004, 12:05   #2  
Beavis-analitik is offline
Beavis-analitik
Участник
 
7 / 10 (1) +
Регистрация: 31.03.2004
Насколько известно, по-хорошему сделать это нельзя.

Есть способ типа "грязный хак": нарыть в MorphX класс Info и доработать его.

Например, поправить метод viewBuild, там есть код
<...>
if (!browser.design().visible())
{
browser.design().visible(true);
<...>

Написанное относится к 3.0 SP1 Rus
Старый 31.03.2004, 12:21   #3  
bms is offline
bms
Участник
 
17 / 10 (1) +
Регистрация: 30.10.2003
Адрес: Донецк
Большое спасибо Beavis-analitik за ваш ответ.

Этот способ мне известен. Но в данной ситуации необходимо реализовать это исключение не меняя класса Info.
Попробую что-нибудь придумать.
Старый 31.03.2004, 16:03   #4  
Atani is offline
Atani
Участник
 
77 / 15 (1) ++
Регистрация: 25.07.2003
Адрес: г. Королёв М.О.
Расскажите поподробнее, пожалуйста, об этом способе.

Цитата:
Есть способ типа "грязный хак": нарыть в MorphX класс Info и доработать его.
Не понял, наверное, потому что не пользуюсь MorphX. В AOT'е класс Info не светится...


Хочу ещё поделиться проблемой при выгрузке в Excel
Одна и та же выгрузка данных в Excel завершается успешно, условно говоря, два раза из трёх. Одна из типичных ошибок: "...Ошибка COM ...метод Value2() вызван с неверным количеством параметров". Выгрузка организована через "чистый" COM, а не класс ComExcelDocument_RU; вставка осуществляется построчно из массива (метод описан на форуме).
Может, кто-то сталкивался с подобным непослушанием.
Старый 31.03.2004, 16:29   #5  
Beavis-analitik is offline
Beavis-analitik
Участник
 
7 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Не понял, наверное, потому что не пользуюсь MorphX. В AOT'е класс Info не светится...
Рискну предположить, что не светится потому, что нет лицензии на светимость.

Имхо MorphX и AOT это одно и то же
Developer's Guide:
Цитата:
The development environment in Axapta is called MorphX.
Старый 31.03.2004, 17:02   #6  
bms is offline
bms
Участник
 
17 / 10 (1) +
Регистрация: 30.10.2003
Адрес: Донецк
У меня есть опыт работы с комом, правда в основном не в Аксапте. На сколько я понимаю такого быть не может. Я хотел бы глянуть код, если это возможно.
Старый 31.03.2004, 17:14   #7  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Попробуй внутри catch что-то типа
PHP код:
Infolog.cut(infolog.line()) 
Старый 31.03.2004, 17:55   #8  
bms is offline
bms
Участник
 
17 / 10 (1) +
Регистрация: 30.10.2003
Адрес: Донецк
Дело втом, что сообщение об ошибке вываливается сразу после обращения к методу. До catch дело не дохдит.
Старый 31.03.2004, 18:34   #9  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Посмотри класс SysExcelTemplateWizard методы createWorkBook() или openWorkBook(). Там идет обработка ошибок при работе с Excel через COM.
Старый 31.03.2004, 18:43   #10  
bms is offline
bms
Участник
 
17 / 10 (1) +
Регистрация: 30.10.2003
Адрес: Донецк
Спасибо за совет, но я работаю с Word. И в класса которые там используются это сообщение не генерится. Может есть подобный класс для Word?
Старый 31.03.2004, 18:54   #11  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Может я чего-то не понимаю, но вроде бы логика простая. Пусть даже сообщение об ошибке вываливается до catch, но сразу после этого в catch оно удаляется из Infolog`а. И в принципе пользователь не должен ничего увидеть. Единственный, может у тебя catch не выполняется. Такое может быть, если твой код расположен внутри ttsbegin .. ttscommit.
Старый 01.04.2004, 10:29   #12  
bms is offline
bms
Участник
 
17 / 10 (1) +
Регистрация: 30.10.2003
Адрес: Донецк
try
{
selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке
}
catch(exception::Error)
{
selection.InsertRows(_num);
}

После того как вываливается сообщение выполнение процедуры останавливается, нет ttsbegin и ttscommit.
Старый 01.04.2004, 11:11   #13  
ta_and is offline
ta_and
Участник
 
226 / 122 (5) +++++
Регистрация: 26.02.2002
Адрес: СПб
Цитата:
Изначально опубликовано bms
try
{
selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке
}
catch(exception::Error)
{
selection.InsertRows(_num);
}
catch(exception::Error)
{
infolog.clear();
selection.InsertRows(_num);
}
Старый 01.04.2004, 11:52   #14  
bms is offline
bms
Участник
 
17 / 10 (1) +
Регистрация: 30.10.2003
Адрес: Донецк
Старый 01.04.2004, 11:54   #15  
bms is offline
bms
Участник
 
17 / 10 (1) +
Регистрация: 30.10.2003
Адрес: Донецк
Господа CATCH ВООБЩЕ НЕ ВЫПОЛНЯЕТСЯ!!!
После selection.InsertRowsBelow(_num); выполнение процедуры прекращается.
Старый 01.04.2004, 12:13   #16  
DMA is offline
DMA
Участник
 
109 / 19 (1) ++
Регистрация: 30.09.2003
Возможножно возникает Exception не того типа, который вы обрабатываете (не Exception::Error). Попробуйте написать обработчики и для других типов исключений (Exception:eadlock и т.д. по списку). Не уверен, но может что и получится
Старый 01.04.2004, 12:21   #17  
bms is offline
bms
Участник
 
17 / 10 (1) +
Регистрация: 30.10.2003
Адрес: Донецк
Спасибо, но это первое что я сделал. Я перепробовал все типы Exception но результата так и не добился.
Старый 01.04.2004, 13:46   #18  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
К сожалению ты прав. Ошибка отсутствия метода не перехватывается. А почему бы не воспользоваться методом version() объекта Application? И в зависмости от полученного значения вызывать тот или иной метод.
Старый 01.04.2004, 13:59   #19  
bms is offline
bms
Участник
 
17 / 10 (1) +
Регистрация: 30.10.2003
Адрес: Донецк
Использовать Version() в данной ситуации не хотелось бы, но видно другого выхода нет.
Спасибо за помощь.
Старый 01.04.2004, 14:42   #20  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
;)
Цитата:
Изначально опубликовано bms
Использовать Version() в данной ситуации не хотелось бы, но видно другого выхода нет.
Я думаю, что так поступать не следует, но с технической точки зрения все решаемо

static void Job151(Args _args)
{
COM excel = new COM("Excel.Application");

try
{
new COMDispFunction(excel, "badfunction",COMDispContext::METHOD).call();
}
catch (Exception::Internal)
{
info("Error found");
}
}

По уму следует создавать ту версию COM объекта, в которой присутсвует нужный метод , например new COM("Excel.Application.8")
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Kurt Hatlevik: Sneak preview of the WMS E&E Blog bot DAX Blogs 0 20.11.2008 01:10
msdynamicsax: VB script that test the com connector for Dynamics Ax 4.0 Blog bot DAX Blogs 0 25.08.2008 18:05
Как посмотреть свойства или методы COM-объектов? NeveB DAX: Программирование 10 21.04.2004 11:45
Групповая обработка объектов alpin DAX: Функционал 1 14.01.2004 12:26

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

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

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