Форум: "Базы";
Текущий архив: 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.007 c