Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.073 c
1-1147776732
konda
2006-05-16 14:52
2006.06.25
Оформление ячеек в Excel


1-1147792675
TStas
2006-05-16 19:17
2006.06.25
Рисование на канве другого приложения


2-1149661709
XTD
2006-06-07 10:28
2006.06.25
Как найти путь к моей программе?


2-1149345914
НовичОк_
2006-06-03 18:45
2006.06.25
Вставить дату из DateTimePicker


15-1149268194
ArtemESC
2006-06-02 21:09
2006.06.25
Программка...