Узнать значение ID только, что вставленной записи

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Узнать значение ID только, что вставленной записи

Сообщение AkANz » 26.07.2010 08:56:51

Есть необходимость узнать значение автоинкриментного id_hospital_in (первичный ключ) только, что вставленной записи.
В обработчике Click (кнопка Сохранить) - запрос (для примера остальные значения убраны):
zqHospitalInEdit.SQL.Clear;
zqHospitalInEdit.SQL.Add('INSERT INTO hospital_in (id_hospital_in)'VALUES (default) RETURNING id_hospital_in');
fmDM.zqHospitalInEdit.ExecSQL;

Подскажите, пожалуйста, как мне вернуть на форму значение id_hospital_in возвращаемое этим запросом.
AkANz
новенький
 
Сообщения: 26
Зарегистрирован: 16.03.2010 13:59:02
Откуда: Алтайский край

Re: Узнать значение ID только, что вставленной записи

Сообщение alex_rain » 26.07.2010 09:57:03

Возможно сработает zqHospitalInEdit.Active := True вместо zqHospitalInEdit.ExecSQL.
И далее, например, Label1.Caption := IntToStr(zqHospitalInEdit.Fields[0].AsInteger).

Lazarus 0.9.29 FPC 2.5.1 Win32
alex_rain
новенький
 
Сообщения: 26
Зарегистрирован: 12.02.2010 06:56:32
Откуда: Russia

Re: Узнать значение ID только, что вставленной записи

Сообщение AkANz » 26.07.2010 10:59:20

Спасибо, alex_rain.
Так сработало.
AkANz
новенький
 
Сообщения: 26
Зарегистрирован: 16.03.2010 13:59:02
Откуда: Алтайский край

Re: Узнать значение ID только, что вставленной записи

Сообщение krab » 26.07.2010 11:57:31

alex_rain писал(а):Возможно сработает zqHospitalInEdit.Active := True вместо zqHospitalInEdit.ExecSQL.
Lazarus 0.9.29 FPC 2.5.1 Win32

есть еще zqHospitalInEdit.Open
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

Re: Узнать значение ID только, что вставленной записи

Сообщение grigoreo » 27.07.2010 14:24:53

или запросом получить текущее значение SEQUENCE для этой таблицы если конечно это поле у вас serial
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: Узнать значение ID только, что вставленной записи

Сообщение AkANz » 17.09.2010 09:11:55

Помогите, пожалуйста, теперь сделать то-же самое, т.е узнать значение ID только, что вставленной записи, но уже для Firebird.
Имеем (для примера лишнее убрано)
quTemp.SQL.Clear;
quTemp.SQL.Add('INSERT INTO hospital_in (medical_type 'VALUES (:medical_type) RETURNING id_hospital_in ');
quTemp.Open;

Поле id_hospital_in первичный ключ с триггером и генератором (при вставке значение увеличивается на 1)
Для подключения к Firebird используется UIB+FBDataSet (UIB 2.1)

Если этот запрос выполнить в IBExpert, то значение id_hospital_in возвращается, а в Lazarus вываливается ошибка.
Видимо UIB не поддерживает RETURNING.
Каким образом можно еще вернуть ID только, что вставленной записи?
AkANz
новенький
 
Сообщения: 26
Зарегистрирован: 16.03.2010 13:59:02
Откуда: Алтайский край

Re: Узнать значение ID только, что вставленной записи

Сообщение stikriz » 17.09.2010 09:27:00

Вообще, если с самого начала, то делать надо так:

CREATE SEQUENCE GEN_NEW_TABLE_ID;
ALTER SEQUENCE GEN_NEW_TABLE_ID RESTART WITH 0;


CREATE OR ALTER TRIGGER NEW_TABLE_BI FOR NEW_TABLE
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.id is null) then
new.id = gen_id(gen_new_table_id,1);
end

create trigger new_table_bi for new_table
active before insert position 0
as
begin
if (new.new_field is null) then
new.new_field = gen_id(gen_new_table_id,1);
end

И при вставке записи вызывать тригер, если нужно получить ID. Обычно, компоненты поддерживают вызов тригера автоматом. Если нет - ручками сами вызывайте.

Добавлено спустя 54 минуты 55 секунд:
Два раза тригер вставил, звиняйте.
create procedure sp_gen_new_table_id
returns (id integer)
as
begin
id = gen_id(gen_new_table_id, 1);
suspend;
end
Вот эту процедуру надо дергать перед вставкой записи и значение присваивать полю с ID.

Кстати, IBExpert так все сам называет, что вычислить имя процедуры можно по имени таблицы легко.
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

Re: Узнать значение ID только, что вставленной записи

Сообщение AkANz » 17.09.2010 12:06:03

stikriz писал(а):Вот эту процедуру надо дергать перед вставкой записи и значение присваивать полю с ID.


А не получиться так, сработавший триггер сгенерирует ID 1 пользователю и в это же время 2 пользователь затеет вставку и ему так же будет сгенерирован этот же ID.
Мне бы хотелось получить ID после вставки записи.
AkANz
новенький
 
Сообщения: 26
Зарегистрирован: 16.03.2010 13:59:02
Откуда: Алтайский край

Re: Узнать значение ID только, что вставленной записи

Сообщение Mr.Smart » 17.09.2010 12:08:08

Нет не получится! Проверенно "годами" :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Узнать значение ID только, что вставленной записи

Сообщение Astralis » 17.09.2010 12:30:51

есть 2 варианта
1) zqHospitalInEdit.SQL.Text= 'INSERT INTO hospital_in (<вводимые поля>) 'VALUES (<вводимые значения>) RETURNING :ResultId';
результат получается что-то вроде zqHospitalInEdit.ParamByName('ResultId').AsInteger;
2) сделать в программе 2 компонента, первый будет вызывать sp_gen_new_table_id и получать значение первичного ключа, второй будет всталять это значение уже в запись. Это немного сложнее, зато гораздо гибче.
Аватара пользователя
Astralis
новенький
 
Сообщения: 45
Зарегистрирован: 06.06.2007 20:33:05
Откуда: Tvercity-Annet

Re: Узнать значение ID только, что вставленной записи

Сообщение AkANz » 17.09.2010 13:23:51

Astralis писал(а):есть 2 варианта
1) zqHospitalInEdit.SQL.Text= 'INSERT INTO hospital_in (<вводимые поля>) 'VALUES (<вводимые значения>) RETURNING :ResultId';
результат получается что-то вроде zqHospitalInEdit.ParamByName('ResultId').AsInteger;


RETURNING :ResultId у меня не захотел работать

Сделал по 2 варианту. Спасибо за помощь.
AkANz
новенький
 
Сообщения: 26
Зарегистрирован: 16.03.2010 13:59:02
Откуда: Алтайский край


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

Рейтинг@Mail.ru