Назад Оглавление Дальше

Работа 3. Создание генератора, триггера, хранимой процедуры


Справочную информацию по Interbase можно найти , например на http://klog.h17.ru/interbase/

Задание


Главная форма проекта

Алгоритм

  1. С помощью IBConsole создаём БД C:\dbase1\TOVARY.GDB, как описано в работе 1

  2. В IBConsole выполняем запросы на создание таблиц (Для ввода запросов: Меню | Tools | Interacive SQL .) :
    CREATE TABLE tovary1 
    ( KODTOV SMALLINT NOT NULL,  
    NAZVAN CHAR(20) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
    PRIMARY KEY (KODTOV) )
    
    CREATE TABLE postavki 
    ( KODTOV SMALLINT NOT NULL,  
    KODPOSTAVSC SMALLINT NOT NULL,  
    CENA FLOAT NOT NULL,  
    KOL_VO FLOAT NOT NULL )
    
    CREATE TABLE postavsc 
    ( KODPOSTAVSC SMALLINT NOT NULL,  
    NAZVPOSTAVSC CHAR(20) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL,
    PRIMARY KEY (KODPOSTAVSC) )
    
    Вторичный ключ, который вроде бы нужен:
    ALTER TABLE postavki ADD FOREIGN KEY (KODTOV) REFERENCES tovary1(KODTOV)
    - в этой работе не нужен - контроль целостности будет реализован программно.

    Но добавим такой вторичный ключ:
    ALTER TABLE postavki ADD FOREIGN KEY (KODPOSTAVSC)
    REFERENCES postavsc(KODPOSTAVSC)

  3. Добавляем в таблицы несколько записей (IBConsole) и создаём интерфейс к БД в виде Делфи-проекта:
    • Запускаем Делфи7. Для появившейся формы устанавливаем заголовок - свойство Caption : БД : ТОВАРЫ

    • Устанавливаем компоненты для связи с БД

      • IBDatabase1, IBTransaction1 (на закладке Interbase). На IBDatabase1 делаем правый щелчок, выбираем Database Editor. Здесь щелкаем Browse и находим нашу БД: C:\dbase1\tovary2.GDB - (файл должен находиться в папке)
      • На панели Database Parameters впишите:
        User Name: SYSDBA
        Password : masterkey
        Character set: WIN1251
        Уберите птичку Login prompt, щелкните ОК . Согласитесь на отключение БД, если будет запрос.
      • Установите (в инспекторе объектов) свойства: IBDatabase1.DefaultTransaction = IBTransaction1, IBTransaction1.Default = IBDatabase1
    • Устанавливаем компоненты для работы с таблицей Товары: IBTable1, DataSource1, DBGrid1, DBNavigator1, настраиваем связи: IBTable1.Database = IBDatabase1; IBTable1.TableName = TOVARY1 (выбор из списка), IBTable1.Active = true; DataSource1.DataSet = IBTable1; DBGrid1.DataSource = DataSource1; DBNavigator1.DataSource = DataSource1; В свойство DBNavigator1.hints можно вставить строки:
      Первая запись
      Предыдущая запись
      Следующая запись
      Последняя запись
      Вставить запись
      Удалить запись 
      Править запись 
      Сохранить изменения 
      Отменить изменения
      Обновить данные из БД
      и установить ShowHints = true; Добавим обработку события DBNavigator1.DataSource.onDataChange - чтобы после изменения табл Товары сразу же просмотреть таблицу Поставки и увидеть там изменения (вызванные действием триггеров).
      procedure TfrmTovar.DataSource1DataChange(Sender: TObject; Field: TField);
      begin
        IBTable2.Active:= false;
        IBTable2.Active:= true;
      end;
    • Аналогично - для работы с таблицей Поставки: IBTable2, DataSource2, DBGrid2, DBNavigator2, настраиваем связи: IBTable2.Database = IBDatabase1; IBTable2.TableName = POSTAVKI (выбор из списка), IBTable2.Active = true; DataSource2.DataSet = IBTable2; DBGrid2.DataSource = DataSource2; DBNavigator2.DataSource = DataSource2; В свойство DBNavigator2.hints можно вставить строки перевода на русский язык.
    • Аналогично - для работы с таблицей Поставщики: IBTable3, DataSource3, DBGrid3, DBNavigator3, настраиваем связи: IBTable3.Database = IBDatabase1; IBTable3.TableName = POSTAVSC(выбор из списка), IBTable3.Active = true; DataSource3.DataSet = IBTable3; DBGrid3.DataSource = DataSource3; DBNavigator3.DataSource = DataSource3; В свойство DBNavigator3.hints можно вставить строки перевода на русский язык.
      Сделаем невидимой кнопку Insert у DBNavigator3, так как добавление записей будем производить кнопкой "Добавить". При нажатии этой кнопки становится видимой форма frmDobav (см рисунок - ниже), содержащая окошки для вписывания значений полей вставляемой записи (причём код поставщика вставляется программно).
    • Для правильной автоматической генерации возрастающих на 1 кодов поставщиков сделаем следующее:

      1. Найдём максимальное значение, хранящееся в поле KODPOSTAV в таблице POSTAVSC. Для этого выполним запрос:
        SELECT max(KODPOSTAVSC) FROM POSTAVKI
        Получаем, например, 3.
      2. Создаём генератор для автоматической выработки значений KODPOSTAVSC (в IBConsole):
        CREATE GENERATOR “POSTAVSC_KODPOSTAVSC”
        и устанавливаем его значение = 3: (в IBConsole)
        SET GENERATOR “POSTAVSC_KODPOSTAVSC” to 3
        Примечание:
        Когда вы будете экспериментировать с проектом, вероятно придётся неоднократно подправлять значение генератора с помощью этой команды. Текущее значение можно просмотреть, щелкнув иконку Generators. После изменения значения показания нужно обновить - убрать этот просмотр и зайти снова.
      3. Определяем хранимую процедуру (в IBConsole):
        SET TERM ^ ;
        CREATE PROCEDURE “GET_KODPOSTAVSC”
        RETURNS (OP INTEGER)
        AS
        BEGIN
         OP = GEN_ID(POSTAVSC_KODPOSTAVSC,1);
        END
        ^
        COMMIT WORK ^
        SET TERM ;^
        Здесь мы вынуждены временно заменить символ-ограничитель ; на ^ , так как в процедуре
        PROCEDURE “GET_KODPOSTAVSC” точка с запятой играет другую роль по синтаксису. Эта процедура по вызову приложения будет возвращать очередной свободный код поставщика.
      4. Кроме того, на форму frmDobav поставим компонент IBStoredProc1 - для связи с хранимой процедурой
        PROCEDURE “GET_KODPOSTAVSC”. Настроим его:
        IBStoredProc1.Database = frmTovar.IBDatabase1 (выберем из списка в инспекторе объектов)
        IBStoredProc1.StoredProcName = GET_KODPOSTAVSC (выберем из списка в инспекторе объектов)
        Щелкаем кпопку справа от Params. Появляется окно редактора и в нём - один параметр: OP. Выделяем этот параметр и настраиваем его свойство DataType = ftInteger. Закрываем редактор.
      5. На форму frmDobav ставим компонент IBQuery1. Именно он будет вставлять запись в табл. Поставщики. Вписываем его свойство SQL:
        INSERT INTO POSTAVSC (kodpostavsc, nazvpostavsc)
        VALUES (:MKODPOST, :MNamePOST)
        После этого откроем свойство IBQuery1.Params. В редакторе увидим параметры: MKODPOST, MNamePOST. Установим для них типы данных - DataType = ftInteger, ftString (соответственно)

  4. Займёмся созданием триггеров ( в IBConsole ). Они должны выполнять следующее:
    • 1-й триггер: перед обновлением таблицы Товары: если мы изменяем значение кода товара, то триггер изменяет код товара во всех записях таблицы Поставки, где есть прежнее значение кода. Чтобы создать триггер, вводим запрос в IBConsole:
      SET TERM ^ ; 
      CREATE TRIGGER BU_TOVARY FOR TOVARY1
      ACTIVE
      BEFORE UPDATE
      AS
      BEGIN
       IF(OLD.KODTOV <> NEW.KODTOV) THEN
        UPDATE POSTAVKI
      SET KODTOV = NEW.KODTOV
       WHERE KODTOV = OLD.KODTOV;
      END
      ^
      COMMIT WORK ^
      SET TERM ;^
    • 2-й триггер: после удаления записи из таблицы Товары удаляет все записи с этим кодом товара из таблицы Поставки. Введём запрос:
      SET TERM ^ ;
      CREATE TRIGGER DEL_TOVARY FOR TOVARY1
      ACTIVE
      AFTER DELETE
      AS
      BEGIN
       DELETE FROM POSTAVKI
       WHERE POSTAVKI.KODTOV = TOVARY1.KODTOV;
      END
      ^
      COMMIT WORK ^
      SET TERM ;^

      Все эти детали можно увидеть, просматривая Метаданные БД: Правый щелчок по БД | View MetaData. Забавно, что некоторые детали сохраняются немного не так, как вводились (например, PROCEDURE “GET_KODPOSTAVSC”)

    • Для проверки 1-го триггера изменим, например, код товара в табл Товары с 4 на 6
      Для этого выделим запись, у которой код товара=4, щелкнем кнопку Навигатора - "Править запись" (чёрный треугольник), впишем 6, нажмём Enter, затем - кнопку "Сохранить изменения" (птичка). Увидим, что в таблице Поставки все значения кода товара, равные 4 изменятся на 6. Это работа триггера. Однако если посмотрим БД через IBConsole, то увидим, что этих изменений в таблицах нет. Щёлкнем на главной форме кнопку "Сохранить в файле базы данных", затем снова просмотрим таблицы в IBConsole (не забудьте здесь щелкнуть кнопку "Commit & Refresh") - и увидите, что изменения сохранены в базе данных.
    • Для проверки 2-го триггера удалим, например, запись, для которой kodtov = 2
      И увидим, что вмете с удалением записи из табл Товары удалены соответствующие записи из табл Поставки. Значит - триггер работает правильно. Чтобы эти изменения сохранились в базе данных, щелкните кнопку "Сохранить в файле базы данных". В результате сработает метод:
      procedure TfrmTovar.btnCommitClick(Sender: TObject);
      begin
        IBTransaction1.CommitRetaining;
      end;

Скачать все файлы делфи-проекта и файл БД - TOVARY.GDB
Rambler's Top100
Hosted by uCoz