Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить только что добавленную запись [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо