Текущий архив: 2006.06.25;
Скачать: CL | DM;
ВнизИспользование метода TADOTable.Seek Найти похожие ветки
← →
vishnia (2006-04-27 10:33) [0]Есть таблица с различной литературой (книги, авторефераты, диссертации и т.д.). Мне нужно сделать алфавитный поиск среди этой литературы, для чего я использую метод Seek. Но поиск этот должен быть среди отфильтрованного набора: в DBGrid отображается отдельно книги, отдельно дисертации и.т.д. И вот при использовании Seek возникает проблема EDataBaseError "ADOBookTable: Record not found". И возникает она, по-моему, именно из-за использования фильтрации и Seek одновременно. Подскажите, как выйти из этой ситуации или может есть какая-то альтернатива этому Seek?
← →
sniknik © (2006-04-27 10:47) [1]> EDataBaseError "ADOBookTable: Record not found"
а в отфильтрованной части искомая запись присутствует? или все так и есть как в ошибке, "не найдена" (и нету).
если нет и поиск необходим по всему рекордсету включая исключонную фильтром часть, то "выход" отключать фильтр на время поиска.
> есть какая-то альтернатива этому Seek?
locate, findfirst
причем второе (findfirst) однозначно не подойдет при использовании фильтров, он его сам использует.
+ можно считать альтрнативой, перезапрос вместо фильтра. (тогда он ни на что влиять не будет)
← →
vishnia (2006-04-27 10:57) [2]Искомая часть отсутствовать не может потому, что я использую Seek с опцией soAfterEQ, которая устанавливает курсор на найденную запись или,если такой нет, на запись, перед которой могла бы находиться искомая. Короче мне нужно, чтобы работало как в хелпе Delphi "Предметный указатель". Раньше я пользовалась таблицами Paradox методом FindNearest, все было ОК, а с Access что-то не выходит.
← →
sniknik © (2006-04-27 11:12) [3]ну значит устанавливаемый фильтр использует другой индекс. не тот по которому поиск.
← →
vishnia (2006-04-27 11:31) [4]Другой индекс в программе не устанавливается вообще. Если выполнять программу по шагам, то это исключение возникает при попадании в onFilterRecord в результате Seek.
← →
Плохиш © (2006-04-27 11:52) [5]
> vishnia (27.04.06 11:31) [4]
Так и будем демогогией заниматься или конкретика появится? Например в виде участков проблемного кода.
← →
vishnia (2006-04-27 12:09) [6]Строка для поиска вводится в 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 12:22) [7]
> 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
← →
sniknik © (2006-04-27 12:32) [8]у тебя не фильтр в строгом понимании, ты используеш событие для самостоятельного "отрезания лишнего", про которое ADO не знает... происходит следующее (имхо) Seek находит запись вне этого диапазона, пытается установить курсор, а ты своим "фильтром" это запрещаеш, типа нет ее. логичный результат - ексепт "запись не найдена".
← →
vishnia (2006-04-27 12:36) [9]А что делать с этим?
← →
sniknik © (2006-04-27 12:59) [10]можно ничего.... это логика программы, а не ограничение методов. тут все только от тебя зависит.
← →
vishnia (2006-04-27 13:01) [11]По совету Плохиш использую ADODataSet, и теперь у меня опять начались проблемы с индексами: "Текущий проводник не поддерживает неоюходимый интерфейс для функции Index", хотя я установила CursorLocation=clUseServer: CursorType=ctKeyset: CommandType=cmdTableDirect.
← →
Плохиш © (2006-04-27 13:37) [12]
> vishnia (27.04.06 13:01) [11]
Вполне возможно, что, как и описано в справке, сначала надо установить индекс и только после этого открывать набор данных.
← →
sniknik © (2006-04-27 13:58) [13]vishnia (27.04.06 13:01) [11]
что в commandtext? должно быть просто имя таблици.
← →
vishnia (2006-04-27 14:08) [14]
> что в commandtext? должно быть просто имя таблици.
Так и есть, но тогда выводит все записи из таблицы, а мне нужны только определенный тип литературы. Запрос я иcпользовать не могу, т.к. CommandType=cmdTableDirect, onFilterRecord - по выше сказанным причинам, а если использовать
ADODataSEt.Filter="[feature]=" +QuotedStr(RadioGroupFeature1.Items[RadioGroupFeature1.ItemIndex]);
до указания индекса, то он то ли игнорируется, короче нет от него толку, а если после - ошибка "Операция невозможна в данном контексте".
← →
sniknik © (2006-04-27 14:34) [15]> Запрос я иcпользовать не могу
можеш, только тогда придется перейти на клиентский курсор...
> ADODataSEt.Filter="[feature]=" +QuotedStr(RadioGroupFeature1.Items[RadioGroupFeature1.ItemIndex]);
а индекс по полю feature есть? может помочь если создаш.
Страницы: 1 вся ветка
Текущий архив: 2006.06.25;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.008 c