Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lr_new.doc
Скачиваний:
2
Добавлен:
09.11.2019
Размер:
649.22 Кб
Скачать

Методичні вказівки

Статичні і параметричні запити створюються на етапі конструювання програми. Для формування запиту використовується редактор властивості SQL, який викликається після клацання по кнопці в рядку властивості SQL компоненту TQuery. На рисунку показано вікно редактора

Рисунок 13 - Вікно редактора тексту запитів з текстом статичного запиту

Параметричним є запит, в Sql–операторі якого в процесі виконання додатку можуть змінюватися окремі його складові. В цьому випадку змінна частина оператора оформлюється як параметри.

Наприклад, в процесі виконання додатку може бути виданий запит «показати всі записи з таблиці Договору, що відносяться до орендаря Іванова і укладені після 10.10.2005»:

select * from lease, tenant

where tenant.tn='Іванов' and tenant.ntn=lease.ntn

and lease.ldate >=’10.10.2005’

і запит «показати всі записи з таблиці Договору, що відносяться до орендаря Сидорова і укладені після 1.11.2005»:

select * from lease, tenant

where tenant.tn='Сидоров' and tenant.ntn=lease.ntn

and lease.ldate >=’1.11.2005’

а також аналогічні запити за договорами інших орендарів і за інші дати. Неважко помітити, що такого роду запити відрізняються тільки прізвищами орендарів і датами. Тому можна сформувати параметричний запит, в якому частини, що змінюються, замінені на параметри.

select * from lease, tenant

where tenant.tn=:tenan and tenant.ntn=lease.ntn

and lease.ldate >= :Dates

Параметрами в цьому запиті є імена, що передують двокрапкою «:». Імена параметрів довільні і можуть не співпадати із значеннями полів таблиці, яким вони ставляться у відповідність.

Для формування параметричного запиту необхідно:

  1. Поставити на модуль даних компонент TQuery, вибрати для нього в інспекторі об'єктів властивість SQL і натискувати на кнопку текстового редактора.

  2. У вікні текстового редактора, що з'явилося набрати текст запиту з параметрами

  3. Вибрати в Інспекторі Об'єктів властивість Params і натискувати кнопку в рядку цієї властивості; у вікні, що з'явилося, будуть показані імена всіх параметрів, введених в текст параметричного запиту на кроці 2;

  4. Кожному параметру із списку необхідно поставити у відповідність певний тип і стартове значення.

Всякий раз, коли необхідно змінити значення параметрів запиту, програма повинна закрити TQuery, привласнити значення параметрам і повторно відкрити його. Звернутися до конкретного параметра можна за допомогою методу ParamByName.

Для описаного вище запиту будемо вводити поточні значення параметрів в компоненти типу TEdit з іменами Dates_edit і Tenant_edit. Відкриття набору даних будемо проводити після натиснення кнопки Vibor. Обробник події OnClick кнопки Vibor:

procedure Tlease edit form.ViborClick(Sender: TObject);

begin

inherited;

with DataModule2.Query1 do begin // ім'я виконуваного запиту

if active then close; // закрити запит, щоб передати значення параметра

ParamByName(' dates').AsString:= Dates_edit.text;

ParamByName('tenan').AsString:= Tenant_edit.text;

open; end; // тепер відкрити, тобто зробити активним

end;

Часто один компонент TQuery використовується для виконання різних віддалених один від одного за часом запитів. Такий підхід зменшує кількість компонентів, що використовуються, але може привести до зростання програмного коду.

Властивість SQL компоненту TQuery має тип TStrings, і тому вміст властивості SQL може формуватися програмно методами Add (додати рядок), Delete (видалити рядок), Clear (очистити список) і іншими.

Нехай компонент LeaseQuery використовується для виконання параметричного запиту

Select * from Lease

Where Ntn= :NTN_param

Значення параметра NTN_param буде братися з поля NTN поточної на даний момент записи в таблиці Tenant (ця вибірка здійснюється за допомогою запиту TenantQuery). Такий запит можна сформувати динамічно за допомогою наступного фрагмента програми:

With LeaseQuery do

Begin

SQL.Add (‘Select * from Lease’)

SQL.Add (‘Where Ntn= ‘ + TenantQuery.FieldByName (‘NTN’).AsInteger);

Open;End;

Збережені процедури вибору можуть повертати декілька значень одного і того ж вихідного параметра або групи вихідних параметрів. Таким чином, процедура вибору повертає набір даних, що полягає в загальному випадку з декількох рядків. Для передачі кожного значення вихідних параметрів в додаток в збереженій процедурі вибору застосовується оператор suspend. Формування рядка результуючого набору даних проводиться операторами select... into. Для звернення до збереженої процедури вибору в додатку клієнта використовується компонент TQuery ( або TIBQuery). Виклик процедури проводиться в рядку FROM оператора SELECT з вказівкою вхідних параметрів процедури. Вихідні параметри процедури указуються як вихідні значення оператора SELECT.

Як приклад скористаємося збереженою процедурою GET_LEASE_DATS, створеною в лабораторній роботі №6.

Щоб звернутися до даної процедури з клієнтського додатку, необхідні компоненти TIBQuery (на модулі даних) і Tbutton (для ініціалізації доступу до цієї процедури).

Рисунок 14 - Зовнішній вигляд форми пошуку даних договору по прізвищу орендаря

У властивості SQL компоненту TIBQuery необхідно визначити такий Sql-запит.

select * from GET_LEASE_DATS (:TN_NAME)

А у властивості Params компоненту TIBQuery - вказати тип параметра TN_ NAME як String. В обробнику натиснення на кнопку відбувається привласнення параметру поточного прізвища орендаря, введеного в компонент Tedit, після чого запит активізується.

procedure Tfm find lease.Button1Click(Sender: TObject);

begin

with datamodule2. IBQuery1 do begin

close;

parambyname(' TN_NAME ').AsString:=edit1.Text;

open;

end;

Процедура дії повертає один екземпляр значення вихідного параметра або параметрів. З додатку клієнта процедуру дії або процедуру вибору, яка повертає тільки один набір даних, викликають за допомогою компоненту TStoredProcedure (або TIBStoredProcedure). Для цього у властивість DatabaseName поміщають ім'я серверної БД, в якій розташована збережена процедура. Потім вибирають ім'я відповідної збереженої процедури із списку у властивості StoredProcedure. При цьому відбувається прочитування імен вхідних і вихідних параметрів і їх типів. Їх можна побачити при натиску на кнопку (...) у властивості Params.

Встановити значення вхідних параметрів і отримати значення вихідних параметрів процедури можна, використовуючи властивість Params.ParamValues або метод

Function ParamByName (const Value:String) :Tparam;

Наприклад

\\ вхідний параметр

IBStoredProc1.Params.ParamValues['tname']:=edit1.Text;

\\ вихідний параметр

label1.Caption:=inttostr(IBStoredProc1.ParamByName('ocenka').asinteger);

Перед виконанням процедури потрібно провести скріплення параметрів компоненту TStoredProcedure (або TIBStoredProcedure) і параметрів збереженої процедури за допомогою методу Procedure Prepare;

Виклик збереженої процедури здійснюється методом Procedure .ExecProc;

Нехай на сервері визначена процедура, що повертає прізвище і домашню адресу орендаря, який знімає нерухомість за певною адресою:

set term^;

create procedure owners(adres char(20) )

returns (fam char(20), ow adres char(29))

as begin

select owner.ow, owner.ado

from owner, lease

where lease.non=owner.non and lease.adr=:adres

into :fam :ow_adres;

suspend;

end^

set term;^

Щоб звернутися до даної процедури, розташуємо на модулі даних компонент IBStoredProcedure1, на формі - кнопку для ініціалізації виконання процедури, компоненти Tlabel - для візуалізації результатів виконання процедури.

Напишемо такий обробник натиснення кнопки, в якому відбувається привласнення значень вхідних параметрів і отримання значень вихідних параметрів процедури:

procedure TForm1.Button1Click(Sender: TObject);

begin

datamodule2.IBStoredProc1.UnPrepare;

datamodule2.IBStoredProc1.Params.ParamValues['adres']:=edit3.Text;

datamodule2.IBStoredProc1.Prepare;

datamodule2.IBStoredProc1.ExecProc;

label1.Caption:=(datamodule2.IBStoredProc1.ParamByName('fam').asstring);

label3.Caption:=(datamodule2.IBStoredProc1.ParamByName('OW ADRES').asstring); end;

Вікно працюючої програми показано на рисунку.

Рисунок 15 - Зовнішній вигляд форми після виконання пошуку

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]