Текущий архив: 2003.03.03;
Скачать: CL | DM;
ВнизIB не хочет выполнять генераторы??? Найти похожие ветки
← →
Andrio (2003-02-12 14:20) [0]Естесственно это не весь код :))
При выполнении запроса на создание БД ошибок не возникает,
но при попытке вставить в описываемую ниже таблицу записи
выдается сообщение, что ключевое поле DomNumber не может быть Null.
Правильно - не может. Но его должен заполнить генератор (как я понимаю) в триггере.
Но почему триггер не хочет включаться ???
CREATE TABLE DOMA (
DOMNUMBER integer not null,
MASTER varchar(40),
STREET varchar(25) not null,
DOM varchar(5) not null,
KORPUS varchar(5) not null,
PRIMARY KEY (DOMNUMBER),
FOREIGN KEY (MASTER) references MASTERS
On Delete CASCADE
On Update CASCADE,
FOREIGN KEY (STREET) references STREETS
On Delete CASCADE
On Update CASCADE
)^
CREATE GENERATOR DNumber^
CREATE TRIGGER DomaTr1 FOR Doma
ACTIVE BEFORE INSERT POSITION 0
AS
begin
if (new.DomNumber is NULL) then
new.DomNumber=GEN_ID(DNumber,1);
end^
← →
kaif (2003-02-12 14:25) [1]А можно подробнее?
Кто именно ругается? Сервер? Такого быть не может.
Может быть, ругается компонент DataSet (на клиентской стороне), при помощи которого происходит вставка?
Тогда нужно свойство Required := False сделать.
← →
Andrio (2003-02-12 14:29) [2]Пробовал даже в IBConsole
Сервер ругается - точно.
← →
Александр С. (2003-02-12 14:42) [3]Встречается такое сообщение, если для ПК не указать значение.
Пусть при вставке для поля DOMNUMBER всегда отправляется одно и то же значение. Ругани не будет, а после Коммита будут видны подкорректированные триггером значения.
Только триггер нужно исправить
begin
/* if (new.DomNumber is NULL) then эту строку убрать */
new.DomNumber=GEN_ID(DNumber,1);
end^
← →
ZDN (2003-02-12 14:44) [4]Проблема в коде на клиенте. При добавлении записи в клиентский набор данных /событие AfterInsert/ ты должен запросить новое уникальное значение для DOMNUMBER с помощью выполнения запроса
NewIDDOMNUMBERQuery /текст запроса: SELECT GEN_ID(DNumber,1) FROM RDB$DATABASE/, а затем присвоить его соответсвующему полю в новой, только что вставленной записи:
procedure TDM.PeopleDataSetAfterInsert(DataSet: TDataSet);
begin
if PeopleDataSource.State=dsInsert then
begin
NewIDPeopleQuery.Open;
DataSet.FieldValues["ID_PEOPLE"]:=NewIDPeopleQuery.Fields[0].asInteger;
NewIDPeopleQuery.Close;
end;
end;
С твоим кодом из БД все в порядке, дело как раз в том, что при вставке новой записи на сервере на него с клиента передается набор данных, где DNumber=NULL, соответственно сервак тебе об этом и пишет.
Должно помочь, я сам очень давно столкнулся с такой же проблемой.
Если чего непонятно, задавай вопросы.
Страницы: 1 вся ветка
Текущий архив: 2003.03.03;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.008 c