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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.07.2011, 10:54   #1  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
ошибка работы RecordInsertList?
Ax2009 RU6 (5.1500.4102)

В методе SalesFormLetter.recordInsertListInit происходит инициализация
X++:
recordInsertSalesParmTable      = new RecordInsertList(tablenum(SalesParmTable), true);
обратите внимание на второй параметр - указывает на то, что метод insert() вызываться не должен.

Тем не менее, далее при вызове recordInsertSalesParmTable.insertDatabase() в SalesFormLetter.recordInsertListInsert этот самый вызов insert происходит и вставляет дополнительный SalesParmSubTable, который уже вставлен вручную => ошибка.

Вопрос - почему происходит вызов insert, хотя происходить не должен?

Ошибка стала возникать после переноса кастомизированных методов класса SalesFormLetter из Ax4 в Ax2009. Причем RecordInsertList там не было, соответственно никакие кастомизации его не трогают.

В одной из тем нарыл, что может влиять аудит - но база пустая и никакого аудита соответственно нет. Что еще может влиять?

UPD: удалил залитые кастомизации на классе SalesFormLetter и таблице SalesFormLetter - ошибка осталась...
За это сообщение автора поблагодарили: Logger (3).
Старый 04.07.2011, 11:14   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Вот тут я описывал логику работы методов common.skip*
Вопрос про skipDeleteMethod. Не ваш случай?
Цитата:
... Если на таблице скажем перекрыт метод delete, а также настроены deleteactions, то отказавшить только от DeleteMethod мы не изменим способ выполнения обработки, из-за наличия deleteАctions обработка будет вынуждена пройти "как обычно" - построчно. И тут, внимание, "как обычно" также означает, что будут выполненн стандартный вызов метода Delete! И это не смотря на как бы указанный запрет skipDeleteMethod(true) ...

Последний раз редактировалось S.Kuskov; 04.07.2011 в 11:20.
Старый 04.07.2011, 11:20   #3  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Вот тут я описывал логику работы методов common.skip*
Вопрос про skipDeleteMethod. Не ваш случай?
увы, не оно может, конечно, RecordInsertList внутри и реализован через skip*...

еще кстати - метод insert перекрыт в стандартном приложении, тем не менее там все работает (если б была та же логика, что и в skip*, то и там бы он вызывался - чего не происходит)
Старый 04.07.2011, 15:50   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от vanokh Посмотреть сообщение
еще кстати - метод insert перекрыт в стандартном приложении, тем не менее там все работает (если б была та же логика, что и в skip*, то и там бы он вызывался - чего не происходит)
Не понял логику ваших рассужений. Метод insert перекрыт - хорошо. Вы же его как раз и пытаетесь обойти. Для этого пытаетесь использовать параметр skipInsertMethod (так же как я в своём примере пытался испольлзовать skipDeleteMethod для обхода метода delete). Но это заблуждение!!! Как я уже писал ранее, skip*, установленный в true сам по себе ещё не даёт никаких гарантий, что скипуемое действие будет в действительности пропущено системой. Только одновременное исключение всех возможных "припонов" позволит груповой операции отработать на сервере и избежать покурсорного исполнения со всеми вытекающими.

Цитата:
Сообщение от vanokh Посмотреть сообщение
обратите внимание на второй параметр - указывает на то, что метод insert() вызываться не должен
Нет, он указывает на то что в случае отсутствия прочих препятствий для переноса выполнения груповой операции на сервер, методом insert можно пренебречь

Последний раз редактировалось S.Kuskov; 04.07.2011 в 15:58.
Старый 05.07.2011, 03:29   #5  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Для этого пытаетесь использовать параметр skipInsertMethod
Во-первых, не я пытаюсь, а стандартный функционал И более того внутри системного класса...
Во-вторых, почему тогда на чистом стандартном приложении выполняется без "препонов", а у меня на таком же (удалил кастомизации) - покурсорно и insert?

Посмотрите внимательно на код SalesFormLetter - там подразумевается, что при создании SalesParmTable его insert не вызовется ни при каких условиях. Именно поэтому SalesParmSubTable создается отдельно, так же через RecordInsertList. То есть разработчики Аксапты либо не знали про такое "рекомендуемое" поведение skip*, либо понадеялись на удачное стечение обстоятельств?...
Старый 05.07.2011, 07:50   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от vanokh Посмотреть сообщение
почему тогда на чистом стандартном приложении выполняется без "препонов", а у меня на таком же (удалил кастомизации) - покурсорно и insert?
В том то и дело что на способ выполнения груповой операции может влиять не только модификации приложения, но и настройки типа аудита, алертов, RLS и т.д.
Попробуйте создавать RecordInsertList так
X++:
recordInsertSalesParmTable = new RecordInsertList(tablenum(SalesParmTable), true, true, true, true, true)
За это сообщение автора поблагодарили: vanokh (1), someOne (3).
Старый 05.07.2011, 08:25   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Сейчас задумался о том как можно гарантированно обезопасить себя от выполнения insert при выполнении груповых операций. Ведь если в следующей версии появится новая фишка со своим скипом, то везде прийдётся устанавливать ещё на один skip больше

Идея такая. Добавить в самое начало метода insert проверку
X++:
if (this.skipDataMethods())
{
    super();
    return;
}

Последний раз редактировалось S.Kuskov; 05.07.2011 в 08:38.
За это сообщение автора поблагодарили: Logger (3).
Старый 05.07.2011, 08:34   #8  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Сейчас задумался о том как можно гарантированно обезопасить себя от выполнения insert при выполнении груповых операций

Идея такая. Добавить в самое начало метода insert проверку
X++:
if (this.skipDataMethods())
{
    this.doInsert()
    return;
}
Эээ метода skipInsertMethod нет. Метод skipDeleteMethod был уже давно признан устаревшим (хотя он мог и работать). Но проверка логичная, если только этот флаг (skipDataMethods) остается включен в insert (не сбрасывается ядром по пути).
И еще. Зачем делать this.doInsert(), когда достаточно написать super() ?
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 05.07.2011 в 08:40.
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 05.07.2011, 09:27   #9  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
настройки типа аудита, алертов, RLS и т.д.
ничего нет, пустая база.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Идея такая. Добавить в самое начало метода insert проверку
Ага, сработало.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Попробуйте создавать RecordInsertList так
X++:
recordInsertSalesParmTable = new RecordInsertList(tablenum(SalesParmTable), true, true, true, true, true)
вот, помогло! skipDtabaseLog и skipEvents - причем, только если оба в true. Теперь осталось узнать, что за Events - настройки аудита у меня пустые (смотрел таблицу DatabaseLog в SQL)
Так и оставлю наверно, уже кучу времени убил на разборки...

Последний раз редактировалось vanokh; 05.07.2011 в 11:14.
Старый 25.04.2012, 18:17   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Сейчас задумался о том как можно гарантированно обезопасить себя от выполнения insert при выполнении груповых операций. Ведь если в следующей версии появится новая фишка со своим скипом, то везде прийдётся устанавливать ещё на один skip больше

Идея такая. Добавить в самое начало метода insert проверку
X++:
if (this.skipDataMethods())
{
    super();
    return;
}
Спасибо.
Такой способ, пожалуй, самый правильный.

А вообще, получается ядро криво работает. Никогда нельзя быть уверенным что твой скип метода insert() гарантированно отработает ( а как правило именно это и нужно - гарантировать пропуск вызова Insert() ). Приходится добавлять такие костыли на X++.

Ну хорошо что их легко и быстро можно добавить.
Теги
recordinsertlist, skipdatamethods

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axzaptech: RecordSortedList and RecordInsertList Blog bot DAX Blogs 0 28.01.2011 23:14
Ошибка в логе при установке клиента AX 2009 sao DAX: Администрирование 9 04.02.2010 11:56
Будьте осторожны с RecordInsertList miklenew DAX: Программирование 6 20.05.2008 15:39
Ошибка: Сессия работы на сервере AOS прервана... Atani DAX: Программирование 6 09.08.2007 09:28
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

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

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

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