Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.12;
Скачать: CL | DM;

Вниз

Как   Найти похожие ветки 

 
NDR   (2002-07-30 16:09) [0]

Поиск организован

form1.table1.Locate(dbgrid1.SelectedField.DisplayName,form1.edit1.text,[loPartialKey,loCaseInsensitive]);

Есть кнопка ("Найти далее") (как в Excel) по нажатию на которую.
должно искаться дальше. перебирая и сравнивая значения.

Как узнать. когда поиск был неудачен? null ?

Как организовать поиск внутри слов (по любой его части)
например ищем = BLACK
находим = HORSE BLACK

с Уважением, NDR


 
Johnmen ©   (2002-07-30 16:19) [1]

Прямое сканирование НД решает все проблемы (кроме м.б.быстродействия)


 
Mike Kouzmine   (2002-07-30 16:24) [2]

Ну вообще Locate возвращает Boolean, если я не ошибаюсь.
А вообще, тут можно использовать onFilterRecords, где Accept := (Pos("BLACK",TableFileld.Value)<>0)


 
Mike Kouzmine   (2002-07-30 16:25) [3]

Но вообще - это медленно.


 
NDR   (2002-07-30 18:07) [4]

Думайте, думайте ! мастера !
Выручайте! если что умного придет в голову.
пишите сразу процедурку =))

я ведь велосипед не изобретаю. вы наверняка уже сталкивались с этим вопросом. ну...

с Уважением, NDR


 
blackman   (2002-07-30 18:33) [5]

Не мучайся. Простым перебором записей добьешься полного успеха !
function Isk( oTable: TAdoTable;var Istr:String; var Pstr:String):boolean;
var RRecno: TBookmark;
Rresult,Napr: Integer;
label ZYes,ZNo,ZNo2,Nach,iskfin;
begin
Napr:=0;
RResult := 0;
MyEsc:=False;
RRecno:=oTable.GetBookmark;
oTable.Next;
Nach:
while not oTable.Eof do
begin
RResult :=AnsiPos(Istr,oTable.FieldByName(Pstr).AsString);
if MyEsc then goto ZNo;
if RResult > 0 then goto ZYes;
Application.ProcessMessages();
oTable.next;
If Bookmark(Rrecno) = Bookmark(oTable.Recno) then goto Zno;
end;
ZNo:
oTable.GotoBookmark(Rrecno);
if (Napr = 0) and (MessageDlg("


 
Леха_   (2002-07-30 18:57) [6]

Я для этого написал свой компонент если хочешь могу прислать для выкладывания он всетаки великоват


 
NDR   (2002-07-31 12:00) [7]

Давай конечно свой компонент.
Это пишет NDR со своей работы !

сбрось его (свой компонент) пожалуйста на officeman@mail.ru


С уважением и НЕИСЧЕРПАЕМОЙ благодарностью, NDR =)


 
FOX ©   (2002-07-31 12:06) [8]

Один из вариантов:
найти(Ctrl+F): FindExecute( QSMan, DBGrid.SelectedField)
искать дальше(F3): DBFindString(QSMan, DBGrid.SelectedField)

procedure TDM.FindExecute(DataSet: TDataSet; SelectedField: TField);
begin
Find_DataSet := DataSet;
Find_SelectedField := SelectedField;
FindDialog.Execute;
end;

function TDM.DBFindString(DataSet: TDataSet; SelectedField: TField): Boolean;
var
Bookmark: TBookmark;
FindText: string;
SearchString: string;
Step: Integer;
AnyCase: Boolean;
function StopCondition: Boolean;
begin
if Step > 0 then Result := DataSet.EOF else Result := DataSet.BOF;
end;
begin
Result := FALSE;
FindText := FindDialog.FindText;
if FindText = "" then Exit;
AnyCase := not (frMatchCase in FindDialog.Options);
if AnyCase then FindText := AnsiUpperCase(FindText);
if frDown in FindDialog.Options then Step := 1 else Step := -1;
DataSet.DisableControls;
Bookmark := DataSet.GetBookmark;
try
DataSet.MoveBy(Step);
while not StopCondition do
begin
SearchString := SelectedField.AsString;
if AnyCase then SearchString := AnsiUpperCase(SearchString);
if Pos(FindText,SearchString) > 0 then Break;
DataSet.MoveBy(Step);
end;
if StopCondition then
begin
DataSet.GotoBookmark(Bookmark);
MessageDlg("""" + FindDialog.FindText + """ - не найдено.",
mtWarning,[mbOK],0);
end
else Result := TRUE;
finally
DataSet.FreeBookmark(Bookmark);
DataSet.EnableControls;
end;
end;

procedure TDM.FindDialogFind(Sender: TObject);
begin
if DBFindString(Find_DataSet,Find_SelectedField) then FindDialog.CloseDialog;
end;

Пояснения:
{ Private declarations }
Find_DataSet: TDataSet; //переменная
Find_SelectedField: TField;//переменная
FindDialog: TFindDialog;//компонент
FindDialogFind - событие onFind компонента FindDialog.


 
NDR   (2002-08-01 08:01) [9]

Спасибо ! попробую !

с Уважением, NDR


 
ЮЮ ©   (2002-08-01 08:44) [10]

Лично мне не нравится интерфей типа "найти"-"найти дальше".
Я предпочитаю найти сразу все записи посредством одного запроса и в случае если их много "вывалить" пользователю весь список в "поверхстоящем окне", с возможностью выбора записи и автоматической Locat-изацией оной в базовом наборе данных


 
NDR   (2002-08-01 08:50) [11]

Ну так, ЮЮ ! взял бы и поделился своими примудростями =))


 
ЮЮ ©   (2002-08-01 09:01) [12]

>Ну так, ЮЮ ! взял бы и поделился своими примудростями =))
"премудрости" выделяю жирным :

Я предпочитаю найти сразу все записи посредством одного запроса и в случае если их много "вывалить" пользователю весь список в "поверхстоящем окне", с возможностью выбора записи и автоматической Locat-изацией оной в базовом наборе данных


 
NDR   (2002-08-01 11:32) [13]

ладно уж...

Я имел ввиду. Если не лень - напиши исходник !

с Уважением, NDR


 
NDR   (2002-08-02 12:09) [14]

Извиняюсь за свою надоедливость!
Я так и не смог организовать поиск внутри ячейки.


ищем=HORSE
находим значение ячейки поля(по которому искали) =BLACK HORSE
нужно чтоб это работало очень БЫСТРО!
так как записей в базе 53"000 =/

Вообще это должно быть похоче на поисковую систему в MSACCESS

Выручайте МАСТЕРА ! Нужна ваша помощь !
Если несильно будет трудно.
пришлите мне на ящик пример. очень сильно буду
благодарен...

или компоненту посоветуйте какую-нить


 
Карелин Артем ©   (2002-08-02 12:30) [15]

Процедура на простейший пример поиска без учета регистра.

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;
---------------


 
Карелин Артем ©   (2002-08-02 12:38) [16]

Забыл добавить: под этим заголовком еще было преобразование в верхний регистр внутри запроса.


 
Val ©   (2002-08-02 13:38) [17]

>NDR (30.07.02 16:09)
используешь Locate :) хоть бы хелп к ней почитал, по крайней мере, на 2 из твоих 3-х вопросов там есть ответ.


 
NDR   (2002-08-02 13:48) [18]

>используешь Locate :) хоть бы хелп к ней почитал, по крайней >мере, на 2 из твоих 3-х вопросов там есть ответ.//VAL

ну тупой я. тупой !
подскажи. как через LOCATE сделать то что требуется..
только если можно примером. процедуркой чтоли!

плизззз.


 
Sokoloff   (2002-08-02 14:24) [19]

Я когда делал у меня locate по текстовому полю работал медлено, я делал дополнительный запрос
QueryFind.SQL:="SELECT ID FROM MY_TABLE WHERE FIND_FILED LIKE "%find_text%""
и потом , в основной базе искал строки с ID равными ID QueryFind
Так у меня работало гораздо быстрее.


 
Виталий Панасенко   (2002-08-02 15:39) [20]

Можно еще определит Filter, но Filtered:= False и использовать FindFirst/FindNext/FindPrev/FindLast


 
NDR   (2002-08-05 10:56) [21]

никто неотвечает. плизззз нужна помощь !

Доброе время суток !

Наверное МНЕ лучше всетаки для такой базы, установить ФИЛЬТР,
только я незнаю как использовать фильтр под 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)




 
fnatali ©   (2002-08-05 11:01) [22]

тебе ведь уже сказали, несколько вариантов решения предложили - что ещё-то?
Сделай ,например, запрос с нужным критерием поиска


 
NDR   (2002-08-05 18:25) [23]

У меня SQL вешается ! зацикливается. может ячто нетак делаю.
поэтому пытаюсь сделать без SQL =|


 
Anatoly Podgoretsky ©   (2002-08-05 20:40) [24]

Во сколько кода выпросил и все без толку


 
striker ©   (2002-08-07 11:08) [25]

NDR-Под лежачий камень вода не течет.


 
kserg@ukr.net   (2002-08-07 13:28) [26]

Я подобное делал (извеняюсь, если повторюсь - всю переписку не читал).
Единствен.требование для осуществления - наличие уникального поля (думаю, почти в любой таблице есть уникал.поле или набор нескольких полей, значения в котр. будут всегда уникальны).

Для орг-ции поиска ввел temp_query, в котр. выбираю искомые значения.
А в основной таблице (запросе) делал Locate по значению уникал.поля, котр. лежат в temp_query.
(т.е. я искал в locate не искомое значение, а значению уникал.поля, котр. как раз содержит искомое значение.


 
NDR   (2002-08-12 11:50) [27]

всё ясно ! спасибо !
Огромное Спасибо тем кто ответил, а остальным флуд.

с Уважением, NDR


 
Rooman ©   (2002-08-23 09:07) [28]

Чтобы прямой перебор быстро работал, делаешь так:

table1.disablecontrols

перебор

table1.enablecontrols


этот код отрубает синхронизацию всех связанных с таблицей визуальных компонентов (тормоза обычно из-за них).

Еще попробуй индексировать поле поиска (вторичный индекс) и использовать поиск по индексу...


 
Rooman ©   (2002-08-23 09:10) [29]

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:14) [30]

Выше был код моего компонента - сетки данных...
В сетке встаем в нужную колонку и жмем Ctrl+F, F3 для поиска по куску строки в поле (для чисел и дат тоже работает), Alt+F3 - просто фильтр по текущему столбцу...



Страницы: 1 вся ветка

Текущий архив: 2002.09.12;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.022 c
7-35926
Ddt
2002-07-02 06:26
2002.09.12
Получение данных с камеры


1-35723
Борис
2002-09-02 09:22
2002.09.12
Защитить программу от множественного запуска по сети?


1-35774
c0pYc@t
2002-08-30 09:53
2002.09.12
ListView


3-35565
OGR
2002-08-21 19:55
2002.09.12
Объединение 2-у х БД


1-35782
SuperOleg
2002-08-31 14:13
2002.09.12
SOS!!! HELP!!! SOS!!! HELP!!!