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

Вниз

Поиск по базе.   Найти похожие ветки 

 
widom   (2003-04-07 07:21) [0]

Нужно сделать поиск по базе данных, когда значение поля частично совпадает со строкой.
Например строка RAV. Он должен вывести поля со значением Drav и Ravik.
SQL запросы не предлагать.


 
Dim!S   (2003-04-07 07:44) [1]

Методом перебора записей...

при обработке записей используй:
MatchStrings(AnsiUpperCase(fmDM.Table1.FieldByName("Krat_Name").Value), AnsiUpperCase("*" + str + "*"));


(функцию нашел в инете)
******************
function MatchStrings(source, pattern: String): Boolean;
var

pSource: Array [0..255] of Char;
pPattern: Array [0..255] of Char;


function MatchPattern(element, pattern: PChar): Boolean;


function IsPatternWild(pattern: PChar): Boolean;
var
t: Integer;
begin
Result := StrScan(pattern,"*") <> nil;
if not Result then Result := StrScan(pattern,"?") <> nil;
end;


begin
if 0 = StrComp(pattern,"*") then
Result := True
else if (element^ = Chr(0)) and (pattern^ <> Chr(0)) then
Result := False
else if element^ = Chr(0) then
Result := True
else begin
case pattern^ of
"*": if MatchPattern(element,@pattern[1]) then
Result := True
else
Result := MatchPattern(@element[1],pattern);
"?": Result := MatchPattern(@element[1],@pattern[1]);
else
if element^ = pattern^ then
Result := MatchPattern(@element[1],@pattern[1])
else
Result := False;
end;
end;
end;

begin

StrPCopy(pSource,source);
StrPCopy(pPattern,pattern);
Result := MatchPattern(pSource,pPattern);
end;
*****************


 
Veles   (2003-04-07 07:57) [2]

Можно и так, если база небольшая...

procedure TForm8.Button2Click(Sender: TObject);
VAR
I: Integer;
K: String;
S: String;
M: String;
begin
Table2.First;
S := Edit1.Text;
begin
For I := 1 To Table2.RecordCount Do
begin
M := Table2Name.Value;
K := Copy(M, 1, Length(S));
if S <> K Then Table2.Next;
end;
if S = K then MessageDlg("


 
Dim!S   (2003-04-07 08:26) [3]

>>Veles
Не пройдет, если регистр букв разный...
Дополни его AnsiUpperCase


 
Veles   (2003-04-07 10:40) [4]

Согласен...


 
Соловьев   (2003-04-07 10:53) [5]


> SQL запросы не предлагать.

почему?


 
alex _bredin   (2003-04-07 10:57) [6]

FindNearest


 
Silver_   (2003-04-07 11:01) [7]

используй

DataSet.Filter:="<<MyField>> LIKE "rav*"";
DataSet.Filtered:=True;


и в результате у тебеа останутся только нужные записи
после
DataSet.Filtered:=False;
в твоем распоряжении опять все записи
Дерзай

P.S. работает достаточно быстро


 
alex _bredin   (2003-04-07 11:14) [8]

если TTable, то TTable.FindNearest

Moves the cursor to the record that most closely matches a specified set of key values.

procedure FindNearest(const KeyValues: array of const);

Description

Call FindNearest to move the cursor to a specific record in a dataset or to the first record in the dataset that is greater than the values specified in the KeyValues parameter. KeyValues contains a comma-delimited array of field values, called a key. Each value in the key can be a literal, a variable, a NULL value, or nil. If the number of values passed in KeyValues is less than the number of columns in the index used for the search, the missing values are assumed to be null. In the statement below, the FindKey method is used to find the table row with the value ""Princess Island SCUBA" in the index field.

Table1.FindNearest(["Princess Island SCUBA"]);

For Paradox and dBASE tables, the key must always be an index, which can be specified in the IndexName property. If IndexName is empty, FindNearest uses the table’s primary index. Note that FindKey does not work with dBASE expression indexes. Use the GotoKey or GotoNearest method instead.

For SQL tables, the key may correspond to a specified index in IndexName, or to a list of field names in the IndexFieldNames property.

FindNearest positions the cursor either on a record that exactly matches the search criteria, or on the first record whose values are greater than those specified in the search criteria. If there are no records that match or exceed the specified criteria, FindNearest positions the cursor on the last record in the table. KeyExclusive affects the boundary conditions of ranges and will affect the record selected by FindNearest.


 
Silver_   (2003-04-07 11:29) [9]


> widom (07.04.03 07:21)
> Нужно сделать поиск по базе данных, когда значение поля
> частично совпадает со строкой.
> Например строка RAV. Он должен вывести поля со значением
> Drav и Ravik.

> SQL запросы не предлагать.


ВСЁ - фильтрация какраз поможет
тока не поля а записи :)

потому как Find... тока позиционирует курсор куда надо а надо не одну запись а ВСЕ подходящие, по крайней мере из вопроса так следует :)


 
Соловьев   (2003-04-07 11:33) [10]

еще можно(наверное даже нужно) - OnFilterRecord.


 
Dim!S   (2003-04-07 11:39) [11]

> alex_bredin
FindNearest не сработает, потомо что берет с первого символа и с учетом регистра, а в задаче условия совсем другие


 
Dim!S   (2003-04-07 11:39) [12]

> alex_bredin
FindNearest не сработает, потомо что берет с первого символа и с учетом регистра, а в задаче условия совсем другие

Только по моему способу, долго, но верно! :)


 
Dim!S   (2003-04-07 11:43) [13]

> alex_bredin
FindNearest не сработает, потому что берет с первого символа и с учетом регистра, а в задаче условия совсем другие

Разве указанный мною способ не подходит? Долго, но верно! :)
По-моему, это единственный способ... (см. условия и для TTable)


 
Dim!S   (2003-04-07 11:44) [14]

Извиняюсь, что-то с инетом :)
см. самое нижнее


 
Silver_   (2003-04-07 12:04) [15]


> Долго, но верно! :)

Верно не есть лучше

в данном случае фильтрация и есть быстрее, проще (смотри код), а значит лучше :)


 
sunrider   (2003-04-07 16:02) [16]

Есть такая функция Locate для Table и Query
Table.Locate(<имя поля - string>,<значение-variant>,
[loCaseInsensitive,loPartialKey]); Два последних ключа, как раз для типа поиска - последний если нужно частичное совпадение.
Вообще работает достаточно быстро



 
Silver_   (2003-04-07 16:17) [17]


> 2 sunrider (07.04.03 16:02)


и ты считаещь что
Locate("MyField","RAV",[loPartialKey, loKeyInsensitive]);
выдаст
Drav
Ravik

я уверен ты получишь Drav а до Ravik с локейтом не доберешься
потому что он позиционирует курсор на ПЕРВУЮ подходящую запись и никак не выдаст тебе более одной

> Вообще работает достаточно быстро

быстро не есть правильно :)

вопще в данном случае либо SQL либо фильтр


 
Соловьев   (2003-04-07 16:20) [18]

может OnFilterRecord?


 
Silver_   (2003-04-07 16:42) [19]


> Соловьев © (07.04.03 16:20)
> может OnFilterRecord?

мона и OnFilterRecord я пользую так устанавливаю
DataSet.Filtered:=True;

у какованить Едита ...EditOnChange(Sender: TObject);
DataSet.Filter:="<<MyField>> LIKE ""+TEdit(Sender).Text+"*"";

усё работает как часы :) просто и немудрено


 
Соловьев   (2003-04-07 16:44) [20]

только в Filter тебе записать работу со строками очень проблемно будет , если сложные условия.... А в OnFilterRecord все легко...


 
Silver_   (2003-04-07 16:53) [21]


> Соловьев © (07.04.03 16:44)

совершенно верно, тока о сложных условиях ни слова в вопросе :)


 
Brenton   (2003-04-08 05:36) [22]


> Silver_ (07.04.03 11:01)
> используй
>
> DataSet.Filter:="<<MyField>> LIKE "rav*"";
> DataSet.Filtered:=True;

Попробовал - не идет. Выдает ошибку Invalid filter expression character: и тут что-то похожее на двойные кавычки, причем не одни, там плохо видно:((
В чем может быть проблема??


 
Dim!S   (2003-04-08 06:23) [23]

Это не двойные кавычки, а апострофы ("" - два апострофа)

А у тебя используется TTable или TQuery?




 
Brenton   (2003-04-08 06:49) [24]


> Dim!S (08.04.03 06:23)


> А у тебя используется TTable или TQuery?

TTable


 
Dim!S   (2003-04-08 07:11) [25]

тогда см. мой способ :)

только он позволяет отобрать все записи, удовлетворяющие условию, о которых сказал widom


 
Brenton   (2003-04-08 08:09) [26]


> Dim!S (08.04.03 07:11)

Лучше я буду пользоваться стандартной функцией AnsiPos, она проверяет есть ли подстрока substr в строке, и возвращает позицию в кот начинается совпадение, если подстрока в строке не содержится, то возвращает 0.


 
Dim!S   (2003-04-08 08:17) [27]

В принципе это тот же путь (перебор всех записей), только если ты внимательно просмотрел указанную мной функцию, то должен был увидеть, что в ней можно применять wildcard symbols (* и ?), т.е. делать более гибкую выборку...


 
Соловьев   (2003-04-08 09:33) [28]


> только он позволяет отобрать все записи, удовлетворяющие
> условию, о которых сказал widom

неужели? А Фильтр?????


 
Vopros   (2003-04-08 09:49) [29]

>Silver_ (07.04.03 16:42)
Что то это у меня не работает как часы.


 
Dim!S   (2003-04-08 10:08) [30]

А как конкрентно TTable.Filter указать LIKE?


 
Silver_   (2003-04-08 11:21) [31]

писал сразу тута видимо настроить над-было
вот кусок из моей проге

if FilteredByEdit.Text <> "" then
MyADODataSet.Filter:="Name LIKE "#39" *"+ DoubleQuotedString (FilteredByEdit.Text,"""")+" *"#39;


где

function DoubleQuotedString(const S: string; Quote: Char): string;
var i: Integer;
begin
Result:="";
for i:=1 to Length(s) do
if S[i]=Quote then
Result:=Result+S[i]+S[i]
else Result:=Result+S[i];
end;


для дублирования аппострофов если они встречаются в самом тексте
типа "Can"t" превратится в "Can""t"

уберешь первую * фильтрует по началу стринга, оставишь найдет и в середине

А ошивка вылетала изза того что не проверял (пустоту не нада искать :) )
if FilteredByEdit.Text <> "" then


примечание #39 = "


 
Brenton   (2003-04-08 11:35) [32]


> Silver_ (08.04.03 11:21)

Незнаю, как у тебя все это работает. У меня код такой:

FilterString:="ORG LIKE "#39"*"+SearchWord+"*"#39;
Table1.Filter:=FilterString;

Выдает ошибку Project raised exception class EDBEngingError with message "Operation not applicable"




 
Silver_   (2003-04-08 12:00) [33]

1. посмотри Дебагом чему равен FilterString после присвоения !...!
2. попробуй напрямую в Object Inspector ввести это !...!

а ещё попробуй в Object Inspector ввести это
ORG LIKE "*слово*"

А возможно ТTable не поддерживает LIKE

и не забудь про
if SearchWord <> "" then

такое ORG LIKE "**" НЕ ПРОЙДЕТ

т.е. у тебя должно быть что-то вроде

if SearchWord <> "" then
begin
FilterString:="ORG LIKE "#39"*"+SearchWord+"*"#39;
Table1.Filter:=FilterString;
end;



 
Brenton   (2003-04-08 12:11) [34]


> Silver_ (08.04.03 12:00)

Похоже Table не поддерживает Like


 
Mike Kouzmine   (2003-04-08 12:20) [35]

Не похоже, а так и есть.


 
Соловьев   (2003-04-08 12:27) [36]

OnFilterRecord - - уже б давно все работало...


 
Silver_   (2003-04-08 12:38) [37]

Ребята а у ТTable есть Опции фильтрации
правда когда я работал с ТTable и пробовал что-то вроде этого (Опций фильтрации)не пошло


> Соловьев © (08.04.03 12:27)
> OnFilterRecord - - уже б давно все работало...


интересно если ТTable не поддерживает LIKE
OnFilterRecord пройдет (сам не знаю OnFilterRecord не использовал не нужен был до сих пор)


 
Mike Kouzmine   (2003-04-08 12:40) [38]

OnFilterRecord - все, что угодно (для г-на Соловьева - в данном контексте) :)


 
Brenton   (2003-04-08 12:53) [39]

А можно пример на OnFilterRecord



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

Форум: "Базы";
Текущий архив: 2003.04.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.009 c
1-76914
Blond
2003-04-15 08:33
2003.04.24
Выделение обьектов на форме


14-77164
alxn
2003-04-08 11:41
2003.04.24
Кто знает, куда пропал DelphiPlus?


1-76997
Мыш
2003-04-13 04:19
2003.04.24
Как рисовать на заголовке формы?


1-76975
CTAPbIi
2003-04-13 10:59
2003.04.24
Алгоритм вычисления номера недели


3-76817
Vitalik S.
2003-04-05 12:18
2003.04.24
Как работать с типом BLOB Oracle8 через ODAC 4.05 в Delphi7





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