![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить только что добавленную запись [D5, IB6.x]
ded_di © (2002-09-12 15:26:00)Пишу
FIBTmpQuery.SQL.Add("insert into sheetaccounts (aaccount, paccount) values (?aaccount, ?paccount)");
FIBTmpQuery.ParamByName("aaccount").AsString:=ActiveCombo.Text;
FIBTmpQuery.ParamByName("paccount").AsString:=PassiveCombo.Text;
FIBTmpQuery.ExecQuery;
Триггером автоматически добавляется id. Как мне получить его значение? Спасибо.
ded_di (2002-09-12 16:35:00) [1]Я все понял. Еще раз спасибо всем.
Max Zyuzin (2002-09-12 16:33:00) [2]>Prooksius © (12.09.02 16:25)
Тогда придется отказаться от триггеров.
Лучше воспользоваться советом Johnmen © (12.09.02 16:24)
Prooksius (2002-09-12 16:25:00) [3]2 ded_di © (12.09.02 16:17)
Неправ.
Генераторы не зависят от транзакций. Как только IB встретил gen_id(<gen_name>, n), генератор просто увеличивается на n.
Другими словами, если ты открыл транзакцию, потом сделал
select gen_id(<generator_name>, 1) from rdb$database,
и получил, например 25,
далее кто-то другой в другой транзакции (на другом компе) сделал такой же запрос, то он получит 26.
Поэтому ты должен получить id сначала, всего один раз и далее работать с этим id.
Johnmen (2002-09-12 16:24:00) [4]На мой взгляд самый простой и прозрачный вариант :
Создается ХП с вх./вых.параметрами, куда загоняется insert.
Параметры инсерта - входные пар-ры ХП, выходной пар-р - значение генератора.
Теперь работаем с TIBStoredProc.
:-))))
Max Zyuzin (2002-09-12 16:22:00) [5]Генератор на то и генератор, что он вне транзакций.
Max Zyuzin (2002-09-12 16:20:00) [6]>ded_di © (12.09.02 16:17)
Да такое вполне может произойти.
ded_di (2002-09-12 16:17:00) [7]2 Prooksius © (12.09.02 16:10)
Спасибо, я понял. Но объясните плз я прав в своем варианте говоря но ведь если другой пользователь успел в это время добавить еще одну запись, то это будет неверно?
Prooksius (2002-09-12 16:10:00) [8]2 ded_di © (12.09.02 15:59)
Не так!!!
select gen_id(<generator_name>, 0) from rdb$database
Надо так
select gen_id(<generator_name>, 1) from rdb$database
Ты не понял. Я имел в виду следующее:
Достать id с помощью этого запроса, заполнить параметры FIBTmpQuery, куда добавить параметром еще и поле id.
Выполнить FIBTmpQuery и позиционироваться на строчку с id, которое уже имеешь.
2 Max Zyuzin © (12.09.02 16:01)
Абсолютно согласен!
Max Zyuzin (2002-09-12 16:02:00) [9]ded_di © (12.09.02 15:59)
Какими компонентами пользуетесь для отображения данных?
ded_di (2002-09-12 16:02:00) [10]Никакие данные вообще не отображаются
Max Zyuzin (2002-09-12 16:01:00) [11]Встречный вопрос - а как вы увидите эту новую строчку вообще? Елси не делать переоткрытие таблицы? Лучше ИМХО настроить RefreshSQL у IBDataSet если конечно для отображения пользуетесь именно им.
ded_di (2002-09-12 15:59:00) [12]Ладно, всем спасибо.
Меня наверное устроит вариант
select gen_id(<generator_name>, 0) from rdb$database
но ведь если другой пользователь успел в это время добавить еще одну запись, то это будет неверно? Или значение генератора отображается в рамках транзакции?
Prooksius (2002-09-12 15:55:00) [13]2 Max Zyuzin © (12.09.02 15:54)
А как тогда по-вашему на эту новую строчку спозиционироваться?
Max Zyuzin (2002-09-12 15:54:00) [14]>ded_di © (12.09.02 15:26)
А в чем проблемма... закрывай и открывай заново тот компонент, который у тебя отображает данные (Query, Table).
oss (2002-09-12 15:51:00) [15]2 gek и что триггер делать будет ?
2 ded_di,
1.Prooksius дело говорит, сделай процедуру, куда будешь передвать все что надо добавить,
а она будет возвращать тете ид.
2.сразу после ExecQuery;, делай select max(id) from table :)
Prooksius (2002-09-12 15:48:00) [16]>>SaS13 © (12.09.02 15:45)
А вдруг добавляют? Потенциальный источник ошибок - зачем?
SaS13 (2002-09-12 15:45:00) [17]А может просто взять максимум по id... если другие пользователи не добавляют параллельно.
gek (2002-09-12 15:37:00) [18]Наверно сделать триггер после вставки
Prooksius (2002-09-12 15:37:00) [19]Триггером никак. Сделай ХП, которая будет возвращать id, которое ты будешь подставлять в нужный параметр в FIBTmpQuery и, следовательно, будешь его знать.
Или делай такой запрос:
select gen_id(<generator_name>, 1) from rdb$database
который будет возвращать твой id.
oss (2002-09-12 15:31:00) [20]наверно какой-то квери или тайблу сделать refresh