Окно w_form_account

Создайте новое окно w_form_account.Тип окна - main.

В окне разместите:

  1. Окно данных. Имя dw_sheet, dataobject - dw_form_account_item.
  2. Кнопку ОК. Имя cb_ok.
  3. Кнопку 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)

Окно получает код отеля, выбранный из окна "Список отелей".