Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];

Вниз

Использование метода 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
2-1149439102
parovoZZ
2006-06-04 20:38
2006.06.25
Стиль кнопки


8-1137680930
misha_gr
2006-01-19 17:28
2006.06.25
Странная проблема с DsPack


15-1148876589
lobach
2006-05-29 08:23
2006.06.25
Триал


2-1149612650
qazwsx
2006-06-06 20:50
2006.06.25
Как получать параметры переданные через командную строку?


11-1129395494
Alextp
2005-10-15 20:58
2006.06.25
Runtime error на выходе KOL-приложения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский