Создаю БД в C:\dbase1\SUPERMARKET.GDB . Запускаю IBConsole.exe . Далее:
CREATE TABLE "POSTAVSC"
( "KODPOSTAVSC" SMALLINT NOT NULL,
"POSTAVSC" CHAR(30) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
"REKVIZIT" CHAR(30) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
PRIMARY KEY ("KODPOSTAVSC") )
CREATE TABLE "PRODUCTION"
( "KODTOV" SMALLINT NOT NULL,
"KODPOSTAVSC" SMALLINT NOT NULL,
"KOLIC" SMALLINT NOT NULL,
"DATPOST" DATE NOT NULL,
"SROKREAL" SMALLINT NOT NULL )
CREATE TABLE "TOVARY"
( "KODTOV" SMALLINT NOT NULL,
"TOVAR" CHAR(20) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
"CENA" FLOAT NOT NULL,
PRIMARY KEY ("KODTOV") )
ALTER TABLE "PRODUCTION" ADD FOREIGN KEY ("KODPOSTAVSC") REFERENCES POSTAVSC ("KODPOSTAVSC");
ALTER TABLE "PRODUCTION" ADD FOREIGN KEY ("KODTOV") REFERENCES TOVARY ("KODTOV");
Для ввода запросов: Меню | Tools | Interacive SQL.
IBDatabase1.DefaultTransaction = IBTransaction1, IBTransaction1.Default = IBDatabase1,
IBDatabase1.Connected = true; IBTransaction1.Active = true;
IBQuery1.Database = IBDatabase1; IBQuery1.CachedUpdates = true;
IBQuery1.UpdateObject = IBUpdateSQL1;
IBQuery1.SQL = SELECT * FROM PRODUCTION, TOVARY, POSTAVSC
WHERE (PRODUCTION.KODTOV = TOVARY.KODTOV) AND
(PRODUCTION.KODPOSTAVSC = POSTAVSC.KODPOSTAVSC)
DataSource1.DataSet = IBQuery1;
DBGrid1.DataSource = DataSource1; DBNavigator1.DataSource = DataSource1;
IBTable1.Database = IBDatabase1; IBTable1.TableName = TOVARY;
IBTable1.CachedUpdates = true; DataSource2.DataSet = IBTable1;
DBGrid2.DataSource = DataSource2; DBNavigator2.DataSource = DataSource2;
IBTable1.Active = true;
Примечание: при всяких проблемах (в режиме разработки) полезно проверить
(и установить) состояние:
IBDatabase1.Connected = true;
IBTransaction1.Active = true;
IBTable1.Active = true;
IBQuery1.Active = true;
При отладке иногда приходится присваивать IBDatabase1.Connected = false,
затем - восстанавливать (все !).
Создание свойств IBUpdateSQL1: DeleteSQL, InsertSQL, ModifySQL, RefreshSQL:
- правый щелчок по IBUpdateSQL1, выбираю UpdateSQL Editor,
- имя таблицы - заглавными: PRODUCTION иначе - не работает!
- в окне KeyFields выбираю ключевые поля: KODTOV, KODPOSTAVSC,
изменяемые поля (Update Fields): все
- устанавливаю птичку Quote Identifiers
- щелкаю Generate SQL
- открывается вкладка SQL, на которой могу выбрать и просмотреть все 3
запроса: DeleteSQL, InsertSQL, ModifySQL, RefreshSQL
- тексты запросов можно увидеть в инспекторе объектов (IBUpdateSQL1,
свойства: DeleteSQL и т п). Например, InsertSQL :
insert into "PRODUCTION"
("PRODUCTION"."KODTOV", "PRODUCTION"."KODPOSTAVSC",
"PRODUCTION"."KOLIC",
"PRODUCTION"."DATPOST", "PRODUCTION"."SROKREAL")
values
(:"KODTOV", :"KODPOSTAVSC", :"KOLIC", :"DATPOST", :"SROKREAL")
Эти запросы исполняются при нажатии соответствующих клавиш DBNavigator1.
Данные таблиц Товары и Поставщики отображаются в нижнем окне. Они редактируются
так же - при нажатии соответствующих клавиш DBNavigator2. Не забывайте щелкнуть
"Сохранить изменения".
Все изменения кешируются, т е отображаются в приложении, но не сохраняются
в таблицах БД. Для сохранения изменений в БД щелкните "Обновить на сервере".
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IBQuery, Grids, DBGrids, DB, IBCustomDataSet, IBTable,
IBDatabase, ExtCtrls, DBCtrls, StdCtrls, IBUpdateSQL;
type
TForm1 = class(TForm)
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBTable1: TIBTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
IBQuery1: TIBQuery;
DBNavigator1: TDBNavigator;
DBGrid2: TDBGrid;
DataSource2: TDataSource;
RG2: TRadioGroup;
IBUpdateSQL1: TIBUpdateSQL;
Button1: TButton;
DBNavigator2: TDBNavigator;
Label1: TLabel;
procedure RG2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.RG2Click(Sender: TObject);
begin
IBTable1.Active:= false;
case RG2.ItemIndex of
0: IBTable1.TableName:= 'TOVARY';
1: IBTable1.TableName:= 'POSTAVSC';
// 2: IBTable1.TableName:= 'PRODUCTION';
end;
IBTable1.Active:= true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
try
IBDatabase1.ApplyUpdates([IBQuery1,IBTable1]);
except
MessageDlg('Изменения не сохранены', mtError, [mbOK],0);
IBQuery1.CancelUpdates;
IBTable1.CancelUpdates;
end;
IBTable1.Active:= false;
IBTable1.Active:= true;
end;
end.
Скачать все файлы делфи-проекта и файл БД - SUPERMARKET.GDB