Домой Создать базу данных типа Interbase и приложение для работы с базой данных в архитектуре клиент-сервер




DataModule1 (dannie.pas)


Настройки компонентов Database1 и Database2 (модуль данных dannie.pas)

Настройки алиаса ib_skl1 в администраторе BDE.
Создать базу данных типа Interbase и приложение для работы 
с базой данных в архитектуре клиент-сервер.
•Создать базу данных типа Interbase из двух таблиц. Проиндексировать поля 
для организации отношения между таблицами "один ко многим".

•Создать клиентскую часть приложения.
Меню приложения:
•Таблица 1
•Таблица 2
•Выход 

Пункт Таблица 1 должен позволять работать с таблицей 1. 

Предусмотрите:
•навигацию по записям таблицы: Вперед, Назад, Первая, Последняя;
•добавление, удаление, редактирование записей; выполните их 
при помощи команд языка запросов SQL.
Пункт Таблица 2 должен позволять работать с таблицей 2.
Выход - выход из приложения.

•Реализовать каскадные воздействия:
при удалении записи в родительской таблице (с отношением один) 
должны быть удалены соответствующие записи в дочерней таблице 
(с отношением многие);
при изменении ключевого поля в родительской таблице должны быть 
изменены соответствующие записи в дочерней таблице.
Примечание: каскадные воздействия работают только в SQLexplorer 
(Delphi\bin\dbexplor.exe)    :-(
~~~~~~~~~~~~~~~~
Для этого приложения созданы 2 БД, которые должны размещаться:
C:\book\ib_sklad\IB_SKLAD.GDB  и C:\book\ib_obuv\ib_obuv.gdb 
(так настроено). Алиасы для них, соответственно: ib_skl1 и obuv

Текст модулей.
unit main;   // главный модуль

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    btnTovar: TBitBtn;
    btnRash: TBitBtn;
    btnQuit: TBitBtn;
    btnRast: TBitBtn;
    procedure btnTovarClick(Sender: TObject);
    procedure btnRashClick(Sender: TObject);
    procedure btnQuitClick(Sender: TObject);
    procedure btnRastClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation uses tovar, rash, dannie, unRast;

{$R *.dfm}

procedure TForm1.btnTovarClick(Sender: TObject);
begin
  Form2.Show;
end;

procedure TForm1.btnRashClick(Sender: TObject);
begin
  Form3.Show;
end;

procedure TForm1.btnQuitClick(Sender: TObject);
begin
  Form1.Close;
end;

procedure TForm1.btnRastClick(Sender: TObject);
begin
  frmRast.Show;
end;

end.

~~~~~~~~~~~~~~~~~~~~~
Файл dannie.pas 

unit dannie;

interface

uses
  SysUtils, Classes, DB, DBTables;

type
  TDataModule1 = class(TDataModule)
    Database1: TDatabase;
    Database2: TDatabase;
    procedure DataModuleCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DataModule1: TDataModule1;

implementation

{$R *.dfm}

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  database1.Connected:= false;
  database1.Connected:= true;
  database2.Connected:= false;
  database2.Connected:= true;
end;

end.

~~~~~~~~~~~~~~~~~
Файл dannie.dfm 

object DataModule1: TDataModule1
  OldCreateOrder = False
  OnCreate = DataModuleCreate
  Left = 593
  Top = 204
  Height = 185
  Width = 295
  object Database1: TDatabase
    AliasName = 'ib_skl1'
    DatabaseName = 'in_sklad'
    LoginPrompt = False
    Params.Strings = (
      'SERVER NAME=C:\book\ib_sklad\ib_sklad.gdb'
      'USER NAME=SYSDBA'
      'OPEN MODE=READ/WRITE'
      'SCHEMA CACHE SIZE=8'
      'LANGDRIVER=ancyrr'
      'SQLQRYMODE='
      'SQLPASSTHRU MODE=SHARED AUTOCOMMIT'
      'SCHEMA CACHE TIME=-1'
      'MAX ROWS=-1'
      'BATCH COUNT=200'
      'ENABLE SCHEMA CACHE=FALSE'
      'SCHEMA CACHE DIR='
      'ENABLE BCD=FALSE'
      'BLOBS TO CACHE=64'
      'BLOB SIZE=32'
      'WAIT ON LOCKS=FALSE'
      'COMMIT RETAIN=FALSE'
      'ROLE NAME='
      'PASSWORD=masterkey')
    SessionName = 'Default'
    Left = 16
    Top = 16
  end
  object Database2: TDatabase
    AliasName = 'obuv'
    DatabaseName = 'obuv2'
    Params.Strings = (
      'SERVER NAME=C:\book\ib_obuv\IB_OBUV.GDB'
      'USER NAME=SYSDBA'
      'OPEN MODE=READ/WRITE'
      'SCHEMA CACHE SIZE=8'
      'LANGDRIVER=ancyrr'
      'SQLQRYMODE='
      'SQLPASSTHRU MODE=SHARED AUTOCOMMIT'
      'SCHEMA CACHE TIME=-1'
      'MAX ROWS=-1'
      'BATCH COUNT=200'
      'ENABLE SCHEMA CACHE=FALSE'
      'SCHEMA CACHE DIR='
      'ENABLE BCD=FALSE'
      'BLOBS TO CACHE=64'
      'BLOB SIZE=32'
      'WAIT ON LOCKS=FALSE'
      'COMMIT RETAIN=FALSE'
      'ROLE NAME='
      'PASSWORD=masterkey')
    SessionName = 'Default'
    Left = 80
    Top = 16
  end
end

~~~~~~~~~~~~~~~~~
unit nov;   // добавление записи в таблицу расходов

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Mask;

type
  TForm31 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    edNom: TEdit;
    edKol: TEdit;
    edTov: TEdit;
    edPok: TEdit;
    MaskEdit1: TMaskEdit;
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form31: TForm31;

implementation uses rash;

{$R *.dfm}

procedure TForm31.BitBtn1Click(Sender: TObject);
begin
{ Присвоение значений параметрам  запроса}
 Form3.Query_InsR.ParamByName('MN_rash').AsInteger:=StrToInt(edNom.Text);
 Form3.Query_InsR.ParamByName('MDat_rash').AsString:= MaskEdit1.Text;
 Form3.Query_InsR.ParamByName('MKolvo').AsInteger:=StrToInt(edKol.Text);
 Form3.Query_InsR.ParamByName('MTovar').AsString:=edTov.Text;
 Form3.Query_InsR.ParamByName('MPokup').AsString:=edPok.Text;
 Form3.Query1.Active:=false;       { Query1 делается неактивным }
 Form3.Query_InsR.ExecSQL;          { Выполнение запроса Query_Ins }
 Form3.Query1.Active:=true;        { Активизация Query1 }
 Form31.Hide;
end;

end.

~~~~~~~~~~~~~~~~~~
unit rash;  // модуль таблицы расходы

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls;

type
  TForm3 = class(TForm)
    Query1: TQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    btnNext: TButton;
    btnPrev: TButton;
    btnFirst: TButton;
    btnLast: TButton;
    Query_InsR: TQuery;
    btnAdd: TButton;
    Query_DelR: TQuery;
    btnDel: TButton;
    btnEdit: TButton;
    Query_RedR: TQuery;
    procedure btnFirstClick(Sender: TObject);
    procedure btnPrevClick(Sender: TObject);
    procedure btnNextClick(Sender: TObject);
    procedure btnLastClick(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnDelClick(Sender: TObject);
    procedure btnEditClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation uses nov,red;

{$R *.dfm}

procedure TForm3.btnFirstClick(Sender: TObject);
begin
  Query1.First;
end;

procedure TForm3.btnPrevClick(Sender: TObject);
begin
  Query1.Prior;
end;

procedure TForm3.btnNextClick(Sender: TObject);
begin
  Query1.Next;
end;

procedure TForm3.btnLastClick(Sender: TObject);
begin
  Query1.Last;
end;

procedure TForm3.btnAddClick(Sender: TObject);
begin
  Form31.show;
end;

procedure TForm3.btnDelClick(Sender: TObject);
//var Mn_rash: integer;
begin
{ определяет значения параметра запроса}
// Mn_rash:= Query1.FieldByName('N_rash').Value;

// edit1.Text:=  inttostr(Mn_rash);

Query_DelR.ParamByName('Mn_rash').Value:=
Query1.FieldByName('N_rash').Value;
Query1.Active:=false;             { Query1 делается неактивным }
Query_DelR.ExecSQL;                { Выполнение запроса Query_Del }
Query1.Active:=true;              { Активизация запроса Query1 }

end;

procedure TForm3.btnEditClick(Sender: TObject);
begin
  Form32.edNom.Text:=IntToStr(Query1.FieldByName('N_Rash').Value);
  Form32.MaskEdit1.Text:= Query1.FieldByName('Dat_Rash').Value;
	Form32.edkol.Text:=IntToStr(Query1.FieldByName('Kolvo').Value);
	Form32.edtov.Text:=Query1.FieldByName('Tovar').Value;
	Form32.edpok.Text:=Query1.FieldByName('Pokup').Value;
  Form32.show;
end;

procedure TForm3.FormActivate(Sender: TObject);
begin
  Query1.Active:= true;
end;

end.

 ~~~~~~~~~~~~~~~
unit red;  // модуль редактирования выделенной записи таблицы расходы

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Mask;

type
  TForm32 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    edNom: TEdit;
    edKol: TEdit;
    edTov: TEdit;
    edPok: TEdit;
    MaskEdit1: TMaskEdit;
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form32: TForm32;

implementation uses rash;

{$R *.dfm}

procedure TForm32.BitBtn1Click(Sender: TObject);
begin
{ Присвоение значений параметрам  запроса}
 Form3.Query_RedR.ParamByName('MN_rash').AsInteger:=StrToInt(edNom.Text);
 Form3.Query_RedR.ParamByName('MDat_rash').AsString:= MaskEdit1.Text;
 Form3.Query_RedR.ParamByName('MKolvo').AsInteger:=StrToInt(edKol.Text);
 Form3.Query_RedR.ParamByName('MTovar').AsString:=edTov.Text;
 Form3.Query_RedR.ParamByName('MPokup').AsString:=edPok.Text;
 Form3.Query_RedR.ParamByName('MN_rash1').AsInteger:=
 Form3.Query1.FieldByName('N_Rash').Value;
 Form3.Query1.Active:=false;       { Query1 делается неактивным }
 Form3.Query_RedR.ExecSQL;          { Выполнение запроса Query_Ins }
 Form3.Query1.Active:=true;        { Активизация Query1 }
 Form32.Hide;
end;

end.

~~~~~~~~~~~~~~
unit tovar;  // модуль таблицы товары

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;

type
  TForm2 = class(TForm)
    Query1: TQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    btnFirst: TButton;
    btnPrev: TButton;
    btnNext: TButton;
    btnLast: TButton;
    btnAdd: TButton;
    btnDel: TButton;
    btnRed: TButton;
    Query_Ins: TQuery;
    Query_Del: TQuery;
    QueryRed: TQuery;
    procedure btnNextClick(Sender: TObject);
    procedure btnPrevClick(Sender: TObject);
    procedure btnFirstClick(Sender: TObject);
    procedure btnLastClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnDelClick(Sender: TObject);
    procedure btnRedClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation uses unTovDob, unTovRed;

{$R *.dfm}

procedure TForm2.btnNextClick(Sender: TObject);
begin
  Query1.Next;
end;

procedure TForm2.btnPrevClick(Sender: TObject);
begin
  Query1.Prior;
end;

procedure TForm2.btnFirstClick(Sender: TObject);
begin
  Query1.First;
end;

procedure TForm2.btnLastClick(Sender: TObject);
begin
  Query1.Last;
end;

procedure TForm2.FormActivate(Sender: TObject);
begin
  Query1.Active:= true;
end;

procedure TForm2.btnAddClick(Sender: TObject);
begin
  frmTovDob.Show;
end;

procedure TForm2.btnDelClick(Sender: TObject);
begin
{ определяет значения параметра запроса}
Query_Del.ParamByName('Mtovar').Value:=Query1.FieldByName('tovar').Value;
Query1.Active:=false;             { Query1 делается неактивным }
Query_Del.ExecSQL;                { Выполнение запроса Query_Del }
Query1.Active:=true;              { Активизация запроса Query1 }

end;

procedure TForm2.btnRedClick(Sender: TObject);
begin
  frmTovRed.edTov.Text:= Query1.FieldByName('tovar').Value;
	frmTovRed.edEd.Text:=Query1.FieldByName('ed_izm').Value;
	frmTovRed.edZena.Text:= IntToStr(Query1.FieldByName('zena').Value);
  frmTovRed.show;
end;

end.
 
~~~~~~~~~~~~~~
unit unRast;   // модуль таблицы растения (БД обувь :-) )

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, DBTables, StdCtrls;

type
  TfrmRast = class(TForm)
    Query1: TQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    btnNext: TButton;
    btnPrev: TButton;
    btnFirst: TButton;
    btnLast: TButton;
    btnAdd: TButton;
    Query_dob_rast: TQuery;
    Query_rast_del: TQuery;
    btnDel2: TButton;
    btnRed: TButton;
    Query_rast_red: TQuery;
    procedure btnNextClick(Sender: TObject);
    procedure btnPrevClick(Sender: TObject);
    procedure btnFirstClick(Sender: TObject);
    procedure btnLastClick(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnDel2Click(Sender: TObject);
    procedure btnRedClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmRast: TfrmRast;

implementation uses unRastDob, unRastRed;

{$R *.dfm}

procedure TfrmRast.btnNextClick(Sender: TObject);
begin
  Query1.Next;
end;

procedure TfrmRast.btnPrevClick(Sender: TObject);
begin
  Query1.Prior;
end;

procedure TfrmRast.btnFirstClick(Sender: TObject);
begin
  Query1.First;
end;

procedure TfrmRast.btnLastClick(Sender: TObject);
begin
  Query1.Last;
end;

procedure TfrmRast.btnAddClick(Sender: TObject);
begin
  frmRastDob.Show;
end;

procedure TfrmRast.btnDel2Click(Sender: TObject);
begin
{ определяет значения параметра запроса}
Query_rast_del.ParamByName('MNAZVANIE').Value:=
Query1.FieldByName('NAZVANIE').Value;
Query1.Active:=false;             { Query1 делается неактивным }
Query_rast_del.ExecSQL;           { Выполнение запроса Query_Del }
Query1.Active:=true;              { Активизация запроса Query1 }

end;

procedure TfrmRast.btnRedClick(Sender: TObject);
begin
  with frmrastred do
  begin
    ednazv.Text:= Query1.FieldByName('NAZVANIE').Value;
    MaskEdit1.Text:= Query1.FieldByName('DAT_POSADKI').Value;
    edzena.Text:=IntToStr(Query1.FieldByName('zena').Value);
    edrazmer.Text:=IntToStr(Query1.FieldByName('razmer').Value);
    Show;
  end;
end;

procedure TfrmRast.FormActivate(Sender: TObject);
begin
  Query1.Active:= true;
end;

end.

~~~~~~~~~~~~~~~
unit unRastDob;  // добавление записи в таблицу растений 

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Mask;

type
  TfrmRastDob = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    edNazv: TEdit;
    edZena: TEdit;
    BitBtn1: TBitBtn;
    MaskEdit1: TMaskEdit;
    Label4: TLabel;
    edRazmer: TEdit;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmRastDob: TfrmRastDob;

implementation uses unRast;

{$R *.dfm}

procedure TfrmRastDob.BitBtn1Click(Sender: TObject);
begin
{ Присвоение значений параметрам  запроса}


 frmRast.Query_dob_rast.ParamByName('MNAZVANIE').AsString:=edNazv.Text;
 frmRast.Query_dob_rast.ParamByName('MDAT_POSADKI').AsString:= MaskEdit1.Text;
 frmRast.Query_dob_rast.ParamByName('MZENA').AsInteger:=StrToInt(edZena.Text);
 frmRast.Query_dob_rast.ParamByName('MRAZMER').AsInteger:=StrToInt(edRazmer.Text);
 frmRast.Query1.Active:=false;       { Query1 делается неактивным }
 frmRast.Query_dob_rast.ExecSQL;          { Выполнение запроса Query_Ins }
 frmRast.Query1.Active:=true;        { Активизация Query1 }
 frmRastDob.Hide;
end;

end.

~~~~~~~~~~~
unit unRastRed;  // редактирование выделенной записи таблицы растений

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Mask;

type
  TfrmRastRed = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    edNazv: TEdit;
    edZena: TEdit;
    BitBtn1: TBitBtn;
    MaskEdit1: TMaskEdit;
    Label4: TLabel;
    edRazmer: TEdit;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmRastRed: TfrmRastRed;

implementation uses unRast;

{$R *.dfm}

procedure TfrmRastRed.BitBtn1Click(Sender: TObject);
begin
{ Присвоение значений параметрам  запроса}

 frmRast.Query_rast_red.ParamByName('MNAZVANIE').AsString:=edNazv.Text;
 frmRast.Query_rast_red.ParamByName('MDAT_POSADKI').AsString:= MaskEdit1.Text;
 frmRast.Query_rast_red.ParamByName('MZENA').AsInteger:=StrToInt(edZena.Text);
 frmRast.Query_rast_red.ParamByName('MRAZMER').AsInteger:=StrToInt(edRazmer.Text);
 frmRast.Query1.Active:=false;       { Query1 делается неактивным }
 frmRast.Query_rast_red.ExecSQL;          { Выполнение запроса Query_Ins }
 frmRast.Query1.Active:=true;        { Активизация Query1 }
 frmRastRed.Hide;
end;

end.

~~~~~~~~~~~~~~
unit unTovDob;  // добавление записи в таблицу товаров

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TfrmTovDob = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    edTov: TEdit;
    edEd: TEdit;
    edZena: TEdit;
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmTovDob: TfrmTovDob;

implementation uses tovar;

{$R *.dfm}

procedure TfrmTovDob.BitBtn1Click(Sender: TObject);
begin
{ Присвоение значений параметрам  запроса}
 Form2.Query_Ins.ParamByName('Mtovar').AsString:=edTov.Text;
 Form2.Query_Ins.ParamByName('Med_izm').AsString:= eded.Text;
 Form2.Query_Ins.ParamByName('Mzena').AsInteger:=StrToInt(edZena.Text);
 Form2.Query1.Active:=false;       { Query1 делается неактивным }
 Form2.Query_Ins.ExecSQL;          { Выполнение запроса Query_Ins }
 Form2.Query1.Active:=true;        { Активизация Query1 }
 frmTovDob.Hide;
end;

end.

~~~~~~~~~~~~~
unit unTovRed;   // редактирование выделенной записи таблицы товаров 

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TfrmTovRed = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    edTov: TEdit;
    edEd: TEdit;
    edZena: TEdit;
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmTovRed: TfrmTovRed;

implementation uses tovar;

{$R *.dfm}

procedure TfrmTovRed.BitBtn1Click(Sender: TObject);
begin
{ Присвоение значений параметрам  запроса}
 Form2.QueryRed.ParamByName('Mtovar').AsString:=edTov.Text;
 Form2.QueryRed.ParamByName('Med_izm').AsString:= eded.Text;
 Form2.QueryRed.ParamByName('Mzena').AsInteger:=StrToInt(edZena.Text);
 Form2.Query1.Active:=false;       { Query1 делается неактивным }
 Form2.QueryRed.ExecSQL;          { Выполнение запроса Query_Ins }
 Form2.Query1.Active:=true;        { Активизация Query1 }
 frmTovRed.Hide;
end;

end.

========= Метаданные таблиц ==========
Табл. TOVARY,  Metadata 

/* Table: TOVARY, Owner: SYSDBA */

CREATE TABLE "TOVARY" 
(
  "TOVAR"	VARCHAR(20) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
  "ED_IZM"	VARCHAR(10) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
  "ZENA"	INTEGER NOT NULL,
 PRIMARY KEY ("TOVAR")
);
SET TERM ^ ;


/* Triggers only will work for SQL triggers */

CREATE TRIGGER "BU_TOVARY" FOR "TOVARY" 
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
    IF ( OLD.TOVAR <> NEW.TOVAR) THEN
     UPDATE  RASHOD
        SET   TOVAR = NEW.TOVAR
       WHERE  (TOVAR = OLD.TOVAR);
END
 ^

CREATE TRIGGER "AD_TOVARY" FOR "TOVARY" 
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
    DELETE FROM RASHOD
    WHERE (RASHOD.TOVAR = TOVARY.TOVAR);
END
 ^

COMMIT WORK ^
SET TERM ;^

Табл. RASHOD,  Metadata 

/* Table: RASHOD, Owner: SYSDBA */

CREATE TABLE "RASHOD" 
(
  "N_RASH"	INTEGER NOT NULL,
  "DAT_RASH"	CHAR(8) CHARACTER SET WIN1251 NOT NULL,
  "KOLVO"	INTEGER NOT NULL,
  "TOVAR"	VARCHAR(20) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
  "POKUP"	VARCHAR(10) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
 PRIMARY KEY ("N_RASH")
);

Табл. RAST,  Metadata 

/* Table: RAST, Owner: SYSDBA */

CREATE TABLE "RAST" 
(
  "NAZVANIE"	VARCHAR(20) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
  "DAT_POSADKI"	CHAR(8) CHARACTER SET WIN1251 NOT NULL,
  "ZENA"	INTEGER NOT NULL,
  "RAZMER"	INTEGER NOT NULL,
 PRIMARY KEY ("NAZVANIE")
);
Примечание: в процессе создания приложения не забывайте, что компоненты Query1 на формах должны быть: Active=true и компоненты Database1,2 : Connected = true. Иногда полезно (когда не находится например БД obuv2) переключить Database.Connected false , затем - true. После этого посмотреть на значение Query1.Active и если false, то включить true (всё это при помощи инспектора объектов). Также - не забудьте настроить Database1,2 при помощи редактора (дв щелчок по Database)

Файлы проекта, баз данных (в папке book) и описание сборки - в упакованном виде
Rambler's Top100
Hosted by uCoz