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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2015, 23:40   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Проще получать id нововставленной строки не передергивая DataSet

Доброе время суток уважаемые.
Можно ли как-нибудь проще видеть id нововставленной строки в DataSet (DBGrid), без его переоткрытия, используя например «RETURNING» и sql-ю «GEN_ID» или что-нибудь в этом роде
Сейчас у меня работает таким образом:

Перед вносом записи непосредственно в БД я обращаяюсь к внутренней процедуре (в которой, входной параметр - это номер таблицы в БД), которая мне возвращает актуальное новое ID, определенного генератора ID, определенной таблицы
Код:
procedure TFMain.DataSetBeforePost(DataSet: TDataSet);
begin
IBStoredProc1.StoredProcName := 'SP_GET_ID';
  IBStoredProc1.ParamByName('NUMBER_TABLE').AsInteger := 0;
  IBStoredProc1.ExecProc;
  IBStoredProc1.Transaction.CommitRetaining;
  DataSet.FieldByName('ID').AsInteger := IBStoredProc1.ParamByName('ID').AsInteger; 
end;


Заранее спасибо
P.S.
- Процедура "GetGenID" (TIBStoredProc), - работает с внутренней процедурой в БД, которая только генерирует ID
- Delphi + FireBird 2.5.4

Последний раз редактировалось KBO; 13.11.2015 в 01:19.
KBO вне форума Ответить с цитированием
Старый 13.11.2015, 09:01   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Руководство по языку SQL СУБД Firebird
(Охватывает Firebird до версии 2.5.3 включительно)

Цитата:
Пример:
Код:
update or insert into Cows (Name, Number, Location)
values ('Suzy Creamcheese', 3278823, 'Green Pastures')
matching (Number)
returning rec_id into :id;
Код:
Query.SQL:=
Query.ExecSQL;// может потребоваться заменить на Open;
val:=Query.Params...('id').AsInteger;  // или Fields (в случае Open)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.11.2015, 13:49   #3
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Можно еще поискать по слову returning на форуме. В какой-то из тем я даже отвечал.
Vapaamies вне форума Ответить с цитированием
Старый 13.11.2015, 18:10   #4
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

такая штука:
в IBExpert пытаюсь выполнить вставку (без нижней строки все работает):
Код:
insert into FEATURES_ETALON
  (CIMP_MRA, ID, MEASURAND)
values
  ('234', GEN_ID(GEN_ID_FEATURES_ETALON, 1), 'qwssw')
returning ID into :ID
как приводили выше и тут, но в "into :ID", вылазит ошибка:
"Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 5, column 19.
?
.
"

Последний раз редактировалось KBO; 13.11.2015 в 18:32.
KBO вне форума Ответить с цитированием
Старый 13.11.2015, 18:51   #5
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Ну и в чем затруднения? вам же пишут эксперт не в зуб ногой что такое :ID..
come-on вне форума Ответить с цитированием
Старый 13.11.2015, 18:53   #6
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
Ну и в чем затруднения? вам же пишут эксперт не в зуб ногой что такое :ID..
да вот нашел:
Код:
insert into FEATURES_ETALON
  (CIMP_MRA, ID, MEASURAND)
values
  ('234', GEN_ID(GEN_ID_FEATURES_ETALON, 1), 'qwssw')
returning ID
возвращает "ID" (нужно без "... into :ID")

пардон, вот я в свойстве "InsertSQL" (DataSet), указал предущий запрос, но мне же нужно тогда куда-то принять значение "ID". Это тогда мне нужно вычисляемое поле сделать в DataSet?

иначе DataSet, тоже также ругается

Последний раз редактировалось Stilet; 13.11.2015 в 20:44.
KBO вне форума Ответить с цитированием
Старый 13.11.2015, 19:35   #7
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Параметр, как указали вам в начале.
come-on вне форума Ответить с цитированием
Старый 14.11.2015, 02:54   #8
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
Параметр, как указали вам в начале.
Если вот так как вверху (может я и не прав), то
Код:
IBQuery1.SQL.Text := 'insert into FEATURES_ETALON  (CIMP_MRA, ID, MEASURAND) values (''234'', GEN_ID(GEN_ID_FEATURES_ETALON, 1), ''qwssw'') returning ID into :ID';
IBQuery1.ExecSQL;// может потребоваться заменить на Open;
showmessage(IBQuery1.Params.ParamByName('id').AsString);
такая же ошибка

может я не правильно выразился в первом сообщении, я хочу не просто вернуть ID нововставленной строки, но еще и вставить его в DataSet. Чтоб его видел пользователь.

Но даже если я его верну, то не смогу его вставить в DataSet, т.к. генератор (в БД) изменяет свое значение, только после BeforePost

Последний раз редактировалось Stilet; 14.11.2015 в 17:24.
KBO вне форума Ответить с цитированием
Старый 14.11.2015, 14:38   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А пользователю это id сто лет не нужно. Суррогатный ключ зачем ему видеть?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.11.2015, 14:53   #10
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Дело в том что это таблица в которую я вставляю запись, точнее к этой записи (после ее вставки), у меня можно прицепить к ней картинки (которые у меня хранятся в отдельной таблице).
Так вот я не разрешаю цеплять к записи картинки, пока у записи не появится ID (поле Dataset пустое)
KBO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно просто узнать «id» следующей строки в DataSet KBO Помощь студентам 2 09.09.2015 20:06
Удаление строки из Dataset Grers Общие вопросы Delphi 7 03.04.2015 15:10
Добавление строки в существующий DataSet Kveldulv Общие вопросы .NET 2 20.01.2011 10:11
Нужно найти ошибку или написать алгоритм по проще! (строки) velamut Помощь студентам 3 18.06.2010 16:09
Тоже задача на строки. Тока проще. maxiswell Помощь студентам 7 28.12.2008 13:42