Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Поправте код


Автор: BpIstorick 27.7.2006, 00:07
В книге Валерия Фаронова "Delphi 2005. Разработка приложений для баз данных и интернета" есть код на 42 странице

Код

CREATE TRIGGER BEF_INS_TYPE FOR TYPES BEFORE INSERT AS
BEGIN
NEW.TYPEID = GEN_ID(GEN_TYPE, 1);
END


У меня выдает ошибку smile

Таблица Paradox7
Сервер IB 6

помогите smile исправьте, базы данных только начал учить (ну и если есть толковая мысль, то подскажите, стоит по этому автору дальше учится или есть альтернатива на порядок лучше?) 

p.s. ТОварисчи!!! не отмалчивайтесь smile из-за этой загвоздки неохото дальше читать книжку smile 

Автор: Akella 27.7.2006, 08:38
Цитата(BpIstorick @  27.7.2006,  00:07 Найти цитируемый пост)
Таблица Paradox7Сервер IB 6

 smile  какое отношение имеет paradox к InterBase?????

Добавлено @ 08:43 
Код

CREATE TRIGGER BEF_INS_TYPE FOR TYPES BEFORE INSERT AS
BEGIN
NEW.TYPEID = GEN_ID(GEN_TYPE, 1);
END

для InterBase нормально, вроде без ошибок
условия: должна быть таблица TYPES создана, должен быть создан генератор GEN_TYPE, в таблице TYPES должно существовать  поле TYPEID типа Int (в качестве первичного ключа) и эти 3 условия должны быть соблюдены до того, как ты начнёшь создавать этот триггер 

Автор: superVad 27.7.2006, 09:31
для работы с IB (создание бд, таблиц, тригеров, генераторов....) юзай IBExpert 

Автор: Akella 27.7.2006, 09:40
http://www.hk-software.net/ibexpert.com/content/doc_122943-0-0-00.php
для жителей бывшего СССР бесплатен, главное, чтобы в системе была установлена кодовая страница Win1251 

Автор: BpIstorick 27.7.2006, 10:52
Моя ошибка smile по незнанию, как оказалось в книге вначале описан метод создания таблицы в Paradox, потом в IB,

то есть дело идет в InterBase

Но тем не менее ошибка не ушла

добавляю описание ошибки
Цитата

Dynamic SQL Error
SQL error code = -104
Unexpected end of command
Statement: CREATE TRIGGER BEF_INS_TYPE FOR TYPES BEFORE INSERT AS
BEGIN
NEW.TYPEID = GEN_ID(GEN_TYPE, 1)


посмотрел:
1. есть таблица  TYPES
2. есть поле TypeID типа SmallInt (может в этом проблема smile ? )
3. есть генератор "Name: GEN_TYPE; CurrentValue: 0"

полный код который я исполнял включая ошибочный

Код

Вот как создается таблица TYPES БД «Книголюб»:
CREATE TABLE TYPES(
TYPEID SMALLINT NOT NULL PRIMARY KEY,
TNAME VARCHAR(23))
Создание генератора для поля TYPEID:
CREATE GENERATOR GENJTYPE;
SET GENERATOR GEN_TYPE TO 0
Создание триггера:
CREATE TRIGGER BEF_INS_TYPE FOR TYPES BEFORE INSERT AS
BEGIN
NEW.TYPEID = GEN_ID(GEN_TYPE, 1);
END
Ввод записи:
INSERT INTO TYPES(TYPEID, TNAME)
VALUES(0, "Поставка на реализацию")


соответственно у меня сейчас создание таблицы и генератора не проходит smile ввиду их существования 

Автор: superVad 27.7.2006, 11:36
попробуй так

SET TERM ^ ;
CREATE TRIGGER BEF_INS_TYPE FOR TYPES BEFORE INSERT AS    
BEGIN    
NEW.TYPEID = GEN_ID(GEN_TYPE, 1);    
END
^
SET TERM ; ^

Добавлено @ 11:44 
Цитата

Разделители в хранимых процедурах

Обратите внимание, что оператор внутри процедуры заканчивается точкой с запятой (;). Как известно, точка с запятой является стандартным разделителем команд в SQL - она является сигналом интерпретатору SQL, что текст команды введен полностью и надо начинать его обрабатывать. Не получится ли так, что, обнаружив точку с запятой в середине ХП, интерпретатор SQL сочтет, что команда введена полностью и попытается выполнить часть хранимой процедуры? Это предположение не лишено смысла. Действительно, если создать файл, в который записать вышеприведенный пример, добавить команду соединения с базы данных и попытаться выполнить этот SQL-скрипт с помощью интерпретатора isql, то будет возвращена ошибка, связанная с неожиданным, по мнению интерпретатора, окончанием команды создания хранимой процедуры. Если создавать хранимые процедуры с помощью файлов SQL-скриптов, без использования специализированных инструментов разработчика InterBase, то необходимо перед каждой командой создания ХП (то же относи 1ся и к триггерам) менять разделитель команд скрипта на другой символ, отличный от точки с запятой, а после текста ХП восстанавливать его обратно. Команда isql, изменяющая разделитель предложений SQL, выглядит так:

SET TERM <new_term><old_term> 

Для типичного случая создания хранимой процедуры это выглядит так: 

SET TERM ^;
CREATE PROCEDURE some_procedure
... . .
END
^
SET TERM ;^


читай Мир InterBase. Можно найти в электронном виде.  

Автор: jack128 27.7.2006, 22:58
Цитата(BpIstorick @  27.7.2006,  00:07 Найти цитируемый пост)
NEW.TYPEID = GEN_ID(GEN_TYPE, 1);

вообще за такие триггеры нужно резать тупыми ножницами.

Код

if (new.typeid is null) then
  NEW.TYPEID = GEN_ID(GEN_TYPE, 1);
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)