Окно w_form_account
Создайте новое окно w_form_account.Тип окна - main.
В окне разместите:
- Окно данных. Имя dw_sheet, dataobject - dw_form_account_item.
- Кнопку ОК. Имя cb_ok.
- Кнопку Cancel. Имя cb_cancel.
Объявление переменных
w_account_item iw_account_item
Скрипты окна данных w_sheet
Событие buttonclicked
Событие возникает после нажатия пользователя на кнопку в окне данных. До него возникает событие buttonclicking.
Кнопке в окне данных можно задать некоторое количество стандартных операций. Событие buttonclicking возникает до начала работы операции, поэтому ее можно остановить, используя коды возврата события.
Одним из параметров событий в окне данных может выступать объект DWObject. Данный объект несет в себе информацию о событии. Например, в нашем случае dwo.type примет значение "button", а dwo.name - "b_hotel".
w_class lw_class opensheetwithparm(lw_class, parent, parent, 0, Layered!)
Изменение скриптов окна "Список отелей"
Т.к. теперь вы используете окно "Список клиентов" для выбора отеля при выписке счета, вам придется изменить его скрипты.
Объявление переменных
Добавьте следующее объявление в конец списка переменных окна w_class:
window iw_parm
Событие open
iw_parm = message.powerobjectparm
Переменная iw_parm имеет тип Window и может принимать значение любого объекта, отнаследованного от объекта Window.
Если открыть окно без параметра (как это делается из меню "Списки") ошибки не произойдет, т.к. объект message существует всегда, просто iw_parm примет значение null.
Событие ue_dn_enter объекта dw_sheet
Необходимо заменить строку
if dw_sheet.dataobject = 'dw_class_hotels' then return 1
на
if dw_sheet.dataobject = 'dw_class_hotels' then if not isnull(iw_parm) and dw_sheet.getrow() > 0 then iw_parm.postevent('ue_get_hotel', 0, dw_sheet.getitemnumber(dw_sheet.getrow(), 'id_hotel')) close(parent) end if return 1 end if
Обратите внимание, что после выполнения функции close(объект) объект будет уничтожен, но скрипт события продолжит выполняться, что приведет к возникновению ошибки, т.к. скрипт может обращаться к переменным объекта, который уже не существует. Поэтому после закрытия текущего объекта надо добавлять оператор return.
Скрипты окна w_form_account
Событие open
iw_account_item = message.powerobjectparm x = 200 x = 200 width = 3000 height = 1500 dw_sheet.settransobject(sqlca) if iw_account_item.id_account_item > 0 then dw_sheet.retrieve(iw_account_item.id_account_item) else dw_sheet.insertrow(0) dw_sheet.setitem(1, 'id_account', iw_account_item.id_account) end if
В окне принимается как параметр вызывающее окно.
Т.к. окно не модальное, вам необходимо задать размер и положение окна на экране, если вы хотите, чтобы оно появлялось в одном и том же месте.
Если значение переменной id_account_item окна w_account_item больше нуля, это означает, что был вызов на редактирование существующей записи. В противном случае запись добавляется в счет.
Событие ue_get_hotel
Добавьте пользовательское событие ue_get_hotel.
Скрипт события:
long ll_hotel; ll_hotel = message.longparm; dw_sheet.setitem(1, 'id_hotel', ll_hotel)
Окно получает код отеля, выбранный из окна "Список отелей".