WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 8 | 9 || 11 | 12 |   ...   | 14 |

Табл. 19. Хранимые процедуры, определяемые для обработки данных в таблице GROUPS ! Тип данных Имя процедуры Параметры Тип параметра ins groups CHAR (30) group_name входной SMALLINT kol_students входной SMALLINT sredniy_ball | входной group_name входной CHAR (30) upd_groups kol_students входной SMALLINT sredniy_ball входной SMALLINT del groups kod_groupp SMALLINT входной get_groups kod_groupp | входной SMALLINT name_groupp [ выходной CHAR (30) Недос тает процедуры, которая позволяла бы извлечь из БД информацию о типе данных по его коду.

Для ее создания запустите windows ISQL и подключитесь к БД Courses, - 99- созданной в конце предыдущего раздела. Наберите в окне запроса следующий текст:

CREATE PROCEDURE get_groups (kod_group SMALLINT) RETURNS (name_group char(30)) AS BEGIN SELECT name_group FROM GROUPS WHERE kod_group=:kod_group INTO :name_group;

END Эта процедура имеет два параметра - входной параметр kod_group и вы- ходной параметр name_group. В теле процедуры имеется обычный запрос на выборку данных, и полученное значение name_group помещается в выходной параметр, к которому могут обращаться внешние приложения.

Выполните запрос, и если все набрано правильно, то в БД будет создана новая процедура getgroups.

Создайте в любом текстовом редакторе файл addon. sql и скопируйте в него текст созданной процедуры. Сохраните addon, sql в каталоге, в котором вы держите сценарий создания БД. Этот файл будет дополнительным файлом сценария, который необходимо запустить при создании БД. Теперь у нас есть полный комплект хранимых процедур для манипулирования данными таблицы GROUPS.

Для работы с хранимыми процедурами Delphi имеет специальный компо- нент TstoredProc, который является наследником TDataSet и имеет все его методы и свойства. В то же время, он имеет несколько свойств и методов, специально предназначенных для работы с хранимыми процедурами:

StoredProcName - имя хранимой процедуры типа string. Во время проек- тирования его можно выбрать из выпадающего списка, подключившись к БД.

Во время выполнения программы оно задается операцией присваивания:

StoredProcl.StoredProcName:='ins groups';

Params - параметры хранимой процедуры, как входные, так и выходные.

Свойство Params имеет тип TParams и является коллекцией - особого рода списков. Работа с ним похожа на работу со свойством Fields. Во время проектирования Params вызывает диалоговое окно редактора, в котором можно добавлять параметры и задавать их различные свойства.

Каждый параметр обладает следующими свойствами:

• Name — имя параметра, имеет тип string;

• DataType - тип данных. Нам понадобятся следующие:

ftstring - символьный;

ftSmallInt - 16 битное число;

ftlnteger - 32 битное число;

ftBoolean — булевское;

- 100- ftFloat —дробное;

ftDataTime - дата и время.

• ParamType - тип параметра. Может принимать следующие значения:

ptUnknown - неопределенный;

ptInput - входной параметр;

ptOutput- выходной параметр;

ptInputoutput - входной и выходной параметр одновременно;

ptResult - возвращаемое значение.

Кроме того, имеется большой набор свойств модификаторов, позволяющих присваивать параметру значение и считывать его: Asinteger, AsString, AsFloat, AsBoolean И Т. Д.

Во время выполнения программы параметры создаются функцией CreateParam, которая добавляет новый параметр в коллекцию и сразу же уста- навливает его имя, тип и тип данных:

function CreateParam (FldType:TfileType;

const ParamName: string;

ParamType: TParamType): TParam;

Так как эта функция возвращает указатель на созданный параметр, удобно использовать ее в конструкции with... do. Например, чтобы добавить входной параметр name_groupp, можно использовать подобный фрагмент:

with StoredProcl.Params.CreateParam(ftString, 'name_groupp', ptlnput) do begin AsString:= Groups.name_groupp;

end Для удаления всех параметров коллекция Params имеет метод Clear:

StoredProcl.Params.Clear;

Выполнение хранимых процедур осуществляется в два этапа:

Подготовка. При этом производиться подготовка параметров, так назы- ваемое «связывание». Кроме этого на этом этапе инициализируются BDE и SQL - серверу посылается сообщение о том, что хранимая процедура готова к выпол- нению. Подготовка выполняется методом Prepare.

Собственно выполнение. Существуют два вида процедур: процедуры, воз- вращающие набор данных, и процедуры, не возвращающие набор данных.

Выполнение первых производиться при помощи метода Open или путем присвоения свойству Active значения true. Для выполнения вторых использу- ется метод ЕхесРгос.

Описание функций вызова хранимых процедур. Создайте метод insElement и наберите его текст:

- 101- function TfeGroups.InsElement : Boolean;

begin try result : =true;

CloseProc;

StoredProcl. StoredProcName : = ' ins_groups ' ;

StoredProcl. Params. Clear;

with StoredProcl. Params.CreateParam (ftString, ' name_group ', ptlnput) do begin Groups. name_group := Editl.Text;

AsString := Groups. name_group ;

end;

StoredProcl. Prepare;

StoredProcl. ExecProc;

except result : =false ;

end;

end;

Имя хранимой процедуры задается при помощи свойства StoredProcName :

StoredProcl. StoredProcName : =' ins_parttype' ;

Затем очищаются все параметры, и в список параметров добавляются па- раметр name_group, значение которого берется из поля ввода Editl. После это- го производится подготовка и собственно выполнение хранимой процедуры.

Функция InsElement возвращает результат выполнения процедуры true, если выполнение прошло успешно и false в случае возникновения исключе- ния.

Точно так же выглядит функция модификации данных upd_element :

function TfeGroups. UpdElement : Boolean;

begin try result : =true;

CloseProc;

StoredProcl. StoredProcName : = ' upd_groups ' ;

StoredProcl. Params.Clear;

with StoredProcl. Params. CreateParam (ftlnteger, ' kod_group ', ptlnput ) do begin Aslnteger := Groups. kodgroup;

end;

with StoredProcl. Params. CreateParam (ftString, 'name_group', ptlnput) do begin Groups. name_group := Editl.Text;

AsString := Groups. name group;

end;

with StoredProcl. Params. CreateParam (ftlnteger, - 102- 'kol_students', ptInput) do begin Groups.kol_students:= Edit2.Text;

Aslnteger := Groups.kol_students;

end;

with StoredProcl.Params.CreateParam (ftFloat, 'sredniy_ball',ptInput) do begin Groups.Changed:=true;

Groups.sredniy_ball:= Edit3.Text;

AsFloat := Groups.sredniy_ball;

end;

StoredProcl.Prepare;

StoredProcl.ExecProc;

except result:=false;

end;

end;

Так как хранимая процедура принимает четыре входных параметра, то в список Params добавляется четыре члена - kod_group, name_group, kol_ students и sredniy ball.

В момент выполнения этой функции мы полагаем, что указатель Groups содержит ссылку на существующий экземпляр класса TGroups, откуда и берет- ся код изменяемой группы kod_group.

Значение наименования namegroup передается из Editl. Это же значение заносится в объект Groups, для использования в вызывающем модуле.

Значение наименования kol_students передается из Edit2 и так же зано- сится в объект Groups.

Значение наименования sredniyball передается из Edits и заносится в объект Groups.

Свойству changed присваивается значение true, как признак того, что дан- ные изменились.

И, наконец, хранимая процедура get_groups, которую мы только что соз- дали, вызывается в программе следующим образом:

function TfeGroups.GetElement: Boolean;

begin try result:=true;

CloseProc;

StoredProcl.StoredProcName:='get groups';

StoredProcl.Params.Clear;

with StoredProcl.Params.CreateParam(ftInteger, kod_group',ptInput) do begin Aslnteger:=Groups.kod_group;

end;

- 103- StoredProcl.Params.CreateParam(ftString, 'name_group',ptOutput);

StoredProcl.Params.CreateParam(ftInteger, 'kol_students',ptOutput);

StoredProcl.Params.GreateParam(ftFloat, 'sredniy_ball',ptOutput);

StoredProcl.Prepare;

StoredProcl.ExecProc;

Groups. namegroup: =Trim( StoredProcl. Params [1 ]. AsString) ;

Editl.Text:=Groups.name_group;

Groups.kol_students:=Trim(StoredProcl.Params[2].Asnteger);

Edit2.Text:=Groups.kol_students;

Groups.sredniy_ball:=Trim(StoredProcl.Params[3].AsFloat);

Edit3.Text:=Groups.sredniy_ball;

except result:=false;

end;

end;

Кроме входного параметра kod_group, здесь создаются выходные пара- метры StoredProcl.Params.CreateParam(ftString,'name_group',ptOutput);

StoredProcl.Params.CreateParam(ftInteger, 'kol_students ', ptOutput);

StoredProcl.Params.CreateParam(ftFloat,'sredniy_ball', ptOutput);

После выполнения процедуры результат (наименование группы, количест- во студентов в группе и средний балл группы) помещается в объект Groups, a также в поля Editl, Edit2, Edit3 для редактирования.

Groups.name_group:=Trim(StoredProcl.Params[1].AsString);

Editl.Text:=Groups.name_group;

Groups.kol_students:=Trim(StoredProcl.Params[2].Asnteger);

Edit2.Text:=Groups.kol_students;

Groups.sredniy_ball:=Trim(StoredProcl.Params[3].AsFloat);

Edit3.Text:=Groups.sredniy_ball;

Операция удаления пробелов Trim здесь необходима, так как хранимая процедура возвращает результат со всеми пробелами.

Процедуры, экспортируемые из DLL. Теперь займемся процедурами, ко- торые будут экспортироваться из DLL и вызываться другими модулями. Таких процедур мы определили три:

procedure CreateElemDlg (Handle:Thandle; p:pointer);

procedure SetElemConnection(const DBHandle:HDBIBB);

procedure ShowElemDlg (const Dl-gMode : boolean) ;

Первые две процедуры не содержат ничего нового - здесь производилось создание диалогового окна и подключение к БД, как показано в следующих двух листингах:

- 104- procedure CreateElemDlg (Handle: Thandle; p: pointer);

begin Application.Handle:=Handle;

feGroups:=TfeGroups.Create(Application);

if assigned(p) then feGroups.Groups:=TGroups(p);

end;

procedure SetElemConnection(const DBHandle: HDBIDB);

begin feGroups.Databasel.Handle:=DBHandle;

end;

Рассмотрим подробнее процедуру showElemDlg:

procedure ShowElemDlg (const DlgMode:boolean);

begin with feGroups do begin if DlgMode then begin {диалог вызван для вставки элемента} Editl.Text:='';

ShowModal;

if modalResult = mrOK then if not InsElement then ShowMessage ('Ошибка при внесении элемента в БД');

end else begin if GetElement then begin ShowModal;

if ModalResult=mrOK then begin if not UpdElement then ShowMessage('Ошибка при изменении элемента в БД.

Kod:'+IntToStr (Groups.equip_type_id));

end;

end else ShowMessage ('Ошибка при извлечении элемента из БД.

Kod:'+ IntToStr(Groups.equip_type_id));

end;

Free ;

end;

end;

В зависимости от значения, переданного в параметре DlgMode, данная функция выполняет ввод или редактирование данных.

Если DlgMode=true, выполняется ввод нового элемента. Перед вызовом диалогового окна на экран поле Editl очищается. Затем вызывается окно диа- лога и, если была нажата кнопка ок, производится попытка внести элемент в - 105- БД. В случае ошибки выдается сообщение «Ошибка при внесении элемента в БД».

Если DlgMode=false, то перед вызовом диалогового окна, оно заполняется данными при помощи функции GetElement. Далее в зависимости от нажатой кнопки производится изменение данных.

Экспортируемые функции должны быть описаны в модуле проекта DLL, поэтому добавьте в файл dlglibOl.dpr раздел exports. Файл проекта должен выглядеть следующим образом:

library dlglibOl;

USES SysUtils, Classes, ueGroups in ' ueGroups. pas ' { feGroups } ;

ucGroups in '..\common\ucGroups.pas', ueG ucGroups in '..\common\ucGroups.pas', {$R *.res} exports CreateElemDlg name 'CREATEELEMDLG', SetElemConnection name 'SETELEMCONNECTION', ShowElemDlg name 'SHOWELEMDLG';

begin end.

Обратите внимание, что в директиве uses имя - ссылка на модуль BDE - это необходимо для того, чтобы был виден тип HDBIDB. Откомпилируйте и по- стройте dlglibOl.dll.

3.4.3.4. СОЗДАНИЕ ПРОЕКТА dlglibВ клиентском приложении созданная форма элемента будет вызываться из формы списка. При нажатии на кнопку «Добавить...» она должна вызываться в режиме вставки, а при нажатии на кнопку «Свойства...» - в режиме редактиро- вания. Теперь создадим форму списка для объекта «Группы».

1. Создайте в группе новый проект - DLL и сохраните его в отдельном каталоге course\dlglib02 ПОД именем dlglib02. dpr.

Установите в свойствах проекта главный каталог course в качестве выходного каталога (диалог «Options», на страничке «Directories/Conditionals» параметр «Output Directory»).

3.4.3.5. СОЗДАНИЕ ФОРМЫ СПИСКА 1. Добавьте к проекту dlglib02 новую форму, воспользовавшись помещен- ной в репозитарий формой «Базовая форма списка» и нажмите «ОК». Для это- го выберите пункт меню «File\New\other...», а затем в окне «New item» на странице «Forms» укажите значок «Базовая форма списка» и нажмите на кнопку «ок». Внешний вид формы списка практически готов, следует изменить только имя формы и заголовок окна Caption (табл. 20).

- 106- Сохраните модуль под именем ulGroups. pas в каталоге dlglib02.

Перейдем к редактированию класса Tf iGroups. Так же, как и класс преды- Табл. 20. Значения свойств компонента fBaseElemForml Компонент Свойство Значение I Name flGroups fBaseElemForm 1 Caption Группы дущей формы, он должен содержать в секции Private указатель на класс TGroups — связующее звено с другими модулями, а также несколько методов:

private {Private declaration} Groups: TGroups;

procedure CloseDataSet;

function LoadList: boolean;

function DelElement: boolean;

Процедура close DataSet закрывает активные наборы данных, которых имеется два: storedProcl - для выполнения хранимых процедур и Queryl - для получения выборки.

procedure TflGroups.CloseDataSet;

begin if StoredProcl.Active then StoredProcl.Close;

if Queryl.Active then Queryl.Close;

end Выборку данных и внесение их в список ListBoxl осуществляет функция LoadList. Но перед описанием функции скажем несколько слов о компоненте TListBox, который предназначен для вывода на экран строковых списков, в ко- торых могут выбираться элементы. Ядром TListBox является свойство items, которое и содержит список, отображаемый на экране, items - это потолок аб- страктного класса TStrings, специально предназначенного для хранения спи- сков строк. Его можно представить как последовательность связанных друг с другом параметров «указатель на класс TObject» - «строка» (рис. 67).

Доступ к строкам производится через свойство strings с указанием по- рядкового номера элемента, например:

ListBoxl.Items.strings[2].

Помимо строк список содержит также указатели на объекты, обращаться к которым надо через свойство objects:

ListBoxl. items.Objects [2] - указатель на 3-й объект. Количество эле- ментов в списке определяется свойством count.

Для добавления элементов в список класс имеет следующие методы:

- 107- Рис. 67. Структура абстрактного класса TStrings, предназначенного для хранения списков строк function Add(cons S:string): Integer;

function AddObject(cons S:string; Aobject: TObject): Integer;

Функция Add добавляет в список строку, устанавливая ссылку на объект, равной nil, а функция AddObject добавляет и строку, и ссылку на объект.

В списке TlistBox пользователь обычно выбирает какую-нибудь строку, номер которой определяется по свойству Itemindex.

Все эти свойства и методы используются в функции LoadList, текст кото- рой приведен ниже:

function TflGroups.LoadList;

begin try try result:=true;

ListBoxl.Items.Clear;

CloseDataSet;

Queryl.SQL.Clear;

Queryl.SQL.Add('select kod_group, name_group');

Queryl.SQL.Add('from GROUPS');

Queryl.SQL.Add('order by name_group');

Queryl.Open;

while not Queryl.EOF do begin ListBoxl.Iterns.AddObject(Queryl.Fields[1].AsString, TObject(Queryl.Fields[0].Aslnteger));

Queryl.Next;

end;

btnProp.Enabled:=false;

btnDelete.Enabled:=false;

Pages:     | 1 |   ...   | 8 | 9 || 11 | 12 |   ...   | 14 |






















© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.