|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
![]() Ну, как пример.
Предположим, что поле LanguageId создано на основе Extended Data Types с тем же именем LanguageId. Этот Extended Data Types имеет Relations настроенный на таблицу LanguageTable. Следовательно, поле LanguageId может принять только те значения, которые есть в таблице LanguageTable и соответствуют всем дополнительным условиям связи, указанным в Relations. Это значит, что, например, если в таблице LanguageTable нет языка с кодом "XXX", то при попытке сохранить сделанные изменения Вы получите сообщение об ошибке о том, что такого значения не существует в связанной таблице. НО! Подобный контроль корректности введенного значения будет выполнен только при интерактивном вводе (через форму ввода). При программном вводе подобная проверка не осуществляется. Однако, это из среды Axapta. Как оно работает через Connector - не проверял. Теоретически - не должно, но проверить не помешает... PS: Если значение поля явно не указано, то оно принимает пустое значение. Не NULL, а именно пусто. Что именно подразумевается под "пустым" значением зависит от типа данных. Для числовых значений (включая Enum) - это 0, для строковых - пустая строка, для дат - 01.01.1900 А насчет проверки отношений я в курсе. Последний раз редактировалось Evgenius; 04.05.2011 в 13:19. |
|
![]() |
#2 |
Участник
|
Вообще-то, 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. |
|
![]() |
#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; } Насчет перечисления - интересно, выходит дело было только в обращении к новым данным из той же транзакции... |
|
Теги |
business connector, com connector |
|
|