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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.05.2011, 14:57   #1  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
1. ttsbegin присутствует
2. 2dmitro. Вы как думаете, смог бы я часть записей создавать успешно (см. первый пост), если бы не залогинился?
3. 2Miker. Опубликовать целое .Net-приложение? Если у вас есть список возможных причин - поделитесь, пожалуйста, если нет - значит, вы именно гадать и собирались, разве нет?:-)

В сухом остатке: отсутствие TTSBegin - не причина, разве что я его неправильно использую. Сейчас на всякий случай делаю так: вызываю в начале процедуры, где изменяю запись таблицы, а в конце этой процедуры всегдда вызываю TTSCommit, даже если не изменилось ничего.

Что еще может быть?
Старый 03.05.2011, 15:39   #2  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от Evgenius Посмотреть сообщение
....
3. 2Miker. Опубликовать целое .Net-приложение? Если у вас есть список возможных причин - поделитесь, пожалуйста, если нет - значит, вы именно гадать и собирались, разве нет?:-)
....
Что еще может быть?
Евгений, вы надеюсь понимаете, что форум не служба тех поддержки..
А по коду можно многое сказать, выложите именно те вещи которые совершают вызовы методов нет коннектора от начала до конца. Остальное можете убрать и поставить звездочки.
X++:
*****
Рассчитываю, что вас этим не обидел....
__________________
Axapta book for developer
Старый 03.05.2011, 15:57   #3  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Давно известно, что когда код вынужденно разбит на кучу процедур и потому состоит из одних вызов, он вызывает только вопросы.
Ну, попробуем:


X++:
             AxaptaRecord axRecord = AX.CreateAxaptaRecord("PST_Inventory_ItemProperties");
            Int64 RecId = 0;
            // определить тип данных
            InventoryDataTypes DataType = GetInventoryDataType(PropertyType);
            // конвертировать значение из строки (если нужно) и установить в нужное поле
            string FieldName;
            object DBPropertyValue = ConvertToInventoryDataType(PropertyType, PropertyValue, AssociatedLink, out FieldName); 
            if (DBPropertyValue == null)
                return 0;
            axRecord.set_Field(FieldName, DBPropertyValue);
            if (FieldName != "Link" && AssociatedLink != null)
                axRecord.set_Field("Link", AssociatedLink);
            else if (FieldName != "StringValue" && Convert.ToString(DBPropertyValue) != PropertyValue)
                axRecord.set_Field("StringValue", PropertyValue);

            // заполнить прочие нужные поля записи
            axRecord.set_Field("ItemType", (int)ItemType);
            axRecord.set_Field("ItemRecId", ItemRecId);
            axRecord.set_Field("DataSourceId", DataSourceId);
            axRecord.set_Field("PropertyType", PropertyType.ID);
            // поскольку мы не получаем группы отдельно (только вместе с элементами),
            // то указываем группу, только если она только что загружена
            PropertyTypeGroup PropertyGroup = (PropertyTypeGroup)PropertyGroups[Convert.ToInt64(PropertyGroupId)];
            if (PropertyGroup != null)
            {
                axRecord.set_Field("PropertyGroupId", PropertyGroup.RecordID);
            }
            axRecord.set_Field("LanguageId", LanguageId);

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

            }
            catch (Exception ExceptionData)
            {

                throw ExceptionData;
            }
Сорри, я заменил первый пример, поскольку в этом месте чаще выпадает.
Комментарии это код из отдельной процедуры, метод TTSBegin вызывается До нее, а TTSCommit -после.
При ошибке сообщается, что она произошла в ValidateWrite(), но на таблице нет ни отношений, ни уникальных индексов, ни перекрытого метода ValidateWrite(). Обязательные поля заполнены все.

Последний раз редактировалось Evgenius; 03.05.2011 в 16:08.
Старый 03.05.2011, 17:18   #4  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
ну начинать надо по порядку :
1 axRecord то вообще создает запись, без последующего обновления?
то есть закоментить write() и вызвать insert().
__________________
Axapta book for developer
Старый 03.05.2011, 18:11   #5  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Цитата:
Сообщение от MikeR Посмотреть сообщение
ну начинать надо по порядку :
1 axRecord то вообще создает запись, без последующего обновления?
то есть закоментить write() и вызвать insert().
Это работает в нескольких приложениях, разработанных для обмена данными со сторонними системами. В чем тут проблема? Я понимаю, что метод insert может содержать что-то дополнительное, но здесь НЕ содержит. Точно. Вообще, у всех тутошних таблиц пока что НЕ ПЕРЕКРЫТ ни один метод.

Последний раз редактировалось Evgenius; 03.05.2011 в 18:14.
Старый 03.05.2011, 21:10   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,720 / 1207 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Evgenius Посмотреть сообщение
При ошибке сообщается, что она произошла в ValidateWrite(), но на таблице нет ни отношений, ни уникальных индексов, ни перекрытого метода ValidateWrite(). Обязательные поля заполнены все.
Надо еще проверить, что поля заполнены допустимыми значениями. Не только обязательные для заполнения, а вообще все. Ну, например, нет ли где попытки записать значение NULL?

В идеале, перехватить ошибку и сбросить в лог значения всех полей той записи, которая создается/модифицируется. Или просто на этапе отладки перед выполнением проблемного метода сбрасывать значения всех полей в лог.
За это сообщение автора поблагодарили: Evgenius (1).
Старый 03.05.2011, 22:41   #7  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Надо еще проверить, что поля заполнены допустимыми значениями. Не только обязательные для заполнения, а вообще все. Ну, например, нет ли где попытки записать значение NULL?

В идеале, перехватить ошибку и сбросить в лог значения всех полей той записи, которая создается/модифицируется. Или просто на этапе отладки перед выполнением проблемного метода сбрасывать значения всех полей в лог.
Можно подробнее? Я некоторые необязательные поля в данном случае вообще не трогал - какие типы данных в X++ в таком случае могут получить значение null?
(насчет явной установки null можно не беспокоиться - метод AxaptaRecord.set_Field не допускает такие значения)
Старый 04.05.2011, 15:29   #8  
Evgenius is offline
Evgenius
Участник
 
56 / 10 (1) +
Регистрация: 03.11.2010
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Надо еще проверить, что поля заполнены допустимыми значениями. Не только обязательные для заполнения, а вообще все. Ну, например, нет ли где попытки записать значение NULL?

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

А нет ли какого способа получать информацию о причинах ошибки (почему "внешний компонент вызвал исключение" и т.п.)?
Или можно только доработать свои таблицы, чтобы хоть с ними было ясно?
Теги
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, время: 02:00.