Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];

Вниз

Как получить только что добавленную запись   Найти похожие ветки 

 
ded_di   (2002-09-12 15:26) [0]

Пишу

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. Как мне получить его значение? Спасибо.


 
oss   (2002-09-12 15:31) [1]

наверно какой-то квери или тайблу сделать refresh


 
Prooksius   (2002-09-12 15:37) [2]

Триггером никак. Сделай ХП, которая будет возвращать id, которое ты будешь подставлять в нужный параметр в FIBTmpQuery и, следовательно, будешь его знать.
Или делай такой запрос:
select gen_id(<generator_name>, 1) from rdb$database
который будет возвращать твой id.


 
gek   (2002-09-12 15:37) [3]

Наверно сделать триггер после вставки


 
SaS13   (2002-09-12 15:45) [4]

А может просто взять максимум по id... если другие пользователи не добавляют параллельно.


 
Prooksius   (2002-09-12 15:48) [5]

>>SaS13 © (12.09.02 15:45)
А вдруг добавляют? Потенциальный источник ошибок - зачем?


 
oss   (2002-09-12 15:51) [6]

2 gek и что триггер делать будет ?
2 ded_di,
1.Prooksius дело говорит, сделай процедуру, куда будешь передвать все что надо добавить,
а она будет возвращать тете ид.
2.сразу после ExecQuery;, делай select max(id) from table :)


 
Max Zyuzin   (2002-09-12 15:54) [7]

>ded_di © (12.09.02 15:26)
А в чем проблемма... закрывай и открывай заново тот компонент, который у тебя отображает данные (Query, Table).


 
Prooksius   (2002-09-12 15:55) [8]

2 Max Zyuzin © (12.09.02 15:54)
А как тогда по-вашему на эту новую строчку спозиционироваться?


 
ded_di   (2002-09-12 15:59) [9]

Ладно, всем спасибо.
Меня наверное устроит вариант

select gen_id(<generator_name>, 0) from rdb$database

но ведь если другой пользователь успел в это время добавить еще одну запись, то это будет неверно? Или значение генератора отображается в рамках транзакции?


 
Max Zyuzin   (2002-09-12 16:01) [10]

Встречный вопрос - а как вы увидите эту новую строчку вообще? Елси не делать переоткрытие таблицы? Лучше ИМХО настроить RefreshSQL у IBDataSet если конечно для отображения пользуетесь именно им.


 
Max Zyuzin   (2002-09-12 16:02) [11]

ded_di © (12.09.02 15:59)
Какими компонентами пользуетесь для отображения данных?


 
ded_di   (2002-09-12 16:02) [12]

Никакие данные вообще не отображаются


 
Prooksius   (2002-09-12 16:10) [13]

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)
Абсолютно согласен!


 
ded_di   (2002-09-12 16:17) [14]

2 Prooksius © (12.09.02 16:10)
Спасибо, я понял. Но объясните плз я прав в своем варианте говоря но ведь если другой пользователь успел в это время добавить еще одну запись, то это будет неверно?


 
Max Zyuzin   (2002-09-12 16:20) [15]

>ded_di © (12.09.02 16:17)
Да такое вполне может произойти.


 
Max Zyuzin   (2002-09-12 16:22) [16]

Генератор на то и генератор, что он вне транзакций.


 
Johnmen   (2002-09-12 16:24) [17]

На мой взгляд самый простой и прозрачный вариант :
Создается ХП с вх./вых.параметрами, куда загоняется insert.
Параметры инсерта - входные пар-ры ХП, выходной пар-р - значение генератора.
Теперь работаем с TIBStoredProc.
:-))))


 
Prooksius   (2002-09-12 16:25) [18]

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.


 
Max Zyuzin   (2002-09-12 16:33) [19]

>Prooksius © (12.09.02 16:25)
Тогда придется отказаться от триггеров.
Лучше воспользоваться советом Johnmen © (12.09.02 16:24)


 
ded_di   (2002-09-12 16:35) [20]

Я все понял. Еще раз спасибо всем.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
1-7891
Eva
2002-09-23 12:31
2002.10.03
перекачка данных по расписанию


1-8026
XPatriot
2002-09-20 20:38
2002.10.03
PopUpMenu


7-8181
Tolic-F
2002-07-22 09:12
2002.10.03
CD-ROM Sony CDU5221


1-8018
lety
2002-09-20 18:39
2002.10.03
ошибка в MaskEdit


4-8219
oduvan
2002-08-16 18:37
2002.10.03
Как переименовать папку?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский