|
![]() |
#1 |
Участник
|
Не получается
![]() ![]() Вообще же моей задачей является сделать форму в которой есть грид, записи в который можно добавлять толко через другую (детальную) форму, в которой видно все поля однои записи. Если в етой деталной форме нажать Сохранить, то форма закрывается и в гриде появляется запись, если нажать Отменить, то форма закрывается без сохранения записи. Мне на етом форуме порекомендовали посмотреть пример SalesTable, но он настолько сложный что я не разобрался. |
|
![]() |
#2 |
Administrator
|
Цитата:
Сообщение от sweeper
![]() Вообще же моей задачей является сделать форму в которой есть грид, записи в который можно добавлять толко через другую (детальную) форму, в которой видно все поля однои записи. Если в етой деталной форме нажать Сохранить, то форма закрывается и в гриде появляется запись, если нажать Отменить, то форма закрывается без сохранения записи.
Мне на етом форуме порекомендовали посмотреть пример SalesTable, но он настолько сложный что я не разобрался. Итак, открываем (в коде) форму SalesTable, как Вам порекомендовали. Для начала следует знать две вещи: 1. Best Practice рекомендует минимизировать код на форме. В стандарте это требование реализуется с помощью одного или нескольких классов, в которых размещается весь код, который "хочется" поместить на форме. Для каждого обработчика события на форме должен быть создан соответствующий метод этого "форменного" класса, который вызывается из метода формы и содержит всю обработку этого события. Это условие соблюдается однако далеко не везде - но тем не менее - при создании записи в форме SalesTable это используется. 2. Создание записи в форме вызывает метод create на датасорсе. И если не вызвать super - то создания записи не произойдет. Метод "форменного" класса - salesTableForm.create() - возвращает true, если нажата кнопка ОК в детальной форме и false - в противном случае. Поэтому в методе create формы SalesTable сделан if и super вызывается только если нажата кнопка ОК в детальной форме Теперь - о том - как в детальной форме сохранять или не сохранять запись. Кнопки в этой форме (SalesCreateOrder) сделаны типа CommandButton, с командой ОК или отмена. Эти команды примечательны тем, что: 1. Автоматически закрывают форму 2. При закрытии вызывают методы формы closeOk и closeCancel, а также устанавливают флажки (это тоже методы формы) closedOk и closedCancel, т.о. позволяя в коде понять - какая из кнопок нажата. Нажатие кнопки Esc эквивалентно выполнении команды Отмена, т.е. нажатию кнопки Отмена. Поскольку любое сохранение записи в форме вызывает метод write на датасорсе формы, то на детальной форме SalesCreateOrder в методе write стоит до вызова super() проверка: если не была нажата кнопка ОК (!closedOk) - то super() не вызывать и как следствие - запись не сохранять. Возвращаясь к форме SalesTable - хочу отметить, что (если из метода create на датасорсе SalesTable перейти в метод "форменного" класса SalesTableForm.create()) форма SalesCreateOrder вызывается во-первых из класса, что дает возможность передать в другую форму этот же экземпляр "форменного" класса, а во-вторых используется метод wait() у формы - что позволяет остановить исполнение кода до закрытия детальной формы SalesCreateOrder, после чего проверить - какая кнопка была нажата (if closedOk). Попутно - обращаю внимание - что непосредственное сохранение записи в таблице SalesTable происходит в методе write датасорса salesTable формы SalesCreateOrder. Там не вызывается super(), а вызывается непосредственно метод insert() на таблице (почему так сделано - это отдельный вопрос), а затем (смотрим код чуть ниже) новый SalesId сохраняется в "форменном" классе SalesCreateForm (метод newSalesId), который потом "достается" уже в методе create на датасорсе SalesTable формы SalesTable (смотрим строчку SalesTable::find) и курсор на датасорсе устанавливается на свежесозданную запись (строка salesTable.data(newSalesTable)) с последующей перечиткой этой записи датасорса (строка salesTable_ds.reread()). Перечитка нужна потому, что запись физически была создана из кода (метод write формы SalesCreateOrder) и параллельно с этим - виртуально (т.е. без записи в базу) - после вызова super() в методе create формы SalesTable. Перечитка позволяет датасорсу забыть про виртуальную запись и отображать запись из базы Вот.... Этот механизм хоть и сложный - но он показывает - как в Аксапте правильно делать тот механизм, который Вас попросили сделать. Сложность данного механизма (в частности, использование "форменного" класса) окупается легкостью обработки кнопок на форме и если форма многофункциональная - то только так и надо делать. Все остальное (использование методов create, write, closedOk, closedCancel) являются всего лишь средствами языка программирования Х++, которые могут и не иметь аналогов в других языках программирования. Вот такой механизм - задействован в форме SalesTable. Его весьма полезно будет осознать и претворять в жизнь дальше.
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 24.09.2008 в 20:30. |
|