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

Вниз

Поис (без учитывания знаков и символов)   Найти похожие ветки 

 
Jeeb   (2007-04-13 12:02) [0]

Здравствуйте!
Прошу помочь мне.

Есть Edit, в который вводится значение для поиска в базе. Вводится пользователем в таком виде: AU044093FR.
В то время как в базе значения введены в виде: AU04-409-3FR, причем может быть и другое расположение дефисов (точек, запятых и пр.).

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

Заранее благодарен за помощь.


 
Johnmen ©   (2007-04-13 12:11) [1]

LIKE "A%U%0%4%4%0%9%3%F%R"


 
clickmaker ©   (2007-04-13 12:11) [2]

хм...
ну как вариант
select * from Table
where replace(Field, "-", "") = SearchString or replace(Field, ",", "") = SearchString or ...

но нельзя ли как-то формализовать данные, наверняка там какая-то логика есть?


 
ЮЮ ©   (2007-04-13 12:18) [3]

Только
 WHERE (Field LIKE "A%") AND (Field LIKE "%U%") AND ... AND (Field LIKE "%R")

P.S. Даже учитывая, что будет долго работать, вернёт больше, чем нужно, например "A0U09344FR".
P.S.S если дефисы так важны, почему бв пользователю их не вводить при поиске? А если так не важны, зачем их хранить в базе? На худой конец, сделать два поле, в одно пользователь вводит AU04-409-3FR, в другое клиент (а лучше сервер в триггере) пишет AU044093FR, по которому, собственно, потом и искать.


 
Jeeb   (2007-04-13 12:21) [4]

clickmaker,
логика есть: AU - Audi, а дальше циферки номера, но как в них происходит расстановка дефисов, я не знаю...

Есть FO10-302-1, а есть просто 16243...

Johnmen,
Тоже думал над этим, но как это сделать?...


 
Johnmen ©   (2007-04-13 12:23) [5]


>  как это сделать?...

Что значит "как"? Молча. Или тихо напевая себе под нос...:)


 
Jeeb   (2007-04-13 12:23) [6]

ЮЮ,
изначально в базу были введены значения по уникальному (оригинальному) коду запчасти для автомобиля. Нужно теперь при осуществлении поиска не учитывать знаки.... Не править же около 5-6000 названий.... Вот...


 
Jeeb   (2007-04-13 12:25) [7]

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


 
ЮЮ ©   (2007-04-13 12:31) [8]

>LIKE "A%U%0%4%4%0%9%3%F%R"
 Красиво и смело !

Не править же около 5-6000 названий.... Вот...
Можно былобы и поправить, не руками же :) Однако есть [1]


 
Jeeb   (2007-04-13 12:33) [9]

ЮЮ,
пойми, это - оригинальные шифры запчасти, если их править, то это будет неправильным...


 
Сергей М. ©   (2007-04-13 12:33) [10]


> Jeeb


Вообще-то немцы, как известно, народ педантичный.

И, если не ошибаюсь, ориг.коды запчастей для Ауди (и не только для этой ТМ) построены по строго определенному шаблону,  которого и следует придерживаться при построении запроса в части условий отбора.


 
Jeeb   (2007-04-13 12:36) [11]

Сергей М.,
я понимаю, что они построены по шаблону, но так же есть запчасти для ВАЗ, УАЗ, Газель, и т.д. Русские - не все настолько педантичны, как немцы... Если бы в базе были только з/ч для Audi, то можно было бы так поступить, но увы.... задавать свой шаблон для каждой марки....


 
ЮЮ ©   (2007-04-13 12:39) [12]

[9] Jeeb   (13.04.07 12:33)
Я и не предлагал править оригинальные значения, а использовать второе. Теперь и этого не предлагаю, ибо с запросом в [1] MS SQL, надеюсь, справится быстро.


 
ЮЮ ©   (2007-04-13 12:45) [13]

> Тоже думал над этим, но как это сделать?...

Строку, введенную пользователем "удлинить" в два раза, вставив "%" после каждого символа. Полученную строку использовать в запросе


 
Jan1   (2007-04-13 12:48) [14]

select *
from (select "A-11-22" as f
union all
select "A1122" as f
union all
select "A/11,22" as f
union all
select "/," as f) q
where f like "%[a-z0-9]%"


 
Jeeb   (2007-04-13 12:48) [15]

С другой стороны, наверное [1] было бы не очено корректно, т.к. пользователь может ввести идентификатор и с символами и без... Это как раз и вводит в заблуждение... Он так же может ввести один дефис правильно, а про второй забыть... Т.е. при поиске надо учитывать только буквы и цифры....


 
ЮЮ ©   (2007-04-13 12:52) [16]

[15] Jeeb   (13.04.07 12:48)
в [1] как раз учитываются только буквы и цифры.
Попробуй, наконец, запрос на своей БД :)


 
Jeeb   (2007-04-13 12:52) [17]

Jan1,
надо учитывать все случаи, а не только случаи с /,-. и пр...

Т.е. надо формировать что-то вроде [1], но учитывая и то, что дефисы могут присутствовать...


 
Jeeb   (2007-04-13 12:55) [18]

ЮЮ,
я могу попробовать именно для AU044093FR, но как сделать удаление всех знаков из Edit, кроме букв и цифр, и добавление знака % после каждого символа..?? сам алгоритм на Delphi мне не понятен... Это по сути просто, как в первом классе, просто я не знаю как...


 
ЮЮ ©   (2007-04-13 13:00) [19]

>
> Т.е. надо формировать что-то вроде [1], но учитывая и то,
> что дефисы могут присутствовать...

в [13] Дефисы в БД учтены . Правильно введенные дефисы в поле поиска тоже будут учтены. Не учтены тольно неправильно введенные дефисы.

Т.е. нельзя найти AU04-409-3FR по AU-04409-3FR. Если хочешь, чтобы искал и в этом случае, то сначала удали символы-разделители из строки поиска, затем, как в [13]


 
ЮЮ ©   (2007-04-13 13:01) [20]

>Это по сути просто, как в первом классе, просто я не знаю как...

Тогда надо переносить в "Начинающим..." :)


 
Сергей М. ©   (2007-04-13 13:03) [21]


> Jeeb   (13.04.07 12:36) [11]


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

И то, что эти правила различны для различных производителей, не является большим припятствием для твоего сабжа. Достаточно знать эти правила, остальное - дело программерской техники)

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

Или наоборот - юзер вводит данные как попало, ты выполняешь парсинг введенных данных на предмет их полного или частичного соответствия одному из известных шаблонов. Если ни один шаблон не обнаружен, юзер получает отлуп (сам виноват !), иначе данные приводятся в полное соответствие шаблонным правилам, после чего они точно так же готовы к употреблению при отборе.


 
Сергей М. ©   (2007-04-13 13:11) [22]


> Jeeb


Именно так и работает довольно известный софт ETKA (интерактивный каталог з/частей VW, Audi и пр.)


 
Sergej ©   (2007-04-13 13:11) [23]

Может так:

FindText:="AU04-409-3FR";
FindText := AnsiReplaceStr(FindText,"-","%");
Query.Sql.Text:="select * from table where field="+findtext;


 
Jeeb   (2007-04-13 13:12) [24]


B:=CCode.Text;
while Pos("-", B)=0 do
 Delete(B, Pos("-", B), 1);
for I:=1 to Length(B) do
 begin
   Insert("%", B, I+1);
 end;


Полученное И вставляю в запрос...

При выполнении этого программа виснет, что не так?


 
ЮЮ ©   (2007-04-13 13:17) [25]

while Pos("-", B) > 0 do
Delete(B, Pos("-", B), 1);

for I:=1 to Length(B) do
begin
  Insert("%", B, I+1);
end;

Полученное И вставляю в запрос...

А смотрел, что получилось?


 
Sergej ©   (2007-04-13 13:17) [26]

К (13.04.07 13:11) [23]
вернее "select * from table where field like "+QuotedStr(findtext);


 
Johnmen ©   (2007-04-13 13:18) [27]


> что не так?

бесконечный цикл


 
Jeeb   (2007-04-13 13:20) [28]


B:=CCode.Text;
while Pos("-", B)>0 do
Delete(B, Pos("-", B), 1);
for I:=1 to Length(B) do
begin
  Insert("%", B, I+1);
end;


Если делать так, то программа не виснет... Но результат поиска - ноль...


 
ЮЮ ©   (2007-04-13 13:20) [29]

while Pos("-", B)   >   0 do
Delete(B, Pos("-", B), 1);

А то получается "до тех пор пока нет сивмола удалять его" :)


 
Jan1   (2007-04-13 13:21) [30]


> LIKE "A%U%0%4%4%0%9%3%F%R"

такая замена не подойдет. так как под % будет понята любая комбинация. и будут лишние записи.


 
Jeeb   (2007-04-13 13:21) [31]

Jan1,
а что вставлять вместо %?


 
ЮЮ ©   (2007-04-13 13:26) [32]

потому что по твоемк алгоритму получишь A%%%%%%%%%%U044093FR

>такая замена не подойдет. так как под % будет понята любая комбинация. и будут лишние записи.

Если есть серри с более чем 10-ю значащими сиволами, поряд 10-ти которых совпал. Такие совпадения, если и будут, то не так страшны, полагаю, чен ненахождение


 
Jan1   (2007-04-13 13:28) [33]

я бы написал простенькую UDF, которая выдерала-бы только числа и буквы.


 
Jeeb   (2007-04-13 13:28) [34]

ЮЮ,

так вот меня и волнует мой алгоритм... я не знаю как по другому сделать, потому сюда и обратился...


 
ЮЮ ©   (2007-04-13 13:30) [35]

ну хотя бы так :)

с := "";
for i := 1 to Length(b) do
  c := c + b[i] + "%";


 
Jeeb   (2007-04-13 13:34) [36]

Эврика!!!!!!!

D:="";
B:=CCode.Text;
while Pos("-", B)>0 do
 Delete(B, Pos("-", B), 1);
for I:=1 to Length(B) do
 begin
   D:=D+B[I]+"%";
 end;


Только как бы это организовать, чтоб учитывались не только знаки дефиса...

Спасибо, ЮЮ....


 
Gadenysh   (2007-04-13 13:37) [37]

ReplaceStr(edit.text, "-", "%") и все


 
Gadenysh   (2007-04-13 13:38) [38]

т.е.
StringReplace(edit.text, "-", "%") и все


 
Gadenysh   (2007-04-13 13:39) [39]

Sergej ©   (13.04.07 13:11) [23]

уже сказал


 
ЮЮ ©   (2007-04-13 13:43) [40]

Повтори

while Pos("-", B)>0 do  Delete(B, Pos("-", B), 1);

столько раз, сколько нужно, чтобы учесть все нежелательные симворлы :)



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

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

Наверх





Память: 0.54 MB
Время: 0.037 c
6-1153741295
integerr
2006-07-24 15:41
2007.07.15
Internet Explorer + *.gif


2-1182532885
7D7
2007-06-22 21:21
2007.07.15
Фильтрация в DBGrid


2-1182345508
авыф
2007-06-20 17:18
2007.07.15
SpeedButton


2-1182606161
Полный Чайник
2007-06-23 17:42
2007.07.15
описание директивы Stdcall


15-1181392158
Игорь Шевченко
2007-06-09 16:29
2007.07.15
Компания Codegear Borland проводит семинары





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