04.05.2011, 15:29 | #21 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Надо еще проверить, что поля заполнены допустимыми значениями. Не только обязательные для заполнения, а вообще все. Ну, например, нет ли где попытки записать значение NULL?
В идеале, перехватить ошибку и сбросить в лог значения всех полей той записи, которая создается/модифицируется. Или просто на этапе отладки перед выполнением проблемного метода сбрасывать значения всех полей в лог. А нет ли какого способа получать информацию о причинах ошибки (почему "внешний компонент вызвал исключение" и т.п.)? Или можно только доработать свои таблицы, чтобы хоть с ними было ясно? |
|
04.05.2011, 16:05 | #22 |
Участник
|
Вообще-то, 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 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Вообще-то, 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; } Насчет перечисления - интересно, выходит дело было только в обращении к новым данным из той же транзакции... |
|
Теги |
business connector, com connector |
|
|