Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 11.09.2013, 15:55
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Цитата:
Сообщение от sAVe
я не могу сообразить, как перейти на только что созданную запись
не это ищешь?

Код:
ADOQuery.close;
ADOQuery.sql.text:='INSERT INTO table (bla-bla, bla) VALUES (' + QuotedStr(memo1.Text) + ', ' + QuotedStr(edit1.Text) + ')';
ADOQuery.ExecSQL;

ADOQuery.close;
ADOQuery.sql.text:='UPDATE table SET bla = "№-" WHERE id = LAST_INSERT_ID()';
ADOQuery.ExecSQL;

это пример, короче, вставка в базу и обновление на основе LAST_INSERT_ID
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
Этот пользователь сказал Спасибо Mrak за это полезное сообщение:
sAVe (18.09.2013)
  #17  
Старый 11.09.2013, 18:43
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Цитата:
Сообщение от sAVe
1. я имел ввиду, что в базу не нужно сохранять триггер, по скольку база будет разная, ну с определёнными полями и таблицами (надеюсь, понятно объяснил)

2. Добавил я строчку с выполнением этого запроса, но тут смысл не в этом, мне нужно именно запомнить только что созданный Cl_id и вставить его в таблицу Person в поле P_cl_id. В принципе у меня тут всё срабатывает, но добавляет не тот Cl_id.

3. база на Firebirde 2.5, если это поможет...

1. нет, не понятно
2. ну так твое Cl_id должно же как-то сначала сформироваться. а для этого нужно выполнить (ExecSQL) 1й запрос.
3. да. firebird такое умеет делать.
примерно так:
Код:
INSERT INTO audit (data) 
VALUES ('-----') 
RETURNING recordid
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
Этот пользователь сказал Спасибо Yurk@ за это полезное сообщение:
sAVe (18.09.2013)
  #18  
Старый 18.09.2013, 21:33
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Всем спасибо, но не то...
Вот у меня что получилось, но всё равно так как надо не работает...
Здесь почему-то всегда 0 получается:

Код:
Cl_idgen:=DataModule1.IBDataset1.FieldByName('id').AsInteger;

вот весь текст:

Код:
procedure TNew_Person.Button1Click(Sender: TObject);
var
Cl_idgen: integer;

begin

with DataModule1.IBDataSet1 do
   begin
    SelectSQL.Text:='select gen_id(GEN_CLIENT_ID,1) as id from RDB$DATABASE';

    Transaction.StartTransaction;
    Open;
    Transaction.Commit;
    Transaction.Active:=false;
end;
Cl_idgen:=DataModule1.IBDataset1.FieldByName('id').AsInteger; // ВОТ ЗДЕСЬ 0 ПОЛУЧАЕТСЯ ВСЕГДА

with DataModule1.IBQuery9 do
   begin
    SQL.Text:='insert into CLIENT (CL_ID, CL_IS_VIP, CL_CLS_ID, CL_CREDIT_NUM) values (:CL_ID, :CL_IS_VIP, :CL_CLS_ID, :CL_CREDIT_NUM)';
    ParamByName('CL_ID').AsInteger:=Cl_idgen;
    ParamByName('CL_IS_VIP').AsInteger:=0;
    ParamByName('CL_CLS_ID').AsInteger:=0;
    ParamByName('CL_CREDIT_NUM').AsInteger:=0;
    Transaction.StartTransaction;
    ExecSQL;
    Transaction.Commit;
    Transaction.Active:=false;

   end;
with DataModule1.IBQuery7 do
    begin
      SQL.Text:='insert into Person(P_ID, P_NAME, P_BIRTHDATE, P_CL_ID)  values (:P_ID, :P_NAME, :P_BIRTHDATE, :P_CL_ID)';
      ParamByName('P_NAME').AsString:=Edit1.Text;
      ParamByName('P_BIRTHDATE').AsString:=Edit2.Text;
      ParamByName('P_CL_ID').AsInteger:=Cl_idgen;
      Transaction.StartTransaction;
      ExecSQL;
      Transaction.Commit;
      Transaction.Active:=false;
Ответить с цитированием
  #19  
Старый 19.09.2013, 10:45
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Всем спасибо!
Всё получилось, коллега на работе помог.
Если интересно, могу рассказать в чём был прикол
Ответить с цитированием
  #20  
Старый 19.09.2013, 10:55
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Рассказывай.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #21  
Старый 19.09.2013, 13:41
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Внесённые изменения помечены коментами

Код:
procedure TNew_Person.Button1Click(Sender: TObject);
var
Cl_idgen: integer;

begin

with DataModule1.IBDataSet1 do
   begin
     SelectSQL.Text:='select gen_id(GEN_CLIENT_ID,1) as id from RDB$DATABASE';

    Transaction.StartTransaction;
    Open;
    DataModule1.IBDataSet1.First; // а вот смысл этой строчки я пока сам не понял...
    Cl_idgen:=DataModule1.IBDataset1.FieldByName('id').AsInteger; // основная фишка в том что нужно было это сделать, до комита
    Transaction.Commit;
    Transaction.Active:=false;
end;
   with DataModule1.IBQuery9 do
   begin
    SQL.Text:='insert into CLIENT (CL_ID, CL_IS_VIP, CL_CLS_ID, CL_CREDIT_NUM) values (:CL_ID, :CL_IS_VIP, :CL_CLS_ID, :CL_CREDIT_NUM)';
    ParamByName('CL_ID').AsInteger:=Cl_idgen;
    ParamByName('CL_IS_VIP').AsInteger:=0;
    ParamByName('CL_CLS_ID').AsInteger:=0;
    ParamByName('CL_CREDIT_NUM').AsInteger:=0;
    Transaction.StartTransaction;
    ExecSQL;
    Transaction.Commit;
    Transaction.Active:=false;

   end;
with DataModule1.IBQuery7 do
    begin
      SQL.Text:='insert into Person(P_ID, P_NAME, P_BIRTHDATE, P_CL_ID)  values (:P_ID, :P_NAME, :P_BIRTHDATE, :P_CL_ID)';
      ParamByName('P_NAME').AsString:=Edit1.Text;
      ParamByName('P_BIRTHDATE').AsString:=Edit2.Text;
      ParamByName('P_CL_ID').AsInteger:=Cl_idgen;
      Transaction.StartTransaction;
      ExecSQL;
      Transaction.Commit;
      Transaction.Active:=false;
Ответить с цитированием
  #22  
Старый 19.09.2013, 14:27
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

DataModule1.IBDataSet1.First; // а вот смысл этой строчки я пока сам не понял...

Это переход в самое начало датасета, т.е. индекс ставится на первую запись.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #23  
Старый 19.09.2013, 20:32
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

это я понимал, но только сейчас понял зачем это сделано было
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:59.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter