( SetKey & GoToKey ) vs. ( Locate )

5 отговора 144 прегледа
#1

( SetKey & GoToKey ) vs. ( Locate )

Значи, на едно място в проекта ми трябва да бъде локализиран запис в DB таблица, и за целта се ползва SetKey и GoToKey методи на TTable. Примерен фрагмент от кода:

with Table1 do begin

SetKey;
FieldByName('Field1').AsString := 'value1'; // breakpoint!!!
if GotoKey then
ShowMessage('Found!')
else
ShowMessage('Not Found!');
end;



Лошо (ми) става ;), когато се стигне до реда с "//брейкпойнт" - вдига
ексепшън от клас EDataBaseError със съобщение 'Field 'Field1' is not indexed
and cannot be modified'. Интересно е, че в хелп-а нищо не пише за
индексираност. Какво става? И какво ще загубя, ако използвам Locate вместо
SetKey и GoToKey?

-------------
Искам да знам какво мисли Бог - останалото са подробности. (Einstein)
Отговор
в отговор на z_free #2

Re: ( SetKey & GoToKey ) vs. ( Locate )

Вярно, че в help-а е казано малко неясно, но за да ползваш TTable.GotoKey трябва да имаш индекс.

To determine current search keys, you can use the IndexFields property to iterate over the fields used by the current index.

Отговор
в отговор на NDeu #3

Re: ( SetKey & GoToKey ) vs. ( Locate )

Обаче нещата изглеждат така, сякаш Locate върши същата работа, нали?

-------------
Искам да знам какво мисли Бог - останалото са подробности. (Einstein)
Отговор
в отговор на z_free #4

Re: ( SetKey & GoToKey ) vs. ( Locate )

Абсолютно - даже се чудя защо си се хвърлил да ползваш предното - е освен ако нямаш индекс по тази колона ? Мисля, че и Locate ползва индекс, като разликата сигурно е в скоростта, ако често правиш търсене - тогава го ползвай само.

---
Е т'ва е живот!
Отговор
в отговор на z_free #5

Re: ( SetKey & GoToKey ) vs. ( Locate )

Почти
Разликите са:
1. Locate е метод на TBDEDataSet, а FindKey, GotoKey и аналогичните на TTable
2. Locate може да се прилага върху произволна комбинация от полета, а FindKey - само по които има построен индекс. (Казват, че ако има индекс, Locate го ползва)
3. За Locate можеш да определиш опции за частично съвпадение, с кейовете трябва да ползваш FindNearest, GotoNearest

Отговор
в отговор на NDeu #6

Благодаря ви, хора ;)



-------------
Искам да знам какво мисли Бог - останалото са подробности. (Einstein)
Отговор