![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск в базе данных (MS Access) [D6, MSSQL]
BD © (2007-12-03 21:26:00)Как организовать поиск а Access по ключевым словам по всему файлу (как в MS Word), т. е. по очереди (находит первое похожее слово, потом второе и т.д.). Пробовали писать через закладки - не читает закладку.
sniknik (2007-12-07 01:06:00) [1]> но проблему решила
не соответствует начальному условию ([0]), вместо поиска по базе, и ключевым словам сделан банальный перебор в 1 таблице по одному полю...
что называется "замах на рубль, удар на копейку".
BD (2007-12-07 00:43:00) [2]Да, описалась. ADOQuery1.SQL.Add('SELECT * FROM nu WHERE kommen Like '+#39+'%'+komm+'%'+#39);
но проблему решила
procedure SeqSearch(Query1: TQuery; AField, AValue: String);//описание процедуры поиска
var
NoRec: integer;
implementation
procedure TForm.ButtonClick(Sender: TObject); //поиск
begin
komm:=Edit1.Text;
SeqSearch(Query1, 'kommen', komm);
end;
procedure SeqSearch(Query1: TQuery; AField, AValue: String);
var
i: integer;
begin
Query1.DataSource:=DataSource1; //DataSource1 - ADOQuery1
with ADOQuery1 do
begin
First;
for i := 0 to RecordCount - 1 do
begin
if (not Eof) and (Pos(AnsiLowerCase(AValue),
AnsiLowerCase(FieldByName(AField).AsString)) 0) then
begin
if MessageBox(HWND_DESKTOP, PChar('Найдено выражение!' + #10#13+
' Продолжить поиск'), '�����', MB_YESNO +
MB_ICONINFORMATION + MB_DEFBUTTON1) = IDYES then
begin
NoRec := RecNo;
Next;
end
else
Break;
end
else
Next;
end;
end;
end;
Andrey (2007-12-06 09:31:00) [3]Не ADOQuery1.SQL.Add('SELECT * FROM nu WHERE kommen LIKE '+#39+'%'+#39);
а ADOQuery1.SQL.Add('SELECT * FROM nu WHERE kommen LIKE '+#39+'%'+Edit1.Text+'%'+#39);
И дальше датасорцу прицепить к этому кверю.
Читать внимально про выражение like. В частнисти про использование в нем %.
BD (2007-12-05 23:36:00) [4]В общем код такой:
Procedure Form.ButtonClick(Sender: TObject); // поиск
komm:=Edit1.Text; //находит первую строку и останавливается
if not ADOQuery1.Locate('kommen', komm,[loCaseInsensitive, loPartialKey]) then
begin
Application.MessageBox('Ошибка набора базы данных!', MB_ICONERROR);
Exit;
end;
end;
Поиск Locate находит только первую запись, дальше по таблице поиск не идет.
А через ADOQuery.Parameters.Param... надо вводить целое ключевое слово, а нужно распознавать строчку например по двум буквам, т.е. находить эти две буквы по всей таблице последовательно, одно за другим, при нажатии на клавишу.
И я честно говоря не поняла куда ставить
ADOQuery.Parameters.ParamByName('word1').Value := '%' + <первое слово для поиска> +
'%';
Если нетрудно поподробней.
если серверно поиск организовать, то появляется список слов в которых есть эти буквы (nu-таблица, kommen-поле)
DBGrid.SelectedRows.Clear;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM nu WHERE kommen LIKE '+#39+'%'+#39);
ADOQuery1.Open;
DBGrid.Refresh;
пыталась с Bookmark - Locate, закладку читает, но функция Locate, я поняла, что "самостоятельная", с закладкой не работает (хотя может закладку неправильно написала ;) )
пыталась через функцию, но требуется полное слово и правильное
Procedure Form.ButtonClick(Sender: TObject); // поиск
begin
komm:=Edit1.Text;
SeqSearh(Query1, 'kommen', komm);
end;
function SeqSearh(Query1: TQuery; Field,Value: String):Boolean;
begin
komm:=Edit1.Text;
Query1.DataSource:=DataSource1;
with ADOQuery1 do
begin
while (not EOF) and (not(FieldByName(Field).AsString=Value)) do
Next;
SegSearh:=not EOF;
end;
end;
Query1-выполняет поиск, при подключении к DataSource1-связаное с ADOQuery1
Field-величина по кот. ведется поиск
Anatoly Podgoretsky (2007-12-04 08:53:00) [5]Можно и с AND, только не знаю какие ограничения в Акцесс на длину запроса.
Утром запустишь, к вечеру результат будет.
Anatoly Podgoretsky (2007-12-04 08:51:00) [6]Получитить список таблиц, в них получить список полей, поиск сделать по каждому текстовому полю, повторять до конца. Поскольку поиск не точный, то как в ЮЮ © (04.12.07 03:01) [1] , кроме AND
ЮЮ (2007-12-04 03:01:00) [7]> по ключевым словам по всему файлу
Может все-таки по вcей таблице?
WHERE (StringField like :word1) AND (StringField like :word2) AND ...
ADOQuery.Parameters.ParamByName('word1').Value := '%' + <первое слово для поиска> + '%';
...