Представления, представления...

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
AnryGTR
Сообщения: 116
Зарегистрирован: 15 янв 2007, 15:58

Представления, представления...

Сообщение AnryGTR » 09 фев 2007, 15:59

Здравствуйте, товарищи ГУРУ!
Создал в БД такое представление:

Код: Выделить всё

CREATE VIEW ALL_OBS (
  DAT,
  TIM,
  OPL,
  PRICE,
  STATUS,
  KOD_PAC,
  FAM,
  IMYA,
  DESCRIPT,
  KOD_OTD,
  NAIM,
  T_NUM,
  FAM_US,
  FAM_IM
)
AS
SELECT VISITS.DAT,
       VISITS.tim,
       VISITS.OPL,
       PRICES.SUMM,
       VISITS.STATUS,
       VISITS.KOD_PAC,
       GENERAL.FAM,
       GENERAL.IMYA,
       USLUGA.DESCRIPT,
       OTDEL.ID,
       OTDEL.NAM_OTD,
       USERS.T_NUM,
       USERS.FAM,
       USERS.IMYA
FROM VISITS
   INNER JOIN GENERAL ON (VISITS.KOD_PAC = GENERAL.ID)
   INNER JOIN USLUGA ON (VISITS.KOD_USL = USLUGA.ID)
   INNER JOIN OTDEL ON (USLUGA.KOD_OTD = OTDEL.ID)
   INNER JOIN PRICES ON (PRICES.ID_USL = USLUGA.ID AND VISITS.DAT>=PRICES.DAT_BEG AND VISITS.DAT<=PRICES.DAT_END)
   INNER JOIN USERS ON (VISITS.KOD_US = USERS.ID)
Потом вызываю его через FIBDataset. Вот никак не могу понять:
в сетке есть поле OPL (Checkbox), вот что мне нужно и куда? написать, чтобы когда я чекал на этом поле в сетке,
в соответствующей таблице это поле принимало соответствующее значение, сетка не Readonly, но она не реагирует на чекание
и другие манипуляции. Конечно, я знаю, что представление так просто не исправишь, слышал что его как-то надо связывать
с тригерром или FIBUpdateObject, Но как связывать, что куда писать так я и не понял... :-(
Премного буду БЛАГОДАРЕН, тем кто сможет помочь в этом вопросе, а ещё лучше было бы маленькую инструкцию о том
как, куда чо писать и чо с чем связывать...

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 09 фев 2007, 16:24

А почитать документацию на сайте разработчиков, надо полагать, мешают угрызения совести за украденный продукт...

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 09 фев 2007, 16:35

Вариант 1. Если тебе надо изменить поле только в этой таблице, в обновляющем запросе датасета впиши запрос:

Код: Выделить всё

UPDATE VISITS
SET
    OPL = :OPL
WHERE
    ID = :ID
ID - поле первичного ключа (не знаю, как оно у тебя там называется). Ну и естественно надо добавить его считывание в представлении.
Понимаешь, датасету абсолютно все равно, из чего ты считываешь данные и что потом меняешь. Его запросы независимы друг от друга.
FIBUpdateObject используется только в том случае, если тебе надо обновить две и более таблицы одновременно, причем с клиента.
Вариант 2. Сделать триггеры для представления. Это позволит обновлять любое количество таблиц через один запрос датасета. Пример: http://forum.ibase.ru/phpBB2/viewtopic.php?t=2680.
P.S. Купи книгу Х. Борри по Firebird'у.

AnryGTR
Сообщения: 116
Зарегистрирован: 15 янв 2007, 15:58

Сообщение AnryGTR » 09 фев 2007, 18:27

Что ж спасибо ВСЕМ за ответы, значит нужно прописать тригерры в представлении чтобы было возможно менять данные таблицы?

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 10 фев 2007, 04:22

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

Ответить