Окна данных. Некоторые особенности проектирования

Окна данных. Некоторые особенности проектирования

1 Окна данных. Некоторые особенности проектирования Источники данных для окна данных (Data Window) При конструировании каждого нового окна данных необходимо выбрать источник данных Тип источника данных Быстрый отбор (Quick Select) Оператор SQL Select Запрос (Query) Хранимая процедура (Stored Procedure) Внешний (External) Как применяется Данные извлекаются из единственной таблицы или нескольких таблиц, связанных посредством внешних ключей. Эта связь автоматически учитывается. При конструировании окна данных выбираются поля, критерий отбора и сортировки. Данные извлекаются из таблиц, не связанных посредством ключей. Поэтому здесь конструируется оператор SQL SELECT, в котором могут быть заданы всевозможные свзи. Например, внутри оператора SQL SELECT определяются вычисляемые поля, возвращаемые аргументы. Данные определяются посредством существующего запроса (объекта Query) Данные определяются в хранимой процедуре, запускаемой на сервере БД. Таблица внешний источник данных создается непосредственно в процессе проектирования окна данных. Если необходимо изменять данные БД через окно данных, то оно должно быть updateble. Это устанавливаем в свойствах Update Properties (рис.1) Рис. 1 Переход из главного меню на задание свойств режима обновления окна данных

2 в следующем окне Описание элементов. Рис. 2 Окно задания свойств режима обновления окна данных Allow Updates - элемент выбора. Необходимо выбрать, если предполагается обновление данных в таблице через объект DataWindow. По умолчанию такие обновления разрешены, если окно данных содержит поля только одной таблицы и в них входят ключевые поля. Table to Update - список Если окно данных содержит поля нескольких таблиц, то необходимо указать имя таблицы, в которой будут обновления через данное окно данных. Where Clause for Update/Delete - группа радио кнопок. Определяет, какие поля включаются в опцию WHERE операторов Update/Delete. Замечание: Выбирайте здесь вариант Key Columns только, если БД используется в монопольном режиме одним пользователем или применена блокировка БД. Key Modification - группа радио кнопок. Определяет, какие генерируются операторы SQL, когда поле, указанное в окне Unique Key Column(s) изменено. Use DELETE then INSERT используется, если в СУБД не разрешено пользователям модифицировать два ключа или устанавливать какое либо значение поля в одной записи, равное значению поля в другой записи, или если СУБД имеет триггер Insert. Use UPDATE используется, если в СУБД только одна запись может быть изменена перед обновлением БД. Updateable Columns - окно В окне можно выбрать и подсветить обновляемые поля. Если такие поля выбраны,

3 убедитесь, что их порядковые номера табуляции отличны от нуля тогда их может выбрать пользователь при работе приложения. Unique Key Column(s) - окно Здесь указываются поля, которые идентифицируют обновляемую запись. По умолчанию считаются поля первичного ключа. Primary Key- кнопка. Выбирается, чтобы вместо окна Unique Key Column(s) использовать первичные ключи. Identity Column Указывается особое поле, величина в котором в новой записи устанавливается СУБД. Если такое поле установлено, то PowerBuilder отображает его величину в новой вставляемой в окно данных строке. Итак: - если окно данных содержит поля только одной таблицы и среди них есть ключевое поле, то они автоматически задаются как обновляемые поля с ненулевыми значениями номеров, определяющих порядок выбора таких полей; пользователи могут менять данные в таких полях непосредственно в окне данных. - если окно данных содержит поля нескольких таблиц или вида, то они автоматически задаются как необновляемые поля с нулевыми значениями номеров, определяющих порядок выбора таких полей; пользователи не могут менять данные в таких полях в окне данных; - пользуясь окном на рис. 2, можно разрешать или запрещать обновления некоторых полей в окне данных, но только принадлежащих одной таблице! Пример. Имеем таблицы студентов и их адресов: Рис. 3 Структура БД Создадим объект - окно данных типа Quick Select. Н рис. показаны структура его источника данных и оператор запроса.

4 Рис. 4. Макет источника данных Рис. 5. Порядок выбора полей таблиц Зададим условия обновления для одной из таблиц stud Назначим номера, определяющие порядок выбора всех полей всех таблиц в окне данных.

5 Нажмем клавишу системного меню и расставим номера у всех полей После этого станет возможным редактирование всех полей в окне данных. Но по скрипту dw_1.update() обновятся только поля таблицы stud Поэтому скрипт должен быть другой: long cr cr=dw_1.getrow() boolean lb_ok string is_updateerror integer li_return lb_ok = True // пока не обнаружено ни одной ошибки is_updateerror = "" //пока нет сообщений об ошибке li_return = dw_1.update(true,false) //Update в таблице stud IF li_return <> 1 OR is_updateerror <> "" THEN lb_ok = False IF lb_ok THEN dw_1.object.datawindow.table.updatetable = "addr" dw_1.object.addr_city.update = "yes" dw_1.object.addr_street.update = "yes" dw_1.object.addr_building.update = "yes" dw_1.object.addr_block.update = "yes" dw_1.object.addr_flat.update = "yes" dw_1.object.addr_zip.update = "yes" dw_1.object.addr_reg.update = "yes" dw_1.object.addr_n_z.update = "yes" dw_1.object.stud_n_zach.key = "no" dw_1.object.stud_n_zach.update = "no" dw_1.object.stud_fam.update = "no" dw_1.object.stud_name.update = "no" dw_1.object.stud_patroname.update = "no" dw_1.object.addr_n_z[cr] = dw_1.object.stud_n_zach[cr] // здесь - номер строки аргумент li_return = dw_1.update(true,false) //Update в таблице addr IF li_return <> 1 OR is_updateerror <> "" THEN lb_ok = False // Возвращаем в исходное dw_1.object.datawindow.table.updatetable = "stud" dw_1.object.addr_city.update = "no" dw_1.object.addr_street.update = "no" dw_1.object.addr_building.update = "no"

6 dw_1.object.addr_block.update = "no" dw_1.object.addr_flat.update = "no" dw_1.object.addr_zip.update = "no" dw_1.object.addr_reg.update = "no" dw_1.object.addr_n_z.update = "no" dw_1.object.stud_n_zach.key = "yes" dw_1.object.stud_n_zach.update = "yes" dw_1.object.stud_fam.update = "yes" dw_1.object.stud_name.update = "yes" dw_1.object.stud_patroname.update = "yes" IF lb_ok THEN COMMIT; dw_1.resetupdate() ELSE ROLLBACK; MessageBox("Error - Обновление БД не прошло", & is_updateerror, StopSign!) Пример 2. Другой вариант. Обновление двух объектов DataWindow int rtncode CONNECT USING SQLCA; dw_cust.settransobject(sqlca) dw_sales.settransobject(sqlca) rtncode = dw_cust.update(true, FALSE) IF rtncode = 1 THEN rtncode = dw_sales.update(true, FALSE) IF rtncode = 1 THEN dw_cust.resetupdate() // Both updates are OK dw_sales.resetupdate() // Clear update flags COMMIT USING SQLCA; // Commit them ELSE ROLLBACK USING SQLCA; // 2nd update failed

ВВОД-ВЫВОД ДАННЫХ. Методические указания к лабораторной работе

ВВОД-ВЫВОД ДАННЫХ Методические указания к лабораторной работе 1. ЦЕЛЬ РАБОТЫ Целью работы является приобретение практических навыков проектирования и программирования пользовательских интерфейсов ввода-вывода

📎📎📎📎📎📎📎📎📎📎