04.07.2011, 10:54 | #1 |
Участник
|
ошибка работы RecordInsertList?
Ax2009 RU6 (5.1500.4102)
В методе SalesFormLetter.recordInsertListInit происходит инициализация X++: recordInsertSalesParmTable = new RecordInsertList(tablenum(SalesParmTable), true); Тем не менее, далее при вызове recordInsertSalesParmTable.insertDatabase() в SalesFormLetter.recordInsertListInsert этот самый вызов insert происходит и вставляет дополнительный SalesParmSubTable, который уже вставлен вручную => ошибка. Вопрос - почему происходит вызов insert, хотя происходить не должен? Ошибка стала возникать после переноса кастомизированных методов класса SalesFormLetter из Ax4 в Ax2009. Причем RecordInsertList там не было, соответственно никакие кастомизации его не трогают. В одной из тем нарыл, что может влиять аудит - но база пустая и никакого аудита соответственно нет. Что еще может влиять? UPD: удалил залитые кастомизации на классе SalesFormLetter и таблице SalesFormLetter - ошибка осталась... |
|
|
За это сообщение автора поблагодарили: Logger (3). |
04.07.2011, 11:14 | #2 |
Участник
|
Вот тут я описывал логику работы методов common.skip*
Вопрос про skipDeleteMethod. Не ваш случай? Цитата:
... Если на таблице скажем перекрыт метод delete, а также настроены deleteactions, то отказавшить только от DeleteMethod мы не изменим способ выполнения обработки, из-за наличия deleteАctions обработка будет вынуждена пройти "как обычно" - построчно. И тут, внимание, "как обычно" также означает, что будут выполненн стандартный вызов метода Delete! И это не смотря на как бы указанный запрет skipDeleteMethod(true) ...
Последний раз редактировалось S.Kuskov; 04.07.2011 в 11:20. |
|
04.07.2011, 11:20 | #3 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Вот тут я описывал логику работы методов common.skip*
Вопрос про skipDeleteMethod. Не ваш случай? еще кстати - метод insert перекрыт в стандартном приложении, тем не менее там все работает (если б была та же логика, что и в skip*, то и там бы он вызывался - чего не происходит) |
|
04.07.2011, 15:50 | #4 |
Участник
|
Цитата:
Нет, он указывает на то что в случае отсутствия прочих препятствий для переноса выполнения груповой операции на сервер, методом insert можно пренебречь Последний раз редактировалось S.Kuskov; 04.07.2011 в 15:58. |
|
05.07.2011, 03:29 | #5 |
Участник
|
Во-первых, не я пытаюсь, а стандартный функционал И более того внутри системного класса...
Во-вторых, почему тогда на чистом стандартном приложении выполняется без "препонов", а у меня на таком же (удалил кастомизации) - покурсорно и insert? Посмотрите внимательно на код SalesFormLetter - там подразумевается, что при создании SalesParmTable его insert не вызовется ни при каких условиях. Именно поэтому SalesParmSubTable создается отдельно, так же через RecordInsertList. То есть разработчики Аксапты либо не знали про такое "рекомендуемое" поведение skip*, либо понадеялись на удачное стечение обстоятельств?... |
|
05.07.2011, 07:50 | #6 |
Участник
|
Цитата:
Попробуйте создавать RecordInsertList так X++: recordInsertSalesParmTable = new RecordInsertList(tablenum(SalesParmTable), true, true, true, true, true) |
|
|
За это сообщение автора поблагодарили: vanokh (1), someOne (3). |
05.07.2011, 08:25 | #7 |
Участник
|
Сейчас задумался о том как можно гарантированно обезопасить себя от выполнения insert при выполнении груповых операций. Ведь если в следующей версии появится новая фишка со своим скипом, то везде прийдётся устанавливать ещё на один skip больше
Идея такая. Добавить в самое начало метода insert проверку X++: if (this.skipDataMethods()) { super(); return; } Последний раз редактировалось S.Kuskov; 05.07.2011 в 08:38. |
|
|
За это сообщение автора поблагодарили: Logger (3). |
05.07.2011, 08:34 | #8 |
Administrator
|
Цитата:
И еще. Зачем делать this.doInsert(), когда достаточно написать super() ?
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 05.07.2011 в 08:40. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
05.07.2011, 09:27 | #9 |
Участник
|
ничего нет, пустая база.
Ага, сработало. Цитата:
Так и оставлю наверно, уже кучу времени убил на разборки... Последний раз редактировалось vanokh; 05.07.2011 в 11:14. |
|
25.04.2012, 18:17 | #10 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Сейчас задумался о том как можно гарантированно обезопасить себя от выполнения insert при выполнении груповых операций. Ведь если в следующей версии появится новая фишка со своим скипом, то везде прийдётся устанавливать ещё на один skip больше
Идея такая. Добавить в самое начало метода insert проверку X++: if (this.skipDataMethods()) { super(); return; } Такой способ, пожалуй, самый правильный. А вообще, получается ядро криво работает. Никогда нельзя быть уверенным что твой скип метода insert() гарантированно отработает ( а как правило именно это и нужно - гарантировать пропуск вызова Insert() ). Приходится добавлять такие костыли на X++. Ну хорошо что их легко и быстро можно добавить. |
|