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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.10.2008, 11:05   #1  
Kozerog is offline
Kozerog
Участник
 
45 / 12 (1) ++
Регистрация: 22.05.2006
? Вопрос про skipDeleteMethod
Привет!

Почему не работает следующий код?

priceDiscTable.skipDeleteMethod(true);
delete_from priceDiscTable
where priceDiscTable.relation == PriceType::LineDiscSales &&
priceDiscTable.AccountCode == TableGroupAll::Table &&
priceDiscTable.AccountRelation == "4";
priceDiscTable.skipDeleteMethod(false);

Отрабатывает delete() на таблице.
Старый 31.10.2008, 11:19   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
возможно нужно ещё skipDatabaseLog(true);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 31.10.2008, 11:21   #3  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Из devGuide:
The delete_from statement enables you to delete multiple records from the database at the same time. This means that there is only one call required to the database from the Microsoft Dynamics AX client. as opposed to the multiple calls required if you use the delete statement.

This reduction in the number of calls required speeds up system performance. It also enables you to specify multiple deleted items in a clearer, simpler manner.

In situations where the delete method is overridden, the system transparently emulates the situation of selecting and deleting one record at a time so that the overridden delete method is executed.

Не ленитесь сначала поискать самому ответ на вопрос.
Старый 31.10.2008, 11:22   #4  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
What prevents fast SQL operations?
There are a number of situations where X++ recordset operations can fall back to record-by-record operations.
The table below identifies these situations:

DELETE_FROM UPDATE_RECORDSET INSERT_RECORDSET ARRAY_INSERT Use...to override
Non-SQL tables Yes Yes Yes Yes not applicable
Delete actions Yes No No No skipDeleteActions()
Database log enabled Yes Yes Yes No skipDatabaseLog()
Overloaded method Yes Yes Yes Yes skipDataMethods()
Dev Guide
Старый 31.10.2008, 17:20   #5  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от Kozerog Посмотреть сообщение
priceDiscTable.skipDeleteMethod
Надо priceDiscTable.skipDeleteActions
Старый 31.10.2008, 17:49   #6  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
2Hyper: не вводите людей в заблуждение, deleteAction и deleteMethod - "немного" разные вещи
Старый 31.10.2008, 18:04   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от DSPIC Посмотреть сообщение
2Hyper: не вводите людей в заблуждение, deleteAction и deleteMethod - "немного" разные вещи
Ну как уже было отмечено выше в выдержке из документации, для достижения поставленной цели может потребоваться и один skip и второй, и третий, в зависимости от ситуации.

Более, того, для множественных вставок ещё существенным является наличие в таблице мемо или контейнерных полей. (это скорее оффтоп).
__________________
Zhirenkov Vitaly
Старый 31.10.2008, 18:05   #8  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Версия Axapta ?
2 Kozerog:

Уточните версию Axapta.
В Dynamics Ax 4.0 понижение оператора delete_from возможно еще по следующим причинам:
1. перекрыт метод aosValidateDelete() или aosValidateRead() таблицы (помимо метода delete() ) (вызов метода skipAosValidation(true) предотвращает проверки выполняемые методами aosValidateDelete() и aosValidateRead() )
2. настроена отправка оповещений при удалении записей в таблице ( вызов метода skipEvents(true) предотвращает проверку )
Старый 19.11.2010, 12:13   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Честно говоря я долго "тупил" сегодня, когда писал код с использование skipDeleteMethod (сегодня пятница - позволительно). Никак у меня не получалось запретить вызов метода delete(). Наткнулся на эту тему, а здесь всё тоже очень сумбурно. Попробую объеснить что меня завело в пятничный ступор.

А дело всё в том, что подошёл я к этому методу (skipDeleteMethod) немного не с правльной стороны, так сказать попытался использовать не по назначению. Задачу которую я с его помощью попытался решить можно сформулировать так:

"Произвести удаление определённых записей из таблицы, так чтобы для них не отработала бизнесс-логика зашитая в методе delete."

Причём для меня в данном случае было не важно, будет ли удаление выполняться при помощи групповой операции или преобразуется по каким-то ещё причинам в построчное удаление. Мне было важно обойти бизнес-логику метода delete. И вот я подумал и решил, что skipDeleteMethod - это то, что мне нужно.

Я ошибался. На самом деле метод skipDeleteMethod можно рассматривать только в контексте групповой операций delete_from. Все мы знаем что delete_from будет целиком выполняться на сервере в том случае если в приложениии нет дополнительных припонов типа табличных медодов, deleteactions, настройки лога и оповещений, возможно ещё чего-то. Также мы знаем, что даже при наличии таких припонов, мы можем при помощи набора методов common.skip...() явно указать системе, что в данном конкретном случае нам на все эти действия плевать - для нас главное производительность, мы хотим что бы обработка прошла одним блоком на сервере. Ключевым моментом сдесь является, что плевать нам именно на ВСЕ припоны. Т.е. если на таблице скажем перекрыт метод delete, а также настроены deleteactions, то отказавшить только от DeleteMethod мы не изменим способ выполнения обработки, из-за наличия deleteАctions обработка будет вынуждена пройти "как обычно" - построчно. И тут, внимание, "как обычно" также означает, что будут выполненн стандартный вызов метода Delete! И это не смотря на как бы указанный запрет skipDeleteMethod(true).

Вывод: запреты common.skip...(true) либо работают все вместе либо не работает не один из них. (проверено для сочитания skipDeleteMethod + skipDeleteActions, обощённый вывод требует дополнительной проверки).

Мораль: нельзя, вызывая skipDeleteMethod(true) перед удалением, гарантированно предотвратить вызов метода delete(). Даже если сейчас обработка пройдёт на сервере и delete() не вызовется, завтра может появиться какой-нибудь DeleteActions и всё изменится. Т.е. skip - в данном случае означает не "ни в коем случае не делай это", а "если хочешь, то можешь это не делать"
За это сообщение автора поблагодарили: sukhanchik (3), samolalex (1).
Старый 19.11.2010, 12:25   #10  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
В книге "Inside Microsoft Dynamics AX 2009" (и в переводной версии этой книги) именно такое поведение и описано.
А фразу:
Цитата:
даже если сейчас обработка пройдёт на сервере и delete() не вызовется, завтра может появиться какой-нибудь DeleteActions и всё изменится
Можно распечатать и повесить на стенку на уровне глаз. На мой взгляд, такие обходы логики больше предназначены для всяких обслуживающих утилит, перед запуском которой всегда можно проверить изменения.
Старый 19.11.2010, 15:36   #11  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
"Произвести удаление определённых записей из таблицы, так чтобы для них не отработала бизнесс-логика зашитая в методе delete."
для этого можно выполнить метод doDelete() на таблице

про скипы верное замечание, тоже наступал на эти грабли
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Теги
удаление

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вопрос по созданию отчета asd1274 DAX: Программирование 6 05.12.2008 21:44
Вопрос по Проектам PSA DAX: Функционал 35 19.01.2007 22:26
Вопрос по финансам Лиса* DAX: Функционал 8 04.10.2004 14:19
расчеты с персоналом. НДФЛ. вопрос чайника shumelka DAX: Функционал 2 25.03.2004 11:36
Вопрос по счетам на оплату поставщикам sergey_alekseev DAX: Функционал 11 26.08.2003 19:43
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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