
Лабораторные работы №1-6 - КИ МГОУ / lab4
.docx
Информационное обеспечение систем управления
Лабораторная работа №5
Форма для управления таблицами, связанными отношением один-ко-многим.
Студенты: Янковский Д.В.
Вихристюк А.С.
Преподаватель: Григорченко Н.А.
2010
Лабораторная работа №5
Форма для управления таблицами, связанными отношением один-ко-многим.
Цель: Изучение приемов построения интерфейса пользователя для работы со связанными таблицами на примере таблиц заказов и детализации. Изучение приемов создания полей выбора и вычисляемых полей наборов данных. Изучение свойств и способов применения компонента DBNavigator.
Выполнение работы.
-
Структура таблиц:
-
Таблица “Zakazi” (Заказы)
-
Поле “Code_Zak_S” является индексным
-
Таблица “Zakazchik” (Заказчик)
Поле “Name_Zak” является индексным
-
Таблица “Det_Zak” (Детализация заказов)
Поля “Num_Zak” и “Code_Zak” являются индексным
-
Таблица “Tovary” (Товыры)
Поле “Nazv_Izd” является индексным
Форма с заказами.
Исходные тексты программных модулей.
unit fz;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBTables, ExtCtrls, DBCtrls, StdCtrls,
Buttons;
type
TFZak = class(TForm)
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
TZakZ: TTable;
TZakDZ: TTable;
DSZakZ: TDataSource;
DSZakDZ: TDataSource;
TZakZNum_Zak: TSmallintField;
TZakZDate_Zak: TDateField;
TZakZCode_Zak_S: TSmallintField;
TTovZ: TTable;
DSTovZ: TDataSource;
TZakNZ: TTable;
DSZakNZ: TDataSource;
TZakZNameZak: TStringField;
DBNavigator2: TDBNavigator;
BBClose: TBitBtn;
TZakDZFirst_key: TAutoIncField;
TZakDZNum_zak: TSmallintField;
TZakDZCode_Izd: TSmallintField;
TZakDZKol_zak: TSmallintField;
TZakDZField: TStringField;
TZakDZSumZ: TCurrencyField;
QZak: TQuery;
TZakDZPrice: TCurrencyField;
TZakZSum: TCurrencyField;
Label1: TLabel;
Label2: TLabel;
Query1: TQuery;
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure TZakDZCalcFields(DataSet: TDataSet);
procedure TZakZCalcFields(DataSet: TDataSet);
procedure DBGrid2Enter(Sender: TObject);
procedure DBGrid1Enter(Sender: TObject);
procedure TZakZAfterInsert(DataSet: TDataSet);
procedure TZakZBeforeDelete(DataSet: TDataSet);
procedure TZakZBeforePost(DataSet: TDataSet);
procedure TZakDZBeforePost(DataSet: TDataSet);
procedure TZakDZBeforeDelete(DataSet: TDataSet);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FZak: TFZak;
implementation
uses fr;
{$R *.dfm}
procedure TFZak.FormActivate(Sender: TObject);
begin
TZakNZ.Active:=True;
TZakZ.Active:=true;
TTovZ.Active:=true;
TZakDZ.Active:=true;
TZakZ.IndexName := 'Code_Zakaz';
TZakDZ.IndexName := 'Ind_num';
TTovZ.IndexName := 'Nazv_Ind';
end;
procedure TFZak.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TZakNZ.Active:=False;
TZakZ.Active:=False;
TTovZ.Active:=False;
TZakDZ.Active:=False;
end;
procedure TFZak.TZakDZCalcFields(DataSet: TDataSet);
begin
TZakNZ.Active:=True;
TZakZ.Active:=true;
TTovZ.Active:=true;
TZakDZ.Active:=true;
TZakDZ.FieldByName('SumZ').AsCurrency:=TZakDZ.FieldByName('Price').AsCurrency*TZakDZ.FieldByName('Kol_zak').AsInteger;
end;
procedure TFZak.TZakZCalcFields(DataSet: TDataSet);
begin
QZak.SQL.Clear;
QZak.SQL.Add('SELECT Num_Zak, SUM(tovary.price*Det_Zak.Kol_zak) as Sumz');
QZak.SQL.Add('FROM Tovary, Det_Zak, Zakazi');
QZak.SQL.Add('WHERE Tovary.Code_Izd=Det_Zak.Code_Izd and Zakazi.Num_Zak=Det_Zak.Num_zak GROUP BY Num_Zak');
QZak.Active:= true;
QZak.Locate('Num_Zak',TZakZ.FieldByName('Num_Zak').AsInteger,[]);
TZakZ.FieldByName('Sum').AsVariant := QZak.FieldByName('Sumz').AsVariant;
QZak.SQL.Clear;
QZak.Close;
end;
procedure TFZak.DBGrid2Enter(Sender: TObject);
begin
DBNavigator2.DataSource:=DSZakDZ;
end;
procedure TFZak.DBGrid1Enter(Sender: TObject);
begin
DBNavigator2.DataSource:=DSZakZ;
end;
procedure TFZak.TZakZAfterInsert(DataSet: TDataSet);
var max:integer;
begin
Query1.SQL.Add('SELECT MAX(Num_Zak) FROM Zakazi');
Query1.Active := true;
max := Query1.FieldByName('MAX OF Num_Zak').AsVariant;
TZakZ.FieldByName('Num_Zak').AsVariant := max + 1;
Query1.SQL.Clear;
Query1.Close;
end;
procedure TFZak.TZakZBeforeDelete(DataSet: TDataSet);
var
k: integer;
begin
if TZakDZ.Locate('Num_Zak', TZakDZ.FieldByName('Num_Zak').AsInteger, []) then
Begin
ShowMessage('У данного заказчика имеются заказы!'+#13+'Продолжение невозможно...');
abort;
End
else
begin
if MessageDlg('Вы действительно хотите удалить эту запись?' , mtInformation, mbOKCancel, 1) = 1 then Begin
TZakZ.Delete;
abort;
End
else
abort;
end;
end;
procedure TFZak.TZakZBeforePost(DataSet: TDataSet);
begin
if MessageDlg('Вы действительно хотите изменить эту запись?', mtInformation, mbOKCancel, 1)<>1 then
begin
TZakZ.Cancel;
TZakZ.Last;
TZakZ.Next;
abort;
end;
end;
procedure TFZak.TZakDZBeforePost(DataSet: TDataSet);
begin
if MessageDlg('Вы действительно хотите изменить эту запись?', mtInformation, mbOKCancel, 1)<>1 then
begin
TZakDZ.Cancel;
TZakDZ.Last;
TZakDZ.Next;
abort;
end;
end;
procedure TFZak.TZakDZBeforeDelete(DataSet: TDataSet);
begin
if MessageDlg('Вы действительно хотите удалить данную запись?', mtInformation, mbOKCancel, 1)= 1 then
TZakDZ.Delete
else
abort;
end;
procedure TFZak.Button1Click(Sender: TObject);
begin
ShowMessage('Under construction');
end;
end.