Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.25;
Скачать: CL | DM;

Вниз

Обновляемое View   Найти похожие ветки 

 
kombat ©   (2002-11-07 18:28) [0]

Привет всем! Помогите в решении проблемы. Есть две таблички
TOWN (
REC_ID T_INT_NOT_NULL NOT NULL,
NAME T_VARCHAR_128 NOT NULL
и
BANK (
REC_ID T_INT_NOT_NULL NOT NULL,
NAME T_VARCHAR_64 NOT NULL,
MFO T_VARCHAR_6 NOT NULL,
TOWN_ID T_INT_NOT_NULL NOT NULL
на них создается
CREATE VIEW NEW_VIEW(
BANK_NAME,
BANK_REC_ID,
TOWN_NAME,
TOWN_REC_ID)
AS
SELECT B.NAME AS BANK_NAME, B.REC_ID, T.NAME AS TOWN_NAME, T.REC_ID AS TOWN_REC_ID
FROM TOWN T, BANK B
WHERE T.REC_ID=B.TOWN_ID;
у него есть тригер
ALTER TRIGGER NEW_VIEW_BI
AS
DECLARE VARIABLE TMPI_TOWN_REC_ID INTEGER;
BEGIN
SELECT REC_ID FROM TOWN WHERE NAME=NEW.TOWN_NAME INTO :TMPI_TOWN_REC_ID;
IF (TMPI_TOWN_REC_ID IS NULL) THEN TMPI_TOWN_REC_ID=0;
IF (TMPI_TOWN_REC_ID=0) THEN BEGIN
TMPI_TOWN_REC_ID=GEN_ID(GEN_TOWN_ID, 1);
INSERT INTO TOWN (REC_ID, NAME) VALUES (:TMPI_TOWN_REC_ID, NEW.TOWN_NAME);
END
TMPI_TOWN_REC_ID=0;
INSERT INTO BANK (NAME, TOWN_ID) VALUES (NEW.BANK_NAME, :TMPI_TOWN_REC_ID);
END
у табличек кроме того на ключевые поля есть тригеры которые подставляют значения для ключевого поля REC_ID.

А проблема в том что при попытке провести следующий запрос INSERT INTO NEW_VIEW (BANK_NAME, TOWN_NAME, BANK_REC_ID, TOWN_REC_ID)
VALUES ("New_bank", "Kiev", 0, 0) просто отваливается соединение к базе.
Как бороться с этим, что я делаю неправильно?


 
Kombat ©   (2002-11-07 18:53) [1]

И еще выдает такое
The cursor identified in the update or delete statement is not positioned on a row.
no current record for fetch operation.
attempted update of read-only column.

Как вообще сделать чтобы View был обновляемым, вроде делаю все как в доках FB


 
Johnmen ©   (2002-11-08 01:59) [2]

Еще раз внимательно прочитать доки на предмет определения редактируемого вью...
А по поводу отваливающегося соединения - так ты не указал, как это соединение осуществляешь ! А телепатов, как уже неоднократно заявлялось в конфах, здесь нет !


 
Виталий Панасенко   (2002-11-08 08:45) [3]

Просто обновляемый просмотр можно создать только используя ОДНУ таблицу


 
Wolf226 ©   (2002-11-08 10:11) [4]

2 Виталий Панасенко.

Да хоть из 100 таблиц! Только тригера пропиши и все там обновляй.
Когда view из 1 таблицы тогда она сама обновляет, а иначе с помощью тригеров.

Кстати о птичках:
Если view из одной таблицы, а тебе нужно сделать встаку своим методом в тригере, то ты ее обманываешь так

select ID, name
from table1, rdb$database


 
Wolf226 ©   (2002-11-08 10:29) [5]

Зачем? Вроде это вторичный ключ, а ты его в 0
TMPI_TOWN_REC_ID=0;
INSERT INTO BANK (NAME, TOWN_ID) VALUES (NEW.BANK_NAME, :TMPI_TOWN_REC_ID);


 
kombat ©   (2002-11-08 11:05) [6]

Извиняюсь за неполный вопрос. Я использовал для коннекта к БД IBExpert 2.5.0.9, при использовании SQLExplorer (BDE 5.11) конект так же отлетает. FireBird 1.0 build 863. В доках написано что обновляемое View можно сделать только на одну таблицу, но если использовать тригеры, то можно обновлять любое количество таблиц. Что я и делаю
CREATE TRIGGER NEW_VIEW_BI FOR NEW_VIEW
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE TMPI_TOWN_REC_ID INTEGER;
BEGIN
SELECT REC_ID FROM TOWN WHERE NAME=NEW.TOWN_NAME INTO :TMPI_TOWN_REC_ID;
IF (TMPI_TOWN_REC_ID IS NULL) THEN TMPI_TOWN_REC_ID=0;
IF (TMPI_TOWN_REC_ID=0) THEN BEGIN
TMPI_TOWN_REC_ID=GEN_ID(GEN_TOWN_ID, 1);
INSERT INTO TOWN (REC_ID, NAME) VALUES (:TMPI_TOWN_REC_ID, NEW.TOWN_NAME);
END
TMPI_TOWN_REC_ID=0;
INSERT INTO BANK (NAME, TOWN_ID) VALUES (NEW.BANK_NAME, :TMPI_TOWN_REC_ID);
END

Если уменьшить строку Insert передавая меньше параметров, то конект не отваливается, но все равно не работает

При попытке редактировать в IBExpert View как табличку при Post вылетает
Invalid Token
Dinamic SQL Error
SQL Error Code -104
Token unknown - line 2, char 2. ).
Но видно это ошибка самого IBExpert


 
kombat ©   (2002-11-08 11:07) [7]

to Wolf226 ©
там звучит так
IF (TMPI_TOWN_REC_ID=0) THEN BEGIN
TMPI_TOWN_REC_ID=GEN_ID(GEN_TOWN_ID, 1);
INSERT INTO TOWN (REC_ID, NAME) VALUES (:TMPI_TOWN_REC_ID, NEW.TOWN_NAME);
END
т.е. если нет записи в справочнике, то создаем её


 
kombat ©   (2002-11-08 11:11) [8]

А вообще, уважаемы Мастера, этот цирк затеивается чтобы перенести БД из Access в Firebird. Но в Firebird используется новая структура, мы переносим туда данные и создаем View которые эмулируют старую структуру где это возможно, а страые приложения Access видят эти View как свои старые таблицы и работают дальше (не все они еще переведены на Делфи). Это попытка осуществить плавный переход. Может конечно это делается и иначе, но я пока другого способа не вижу


 
Wolf226 ©   (2002-11-08 11:54) [9]

Про МФО забыл? Оно же not null.


 
kombat ©   (2002-11-08 12:58) [10]

МФО нот нулл, но его домен сам подставляет " "


 
Wolf226 ©   (2002-11-08 13:16) [11]

Мда...
у меня как-то был такой случай. Я создал процедуру, alter и отвалилось соединение.
Пришлось находить сбойный участок. Путем поочередного комментирования операторов. Но я нашел другой способ написать сбойный участок и стало все в порядке. Наверно баг самого сервера.



Страницы: 1 вся ветка

Текущий архив: 2002.11.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
1-82777
Азазелло
2002-11-15 17:26
2002.11.25
Delphi+ActiveX Crystal Report 8.5 передача параметров в ХП


3-82675
AlexeyMir
2002-11-07 13:38
2002.11.25
Удаление записей в Paradox из Delphi


1-82849
Tadeush
2002-11-13 15:35
2002.11.25
Вывод данных о номере версии.


4-83075
chsv
2002-10-14 20:06
2002.11.25
?


1-82685
Evyshka
2002-11-13 09:55
2002.11.25
Как вытащить текущий год ? :-))