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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.04.2018, 00:00   #1  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
бесконечный цикл deleteMarked AX 2012 R3 CU13
это баг или я что-то пропускаю?

если на форме у источника данных таблицы перекрыть validateDelete() return true, а в delete вызывать validateDelete самой таблицы,

Нажмите на изображение для увеличения
Название: table1validateDelete.png
Просмотров: 516
Размер:	147.7 Кб
ID:	11883

Нажмите на изображение для увеличения
Название: form1.delete.png
Просмотров: 694
Размер:	175.7 Кб
ID:	11884


то:

- удаление одной, не отмеченной галочкой записи, не вызывает никаких проблем;

Нажмите на изображение для увеличения
Название: delete.png
Просмотров: 470
Размер:	61.6 Кб
ID:	11885

Название: deleteDebug.png
Просмотров: 1135

Размер: 49.2 Кб


- удаление хотя бы одной, отмеченной галочкой записи вызывает бесконечный цикл внутри deleteMarked();

Нажмите на изображение для увеличения
Название: deleteMarked.png
Просмотров: 510
Размер:	107.7 Кб
ID:	11887

Название: deleteMarkedDebug.png
Просмотров: 1196

Размер: 64.3 Кб

WTF?

Sequence of Method calls while deleting the record in the Form
Form --- Datasource --- validatedelete ()
Table --- validatedelete ()
Table --- delete ()
Form --- Datasource --- active ()
__________________
Felix nihil admirari
За это сообщение автора поблагодарили: Logger (1).
Старый 13.04.2018, 01:16   #2  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от wojzeh Посмотреть сообщение
это баг или я что-то пропускаю?

если на форме у источника данных таблицы перекрыть validateDelete() return true, а в delete вызывать validateDelete самой таблицы,
Думаю что и то и другое

_ds.validateDelete() вызывается системой автоматически из _ds.delete() источника данных.
И как результат table.validateDelete() вызывается и так.

C учетом того что система и так дергает на форме validateDelete() вызывать его там явно избыточно.


Но в то же время и не запрещает и в каких-то случаях не создает проблем,
так что и баг тоже.
Старый 13.04.2018, 02:13   #3  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Думаю что и то и другое

_ds.validateDelete() вызывается системой автоматически из _ds.delete() источника данных.
И как результат table.validateDelete() вызывается и так.

C учетом того что система и так дергает на форме validateDelete() вызывать его там явно избыточно.
я же написал, что на источнике данных на форме validateDelete() перекрыт и НЕ ВЫЗЫВАЕТ validateDelete таблицы.

X++:
public boolean validateDelete()
{
    return true;
}
но это никак не влияет на то, что в космос улетает только deleteMarked()

в смысле, что вот такой вариант
X++:
public boolean validateDelete()
{
    return super();
}
даёт точно такое же зависание.
__________________
Felix nihil admirari
Старый 13.04.2018, 11:59   #4  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Явно неверно вручную вызывать какой-либо ValidateDelete() в _ds.Delete() вообще.
Я об этом.

А так, да. Баг. Но и код table.ValidateDelete() в _ds.Delete() - это желание доломать

Нечего делать этому методу таблицы на уровне формы. В любом случае.
Если у нас есть foo1() --> foo2() -->foo3() --> foo4() то вызывать foo1() { foo3() } представляется хакерством.
Старый 13.04.2018, 17:38   #5  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Явно неверно вручную вызывать какой-либо ValidateDelete() в _ds.Delete() вообще.
Я об этом.

А так, да. Баг. Но и код table.ValidateDelete() в _ds.Delete() - это желание доломать

Нечего делать этому методу таблицы на уровне формы. В любом случае.
Если у нас есть foo1() --> foo2() -->foo3() --> foo4() то вызывать foo1() { foo3() } представляется хакерством.
что собственно мешает нам реализовывать любую логику с помощью любых методов, если это не приводит к ошибкам компиляции и времени исполнения? рекурсивных вызовов тут нет, никаких best practice, насколько я помню, на эту тему тоже нет, и работает прекрасно, но только не в случае deleteMarked().

код этот, кстати говоря, стандартный и находится в форме Project WBS в части таблицы Estimates. можете попробовать выбрать несколько строк в ней и нажать "удалить".

не понимаю, как пофиксить этот косяк, ибо явно идёт вызов из недоступного для редактирования класса в методе deleteMarked. надо проверить эффект в D365!
__________________
Felix nihil admirari
За это сообщение автора поблагодарили: ax_mct (5).
Старый 13.04.2018, 18:44   #6  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от wojzeh Посмотреть сообщение

код этот, кстати говоря, стандартный и находится в форме Project WBS в части таблицы Estimates. можете попробовать выбрать несколько строк в ней и нажать "удалить".

не понимаю, как пофиксить этот косяк, ибо явно идёт вызов из недоступного для редактирования класса в методе deleteMarked. надо проверить эффект в D365!
Если есть такой стандартный код то тогда однозначно баг, но все равно не согласен с тем что раз не запрещается то можно.

Не вызывать validateDelete на форме Project WBS\Estimates если Estimates_ds,anyMarked или типа того??
Старый 13.04.2018, 18:49   #7  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Если есть такой стандартный код то тогда однозначно баг, но все равно не согласен с тем что раз не запрещается то можно.

Не вызывать validateDelete на форме Project WBS\Estimates если Estimates_ds,anyMarked или типа того??
validateDelete не вызывает проблем - зовёшь ты его или нет. прочитай уже ВНИМАТЕЛЬНО, что написано.

конкретно в данной ситуации всё более чем кошерно:

- отключаем валидацию на форме, чтоб не задавать вопроса о подтверждении, как доктор прописал;
- перед непосредственным удалением методом delete проверяем, всё ли в порядке табличным валидатором;

описанный подход - просто сказка!

теоретическая дискуссия о том, что можно и нельзя, всегда упирается в конкретные потребности бизнеса и наши возможности их реализовать.

можешь привести конкретный пример, где, как ты это называешь, "хакерство" приводит к плачевным последствиям?
__________________
Felix nihil admirari
Старый 14.04.2018, 00:57   #8  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от wojzeh Посмотреть сообщение
validateDelete не вызывает проблем - зовёшь ты его или нет. прочитай уже ВНИМАТЕЛЬНО, что написано.

конкретно в данной ситуации всё более чем кошерно:

- отключаем валидацию на форме, чтоб не задавать вопроса о подтверждении, как доктор прописал;
- перед непосредственным удалением методом delete проверяем, всё ли в порядке табличным валидатором;

описанный подход - просто сказка!

теоретическая дискуссия о том, что можно и нельзя, всегда упирается в конкретные потребности бизнеса и наши возможности их реализовать.

можешь привести конкретный пример, где, как ты это называешь, "хакерство" приводит к плачевным последствиям?
Например вызов табличного валидатора в методе delete источника данных

(1)_ds.delete() --> (2)_ds.validateDelete() --> (3) table.validateDelete() --> (4) table.delete().

Согласен что отключение super в (2) _ds.validateDelete() для отключения диалога - нормальный ход который по идее прерывает эту цепочку. Но судя по всему мы не контролируем эту цепочку в случае deleteMarked.

deleteMarked() не вызывает _ds.delete(), а используется вместо. Что за цепочку методов он там использует - непонятно.

Почему не вызывать табличный (3) table.validateDelete() на уровне таблицы в (4) table.delete()?
Можно добавить if (.dataSource() && ) если нужно такое ограничить вызовами с формы.
Старый 14.04.2018, 01:06   #9  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от ax_mct Посмотреть сообщение
deleteMarked() не вызывает _ds.delete(), а используется вместо. Что за цепочку методов он там использует - непонятно.
посмотри внимательно последнюю картинку в исходном сообщении и скажи, видишь ли ты, что ВЫЗЫВАЕТ? причём бесконечное количество раз, если не положить этому предел.
__________________
Felix nihil admirari
Старый 14.04.2018, 01:18   #10  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от wojzeh Посмотреть сообщение
посмотри внимательно последнюю картинку в исходном сообщении и скажи, видишь ли ты, что ВЫЗЫВАЕТ? причём бесконечное количество раз, если не положить этому предел.
О, cупер, я ВИЖУ

MSDN пишет что
If no records have been selected, the FormDataSource.delete method is executed.
https://msdn.microsoft.com/en-us/lib...or=-2147217396

Но я вижу, что все интереснее. Получается что _ds.DeleteMarked() таки вызывает _ds.delete().

Но я бы переместил табличный validateDelete() в табличный Delete() так как есть чувство что
именно использование его на форме есть неприемлимый хак бага
Старый 14.04.2018, 02:42   #11  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если отказываетесь от удаления, то снимите выделение записи на удаление

X++:
// На DataSource - формы
public void delete()
{
    
    if (false)
    {
        super();
    }
    else
    {
        // Отказались от удаления. Снимаем метку, если она есть
        if (this.anyMarked())
        {
            this.mark(0);
        }
    }
}
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: wojzeh (1), S.Kuskov (5), ax_mct (3).
Старый 14.04.2018, 02:50   #12  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Если отказываетесь от удаления, то снимите выделение записи на удаление

X++:
// На DataSource - формы
public void delete()
{
    
    if (false)
    {
        super();
    }
    else
    {
        // Отказались от удаления. Снимаем метку, если она есть
        if (this.anyMarked())
        {
            this.mark(0);
        }
    }
}
старик, ты - гений!
__________________
Felix nihil admirari
Теги
ax2012r3, delete, deletemarked, formdatasource

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxse: Dynamics AX 2012 R3 cumulative updates Blog bot DAX Blogs 0 15.03.2017 18:11
dynamicsaxse: February release – Dynamics AX 2012 R3 Blog bot DAX Blogs 0 02.03.2017 01:11
emeadaxsupport: BOM Journal postings in AX 2012 R3 vs. earlier versions of AX 2012 Blog bot DAX Blogs 0 03.10.2015 02:35
emeadaxsupport: [AX 2012 R3] Why is my Kernel build version not changing after installing CU-8 or the latest binary hotfix? Blog bot DAX Blogs 0 31.12.2014 20:20
Dynamics AX Sustained Engineering: Microsoft Dynamics AX 2012 R3 RTM Warehouse Management: How to prevent the creation of two inventDim records considered identical in Dynamics AX 2012 R3 RTM Blog bot DAX Blogs 0 22.12.2014 19:12
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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