Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Delphi & interbase

Возможно ли и если да то как сделать автоинкремент главного ключа.
Номер выпуска : 1881
Возраст листа : 142 (дней)
Количество подписчиков : 385
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/76921
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   RagE Tue, 10 Feb 2004 13:43:07 +0200 (#76921)

 

Ответы:

Я это делаю таким макаром:
procedure MakeTrigger(trs :TIBTransaction;
GenName, // имя генератора
ID_Name, // имя триггера
TablName, // имя таблицы
FieldName :String // имя поля, на которое
ставим тригер.
);
var
trsAct :Boolean;
begin
trsAct := trs.Active;
dmInqDB.qr.Transaction := trs;
dmInqDB.qr.Transaction.Active := True;
dmInqDB.qr.SQL.Clear;
dmInqDB.qr.SQL.Add('CREATE GENERATOR '+GenName+';');
dmInqDB.qr.ExecQuery;
dmInqDB.qr.SQL.Clear;
dmInqDB.qr.SQL.Add('CREATE TRIGGER '+ID_Name+' FOR '+ TablName);
dmInqDB.qr.SQL.Add('BEFORE INSERT');
dmInqDB.qr.SQL.Add('AS');
dmInqDB.qr.SQL.Add('begin');
dmInqDB.qr.SQL.Add('new.'+FieldName+'=gen_id('+GenName+',1);');
dmInqDB.qr.SQL.Add('end;');
dmInqDB.qr.ExecQuery;

dmInqDB.qr.SQL.Clear;
dmInqDB.qr.SQL.Add('SET GENERATOR '+GenName+' TO 0');
dmInqDB.qr.ExecQuery;
trs.Active := trsAct;
end;

Здесь dmInqDB.qr - компонент-кверь. Эту процедуру нужно вызывать только один
раз - например, проверили наличие таблицы, если ее нет, сгенирили структуру,
описали индексы и вызвали ее.
Единственное неудобство с триггерами - если при добавлении записи приспичит
получить значение этого поля. Приходится добавлять запись, записывать в одно
из полей (ни автокриментное только) уникальные данные ('####', например в
строковое поле). Потом делать Post, Refresh и Locate для этих ####
Номер выпуска : 1900
Возраст листа : 143 (дней)
Количество подписчиков : 385
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/77195
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "Вадим Шешунов" Wed, 11 Feb 2004 01:25:22 +0200 (#77195)

 

Здравствуйте, RagE.

Вы писали 11 февраля 2004 г., 1:25:22:

один

в одно

в

Я предлагаю способ намного проще, которым сам пользуюсь.

Во первых, создаешь Генератор.
Для этого можешь использовать WISQL,
который идет в поставке IB/FireBird (далее ИБ/ФБ), или программу IB Expert, в
ней
тоже есть возможность управления БД с помощью интерактивного SQL.
Пишешь следующие:

create generator Name_Generator;

Во вторых, тебе надо решить, что ты хочешь использовать в своей БД IB:
триггеры или хранимые процедуры. Классики и во многой литературе НЕ
рекомендуют использовать одновренно и то, и другое.

ВАРИАНТ 1. Триггеры.

Создаешь в своей базе триггер на ту таблицу, в которой хочешь сделать
автоинкремент.
Пишешь следующий запрос:

create trigger Name_Trigger for Name_Table
before insert
as
begin
New.Name_Field = Gen_ID(Name_Generator, Х);
end;

И его запускаешь. После чего будет создан триггер с именем
Name_Trigger для таблицы Name_Table, который будет срабатывать (Сервер
ИБ/ФБ сам автоматом его запустит) перед добавлением новой записи в
таблицу, и запишет новое значение твоего ключевого поля Name_Field.
Это значение получается следующим образом, берется генератор
Name_Generator, а точней его значение, и увеличивается на значение Х,
где Х, как правило, равно 1 или другому любому значению, ли ж бы
тип результата отвечал типу твоего ключевого поля. Если поля у тебя
Integer, то Х не может быть Float.
"New." и "Gen_ID" это зарезервированные слова в сервере ИБ/ФБ.
Пользоваться этим элементарно, в своей проге добавляешь новую запись,
удобным для тебя способом, а в ключевое поле Name_Field ничего не
пишешь, затем даешь команду на подтверждение изменений (Post,
ApplyUpdates и т.д.). А сервак уже сам сгенерит новое значение ключа и
запишет его.
Недостаток этого способа - ты не можешь напрямую заранее определить
чему будет равно у тебя это поле, разве что самому напрямую обращаться
к системным таблицам, где хранятся генераторы, найти его там и взять
его текущее значение, но это геморно и не удобно.
ВАРИАНТ 2. Хранимые процедуры.

Хранимые процедуры вещь удобная. Они хранятся в твоей базе (сервере), а не у
клиента на машине и запускаются на серверной стороне. Что позволяет
создавать тонких клиентов. Но хранимые процедуры надо самому
запускать, сами они по себе не запустятся ;-).
Создаешь хранимую процедуру:

create procedure Name_Proc
returns (NewID INTEGER)
as
begin
NewID = Gen_Id(Name_Generator, 1);
end;

Эта процедура возвращает в переменную NewID, типа Integer,
сгенерированное новое значение генератора Name_Generator, но она не
записывает в твое поле Name_Field никакого значения. Тебе его самому
надо будет вставить в новую запись.

В своей проге кладешь компонент для хранимых процедур, например
TIBStoredProc, заполняешь свойство DataBase, затем выбираешь из списка
свойства StoredProcName имя своей процедуры (Name_Proc). После чего у
тебя заполнится свойство Params, в нем появится переменная NewID,
которой будет возвращено значение, после окончания выполнения процедуры
на серваке.

Там, где тебе надо добавить новую запись, сначала запускаешь
TIBStoredProc.ExecProc
Description

Call ExecProc to execute a stored procedure on the server. Before calling ExecProc:

1 Provide any input parameters in the Params property. At design time,
a developer can provide parameters using the Parameters editor. At runtime an
application must access Params directly.
2 Call Prepare to bind the parameters.

If a stored procedure returns output parameters, they are stored in the Params
property when ExecProc returns control to the application. An application can
access the output parameters by indexing into the Params list, or by using the
ParamByName method.
после ее выполнения в свойстве Params в переменной NewID и будет твое
новое значение ключевого поля.
Потом добавляешь новую запись в таблицу и заполняешь ВСЕ ее поля, а в
ключевое поле ставишь NewID. И сохраняешь.
С помощью хранимых процедур можно выполнять на стороне сервера большие
и сложные запросы, а результаты передавать через нужные переменные в
клиентскую прогу. Таким образом, у тебя будут тонкие клиенты, а на
серваке будут процедуры в одном экземпляре, которые часто запускаются
всеми клиентами.

Вот вроде бы и все.

P.S. Если я в чем ошибся, пусть меня поправят знающие люди.
Я признаю, что в чем-то мог ошибиться, т.к. писал по памяти.
Детально и триггерах, генераторах и хр. процедурах читай в
хелпах.

P.SS. Я например для работы с ИБ/ФБ пользуюсь прогой PowerDesigner 9.0
Мощная штука. В ней можно визуально создавать базы любой конфигурации
и наворотам. Поддерживает все, вплоть по соединения с твоей базой
через ODBC и заполнение сгенерированными тестовыми данными. Все
рисуется визуально в ее оболочке, она сама генерит
все SQL запросы и их выполняет.
Если у кого есть версия по новей, дайте мне урлик где можно ее
скачать.

С уважением,
Feniks mailto: feni***@b*****.ua
Номер выпуска : 1915
Возраст листа : 143 (дней)
Количество подписчиков : 388
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/77475
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Feniks Wed, 11 Feb 2004 11:29:38 +0200 (#77475)