![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Poisk zapisi v Interbase table [D6, IB6.x]
Alexei Sviridov © (2003-05-30 22:41:00)Dobroe vremja sutok...Podskazhite kak b tablice Interbase bistro opredelit suschestvuet li zapis i esli da to bistro k nej peremestitsja.
Na danni moment ja delaju tak:
countquery:=TIBQuery.Create(owner);
countquery.Database:=dm.DB;
importquery.close;
importquery.sql.add("select * from stocklistwhere upper(code)=:param0");
importquery.open;
countquery.SQL.Add("select count(code) from stocklist where upper(code)=:param0");
if countquery.Fields[0].Value<>0
then importquery.edit
else importquery.insert.... i t.d.
Pri bolshom ob"eme dannih poisk odnoj zapisi( code - Primary Key) eto navernoe daleko ne samij elegantnij algoritm, mozhet kto-to podskazhet chto-nibud?
Alexei Sviridov (2003-05-31 05:07:00) [1]> VMcL
Spasibo, k etomu vremeni ja uzhe perepisal modul s ХП.
Vot gde ona sila SQL"evskaja. Spasibo vsem
VMcL (2003-05-31 04:10:00) [2]>Alexei Sviridov (31.05.03 02:03)
>Prostite za glupij vopros: a chto takoe "ХП"?
Судя по постам, "ХП" - хранимая процедура.
Alexei Sviridov (2003-05-31 02:03:00) [3]Prostite za glupij vopros: a chto takoe "ХП"?
Zacho (2003-05-31 01:29:00) [4]
> Alexei Sviridov (31.05.03 01:04)
Да собственно дело в том, что приведенный тобой запрос должен выбирать только однузапись. А в этом случае тормозить Locate никак не может.
И еще раз скажу: для такой цели (UPDATE записи если она есть, или INSERT если нет) я бы предпочел ХП.
Alexei Sviridov (2003-05-31 01:04:00) [5]>Zacho
Code dejstvitelno PK. A Locate ne budet tormozit tolko v tom sluchae esli stocklist.FetchAll - chto samo po sebe emkaja zadacha (110 000 records). Spasibo
Zacho (2003-05-30 23:33:00) [6]
> Alexei Sviridov (30.05.03 23:30)
Судя по запросу - этого не может быть. Если code - PK то запрос должен возвращать всего одну запись, и Locate тормозить просто не может.
Alexei Sviridov (2003-05-30 23:30:00) [7]To Zacho
VSe bi horosho, no Locate ne katit. Locatom u menja do etogo rabotalo. No problema v tom chto v baze 110 000 records i pri metode LOcate nabljudajutsja bolshie tormoza!!!
Zacho (2003-05-30 23:30:00) [8]Что-то я не сразу сообразил, что именно надо. Можно еще проще:
importquery.sql.add("select * from stocklistwhere upper(code)=:param0");
importquery.open;
if importquery.IsEmpty then
begin
importquery.Insert;
...
end else
begin
importquery.Edit;
....
end
Но я бы сделал хранимую процедуру. Или VIEW с триггерами, в зависимости от задачи.
Dred2k (2003-05-30 23:11:00) [9]Для "серверных" датасетов все одно...
Хотя, реализация бывает разной.
Avreliy (2003-05-30 23:08:00) [10]При использовании BDE можно попробывать табличный метод
FindKey(). Можеть быть можно и для IBX-таблиц?
Zacho (2003-05-30 23:04:00) [11]
> Alexei Sviridov (30.05.03 22:41)
Все гораздо проще :-)
importquery.sql.add("select * from stocklistwhere upper(code)=:param0");
importquery.open;
if importquery.Locate("code",code,[]) then
begin
importquery.Edit;
...
end else
begin
importquery.insert;
....
end
Здесь второй параметр в Locate - нужное значение PK.