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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.03.2012, 18:15   #1  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Аккуратнее! ValidateDelete() на таблице не всегда спасет.
Когда просят сделать запрет на удаление записи в таблице, программисты, очень часто, прибегают к самому простому способу - перекрыть метод ValidateDelete(). Сегодня нактнулся на такую особенность. Предположим у вас есть 2 таблицы : Table и Line. В таблице Line настроен Relation на таблицу Table и перекрыт метод ValidateDelete() на различные дополнительные проверки во время удаления записи. А в таблице Table настроен DeleteActions: Cascade на таблицу Line. Удаление строки в таблице Table с легкостью удалит связанные строчки в Line, несмотря на все проверки.
Вывод : Каскадное удаление игнорирует метод ValidateDelete(). Поэтому перед перекрытием этого метода пробежаться по Relation-ам и посмотреть на существование DeleteActions в связанных таблицах лишним не будет.
Может быть этот баг (или фича, в чем я крайне сомневаюсь) был уже описан здесь. Но по поиску не нашел.
Для нас это хорошо, что обнаружилось заранее.
AX 2009 RU5.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 14.03.2012, 18:52   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Pustik Посмотреть сообщение
Вывод : Каскадное удаление игнорирует метод ValidateDelete()....
Может быть этот баг (или фича, в чем я крайне сомневаюсь) был уже описан здесь.
Вывод неполный.
1. Методы ValidateDelete, ValidateField вызываются ядром ТОЛЬКО при интерфейсных операциях (пользователь что-то делает на форме).
2. В остальных случая эти методы должны вызываться явно в коде

Это фича.
Об этом даже вопросы на экзамене были, насколько я помню.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Pustik (2).
Старый 14.03.2012, 19:03   #3  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от mazzy Посмотреть сообщение
Вывод неполный.
Это фича.
Спасибо, не знал. А по чему так сделали? Ведь было бы удобно. Может быть есть ссылки?
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 14.03.2012 в 19:07.
Старый 15.03.2012, 07:53   #4  
iCloud is offline
iCloud
Enjoy!
Аватар для iCloud
MCP
Злыдни
 
195 / 112 (4) +++++
Регистрация: 06.03.2012
Цитата:
Сообщение от mazzy Посмотреть сообщение
Вывод неполный.
1. Методы ValidateDelete, ValidateField вызываются ядром ТОЛЬКО при интерфейсных операциях (пользователь что-то делает на форме).
2. В остальных случая эти методы должны вызываться явно в коде

Это фича.
Метод validateDelete(), по-моему, вызывается не только на интерфейсных операциях. На AX2009 этот метод не отрабатывает только при вызове doDelete().

Посмотрел - действительно так! А какой validate delete метод не будет пропускать в при DeleteActions: Cascade?

Последний раз редактировалось iCloud; 15.03.2012 в 08:09.
Старый 15.03.2012, 09:33   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от iCloud Посмотреть сообщение
А какой validate delete метод не будет пропускать в при DeleteActions: Cascade?
Метод Delete() точно не будет пропускаться . Если вы хотите чтобы при любом удалении у вас выполнялась проверка, то можно сделать так:
X++:
public void delete()
{
    if (!this.validateDelete())
        throw exception::error;

    super();
}
Старый 15.03.2012, 00:39   #6  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
1) почему пишется слитно
2) так сделано, чтобы был выбор - ограничивать только на форме или везде
3) еще у таблицы есть методы delete() и aosValidateDelete(), которые тоже можно перекрыть
За это сообщение автора поблагодарили: driller (0).
Старый 16.03.2012, 18:30   #7  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от lvan Посмотреть сообщение
1) почему пишется слитно
После каждого предложения ставится орфографический знак - точка.(или восклицательный или вопросительный знак).
Цитата:
Сообщение от lvan Посмотреть сообщение
2) так сделано, чтобы был выбор - ограничивать только на форме или везде
А разве validateDelete() на датасорсе формы отменили? Чем же они тогда отличаются?
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 16.03.2012, 22:40   #8  
Alexanderis.ua is offline
Alexanderis.ua
Участник
 
53 / 40 (2) +++
Регистрация: 25.12.2008
Адрес: Киев, Украина
Цитата:
Сообщение от Pustik Посмотреть сообщение
А разве validateDelete() на датасорсе формы отменили? Чем же они тогда отличаются?
Ну примерно тем же, чем и update() и delete() и остальные. Их же тоже не отменили.
Это обертки - каждый из этих методов просто вызывает соответствующий метод таблицы, но может быт перекрыт.
А в фреймворке формы прописан вызов validateDelete() датасорса перед вызовом delete() датасорса.

Это как fieldModified(). Если ввод данных происходит не через форму, то его нужно явно вызывать. На обычное присвоение триггер не сработает
__________________
If it ain't broke, take it apart and find out why (с)
Старый 15.03.2012, 09:34   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
К стати, методы Write() и modifiedField() также вызываются только через пользовательский интерфейс.
Нужно помнить, что интерфейсные события это всего лишь события изменения клиентского курсора а не строки в БД. Если одновременно с созданием/изменением/удалением какй-то строки нужно синхронно изменять ещё что-то в другой строке или другой таблице, то для обеспечения целостности данных делать это нужно внутри транзакции в методах Insert/Update/Delete.
Распознать факт изменения конкретного поля на уровне метода Update можно сравнением текущего(изменённого) значения this.Field и оригинального this.orig().Field.

Последний раз редактировалось S.Kuskov; 15.03.2012 в 09:37.
За это сообщение автора поблагодарили: Pustik (2), iCloud (1).
Старый 16.03.2012, 08:29   #10  
d_alexe is offline
d_alexe
Участник
 
17 / 10 (1) +
Регистрация: 01.04.2009
Чего-то не понимаю из-за чего паника?
Если настроено каскадное удаление, то зачем в таблице Line нужны записи не имеющие связной записи в таблице Table?
Это типа как Журнал приказа удалить, а строки этого приказа оставить. Только вот зачем нужны эти строки без Журнала. Или я что-то не так понял?
Старый 16.03.2012, 09:18   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от d_alexe Посмотреть сообщение
Или я что-то не так понял?
Угу, не так

Речь шла о том что если на "строках" удаляемого "журнала" есть собственный validateDelete(), который не позволяет удалить такую строку (ну допустим, пока её не "разутвердят"), то такая проверка не сработает в случае каскадного удаления ("неразутверждённые" строки удалятся) . А хотелось, что бы в таком случаее удаление "журнала" (всего журнала: и шапок и строчек) прерывалось. Другими словами, нет желания удалить часть связанных данных, есть желание предотвратить удаление всех данных, если хотя бы их часть не подлежит удалению.

Вывод: validateDelete() не является инструментом сохранения целостности данных. Это всего лишь часть презентационной логики UI.

Последний раз редактировалось S.Kuskov; 16.03.2012 в 09:45.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Фильтрование записей при "переходе к основной таблице" demID DAX: Программирование 10 18.11.2015 12:52
Переименование полей в одной таблице на основе данных из другой niksen DAX: Программирование 1 14.09.2011 12:34
как сохранить запрос в таблице kitty DAX: Программирование 13 19.11.2007 20:16
Переход на правильную запись при Переходе к основной таблице. Anais DAX: Программирование 11 29.06.2004 19:16
фильтр по связанной таблице mick_777 DAX: Программирование 13 21.08.2002 16:00

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

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

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