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