Вопрос 31. Создание форм 1:М для просмотра, вставки, удаления и обновления данных в связанных таблицах с помощью компонента IBQuery, Ouery.
На такие формы размещаются следующие компоненты: IBQuery1 ( будет использован для реализации операции вставки), IBQuery2 (для отображения содержимого табл. к кот. добавляется запись), IBQuery3 (используется для создания списков
DBLookUpComboBox для выбора ВК), IBDatabase, IBTransaction, Edit1, Edit2 и DBLookUpComboBox.
Вставка в таблицу "Student" в свойстве SQL объекта IBQuery1 пишем :
Insert into student (kod, fio, kod_gr)
values (:pkod, :pfio, :pkod_gr)
в свойстве SQL объекта IBQuery2 пишем :
select * from student
в свойстве SQL объекта IBQuery3 пишем :
select * from gruppa
Перенос значений текущей записи в поля ввода и списка
Событие AfterScroll компонента IBQuery2:
Edit1.Text:= IBQuery2;
FieldByName('kod').Asstring;
Edit2.Text:= IBQuery2.FieldByName('fio'). Asstring;
DBLookUpComboBox.KeyValue:= IBQuery2.FieldByName('kod_gr'). Asinteger;
Обработка нажатия кнопки "Вставить":
IBQuery1.Close;
IBQuery1.ParamByName('pkod'). Asinteger:=StrToInt(Edit1.Text);
IBQuery1.ParamByName('pfio'). Asinteger:=StrToInt(Edit2.Text);
IBQuery1.ParamByName('pkod_gr'). Asinteger :=DBLookUpComboBox1.KeyValue;
IBQuery1.ExecSQL;
IBQuery2.Close;
IBQuery3.Open;
Замечание: В данном примере ПК в таблице студент (kod_stud) вводится вручную. Для того чтобы этот шаг генерировался автоматически можно либо создать генератор и триггер на добавление записи в табл. student, либо создать генератор и функцию GEN_ID вызвать непосредственно командой Insert into student value (GEN_ID(...)...)
Если ключ генерируется автоматически, то его на форме можно вообще не отображать
Замечание: Свойство всех объектов формы можно задать вручную в инспекторе объектов, либо задать их программным путем в виде обраб. формы события Activate:
IBQuery1.SQL:= 'insert into...'
Замечание: Если вставка, удаление и обновление данных в таблице осуществляется на одной и той же форме , то на форму помещается 3 кнопки; можно разместить на форме несколько запросов каждый из которых будет содержать следующие команды :
IBQuery1-Insert, IBQuery2 - Update, IBQuery3 - Delete.
Вставка добавл и удал. с помощью ХП
Для доступа к ХП erBase используется компонент IBStoredProc
Основный свойства:
StoredProcName - имя ХП, созданной в БД
ParamByName ('') - обращение к параметру
Метод: ExecProc - вызов исполняемых процедур
Вставка нов строки в табл. student:
IBQuery1 - отображения содержимого таблицы
IBQuery1.SQL:='select * from student'
IBQuery2 - формирования списка для выбора наименования группы ВК
IBQuery2.SQL:= 'select * from gruppa'
ХП Vvod: Insert into student (kod, fio,kod_gr)values (:pkod, :pfio, :pkod_gr)
Обработка нажатия кнопки "Добавить"
IBStoredProc1. StoredProcName:='Vvod';
IBStoredProc1. ParamByName('pkod').Asinteger:=StrToInt(Edit1.Text);
IBStoredProc1. ParamByName('pfio').Asstring:= Edit2.Text;
IBStoredProc1. ParamByName('pkod_gr').Asinteger:= DBLookUpComboBox1.KeyValue;
IBStoredProc1. ExecProc;
IBQuery1.Close;
IBQuery1.Open;
Замечание : Чтобы ПК в таблице student генерировался автоматически необходимо создать генератор и ХП будет след. вида:
Insert into student (kod, fio, kod_gr) values (GEN_ID(gen_grup, 1) :pfio, :pkod_gr)
Если значение ПК генерируется, то его запрещается обновлять, поэтому столбец ПК желательно скрыть.
Замечание: Если на 1 форме осуществляется и вставка и удал. и обновление все равно достаточно разместить на форме только1 объект IBStoredProc, при этом значение св-ва IBStoredProcName должно задаваться программным путем, а не в инспекторе объектов.
Выполнение запросов с помощью ХП выборки
ХП выборки студента заданной группы.
ХП stud_from создается в InterBase
create procedure stud_from (pkod integer) returns (pfio char (30))
as
begin
for
select fio
from student
where kod_gr=:pkod_gr
into :pfio
do
begin
suspend;
end ;
end.
Замечание: Объект IBStoredProc на форму не выносится. IBQuery для вызова ХП свойством SQL: IBQuery1.SQL:= 'select * from stud_from (:p)'
На такие формы размещаются следующие компоненты: IBQuery1 ( будет использован для реализации операции вставки), IBQuery2 (для отображения содержимого табл. к кот. добавляется запись), IBQuery3 (используется для создания списков
DBLookUpComboBox для выбора ВК), IBDatabase, IBTransaction, Edit1, Edit2 и DBLookUpComboBox.
Вставка в таблицу "Student" в свойстве SQL объекта IBQuery1 пишем :
Insert into student (kod, fio, kod_gr)
values (:pkod, :pfio, :pkod_gr)
в свойстве SQL объекта IBQuery2 пишем :
select * from student
в свойстве SQL объекта IBQuery3 пишем :
select * from gruppa
Перенос значений текущей записи в поля ввода и списка
Событие AfterScroll компонента IBQuery2:
Edit1.Text:= IBQuery2;
FieldByName('kod').Asstring;
Edit2.Text:= IBQuery2.FieldByName('fio'). Asstring;
DBLookUpComboBox.KeyValue:= IBQuery2.FieldByName('kod_gr'). Asinteger;
Обработка нажатия кнопки "Вставить":
IBQuery1.Close;
IBQuery1.ParamByName('pkod'). Asinteger:=StrToInt(Edit1.Text);
IBQuery1.ParamByName('pfio'). Asinteger:=StrToInt(Edit2.Text);
IBQuery1.ParamByName('pkod_gr'). Asinteger :=DBLookUpComboBox1.KeyValue;
IBQuery1.ExecSQL;
IBQuery2.Close;
IBQuery3.Open;
Замечание: В данном примере ПК в таблице студент (kod_stud) вводится вручную. Для того чтобы этот шаг генерировался автоматически можно либо создать генератор и триггер на добавление записи в табл. student, либо создать генератор и функцию GEN_ID вызвать непосредственно командой Insert into student value (GEN_ID(...)...)
Если ключ генерируется автоматически, то его на форме можно вообще не отображать
Замечание: Свойство всех объектов формы можно задать вручную в инспекторе объектов, либо задать их программным путем в виде обраб. формы события Activate:
IBQuery1.SQL:= 'insert into...'
Замечание: Если вставка, удаление и обновление данных в таблице осуществляется на одной и той же форме , то на форму помещается 3 кнопки; можно разместить на форме несколько запросов каждый из которых будет содержать следующие команды :
IBQuery1-Insert, IBQuery2 - Update, IBQuery3 - Delete.
Вставка добавл и удал. с помощью ХП
Для доступа к ХП erBase используется компонент IBStoredProc
Основный свойства:
StoredProcName - имя ХП, созданной в БД
ParamByName ('') - обращение к параметру
Метод: ExecProc - вызов исполняемых процедур
Вставка нов строки в табл. student:
IBQuery1 - отображения содержимого таблицы
IBQuery1.SQL:='select * from student'
IBQuery2 - формирования списка для выбора наименования группы ВК
IBQuery2.SQL:= 'select * from gruppa'
ХП Vvod: Insert into student (kod, fio,kod_gr)values (:pkod, :pfio, :pkod_gr)
Обработка нажатия кнопки "Добавить"
IBStoredProc1. StoredProcName:='Vvod';
IBStoredProc1. ParamByName('pkod').Asinteger:=StrToInt(Edit1.Text);
IBStoredProc1. ParamByName('pfio').Asstring:= Edit2.Text;
IBStoredProc1. ParamByName('pkod_gr').Asinteger:= DBLookUpComboBox1.KeyValue;
IBStoredProc1. ExecProc;
IBQuery1.Close;
IBQuery1.Open;
Замечание : Чтобы ПК в таблице student генерировался автоматически необходимо создать генератор и ХП будет след. вида:
Insert into student (kod, fio, kod_gr) values (GEN_ID(gen_grup, 1) :pfio, :pkod_gr)
Если значение ПК генерируется, то его запрещается обновлять, поэтому столбец ПК желательно скрыть.
Замечание: Если на 1 форме осуществляется и вставка и удал. и обновление все равно достаточно разместить на форме только1 объект IBStoredProc, при этом значение св-ва IBStoredProcName должно задаваться программным путем, а не в инспекторе объектов.
Выполнение запросов с помощью ХП выборки
ХП выборки студента заданной группы.
ХП stud_from создается в InterBase
create procedure stud_from (pkod integer) returns (pfio char (30))
as
begin
for
select fio
from student
where kod_gr=:pkod_gr
into :pfio
do
begin
suspend;
end ;
end.
Замечание: Объект IBStoredProc на форму не выносится. IBQuery для вызова ХП свойством SQL: IBQuery1.SQL:= 'select * from stud_from (:p)'