03.02.2010, 14:00 | #1 |
Участник
|
Управление изменением записей на форме.
Подскажите. На форме в текущей записи Grid сделан ряд изменений, но потом нажимается Esc вместо Save и возникает диалог: В форме были сделаны измения. Сохранить ?
В каком из методов можно управлять этим процессом, т.е. понять что выбрал User и отреагировать соответственно ? |
|
03.02.2010, 14:16 | #2 |
Участник
|
У меня по ESC вызывется element.task() с TaskId равным 1313.
В макросе #Task эта константа объявлена как #define.taskEsc(1313) |
|
|
За это сообщение автора поблагодарили: pwp (1). |
03.02.2010, 14:32 | #3 |
Участник
|
|
|
03.02.2010, 15:07 | #4 |
Участник
|
При сохранении изменений должен сработать метод write() на DataSource формы. Если выбрано "Нет", то записи не произойдет и метод write() не сработает
|
|
|
За это сообщение автора поблагодарили: pwp (1). |
03.02.2010, 15:09 | #5 |
Участник
|
Методом научного тыка удалось установить, что данный бокс вызывается где-то в супере element.canClose(). Также удалось распознать нажатие кнопки 'Отмена': в этом случае super() метода canClose возвращает false, а соответственно для кнопок 'Да' и 'Нет' - true (что логично, т.к. при таком выборе форма должна закрыться).
|
|
03.02.2010, 15:15 | #6 |
Ищущий знания...
|
Я что то не очень понял задачу...
Сейчас в стандарте, если ты что то изменил на форме, не сохранил и нажимаешь Esc, вылезает сообщение "В форме были сделаны изменения. Сохранить?" и три кнопки "Да", "Нет", "Отмена". Если нажать "да", то форма закроется и изменения сохраняться, если "нет", то форма закроется и ничего не сохраниться, если "отмена", то форма проста останется открытой и изменения остануться в том же виде не сохрененные. У меня созается впечатление что вам ничего доделовать не надо, а просто нажать на кнопку да, что бы сохранить изменения.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
03.02.2010, 15:27 | #7 |
Участник
|
Цитата:
Цитата:
Сообщение от S.Kuskov
Методом научного тыка удалось установить, что данный бокс вызывается где-то в супере element.canClose(). Также удалось распознать нажатие кнопки 'Отмена': в этом случае super() метода canClose возвращает false, а соответственно для кнопок 'Да' и 'Нет' - true (что логично, т.к. при таком выборе форма должна закрыться).
реакция не нужна. А тут и ДА и НЕТ не различаются!! Можно, конечно, в task поймать Esc, откатить все что нужно и заменить его на ctrlQ-что вроде равно Esc c ответом "НЕТ". |
|
03.02.2010, 15:30 | #8 |
Участник
|
Цитата:
Сообщение от lev
Я что то не очень понял задачу...
Сейчас в стандарте, если ты что то изменил на форме, не сохранил и нажимаешь Esc, вылезает сообщение "В форме были сделаны изменения. Сохранить?" и три кнопки "Да", "Нет", "Отмена". Если нажать "да", то форма закроется и изменения сохраняться, если "нет", то форма закроется и ничего не сохраниться, если "отмена", то форма проста останется открытой и изменения остануться в том же виде не сохрененные. У меня созается впечатление что вам ничего доделовать не надо, а просто нажать на кнопку да, что бы сохранить изменения. |
|
03.02.2010, 15:42 | #9 |
Участник
|
Цитата:
Помойму здесь явная ошибка в проектировании решения. Не нужно откатывать по 'Нет', а нужно коммитить по 'Да'. Чуствуете разницу? Последний раз редактировалось S.Kuskov; 03.02.2010 в 15:45. |
|
03.02.2010, 15:48 | #10 |
Участник
|
В Аксапте есть стандартная функциональность подтверждения. В настройках пользователя закладка "Confirmation" (не помню, как на русский перевели). Там настраивается подтверждение на новую запись и обновление старой отдельно для каждой группы таблиц.
|
|
03.02.2010, 15:54 | #11 |
Участник
|
То что тут ошибка в проектировании, это да, но я на это повлиять не могу. А вот что такое коммитить по Да - не пойму пока, уж извините... Если это выполнить то, что нужно было бы потом откатить, то вопрос: а если опер не нажмет ESC ? Лучше конечно тогда "коммитить" в validateWrite - но тут опять накладываются ошибки проектирования, а скорей постановки.
|
|
03.02.2010, 16:06 | #12 |
Участник
|
Подождите. Но вы же понимаете, что если у вас есть две взаимозависимые сущности. То при сохранении изменений в одной, изменения должны сохранятся и во второй. Не раньше не позже, а именно одновременно. В ОДНОЙ ТРАНЗАКЦИИ. Если это возможно, то делать это нужно даже не в методах формы, а в методах/тригерах таблиц (insert/update/delete)
|
|
03.02.2010, 16:38 | #13 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Подождите. Но вы же понимаете, что если у вас есть две взаимозависимые сущности. То при сохранении изменений в одной, изменения должны сохранятся и во второй. Не раньше не позже, а именно одновременно. В ОДНОЙ ТРАНЗАКЦИИ. Если это возможно, то делать это нужно даже не в методах формы, а в методах/тригерах таблиц (insert/update/delete)
|
|
03.02.2010, 18:33 | #14 |
Участник
|
почему вы решили что это ошибка? избыточность изначально заложена в систему. сначало раскажите какая перед вами стоит задача.
|
|
03.02.2010, 20:16 | #15 |
Участник
|
Цитата:
Если у Вас что-то другое, то опишите ситуацию подробнее. Не выбранный Вами способ решения задачи, а саму задачу. Почему возникла необходимость перехватывать отмену модификаций? |
|
04.02.2010, 07:54 | #16 |
Участник
|
Цитата:
Цитата:
Сообщение от Владимир Максимов
А зачем это надо ловить? Если пользователь вошел в форму, просто посмотрел ничего не изменяя и вышел. Эту ситуацию тоже хотите отлавливать? Ведь этот сценарий ничем не будет отличаться от нажатия кнопки "Нет" в диалоге.
Если у Вас что-то другое, то опишите ситуацию подробнее. Не выбранный Вами способ решения задачи, а саму задачу. Почему возникла необходимость перехватывать отмену модификаций? |
|
04.02.2010, 08:34 | #17 |
Участник
|
И стоило городить всё это ради такой ерунды? Ну да ладно, как говорится, опыт - сын ошибок трудных.
Для решения поставленной задачи вам необходимо в момент смены даты в 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; } |
|
04.02.2010, 09:04 | #18 |
Участник
|
Цитата:
Сообщение от S.Kuskov
И стоило городить всё это ради такой ерунды? Ну да ладно, как говорится, опыт - сын ошибок трудных....................
....................................... Обратите внимание. Метод InvetJournalTable.update() будет вызываться как при штатном сохранении записи CTRL+S, так и при аварийном выходе при нажатии ESC. Более того, если по каким-нибудь причинам у пользователя появится возможность изменить дату журнала с како-либо другой формы, этот код также отработает. Т.е. синхранизация данных обеспечивается на уровне тригеров таблиц и не зависит от пользовательского интерфейса |
|
04.02.2010, 09:23 | #19 |
Ищущий знания...
|
Цитата:
Сообщение от pwp
Ну я так и знал. Поехали тогда немного в детали. Это нужно не для всех журналов, а только Проводки,Приб\Убытки\Перенос+еще 2.(т.е.хорошо бы в этом методе иметь установленный параметр с формы, чтобы не нести этот код в метод таблицы.) При update в Trans нужно отработать еще ряд методов по другим таблицам(посмотрите update Transdate при изменении даты в Grid) Кроме того, update на Trans в нашей реализации идет с параметром(но он не selectforupdate). + прямой update этой даты в Table не находит своего своего отражения на форме (возможно нужно где-то (?) вставить research() на DS формы)+ нужен еще и диалог по изменению даты(где его затеять, тогда?), вдруг это кто то сел на клавиатуру).Но по любому, спасибо за совет, попробую и его тоже, если получится.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: pwp (1). |
04.02.2010, 09:34 | #20 |
Участник
|
Да у меня сейчас вроде так и сделано, только вместо класса я сделал метод в классе JournalFormTable. Но стоит требование конса делать это не по кнопке, а по редактированию даты(я этого не поддерживаю) отсюда проблема с ESC (см.выше)
|
|
|
|