Создаю БД в 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