![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование метода 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) однозначно не подойдет при использовании фильтров, он его сам использует.
+ можно считать альтрнативой, перезапрос вместо фильтра. (тогда он ни на что влиять не будет)