![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как
NDR © (2002-07-30 16:09:00)Поиск организован
form1.table1.Locate(dbgrid1.SelectedField.DisplayName,form1.edit1.text,[loPartialKey,loCaseInsensitive]);
Есть кнопка ("Найти далее") (как в Excel) по нажатию на которую.
должно искаться дальше. перебирая и сравнивая значения.
Как узнать. когда поиск был неудачен? null ?
Как организовать поиск внутри слов (по любой его части)
например ищем = BLACK
находим = HORSE BLACK
с Уважением, NDR
Rooman (2002-08-23 09:14:00) [1]Выше был код моего компонента - сетки данных...
В сетке встаем в нужную колонку и жмем Ctrl+F, F3 для поиска по куску строки в поле (для чисел и дат тоже работает), Alt+F3 - просто фильтр по текущему столбцу...
Rooman (2002-08-23 09:10:00) [2]
unit DBFindGrid;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids,db;
type
TDBFindGrid = class(TDBGrid)
private
{ Private declarations }
flastfind:string;
protected
{ Protected declarations }
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
public
{ Public declarations }
constructor Create(AOwner:TComponent);override;
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("Data Controls", [TDBFindGrid]);
end;
{ TDBFindGrid }
constructor TDBFindGrid.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
flastfind:="";
end;
procedure TDBFindGrid.KeyDown(var Key: Word; Shift: TShiftState);
var s,fn:string;
function UpperCase(const S: string): string;
var
Ch: Char;
L: Integer;
Source, Dest: PChar;
begin
L := Length(S);
SetLength(Result, L);
Source := Pointer(S);
Dest := Pointer(Result);
while L <> 0 do
begin
Ch := Source^;
if (Ch >= "a") and (Ch <= "z") then Dec(Ch, 32);
if (Ch >= #$E0) and (Ch <= #$FF) then Dec(Ch, 32);
Dest^ := Ch;
Inc(Source);
Inc(Dest);
Dec(L);
end;
end;
begin
s:=flastfind;
fn:=self.SelectedField.FieldName;
if shift=[ssctrl] then
if (key=ord("f")) or (key=ord("F")) then
if inputquery("Поиск","Введите строку для поиска:",s) then
begin
flastfind:=s;
datalink.dataset.DisableControls;
DataLink.DataSet.First;
while not datalink.DataSet.Eof do
begin
if pos(uppercase(s),uppercase(datalink.dataset.FieldByName(fn).AsString))>0 then break;
datalink.DataSet.Next;
end;
datalink.dataset.EnableControls;
key:=0;
exit;
end;
if (key=VK_F3) then
if flastfind<>"" then
begin
s:=flastfind;
datalink.dataset.DisableControls;
while not datalink.DataSet.Eof do
begin
datalink.DataSet.Next;
if pos(uppercase(s),uppercase(datalink.dataset.FieldByName(fn).AsString))>0 then break;
end;
datalink.dataset.EnableControls;
key:=0;
exit;
end;
if shift=[ssalt] then
if (key=ord("f")) or (key=ord("F")) then
if inputquery("Фильтр","Введите строку для фильтра:",s) then
begin
flastfind:=s;
if s<>"" then
DataLink.DataSet.Filter:=self.SelectedField.FieldName+" = """+s+""""
else
DataLink.DataSet.Filter:="";
DataLink.DataSet.Filtered:=s<>"";
key:=0;
exit;
end;
inherited;
end;
end.
Rooman (2002-08-23 09:07:00) [3]Чтобы прямой перебор быстро работал, делаешь так:
table1.disablecontrols
перебор
table1.enablecontrols
этот код отрубает синхронизацию всех связанных с таблицей визуальных компонентов (тормоза обычно из-за них).
Еще попробуй индексировать поле поиска (вторичный индекс) и использовать поиск по индексу...
NDR (2002-08-12 11:50:00) [4]всё ясно ! спасибо !
Огромное Спасибо тем кто ответил, а остальным флуд.
с Уважением, NDR
kserg@ukr.net (2002-08-07 13:28:00) [5]Я подобное делал (извеняюсь, если повторюсь - всю переписку не читал).
Единствен.требование для осуществления - наличие уникального поля (думаю, почти в любой таблице есть уникал.поле или набор нескольких полей, значения в котр. будут всегда уникальны).
Для орг-ции поиска ввел temp_query, в котр. выбираю искомые значения.
А в основной таблице (запросе) делал Locate по значению уникал.поля, котр. лежат в temp_query.
(т.е. я искал в locate не искомое значение, а значению уникал.поля, котр. как раз содержит искомое значение.
striker (2002-08-07 11:08:00) [6]NDR-Под лежачий камень вода не течет.
Anatoly Podgoretsky (2002-08-05 20:40:00) [7]Во сколько кода выпросил и все без толку
NDR (2002-08-05 18:25:00) [8]У меня SQL вешается ! зацикливается. может ячто нетак делаю.
поэтому пытаюсь сделать без SQL =|
fnatali (2002-08-05 11:01:00) [9]тебе ведь уже сказали, несколько вариантов решения предложили - что ещё-то?
Сделай ,например, запрос с нужным критерием поиска
NDR (2002-08-05 10:56:00) [10]никто неотвечает. плизззз нужна помощь !
Доброе время суток !
Наверное МНЕ лучше всетаки для такой базы, установить ФИЛЬТР,
только я незнаю как использовать фильтр под dbase-сом.
под парадокс знаю. под dbase незнаю !
подскажите как это лучше всего сделать.
(лучше сразу процедуркой) =/
так как моя база
по лекарственным препаратам и мед.товарам включает 53"312 записей(позиций)
Два основных поля:
NMPREP(наименование) FORM(форма упаковки)
НО-ШПА ТАБ. 40 МГ Х 100
НО-ШПА ФОРТЕ АМП. 2% 4 МЛ Х 5
НО-ШПА ФОРТЕ АМП. 2% 4 МЛ Х 5
НО-ШПА ФОРТЕ ТАБ. 80 МГ Х 20
...
ПРЕЗЕРВАТИВ "Ванька встанька" 10 Х 10
ПРЕЗЕРВАТИВ "BLACK HORSE" 20 Х 6
и ещё 53"306 записей.
соответственно устраиваем поиск по полю "NMPREP"
И отбираем все записи по "ФОРТЕ"
Помогите мне пожалуйста до конца разобраться с этим вопросом.
с Уважением, NDR (aka Officeman)
Виталий Панасенко (2002-08-02 15:39:00) [11]Можно еще определит Filter, но Filtered:= False и использовать FindFirst/FindNext/FindPrev/FindLast
Sokoloff (2002-08-02 14:24:00) [12]Я когда делал у меня locate по текстовому полю работал медлено, я делал дополнительный запрос
QueryFind.SQL:="SELECT ID FROM MY_TABLE WHERE FIND_FILED LIKE "%find_text%""
и потом , в основной базе искал строки с ID равными ID QueryFind
Так у меня работало гораздо быстрее.
NDR (2002-08-02 13:48:00) [13]>используешь Locate :) хоть бы хелп к ней почитал, по крайней >мере, на 2 из твоих 3-х вопросов там есть ответ.//VAL
ну тупой я. тупой !
подскажи. как через LOCATE сделать то что требуется..
только если можно примером. процедуркой чтоли!
плизззз.
Val (2002-08-02 13:38:00) [14]>NDR (30.07.02 16:09)
используешь Locate :) хоть бы хелп к ней почитал, по крайней мере, на 2 из твоих 3-х вопросов там есть ответ.
Карелин Артем (2002-08-02 12:38:00) [15]Забыл добавить: под этим заголовком еще было преобразование в верхний регистр внутри запроса.
Карелин Артем (2002-08-02 12:30:00) [16]Процедура на простейший пример поиска без учета регистра.
procedure TForm1.Edit6Change(Sender: TObject);
begin
MAIN_Q.Active:=false;
MAIN_Q.sql.Clear;
MAIN_Q.SQL.Append("select * from books");
MAIN_Q.SQL.Append("where book like "+""%"+Edit6.Text+"%"");
MAIN_Q.ExecSQL;
MAIN_Q.Active:=true;
end;
---------------
NDR (2002-08-02 12:09:00) [17]Извиняюсь за свою надоедливость!
Я так и не смог организовать поиск внутри ячейки.
ищем=HORSE
находим значение ячейки поля(по которому искали) =BLACK HORSE
нужно чтоб это работало очень БЫСТРО!
так как записей в базе 53"000 =/
Вообще это должно быть похоче на поисковую систему в MSACCESS
Выручайте МАСТЕРА ! Нужна ваша помощь !
Если несильно будет трудно.
пришлите мне на ящик пример. очень сильно буду
благодарен...
или компоненту посоветуйте какую-нить
NDR (2002-08-01 11:32:00) [18]ладно уж...
Я имел ввиду. Если не лень - напиши исходник !
с Уважением, NDR
ЮЮ (2002-08-01 09:01:00) [19]>Ну так, ЮЮ ! взял бы и поделился своими примудростями =))
"премудрости" выделяю жирным:
Я предпочитаю найти сразу все записи посредством одного запросаи в случае если их много "вывалить" пользователю весь списокв "поверхстоящем окне", с возможностью выбора записии автоматической Locat-изациейоной в базовом наборе данных
NDR (2002-08-01 08:50:00) [20]Ну так, ЮЮ ! взял бы и поделился своими примудростями =))