| ExplodeMan | 
| Отправлено: 11.08.2004, 13:25 |  | 
|  
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 18
 
 
 
  
 | совсем недавно взялся изучать interbase. сразу же весьма удивил громоздкий механизм реализации автоинкремента в этой БД. вроде разобрался, но запустить аутоинк не получается. хотя, вроде, всё правильно: 
 //создал таблицу
 CREATE TABLE CLIENT (
 ID INTEGER NOT NULL,
 FIO CHAR(25) CHARACTER SET WIN1251 NOT NULL,
 CONSTRAINT CLIENT_PK PRIMARY KEY (ID)
 );
 
 //триггер
 CREATE TRIGGER TRIG_GEN_CLIENT
 ACTIVE BEFORE INSERT POSITION 0
 AS
 begin
 if(new.id is null) then
 new.id=gen_id(gen_client,1);
 end
 
 //генератор
 CREATE GENERATOR GEN_CLIENT
 set generator GEN_CLIENT to 1
 
 в качестве сервера использую fb 1.0.2.
 кто знает, подскажите что здесь не так? третий день уже долблюсь с этой ерундой
   | 
|  | 
| olegenty | 
| Отправлено: 11.08.2004, 13:55 |  | 
| 
 Ветеран
 
 Группа: Модератор
 Сообщений: 2412
 
 
 
  
 | ну в приведённом сорце ошибка в синтаксисе реализации триггера. 
 а механизм не громоздкий, а замечательный, удобнее, чем где либо. потому что на одну таблицу можно назначать более одного генератора, т.е. более одного автоинкрементного поля.
 
 поставь себе ibexpert, скачай с http://www.ibexpert.com/download — для русских бесплатен. он тебе всё это автоматически создаст.
 | 
|  | 
| Simai | 
| Отправлено: 11.08.2004, 13:58 |  | 
| 
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 15
 
 
 
  
 | У меня InterBase 6.0 и из оболочки (IB Expert) все работает. Насколько я понял у тебя auto -increment не работет уже из проги.
 Теоретически можно сделать процедуру вида
 
 CREATE PROCEDURE GEN_ID
 RETURNS (
 N INTEGER)
 AS
 begin
 N=GEN_CLIENT(gen_id,1);
 end
 
 и вызывать её при вставки новой записи
 
 | 
|  | 
| ExplodeMan | 
| Отправлено: 11.08.2004, 16:27 |  | 
|  
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 18
 
 
 
  
 | 2olegenty сорри, это я недописал. триггер у меня так описан:
 CREATE TRIGGER TRIG_GEN_CLIENT for client
 ACTIVE BEFORE INSERT POSITION 0
 AS
 begin
 if(new.id is null) then
 new.id=gen_id(gen_client,1);
 end
 
 ibexpert скачал, то же самое....
 
 2Simai
 в ibexpertе тоже при вставке поле id не заполняется.....
 
 | 
|  | 
| olegenty | 
| Отправлено: 12.08.2004, 07:06 |  | 
| 
 Ветеран
 
 Группа: Модератор
 Сообщений: 2412
 
 
 
  
 | Там всё работает. Я проект щас сдаю на Yaffil... 
 Опиши подробно проблему: где и что не заполняется после каких действий...
 | 
|  | 
| ExplodeMan | 
| Отправлено: 12.08.2004, 15:12 |  | 
|  
 Ученик-кочегар
 
 Группа: Участник
 Сообщений: 18
 
 
 
  
 | olegenty, может я чё не так понимаю, но по идее, если в приведённом выше коде ошибок нет (а ibexpert все скрипты откомпилячил и говорит, что нет ошибок), то при добавлении новой записи: 
 1. запускается триггер TRIG_GEN_CLIENT
 2. значение генератора увеличивается на единицу
 3. в поле ID автоматом вставляется значение из генератора.
 
 т.е. происходит то, что всем нам знакомо как банальный автоинкремент.
 может я что то недопонимаю в идеологии интербейза?
 | 
|  | 
| olegenty | 
| Отправлено: 13.08.2004, 11:08 |  | 
| 
 Ветеран
 
 Группа: Модератор
 Сообщений: 2412
 
 
 
  
 | всё так, здесь я вижу только одни грабли: 
 | CODE |  | if(new.id is null) then...
 
 | 
 
 у тебя точно NULL на входе? ты точно не воткнул туда значение по умолчанию???
 | 
|  |