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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.02.2010, 14:00   #1  
pwp is offline
pwp
Участник
 
76 / 16 (1) ++
Регистрация: 08.07.2008
Адрес: Обнинск
? Управление изменением записей на форме.
Подскажите. На форме в текущей записи Grid сделан ряд изменений, но потом нажимается Esc вместо Save и возникает диалог: В форме были сделаны измения. Сохранить ?
В каком из методов можно управлять этим процессом, т.е. понять что выбрал User и отреагировать соответственно ?
Старый 03.02.2010, 14:16   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
У меня по ESC вызывется element.task() с TaskId равным 1313.
В макросе #Task эта константа объявлена как #define.taskEsc(1313)
За это сообщение автора поблагодарили: pwp (1).
Старый 03.02.2010, 14:32   #3  
pwp is offline
pwp
Участник
 
76 / 16 (1) ++
Регистрация: 08.07.2008
Адрес: Обнинск
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
У меня по ESC вызывется element.task() с TaskId равным 1313.
В макросе #Task эта константа объявлена как #define.taskEsc(1313)
Ок, это работает, но как бы еще узнать что выбрал клиент: Да,Нет или Отмену. ret = super(_taskId);
в методе task() информации не несет.
Старый 03.02.2010, 15:07   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
При сохранении изменений должен сработать метод write() на DataSource формы. Если выбрано "Нет", то записи не произойдет и метод write() не сработает
За это сообщение автора поблагодарили: pwp (1).
Старый 03.02.2010, 15:09   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Методом научного тыка удалось установить, что данный бокс вызывается где-то в супере element.canClose(). Также удалось распознать нажатие кнопки 'Отмена': в этом случае super() метода canClose возвращает false, а соответственно для кнопок 'Да' и 'Нет' - true (что логично, т.к. при таком выборе форма должна закрыться).
Старый 03.02.2010, 15:15   #6  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Я что то не очень понял задачу...
Сейчас в стандарте, если ты что то изменил на форме, не сохранил и нажимаешь Esc, вылезает сообщение "В форме были сделаны изменения. Сохранить?" и три кнопки "Да", "Нет", "Отмена". Если нажать "да", то форма закроется и изменения сохраняться, если "нет", то форма закроется и ничего не сохраниться, если "отмена", то форма проста останется открытой и изменения остануться в том же виде не сохрененные.
У меня созается впечатление что вам ничего доделовать не надо, а просто нажать на кнопку да, что бы сохранить изменения.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 03.02.2010, 15:27   #7  
pwp is offline
pwp
Участник
 
76 / 16 (1) ++
Регистрация: 08.07.2008
Адрес: Обнинск
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
При сохранении изменений должен сработать метод write() на DataSource формы. Если выбрано "Нет", то записи не произойдет и метод write() не сработает
Это верно, но как поймать ситуацию, что метод write и не вызывался при отмене ?

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Методом научного тыка удалось установить, что данный бокс вызывается где-то в супере element.canClose(). Также удалось распознать нажатие кнопки 'Отмена': в этом случае super() метода canClose возвращает false, а соответственно для кнопок 'Да' и 'Нет' - true (что логично, т.к. при таком выборе форма должна закрыться).
Это правильно, но нужно знать что клиент нажал "НЕТ" и реагировать. Если "Да"-то
реакция не нужна. А тут и ДА и НЕТ не различаются!!
Можно, конечно, в task поймать Esc, откатить все что нужно и заменить его на ctrlQ-что вроде равно Esc c ответом "НЕТ".
Старый 03.02.2010, 15:30   #8  
pwp is offline
pwp
Участник
 
76 / 16 (1) ++
Регистрация: 08.07.2008
Адрес: Обнинск
Цитата:
Сообщение от lev Посмотреть сообщение
Я что то не очень понял задачу...
Сейчас в стандарте, если ты что то изменил на форме, не сохранил и нажимаешь Esc, вылезает сообщение "В форме были сделаны изменения. Сохранить?" и три кнопки "Да", "Нет", "Отмена". Если нажать "да", то форма закроется и изменения сохраняться, если "нет", то форма закроется и ничего не сохраниться, если "отмена", то форма проста останется открытой и изменения остануться в том же виде не сохрененные.
У меня созается впечатление что вам ничего доделовать не надо, а просто нажать на кнопку да, что бы сохранить изменения.
Если это я, то да, но кто знает что нажмет оператор, если нажмет НЕТ, то кое что нужно откатить в данных....
Старый 03.02.2010, 15:42   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от pwp Посмотреть сообщение
Если это я, то да, но кто знает что нажмет оператор, если нажмет НЕТ, то кое что нужно откатить в данных....
А если свет выключится?

Помойму здесь явная ошибка в проектировании решения.

Не нужно откатывать по 'Нет', а нужно коммитить по 'Да'. Чуствуете разницу?

Последний раз редактировалось S.Kuskov; 03.02.2010 в 15:45.
Старый 03.02.2010, 15:48   #10  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,296 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
В Аксапте есть стандартная функциональность подтверждения. В настройках пользователя закладка "Confirmation" (не помню, как на русский перевели). Там настраивается подтверждение на новую запись и обновление старой отдельно для каждой группы таблиц.
__________________
Михаил Андреев
https://www.amand.ru
Старый 03.02.2010, 15:54   #11  
pwp is offline
pwp
Участник
 
76 / 16 (1) ++
Регистрация: 08.07.2008
Адрес: Обнинск
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А если свет выключится?
Помойму здесь явная ошибка в проектировании решения.
Не нужно откатывать по 'Нет', а нужно коммитить по 'Да'. Чуствуете разницу?
То что тут ошибка в проектировании, это да, но я на это повлиять не могу. А вот что такое коммитить по Да - не пойму пока, уж извините... Если это выполнить то, что нужно было бы потом откатить, то вопрос: а если опер не нажмет ESC ? Лучше конечно тогда "коммитить" в validateWrite - но тут опять накладываются ошибки проектирования, а скорей постановки.
Старый 03.02.2010, 16:06   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Подождите. Но вы же понимаете, что если у вас есть две взаимозависимые сущности. То при сохранении изменений в одной, изменения должны сохранятся и во второй. Не раньше не позже, а именно одновременно. В ОДНОЙ ТРАНЗАКЦИИ. Если это возможно, то делать это нужно даже не в методах формы, а в методах/тригерах таблиц (insert/update/delete)
Старый 03.02.2010, 16:38   #13  
pwp is offline
pwp
Участник
 
76 / 16 (1) ++
Регистрация: 08.07.2008
Адрес: Обнинск
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Подождите. Но вы же понимаете, что если у вас есть две взаимозависимые сущности. То при сохранении изменений в одной, изменения должны сохранятся и во второй. Не раньше не позже, а именно одновременно. В ОДНОЙ ТРАНЗАКЦИИ. Если это возможно, то делать это нужно даже не в методах формы, а в методах/тригерах таблиц (insert/update/delete)
Да, Вы правы на 100%. 2 сущности-это 2 таблицы, при изменении поля в одной, должны меняться несколько строк в другой. Ошибка проектирования в том, что одно и тоже поле присутствует в 2-х таблицах-а так не должно быть. Пытаюсь программированием убрать эти ошибки проекта...
Старый 03.02.2010, 18:33   #14  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от pwp Посмотреть сообщение
Да, Вы правы на 100%. 2 сущности-это 2 таблицы, при изменении поля в одной, должны меняться несколько строк в другой. Ошибка проектирования в том, что одно и тоже поле присутствует в 2-х таблицах-а так не должно быть. Пытаюсь программированием убрать эти ошибки проекта...
почему вы решили что это ошибка? избыточность изначально заложена в систему. сначало раскажите какая перед вами стоит задача.
Старый 03.02.2010, 20:16   #15  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от pwp Посмотреть сообщение
Это верно, но как поймать ситуацию, что метод write и не вызывался при отмене ?
А зачем это надо ловить? Если пользователь вошел в форму, просто посмотрел ничего не изменяя и вышел. Эту ситуацию тоже хотите отлавливать? Ведь этот сценарий ничем не будет отличаться от нажатия кнопки "Нет" в диалоге.

Если у Вас что-то другое, то опишите ситуацию подробнее. Не выбранный Вами способ решения задачи, а саму задачу. Почему возникла необходимость перехватывать отмену модификаций?
Старый 04.02.2010, 07:54   #16  
pwp is offline
pwp
Участник
 
76 / 16 (1) ++
Регистрация: 08.07.2008
Адрес: Обнинск
Цитата:
Сообщение от ice Посмотреть сообщение
почему вы решили что это ошибка? избыточность изначально заложена в систему. сначало раскажите какая перед вами стоит задача.
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
А зачем это надо ловить? Если пользователь вошел в форму, просто посмотрел ничего не изменяя и вышел. Эту ситуацию тоже хотите отлавливать? Ведь этот сценарий ничем не будет отличаться от нажатия кнопки "Нет" в диалоге.
Если у Вас что-то другое, то опишите ситуацию подробнее. Не выбранный Вами способ решения задачи, а саму задачу. Почему возникла необходимость перехватывать отмену модификаций?
Я думаю, задача представляет узкосудебный интерес. Ну хорошо. Журналы InvetJournalTable+InvetJournalTrans(Строки). Нужно, чтобы строки одного журнала имели одну дату. Для этого решили эту дату внести в Table (уже неверно). И при изменении поля клиентом в Table необходимо поменять дату и в строках. Решил: в validate этого поля на DS в Table тут же спросить клиента и при ДА заменить дату и в Table и в Trans. Все работает, но: если клиенту придет в голову нажать Esc вместо Save и там отказаться от модификации , то даты разъедутся. Вот и вся проблема(мелочи я опускаю).
Старый 04.02.2010, 08:34   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
И стоило городить всё это ради такой ерунды? Ну да ладно, как говорится, опыт - сын ошибок трудных.
Для решения поставленной задачи вам необходимо в момент смены даты в InvetJournalTable (а совершенно гарантированно этот момент можно отловить в методе update() таблицы InvetJournalTable) синхронно (т.е. в одной транцакции) менять значения даты и в таблице InvetJournalTrans.
Например так:
X++:
public void update()
{
    InventJournalTrans InventJournalTrans;
    ;

    ttsbegin;
    if (this.TransDate != this.orig().TransDate)
    {
        update_recordset InventJournalTrans
        setting TransDate = this.TransDate
        where InventJournalTrans.JournalId == this.JournalId;
    }
    
    super();
    ttscommit;
}
Обратите внимание. Метод InvetJournalTable.update() будет вызываться как при штатном сохранении записи CTRL+S, так и при аварийном выходе при нажатии ESC. Более того, если по каким-нибудь причинам у пользователя появится возможность изменить дату журнала с како-либо другой формы, этот код также отработает. Т.е. синхранизация данных обеспечивается на уровне тригеров таблиц и не зависит от пользовательского интерфейса
Старый 04.02.2010, 09:04   #18  
pwp is offline
pwp
Участник
 
76 / 16 (1) ++
Регистрация: 08.07.2008
Адрес: Обнинск
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
И стоило городить всё это ради такой ерунды? Ну да ладно, как говорится, опыт - сын ошибок трудных....................
.......................................
Обратите внимание. Метод InvetJournalTable.update() будет вызываться как при штатном сохранении записи CTRL+S, так и при аварийном выходе при нажатии ESC. Более того, если по каким-нибудь причинам у пользователя появится возможность изменить дату журнала с како-либо другой формы, этот код также отработает. Т.е. синхранизация данных обеспечивается на уровне тригеров таблиц и не зависит от пользовательского интерфейса
Ну я так и знал. Поехали тогда немного в детали. Это нужно не для всех журналов, а только Проводки,Приб\Убытки\Перенос+еще 2.(т.е.хорошо бы в этом методе иметь установленный параметр с формы, чтобы не нести этот код в метод таблицы.) При update в Trans нужно отработать еще ряд методов по другим таблицам(посмотрите update Transdate при изменении даты в Grid) Кроме того, update на Trans в нашей реализации идет с параметром(но он не selectforupdate). + прямой update этой даты в Table не находит своего своего отражения на форме (возможно нужно где-то (?) вставить research() на DS формы)+ нужен еще и диалог по изменению даты(где его затеять, тогда?), вдруг это кто то сел на клавиатуру).Но по любому, спасибо за совет, попробую и его тоже, если получится.
Старый 04.02.2010, 09:23   #19  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от pwp Посмотреть сообщение
Ну я так и знал. Поехали тогда немного в детали. Это нужно не для всех журналов, а только Проводки,Приб\Убытки\Перенос+еще 2.(т.е.хорошо бы в этом методе иметь установленный параметр с формы, чтобы не нести этот код в метод таблицы.) При update в Trans нужно отработать еще ряд методов по другим таблицам(посмотрите update Transdate при изменении даты в Grid) Кроме того, update на Trans в нашей реализации идет с параметром(но он не selectforupdate). + прямой update этой даты в Table не находит своего своего отражения на форме (возможно нужно где-то (?) вставить research() на DS формы)+ нужен еще и диалог по изменению даты(где его затеять, тогда?), вдруг это кто то сел на клавиатуру).Но по любому, спасибо за совет, попробую и его тоже, если получится.
Если есть много нюансов, которые не хочется городить в методе update(), тогда закройте дату в шапке журнала и в строках на редактирование. а в шапке журнала сделайте функцию (class) изменения даты. И в этой функции выполняйте все необходимые хитрости. а для обновления информации на форме, на кнопке, которая будет вызывать функцию, перекройте метод cliked() и после super() сделайте Reread и Refreash на датасорсе.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: pwp (1).
Старый 04.02.2010, 09:34   #20  
pwp is offline
pwp
Участник
 
76 / 16 (1) ++
Регистрация: 08.07.2008
Адрес: Обнинск
Цитата:
Сообщение от lev Посмотреть сообщение
Если есть много нюансов, которые не хочется городить в методе update(), ................... на датасорсе.
Да у меня сейчас вроде так и сделано, только вместо класса я сделал метод в классе JournalFormTable. Но стоит требование конса делать это не по кнопке, а по редактированию даты(я этого не поддерживаю) отсюда проблема с ESC (см.выше)
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Итератор с поддержкой методов обратного вызова для обработки контролов на форме gl00mie DAX: Программирование 18 06.08.2013 22:16
Как не выводить заголовки в форме, если нет строк? DreamCreator DAX: Программирование 9 29.05.2008 15:10
Отличия в строках ReqPO, почему одна строка появляется в форме а другая нет (Master Planning, Planned Orders) rkorchagin DAX: Программирование 8 21.02.2007 16:27
вывод количества записей в таблице на web форме и указание текущей страницы таблицы bambuk1960 DAX: Программирование 1 06.07.2006 13:27
Ограничение записей на форме Mystery DAX: Программирование 2 26.02.2004 11:28

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

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

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