Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2010, 13:07   #1
Lecter2009
Пользователь
 
Регистрация: 30.12.2009
Сообщений: 17
По умолчанию Буквы Е и Ё. Контекстный поиск

Помогите решить проблему, есть у меня программа, работает с БД Access, есть контекстный поиск (код ниже). Поиск ищет первую запись совпадающую с условием, потом по кнопке Enter продолжает поиск след. записи совпадающей с условием и т.д. Стоит задача сделать так чтобы буквы Е и Ё в поиске не различались, т.е. набрав фамилию "Щеголев" поиск должен найти запись с "Щёголев"....пока никак не дойду своим умом....
Код:
var
 FoundRec: Boolean;
 FndEdit: string;
 Fld_0: TField;
begin
FndEdit := AnsiLowerCase(txtKonSearch.Text);
FoundRec := False;
         begin 
           Fld_0 := DM.tbPhone.FieldByName('name');
           if txtKonSearch.Text <> '' then
           begin
             DM.dsMain.First;
             while not DM.dsMain.Eof do
             begin
               if Fld_0.IsNull then
               begin
                 DM.dsMain.Next;
                 Continue;
               end;
               if Pos(FndEdit, AnsiLowerCase(Fld_0.AsString)) > 0 then
               begin
                 FoundRec := True;
                 break;
               end;
               DM.dsMain.Next;
             end;

             if not FoundRec then
             begin
               DM.dsMain.First;
               Application.MessageBox(PChar('Абонент <' + txtKonSearch.Text +
                 '> не найден'), 'Информация', MB_OK + MB_ICONINFORMATION);
             end;
           end;

Последний раз редактировалось Lecter2009; 19.02.2010 в 13:14.
Lecter2009 вне форума Ответить с цитированием
Старый 19.02.2010, 13:32   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

странная реализация, но ничего кроме как делать еще одну проверку не могу предложить
Код:
 if AnsiLowerCase(FndEdit) = 'е'
  or AnsiLowerCase(FndEdit) = 'ё' then
      if Pos('е', AnsiLowerCase(Fld_0.AsString)) > 0 
      or Pos('ё', AnsiLowerCase(Fld_0.AsString)) > 0 then
               begin
                 FoundRec := True;
                 break;
               end;
else
 if Pos(FndEdit, AnsiLowerCase(Fld_0.AsString)) > 0 then
               begin
                 FoundRec := True;
                 break;
               end;
soleil@mmc вне форума Ответить с цитированием
Старый 19.02.2010, 14:02   #3
Lecter2009
Пользователь
 
Регистрация: 30.12.2009
Сообщений: 17
По умолчанию

Спасибо поробую

Поробовал, теперь ничего не ищет кроме Е и Ё ))) Т.е. если ввести Щёголев - пишет не найден, ищет только если в строку поиска ввести буквы е или ё.....Условие не выполняется если введена какая-либо другая буква, не Е и не Ё...А мне надо чтобы можно было ввести слово (фамилию в моем случае) целиком или несколько начальных букв

Кстати насчет реализации....если подскажите как еще можно организовать контекстный поиск с функцией "Найти далее" - буду премного благодарен. Моих мозгов хватило на то что написано выше...))

Последний раз редактировалось Stilet; 24.02.2010 в 17:13.
Lecter2009 вне форума Ответить с цитированием
Старый 20.02.2010, 14:42   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

чтобы код работал и с частью слова нужно подправить код
а я бы делал через скл-запрос, который выдаст все варианты по укаанному фильтру
и в запросе можно на лету заменить все ё на е
soleil@mmc вне форума Ответить с цитированием
Старый 24.02.2010, 09:55   #5
Lecter2009
Пользователь
 
Регистрация: 30.12.2009
Сообщений: 17
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
чтобы код работал и с частью слова нужно подправить код
а я бы делал через скл-запрос, который выдаст все варианты по укаанному фильтру
и в запросе можно на лету заменить все ё на е
Спасибо за идею. Буду пробовать
Lecter2009 вне форума Ответить с цитированием
Старый 24.02.2010, 10:49   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

Во-первых, нужно разобраться: могут ли в базе быть, например, такие записи:
Цитата:
Щёголёв
Щёголев
Щеголёв
Щеголев
Если могут, то двумя запросами с е и ё тут не отделаться, т.к. они охватят только записи: "Щёголёв" и "Щеголев", а остальные не будут найдены.
Как вариант тут завести дополнительное поле для поиска, в котором хранить фамилии с буквами е, т.е. в базе на каждого абонента будет фамилия для отображения пользователю (с е и ё вперемешку) и фамилия для поиска (никаких ё, только е). Заставлять пользователей вводить фамилию в двух вариантах естественно не нужно и можно вынести заполнение адаптированной под поиск фамилии в триггер, например.
Тогда поиск сведётся к одному единственному запросу, в котором так же нужно будет все ё заменить на е.
pu4koff вне форума Ответить с цитированием
Старый 24.02.2010, 14:34   #7
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

Дублировать Фамилию не вариант...у меня их больше 2,5 миллионов.

с Ё всего около 250 тысяч... Это зря базу раздувать. Есть фамилии и с 3 Ё.
По этому проверка должна быть наверняка.
поиск основной у меня по номеру присвоенному человеку. Но данный вопрос тоже интересен.
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 24.02.2010, 17:02   #8
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

тхаха
BARNEY, перелогиниться забыл?

предложенный вариант - это небольшое раздувание базы
зато сразу можно заменить все ненужные символы на однозначные и привести все буквы к одному регистру (например, верхнему)
soleil@mmc вне форума Ответить с цитированием
Старый 24.02.2010, 18:19   #9
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

soleil@mmc, перелогиниться это вы к чему?

Да база всегда должна идти либо в нижнем либо верхнем регистре...у меня она вся в верхнем... По этому вариант добавлять в базу ещё несколько миллионов значение , ради поиска по Е и Ё ...мягко говоря не внушает доверия.
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 24.02.2010, 18:20   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

Можно попробовать выполнить какой-то такой запрос:
Код:
SELECT *
FROM таблица
WHERE (REPLACE(Поле_с_буквой_ё, "Ё", "Е") like строка_поиска)
и из него выудить нужную информацию для навигации. Например, вместо * запрашивать только идентификаторы записей и в программе прописать Locate по этому идентификатору. Вернутся идентификаторы всех найденных записей, а значит проблем с функцией "найти далее" так же не будет.
Так же еще можно тупо у СУБД запросить всех абонентов, пробегать по очереди по каждому, заменять в его фамилии все ё на е и искать подходящего, только вот это всё будет медленнее работать, нежели вариант с раздуванием базы.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Буквы алфавита Golovastik Общие вопросы C/C++ 27 24.07.2009 22:29
Прописные буквы Guest_ Помощь студентам 6 15.12.2007 21:29
Контекстный поиск Ferro БД в Delphi 1 09.11.2007 17:00
Поиск буквы в слое o1ps Помощь студентам 6 11.05.2007 11:59