Окно "Список клиентов"

Откройте окно Inherit From Object, выбрав пункт меню File - Inherit. Установите Object Type в значение Window. В поле Object установите окно w_base_dw и нажмите кнопку ОК.

Вы получили окно, унаследованное от базового окна w_base_dw. Сохраните его под именем w_clients.

Установите в окне Properties для объекта dw_sheet в поле DataObject значение dw_clients.

Установите в окне Properties для объекта w_clients в поле Menu Name значение m_clients.

Установите в окне Properties для объекта w_clients в поле Title значение "Список клиентов".

Скрипт ue_retrieve_data

Откройте окно Scripts художника Window и в событие ue_retrieve_data. Заметьте, что события, скрипты которых не пусты в родительском окне, отмечены другим цветом. Просмотреть их можно, выбрав в выпадающем меню Select Ancestor/Descendant имя родительского окна. Поменять их вы не можете.

Напишите следующий скрипт в событие ue_retrieve_data:

dw_sheet.retrieve()
commit;

Метод retrieve совершает чтение данных из базы данных в объект dw_sheet используя объект dw_clients. Для визуализации этого процесса вы можете использовать события retrievestart, retrieverow и retrieveend объекта dw_sheet и, например, метод setmicrohelp объекта w_rad_frame - главного окна приложения, т.к. оно имеет строку состояния (тип mdihelp), которую и меняет функция setmicrohelp.

Скрипт ue_save

Т.к. поле emp_id является уникальным ключом, и мы не можем использовать специфические свойства полей конкретных баз данных (как, например, последовательности Oracle), мы должны заполнить это поле при сохранении данных.

Для этого нам придется изменить скрипт события ue_save - сначала мы должны проставить значения полей emp_id, а только затем сохранить данные.

Для того, чтобы скрипт события ue_save окна w_clients был вызван первым, мы должны перекрыть им скрипт родительского окна. Это можно сделать, нажав правую кнопку мыши на окне Script художника Window на скрипте события ue_save и сняв установку Extend Ancessor Script. После этого запишем следующий скрипт:

long		ll_rowcount
long		ll_row
long		ll_emp_id
ll_rowcount = dw_sheet.rowcount()
if ll_rowcount > 0 then
	select max(emp_id) + 1
		into :ll_emp_id
	from clients;
	if isnull(ll_emp_id) then ll_emp_id = 1
end if
for ll_row = 1 to ll_rowcount
	if isnull(dw_sheet.getitemnumber(ll_row, 'emp_id')) then
		dw_sheet.setitem(ll_row, 'emp_id', ll_emp_id)
		ll_emp_id ++
	end if
next
call super:: ue_save

Последним оператором мы вызываем скрипт сохранения данных в окне после выполнения скрипта дочернего окна.

Обратите внимание:

  • В отличие от метода setitem, который не зависит от типа данных, методы getitem:() имеют разные имена (например, getitemnumber или getitemstring). Вызов неверного метода приведет к ошибке выполнения приложения.
  • Имена всех переменных SQL-запроса в языке PowerScript предваряются двоеточием.

Запись вызова окна в базовое меню

Откройте базовое меню m_rad_frame и скрипте события clicked пункта "Список клиентов" напишите следующий скрипт:

w_clients lw_clients;
opensheet(lw_clients, parentwindow, 0, Layered!)

В данном скрипте вы объявили переменную типа w_clients, и открыли экземпляр окна lw_clients. Заметим, что при этом не была использован оператор Create.