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

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

Использование метода TADOTable.Seek [D7, Access]


vishnia ©   (2006-04-27 10:33:00) 

Есть таблица с различной литературой (книги, авторефераты, диссертации и т.д.). Мне нужно сделать алфавитный поиск среди этой литературы, для чего я использую метод Seek. Но поиск этот должен быть среди отфильтрованного набора: в DBGrid отображается отдельно книги, отдельно дисертации и.т.д. И вот при использовании Seek возникает проблема EDataBaseError "ADOBookTable: Record not found". И возникает она, по-моему, именно из-за использования фильтрации и Seek одновременно. Подскажите, как выйти из этой ситуации или может есть какая-то альтернатива этому Seek?


sniknik   (2006-04-27 14:34:00) [1]

> Запрос я иcпользовать не могу
можеш, только тогда придется перейти на клиентский курсор...

> ADODataSEt.Filter='[feature]=' +QuotedStr(RadioGroupFeature1.Items[RadioGroupFeature1.ItemIndex]);
а индекс по полю feature есть? может помочь если создаш.


vishnia   (2006-04-27 14:08:00) [2]


> что в commandtext? должно быть просто имя таблици.


Так и есть, но тогда выводит все записи из таблицы, а мне нужны только определенный тип литературы. Запрос я иcпользовать не могу, т.к. CommandType=cmdTableDirect,  onFilterRecord - по выше сказанным причинам, а если использовать
ADODataSEt.Filter='[feature]=' +QuotedStr(RadioGroupFeature1.Items[RadioGroupFeature1.ItemIndex]);
до указания индекса, то он то ли игнорируется, короче нет от него толку, а если после - ошибка "Операция невозможна в данном контексте".


sniknik   (2006-04-27 13:58:00) [3]

vishnia   (27.04.06 13:01) [11]
что в commandtext? должно быть просто имя таблици.


Плохиш   (2006-04-27 13:37:00) [4]


> vishnia   (27.04.06 13:01) [11]

Вполне возможно, что, как и описано в справке, сначала надо установить индекс и только после этого открывать набор данных.


vishnia   (2006-04-27 13:01:00) [5]

По совету Плохиш использую ADODataSet, и теперь у меня опять начались проблемы с индексами: "Текущий проводник не поддерживает неоюходимый интерфейс для функции Index", хотя я установила CursorLocation=clUseServer: CursorType=ctKeyset: CommandType=cmdTableDirect.


sniknik   (2006-04-27 12:59:00) [6]

можно ничего.... это логика программы, а не ограничение методов. тут все только от тебя зависит.


vishnia   (2006-04-27 12:36:00) [7]

А что делать с этим?


sniknik   (2006-04-27 12:32:00) [8]

у тебя не фильтр в строгом понимании, ты используеш событие для самостоятельного "отрезания лишнего", про которое ADO не знает... происходит следующее (имхо) Seek находит запись вне этого диапазона, пытается установить курсор, а ты своим "фильтром" это запрещаеш, типа нет ее. логичный результат - ексепт "запись не найдена".


Плохиш   (2006-04-27 12:22:00) [9]


> ADOBookTable.Close;
> ADOBookTable.CursorLocation:=clUseServer;
> ADOBookTable.TableDirect:=true;
> ADOBookTable.CursorType:=ctKeyset;
> ADOBookTable.Active:=true;
> ADOBookTable.IndexName:='SortAuthor';


> cond1:=DataSet['Feature']=RadioGroupFeature1.Items[RadioGroupFeature1.
> ItemIndex] ;
> Accept:=cond1;

Фсё выкинуть нафик. Использовать TADODataSet. Условие фильтрации писать в WHERE


vishnia   (2006-04-27 12:09:00) [10]

Строка для поиска вводится в TntEditAlphabet1.

В методе TntEditAlphabet1Change()


ADOBookTable.Close;
ADOBookTable.CursorLocation:=clUseServer;
ADOBookTable.TableDirect:=true;
ADOBookTable.CursorType:=ctKeyset;
ADOBookTable.Active:=true;
ADOBookTable.IndexName:='SortAuthor';

if not(ADOBookTable.IsEmpty) then
 ADOBookTable.Seek(TntEditAlphabet1.Text,soAfterEQ);


Обработчик ADOBookTable.onFilterRecord()

cond1:=DataSet['Feature']=RadioGroupFeature1.Items[RadioGroupFeature1.ItemIndex] ;
Accept:=cond1;


(Feature- это тип литературы в БД)

В DBGrid результат фильтрации отображается правильно. Кстати, есть другая таблица, в которой этот же поиск осуществляется без фильтрации (там только периодическая литература) и все работает хорошо.


Плохиш   (2006-04-27 11:52:00) [11]


> vishnia   (27.04.06 11:31) [4]

Так и будем демогогией заниматься или конкретика появится? Например в виде участков проблемного кода.


vishnia   (2006-04-27 11:31:00) [12]

Другой индекс в программе не устанавливается вообще. Если выполнять программу по шагам, то это исключение возникает при попадании в onFilterRecord  в результате Seek.


sniknik   (2006-04-27 11:12:00) [13]

ну значит устанавливаемый фильтр использует другой индекс. не тот по которому поиск.


vishnia   (2006-04-27 10:57:00) [14]

Искомая часть отсутствовать не может потому, что я использую Seek с опцией soAfterEQ, которая устанавливает курсор на найденную запись или,если такой нет, на запись, перед которой могла бы находиться искомая. Короче мне нужно, чтобы работало как в хелпе Delphi "Предметный указатель". Раньше я пользовалась таблицами Paradox методом FindNearest, все было ОК, а с Access что-то не выходит.


sniknik   (2006-04-27 10:47:00) [15]

> EDataBaseError "ADOBookTable: Record not found"
а в отфильтрованной части искомая запись присутствует? или все так и есть как в ошибке, "не найдена" (и нету).

если нет и поиск необходим по всему рекордсету включая исключонную фильтром часть, то "выход" отключать фильтр на время поиска.

> есть какая-то альтернатива этому Seek?
locate, findfirst
причем второе (findfirst) однозначно не подойдет при использовании фильтров, он его сам использует.
+ можно считать альтрнативой, перезапрос вместо фильтра. (тогда он ни на что влиять не будет)


Наверх

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