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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.09.2013, 20:00
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Последовательное выполнение запросов

Вот такая вот проблемка:
Нужно чтоб в поле P_CL_ID попадал только что созданный CL_ID

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

begin
with DataModule1.IBQuery9 do
begin
SQL.Text:='insert into CLIENT (CL_ID, CL_IS_VIP, CL_CLS_ID, CL_CREDIT_NUM) values (gen_id(GEN_CLIENT_ID,1), :CL_IS_VIP, :CL_CLS_ID, :CL_CREDIT_NUM)';
ParamByName('CL_IS_VIP').AsInteger:=0;
ParamByName('CL_CLS_ID').AsInteger:=0;
ParamByName('CL_CREDIT_NUM').AsInteger:=0;

Cl_idg:=DataModule1.CLIENT.FieldByName('CL_ID').AsInteger; // ВОТ ТУТ Я ЧТО-ТО НЕ ТАК ДЕЛАЮ, А ЧТО ПОНЯТЬ НЕ МОГУ...

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_idg;
Transaction.StartTransaction;
ExecSQL;
Transaction.Commit;
Transaction.Active:=false;

end;
end;
Ответить с цитированием
  #2  
Старый 10.09.2013, 20:09
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Сделайте StepByStep (Debug-Mode) и посмотрите в каком месте ошибка.

На вскидку:

Для DataModule1.IBQuery9 не вызывается ExecSQL;
Ответить с цитированием
  #3  
Старый 10.09.2013, 20:15
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Тут не ошибка, а что-то не так работает, добавляется не тот CL_ID в поле P_CL_ID.
Сейчас попробую твоё предложение
Ответить с цитированием
  #4  
Старый 10.09.2013, 20:18
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Вот здесь:
не хватает DataModule1.IBQuery9.ExeSQL
Код:
// <<==
ExecSQL;
Transaction.Commit;
Transaction.Active:=false;
Ответить с цитированием
  #5  
Старый 10.09.2013, 21:29
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Uniq!
Вот здесь:
не хватает DataModule1.IBQuery9.ExeSQL
Код:
// <<==
ExecSQL;
Transaction.Commit;
Transaction.Active:=false;

Спасибо, но не то, он так же вставляет запись на которой стоит указатель, то есть на первой записи...
Ответить с цитированием
  #6  
Старый 11.09.2013, 08:12
Аватар для 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, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #7  
Старый 11.09.2013, 08:43
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Используйте триггеры, если база не лажовая.

Без триггеров надо, в этом вся проблема.
Ответить с цитированием
  #8  
Старый 11.09.2013, 11:50
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

1. если нужно "без тригеров" - то как тогда формируется CL_ID ?
2. и в самом то деле, где выполнение запроса в DataModule1.IBQuery9 ?
3. если сервер позволяет - в команде INSERT добавить инструкцию RETURN CL_ID INTO <переменная> ()может помочь вернуть новое значение)
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #9  
Старый 11.09.2013, 12:56
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Yurk@
1. если нужно "без тригеров" - то как тогда формируется CL_ID ?
2. и в самом то деле, где выполнение запроса в DataModule1.IBQuery9 ?
3. если сервер позволяет - в команде INSERT добавить инструкцию RETURN CL_ID INTO <переменная> ()может помочь вернуть новое значение)

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

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

3. база на Firebirde 2.5, если это поможет...
Ответить с цитированием
  #10  
Старый 11.09.2013, 13:11
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Я у себя на MySQL завёл твой код.
Код:
Transaction.StartTransaction;
ExecSQL; для мастер-таблицы.
ExecSQL; для детейл-таблицы.
Transaction.Commit;
Добавляется на ура. (у меня MySQL)
Может быть у тебя курсор стоит Серверный? Поэтому в Detail-таблицу добавляется первый (в общем не тот номер)?
Ответить с цитированием
  #11  
Старый 11.09.2013, 14:34
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Uniq!
Может быть у тебя курсор стоит Серверный? Поэтому в Detail-таблицу добавляется первый (в общем не тот номер)?

Да, скорее всего так оно и есть, а я не могу сообразить, как перейти на только что созданную запись
Ответить с цитированием
  #12  
Старый 11.09.2013, 15:09
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Может курсор на клиентский поставить?)

А вообще (должно, не уверен) добавляться "в конец" т.е. TTable1.Last;
Ответить с цитированием
Этот пользователь сказал Спасибо Uniq! за это полезное сообщение:
sAVe (18.09.2013)
  #13  
Старый 11.09.2013, 15:13
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Uniq!
Может курсор на клиентский поставить?)

А вообще (должно, не уверен) добавляться "в конец" т.е. TTable1.Last;

Переключение указателя делается в базе или из делфы можно это сделать?

про TTable1.Last, если 2 пользователя одновременно будут добавлять записи, не перепутается?
Ответить с цитированием
  #14  
Старый 11.09.2013, 15:17
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

про CursorType и CursorLocation можно почитать в инете.

Last это лишь перемещение указателя.(к добавлению, никакого отношения не имеет)

Я ещё подумал (но это говнокод), можно Locate до нужной записи, вытащить ID
и уже потом его вставлять куда надо.
Не надо так делать.
Ответить с цитированием
Этот пользователь сказал Спасибо Uniq! за это полезное сообщение:
sAVe (11.09.2013)
  #15  
Старый 11.09.2013, 15:21
sAVe sAVe вне форума
Прохожий
 
Регистрация: 20.06.2013
Сообщения: 40
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Uniq!
про CursorType и CursorLocation можно почитать в инете.

Last это лишь перемещение указателя.(к добавлению, никакого отношения не имеет)

Я ещё подумал (но это говнокод), можно Locate до нужной записи, вытащить ID
и уже потом его вставлять куда надо.
Не надо так делать.

Спасибо большое, дома попробую, отпишусь
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter