Вопрос № 68389: Всем привет!
Вопрос у меня. Написал я программу что типа телефонного справочника. База данных хранится в файле формата MS Access 2003. Использую компоненты ADO. В принципе все работает. Захотелось мне сделать в ней поиск. Ну и снизу сетки (DBGrid...
Вопрос № 68.389
Всем привет!
Вопрос у меня. Написал я программу что типа телефонного справочника. База данных хранится в файле формата MS Access 2003. Использую компоненты ADO. В принципе все работает. Захотелось мне сделать в ней поиск. Ну и снизу сетки (DBGridKvartiry: TDBGrid) добавил текстовые поля: TxtKvFIO: TEdit; TxtKvGorod: TEdit; TxtKvUlica: TEdit; TxtKvDom: TEdit; TxtKvKv: TEdit; TxtKvTelephone: TEdit; TxtKvCommentary: TEdit.
Для каждого этого поля обрабатываю событие OnChange, в процедурах которых ссылаюсь на процедуру SQL_Find_Kv. Т.е., например, для поля TxtKvFIO обработка этого события выглядит так:
procedure TFrmGeneral.TxtKvFIOChange(Sender: TObject);
begin
SQL_Find_Kv;
end;
В процедуре же SQL_Find_Kv я обрабатываю SQL-запрос (см. приложение). Все до тех пор, пока в сетке имеются хоть какие-то данные. Если же в сетке уже нет данных, т.е. в таблице нет данных, удовлетворяющих запросу SQL, вылетает ошибка:
=======
Project MyPhone.exe raised exception class EOleException with message 'BOF или EOF имеет значение True, либо текущая запись удалена. Для выполнения операции требуется текущая запись'.
Process stopped. Use Step or Run to continue.
=======
Попытался обойти эту ошибке. На последние четыре строчки процедуры SQL_Find_Kv поставил условие:
if not(FrmGeneral.ADODataKv.Eof) then
begin
FrmGeneral.ADODataKv.Active:=false;
FrmGeneral.ADODataKv.CommandText:=s1;
FrmGeneral.ADODataKv.Active:=true;
FrmGeneral.DBGridKvartiry.Refresh;
end;
Ошибка не вылетает. Но когда в таблице нет данных, удовлетворяющих запросу SQL, и я в текстовых полях вручную меняю условие запроса (заранее знаю, что такие данные должны быть в таблице), сетка все равно остается пустой. Я так понимаю, в этом условном операторе надо еще else добавить, но что в нем написать? Помогите, пожалуйста.
Приложение:
Отправлен: 24.12.2006, 15:50
Вопрос задал: Бурда Саша (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Tresda
Здравствуйте, Бурда Саша!
Я делаю проще и получается по ходу контекстный поиск:
if Edit1.text='' then exit else
ADOTable1.Locate('Name_POLE', Edit1.Text,[loCaseInsensitive, loPartialKey]);
Ответ отправил: Tresda (статус: 1-ый класс)
Ответ отправлен: 25.12.2006, 07:00 Оценка за ответ: 5 Комментарий оценки: тоже вариант
Отвечает: Синельников Сергей
Здравствуйте, Бурда Саша!
По-моему вся проблема в строке
FrmGeneral.DBGridKvartiry.Refresh;
Ее надо убрать. Грид будет и без рефреша обновляться. И уберите условие "на последние четыре строчки".
Ответ отправил: Синельников Сергей (статус: 2-ой класс)
Ответ отправлен: 25.12.2006, 07:17 Оценка за ответ: 4 Комментарий оценки: Убирал строку FrmGeneral.DBGridKvartiry.Refresh, и условие тоже. Не помогло. Да, таблица и без строки FrmGeneral.DBGridKvartiry.Refresh обновляется. Но когда в ней уже нет данных удовлетворяющих SQL-запросу, вылетает таже ошибка.
Отвечает: PaVeL_Ekt
Здравствуйте, Бурда Саша!
а фильтрацией Вы не пробовали воспользоваться?
очень на мой взгляд удобная штука.
Filtered в труе
Filter допустим "((pole=1)or(pole=5))and(pole2=1)
и в гриде отобразятся только записи удовлетворяющие строке,
очистить строку фильтрации и все вернеться на круги своя.
--------- Да поможет Вам F1, да сохранит Вас F2, во имя CTRL, ALT и святого DEL
Ответ отправил: PaVeL_Ekt (статус: Студент)
Ответ отправлен: 25.12.2006, 07:58 Оценка за ответ: 5 Комментарий оценки: Багодарю! Имено так и реализовал данную задачу