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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.006 c
1-35685
Gold Ostap
2002-09-02 14:18
2002.09.12
Большой проект


1-35643
978658473
2002-09-01 14:08
2002.09.12
Процессор.


4-35953
Романов А.
2002-07-18 09:20
2002.09.12
Windows XP При смене имени учетной записи ,появляеться проблема !


14-35882
SPeller
2002-08-18 07:11
2002.09.12
Подход к написанию программы


1-35799
vllllllllad
2002-08-31 23:32
2002.09.12
ОЙ-ЙО!!!!!!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский