Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2015, 11:02   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию Получить ID добавленной записи

Здравствуйте!
Использую Delphi XE2, Firebird 2.5, FIBPLUS.
Есть триггер
Код:
CREATE TRIGGER BI_AVTO_ID FOR AVTO
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
      NEW.ID = GEN_ID(AVTO_ID_GEN, 1);
END
Хранимая процедура для добавления/редактирования записи в таблице
Код:
CREATE PROCEDURE AVTO_E(
  FID INTEGER,
  MARKA VARCHAR(100),
  GOSNOMER VARCHAR(20))
AS
BEGIN
IF (:FID < 0) THEN
BEGIN
  INSERT INTO AVTO (
    MARKA,
    GOSNOMER)
  VALUES (
    :MARKA,
    :GOSNOMER);
END
  ELSE
	BEGIN
	  UPDATE AVTO
	  SET
		MARKA = :MARKA,
		GOSNOMER = :GOSNOMER
	  WHERE
		(ID = :FID);
	END
END
Есть замечательная штука RETURNING, но я что-то не пойму куда её написать, чтобы после вставки новой записи получить этот ID при использовании сетевой версии программы и получить в Delphi этот ID.
Сейчас у меня так
Код:
try
      with Dm.StrPr do
        begin
          StoredProcName := 'AVTO_E';
          ParamByName('FID').AsInteger := StrToInt(IDLbl.Caption);
          ParamByName('MARKA').AsString := Trim(MARKAEdt.Text);
          ParamByName('GOSNOMER').AsString := AnsiUpperCase(Trim(GOSNOMEREdt.Text));
          ExecProc;
        end;
      Dm.Tr.Commit;     
    except
      on E : Exception do
        begin
          Application.MessageBox('Ошибка сохранения!', 'Ошибка!', MB_OK +
            MB_ICONSTOP + MB_TOPMOST);
          IniU.SaveLog('ОШибка сохранения Авто : '+E.ClassName+'|'+E.Message);
          Dm.Tr.Rollback;
        end;
    end;
tarakan1983 вне форума Ответить с цитированием
Старый 30.04.2015, 11:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://www.firebirdsql.org/refdocs/l...21-insert.html
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.04.2015, 14:39   #3
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

ну так вроде пишу
Код:
CREATE PROCEDURE AVTO_E(
  FID INTEGER,
  MARKA VARCHAR(100),
  GOSNOMER VARCHAR(20))
AS
BEGIN
IF (:FID < 0) THEN
BEGIN
  INSERT INTO AVTO (
    MARKA,
    GOSNOMER)
  VALUES (
    :MARKA,
    :GOSNOMER)   RETURNING id или :FID;
END
  ELSE
	BEGIN
	  UPDATE AVTO
	  SET
		MARKA = :MARKA,
		GOSNOMER = :GOSNOMER
	  WHERE
		(ID = :FID);
	END
END
получаю ошибку
Цитата:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Unexpected end of command - line 14, column 26.
tarakan1983 вне форума Ответить с цитированием
Старый 30.04.2015, 15:39   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
ну так вроде пишу
Подозреваю, что по ссылке от Виталия не ходили.
1. В процедуре нужно предусмотреть возвращаемый параметр.
2. Для Insert-а id into :<возращаемый параметр>
3. Для Update в этот возвращаемый параметр поместить значение :FID
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 30.04.2015 в 15:42.
Аватар вне форума Ответить с цитированием
Старый 30.04.2015, 18:41   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

ЕМНИП, по стандарту returning пишется с into:
Код:
returning ID into :FID
Надо полагать, что и в Firebird так.
Vapaamies вне форума Ответить с цитированием
Старый 30.04.2015, 19:03   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Надо полагать, что и в Firebird так.
Если это так, то странно что доки по ссылке моей сие не озвучивают...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.04.2015, 19:36   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Как раз озвучивают
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.04.2015, 19:39   #8
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Озвучивают, даже какие-то ограничения описывают. Полагаю, что returning без into -- чисто фишка Firebird, чтобы оператор insert мог тоже возвращать курсор. Если мои предположения верны, такой insert нужно открывать через Open и читать поля как из запроса.
Vapaamies вне форума Ответить с цитированием
Старый 30.04.2015, 19:45   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тьху ты чьортпобъери. Моя невнимательность.
Хотел Vapaamies плюсануть, но портал не дает, так что на словах выражу "спс".
Действительно похоже что у огнептицы насчет этого не совсем однозначное видение.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.04.2015, 23:18   #10
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Простите за долгое молчание. Спасибо всем за наставления, буду пробовать
tarakan1983 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование на добавленной *.bmp картинке zverozavr Помощь студентам 0 21.06.2013 03:08
Как узнать ID добавленной записи? LittleLoya Общие вопросы .NET 1 15.05.2013 18:01
Получить все записи из бд. Gefo PHP 2 22.12.2012 16:19
Получить id подчинённой записи используя Relations Greek9000 Общие вопросы .NET 2 16.05.2011 15:03
Как определить ключ добавленной или существующей записи? tumanovalex C# (си шарп) 10 08.05.2011 10:00