Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как


Страницы:   1 2

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]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо