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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.05.2011, 15:29   #21  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Надо еще проверить, что поля заполнены допустимыми значениями. Не только обязательные для заполнения, а вообще все. Ну, например, нет ли где попытки записать значение NULL?

В идеале, перехватить ошибку и сбросить в лог значения всех полей той записи, которая создается/модифицируется. Или просто на этапе отладки перед выполнением проблемного метода сбрасывать значения всех полей в лог.
одна такая ошибка найдена, вы оказались правы (к вылетам приложения она отношения не имеет, с ними еще предстоит разобраться): в свойствах поля оказался не тот тип перечисления указан (с очень похожим именем), в итоге одно из значений оказывалось некорректным.. А я не был в курсе, что ValidateWrite при этом выбрасывает исключение, а не просто возвращает false.

А нет ли какого способа получать информацию о причинах ошибки (почему "внешний компонент вызвал исключение" и т.п.)?
Или можно только доработать свои таблицы, чтобы хоть с ними было ясно?
Старый 04.05.2011, 16:05   #22  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вообще-то, Axapta сугубо "филетово" каким образом берется значение для Enum, поскольку физически - это число от 0 до 255. Контроль типов Enum может быть выполнен только и исключительно на этапе компиляции. На этапе исполнения Axapta не контролирует ни тип Enum, ни его значение. Вероятно, это какая-то особенность Connector

Ну, а сообщение об ошибках для Com-объектов стандартно берется из метода Error(). Как правило, он есть у любого Com-объекта, хотя и не всегда описывается в документации. Про AxaptaRecord не уверен, но, теоретически, должно быть что-то вроде такого

X++:
    ComError    comError;
    str         errorMsg;
    ;

           try
            {
                if (axRecord.ValidateWrite())
                { 
                    axRecord.Write();
                    RecId = (Int64)axRecord.get_Field("RecId");
                }

            }
            catch (Exception ExceptionData)
            {
                comError  = axRecord.error();
                errorMsg  = StrFmt("Error %1 (%2)", comError.number(), comError.description());

                info(errorMsg);
                throw ExceptionData;

            }

Последний раз редактировалось Владимир Максимов; 04.05.2011 в 16:08.
Старый 04.05.2011, 19:47   #23  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Вообще-то, Axapta сугубо "филетово" каким образом берется значение для Enum, поскольку физически - это число от 0 до 255. Контроль типов Enum может быть выполнен только и исключительно на этапе компиляции. На этапе исполнения Axapta не контролирует ни тип Enum, ни его значение. Вероятно, это какая-то особенность Connector

Ну, а сообщение об ошибках для Com-объектов стандартно берется из метода Error(). Как правило, он есть у любого Com-объекта, хотя и не всегда описывается в документации. Про AxaptaRecord не уверен, но, теоретически, должно быть что-то вроде такого

X++:
    ComError    comError;
    str         errorMsg;
    ;

           try
            {
                if (axRecord.ValidateWrite())
                { 
                    axRecord.Write();
                    RecId = (Int64)axRecord.get_Field("RecId");
                }

            }
            catch (Exception ExceptionData)
            {
                comError  = axRecord.error();
                errorMsg  = StrFmt("Error %1 (%2)", comError.number(), comError.description());

                info(errorMsg);
                throw ExceptionData;

            }
Это ведь не COM-коннектор, а BusinessConnectorNet (даже если он на деле всего лишь оболочка для COM, я не знаю). Метода такого здесь нет.


Насчет перечисления - интересно, выходит дело было только в обращении к новым данным из той же транзакции...
Теги
business connector, com connector

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dax-lessons: Easy way to write queries/select statements – Editor scripts Blog bot DAX Blogs 0 17.12.2010 21:11
dynamicsaxtraining: Write down the record Blog bot DAX Blogs 0 08.12.2010 20:11
Переход на первую строку SalesLine_ds при вызове SalesTable_ds.write() Владимир Максимов DAX: Программирование 4 02.10.2008 18:08
Как понять что вызывает исключение Invalid Method Call Jab Straight DAX: Программирование 0 17.12.2007 23:23
Dynamics AX: .Net BC, C# - Working with AxaptaRecord Object Blog bot DAX Blogs 0 20.06.2007 23:13

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

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

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