|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Последовательное выполнение запросов
Вот такая вот проблемка:
Нужно чтоб в поле 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
|
||||
|
||||
Сделайте StepByStep (Debug-Mode) и посмотрите в каком месте ошибка.
На вскидку: Для DataModule1.IBQuery9 не вызывается ExecSQL; |
#3
|
|||
|
|||
Тут не ошибка, а что-то не так работает, добавляется не тот CL_ID в поле P_CL_ID.
Сейчас попробую твоё предложение |
#4
|
||||
|
||||
Вот здесь:
не хватает DataModule1.IBQuery9.ExeSQL Код:
// <<== ExecSQL; Transaction.Commit; Transaction.Active:=false; |
#5
|
|||
|
|||
Цитата:
Спасибо, но не то, он так же вставляет запись на которой стоит указатель, то есть на первой записи... |
#6
|
||||
|
||||
Используйте триггеры, если база не лажовая.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#7
|
|||
|
|||
Цитата:
Без триггеров надо, в этом вся проблема. |
#8
|
||||
|
||||
1. если нужно "без тригеров" - то как тогда формируется CL_ID ?
2. и в самом то деле, где выполнение запроса в DataModule1.IBQuery9 ? 3. если сервер позволяет - в команде INSERT добавить инструкцию RETURN CL_ID INTO <переменная> ()может помочь вернуть новое значение) Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#9
|
|||
|
|||
Цитата:
1. я имел ввиду, что в базу не нужно сохранять триггер, по скольку база будет разная, ну с определёнными полями и таблицами (надеюсь, понятно объяснил) 2. Добавил я строчку с выполнением этого запроса, но тут смысл не в этом, мне нужно именно запомнить только что созданный Cl_id и вставить его в таблицу Person в поле P_cl_id. В принципе у меня тут всё срабатывает, но добавляет не тот Cl_id. 3. база на Firebirde 2.5, если это поможет... |
#10
|
||||
|
||||
Я у себя на MySQL завёл твой код.
Код:
Transaction.StartTransaction; ExecSQL; для мастер-таблицы. ExecSQL; для детейл-таблицы. Transaction.Commit; Может быть у тебя курсор стоит Серверный? Поэтому в Detail-таблицу добавляется первый (в общем не тот номер)? |
#11
|
|||
|
|||
Цитата:
Да, скорее всего так оно и есть, а я не могу сообразить, как перейти на только что созданную запись |
#12
|
||||
|
||||
Может курсор на клиентский поставить?)
А вообще (должно, не уверен) добавляться "в конец" т.е. TTable1.Last; |
Этот пользователь сказал Спасибо Uniq! за это полезное сообщение: | ||
sAVe (18.09.2013)
|
#13
|
|||
|
|||
Цитата:
Переключение указателя делается в базе или из делфы можно это сделать? про TTable1.Last, если 2 пользователя одновременно будут добавлять записи, не перепутается? |
#14
|
||||
|
||||
про CursorType и CursorLocation можно почитать в инете.
Last это лишь перемещение указателя.(к добавлению, никакого отношения не имеет) Я ещё подумал (но это говнокод), можно Locate до нужной записи, вытащить ID и уже потом его вставлять куда надо. Не надо так делать. |
Этот пользователь сказал Спасибо Uniq! за это полезное сообщение: | ||
sAVe (11.09.2013)
|
#15
|
|||
|
|||
Цитата:
Спасибо большое, дома попробую, отпишусь |