18.06.2003, 05:48 | #1 |
Участник
|
Cвязь данных между двумя формами
Здравствуйте!
Ситуация следующая. Для одной из форм требуется доработка, заключающаяся в том, чтобы новые записи в таблице создавались не в этой же форме, а в отдельной. Dialog нельзя использовать из-за недостаточной функциональности. То есть создание новой записи в нашей форме будет похоже на создание производственного заказа в форме "Производственные заказы" (там тоже выскакивает отдельная форма) Форму создание сделал, запускаю ее в методе create() источника данных начальной формы. Вопрос в следуещем: как запись созданную в новой форме после нажатия кнопки "Ok" перенисти в старую??? В "Производственных заказах" это сделано достаточно сложно. Интересуют простые по логике методы реализации. Заранее благодарен. |
|
18.06.2003, 08:23 | #2 |
Соучастник
|
что значит "перенести из новой формы в старую"? обновить данные в первой форме? заставить перечитать все из базы? или взять отдельный элемент дизайна этой формы, и насильно что-то туда запихать?
__________________
View Anton Soldatov's LinkedIn profile |
|
18.06.2003, 12:02 | #3 |
Banned
|
Способов не так уж и много. Мой любимый: вставить новую запись в таблицу, перечитать источник данных и спозиционировать курсор на нужной строке:
PHP код:
|
|
18.06.2003, 12:46 | #4 |
NavAx
|
2 Artild
Как я понимаю, ты хочешь создать что-то вроде мастера.
На днях решил подобную задачу, может и не очень элегантно, но работает без проблем. Из create() вызываешь новую форму, через menuFunction, передаешь ей текущую форму, через args.caller() и датасорс, через parmObject(). В create нужно добавить дополнительный аргумент, чтобы его вызове из внешней формы создавалась строка, а не вызывалась форма. void create(boolean aPPEND = false, boolean extern = false // If created externally ){ Args args; ; if(!extern){ args = new args(); args.caller(element); args.parmObject(custTable_ds); new menuFunction(menuItemDisplayStr(ISP_CustWizard),MenuItemType:isplay).run(args); } else { super(aPPEND); } } В новой форме, в run, после super, создаешь временную таблицу, создаешь в ней новую запись и подставляешь ее в датасорс. custTableTmp.setTmp(); custTableTmp.initValue(); custTableTmp.doInsert(); custTable.setTmpData(custTableTmp); custTable_ds.executeQuery(); в датасорсе перебиваешь init: public void init() { super(); custTable.setTmp(); } Так же запрещаешь пользователю все лишние движения, кроме редактирования созданной записи. По завершении редактирования (я ловлю closeOk), переносишь данные из временной в реальную, берешь курсор вызывавшей формы, создаешь новую запись и загоняешь в нее данные из временной таблицы. public void closeOk() { FormDataSource formDataSource; Object formDatasourceObj; CustTable custTableDB; ; select custTableTmp; custTableDB.data(custTableTmp); custTableDB.insert(); formDataSource = element.args().caller().dataSource(1); formDatasourceObj = formDataSource; formDatasourceObj.create(false,true); formDataSource.cursor().data(custTableDB); super(); } Если что-то не сработало, сверься с InventTableWizard, я с него списывал, все работает. P.S. Не бойся разбираться в коде, это полезно и не так долго, как кажется |
|
18.06.2003, 14:54 | #5 |
Участник
|
Посмотрите как создаются обычные заказы в модуле заказы
|
|
23.06.2003, 09:24 | #6 |
Участник
|
Всем спасибо за ответы.
Частично они помогли разобраться в ситуации. Но все таки не до конца. в основной форме в методе create() перед запуском формы создания уже выполнен метод super(), то есть некоторым полям уже присвоены какие-то значения. Есть ли возможность эту еще не до конца созданную строку каким-то образом получить в форме создания? C уважением. |
|
23.06.2003, 09:36 | #7 |
Соучастник
|
Один из способов:
В методе обработчика clicked кнопки или чего-то-там основной формы говоришь MyChildFormCreator::create(this); В классе MyChildFormCreator в статическом методе create инициализируешь дочернюю форму, в ее элементы запихиваешь то что тебе нужно, значения можно взять из обьекта родительской формы, который передавался как аргумент метода create...
__________________
View Anton Soldatov's LinkedIn profile |
|
23.06.2003, 18:40 | #8 |
Banned
|
Цитата:
Есть ли возможность эту еще не до конца созданную строку каким-то образом получить в форме создания?
|
|
24.06.2003, 05:34 | #9 |
Соучастник
|
Цитата:
Изначально опубликовано EVGL
Разумеется. Засунуть этот курсор в свойство record() класса Args, который передается вызываемой форме. Или добраться до него из вызываемой формы так: element.args().caller().datasource().cursor(). P.S.(флейм): Недоумеваю: почему используется такой неудобный механизм работы с формами? Да, конечно, есть бестпрактис, где написано no code in forms! Но почему бы не сделать все формы нормальными классами, потомками FormRun. Чтобы можно было добавлять и вызывать свои методы, чтобы можно было сделать new MyForm, а не использовать для этого только(!) ClassFactory. Зачем так сильно ограничивать свободу? только ради "no code"?
__________________
View Anton Soldatov's LinkedIn profile |
|
24.06.2003, 09:01 | #10 |
Участник
|
Следующая проблема.
В форме создания через element.args().record() получил строку таблицы, изменил ее. В начальной форме ловлю closedOk формы закрытия, после чего курсор начальной формы устанавливаю в курсор формы создания. В форме появляется строка с параметрами указанными в форме создания. Но после выхода из формы при новом ее запуске строки уже нет. То есть она не сохраняется. Поэксперементировал с методами write(), insert(), reread(), refresh() источника данных, но результата не добился. Help!!!!! С уважением. |
|
24.06.2003, 10:36 | #11 |
Banned
|
Цитата:
после выхода из формы при новом ее запуске строки уже нет. То есть она не сохраняется. Поэксперементировал с методами write(), insert()
Цитата:
А каким образом(если это возможно), можно вызвать свой(не переопределенный от FormRun) метод произвольной формы из других форм и классов?
PHP код:
|
|
24.06.2003, 10:45 | #12 |
Соучастник
|
Цитата:
Изначально опубликовано EVGL
Элементарно. PHP код:
__________________
View Anton Soldatov's LinkedIn profile |
|
|
|