Окно "Список клиентов"
Откройте окно 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.