Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.10.2008, 13:17
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
Вопрос Запрос SQL:

Запрос SQL:
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
 f:string;
begin
 f:=inputbox('Поиск по БД','Введите фамилию человека','');
if f <> '' then
  begin
  with Form1.Query1 do begin
  Close;
    SQL.Clear;
    SQL.Add('SELECT Number');
    SQL.Add('FROM MobNomera');
    SQL.Add('WHERE Fam like "%'+'f'+'%" and Name like "%'+'f'+'%"');
  Open;
    if Form1.Query1.RecordCount>0 then
    ShowMessage(Form1.Query1.Fields[0].AsString);
    end;
  end;
end;
Если я ввожу в строке поиска фамилию, то ничего не происходит и не выводится.
А если я пробую так:
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
 f:string;
begin
 f:=inputbox('Поиск по БД','Введите фамилию человека','');
if f <> '' then
  begin
  with Form1.Query1 do begin
  Close;
    SQL.Clear;
    SQL.Add('SELECT Number');
    SQL.Add('FROM MobNomera');
    //SQL.Add('WHERE Fam like "%'+'f'+'%" and Name like "%'+'f'+'%"');
  Open;
    if Form1.Query1.RecordCount>0 then
    ShowMessage(Form1.Query1.Fields[0].AsString);
    end;
  end;
end;
то выводится сообщение с номером именно первого человека. То есть что бы я не вводил, то все время будет выводится один и тот же номер человека, первым стоящим по списку. Делает почти то, что надо, но немного не то. Что надо исправить? В свойствах компонента TQuery (свойство SQL) у меня написано так:
Код:
SELECT * FROM MobNomera.db
Может надо в этом свойстве исправить? Подскажите пожалуйста. Поиск по форуму конкретно не отвечает на мой вопрос.
Ответить с цитированием
  #2  
Старый 07.10.2008, 13:31
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Советую почитать что-нибудь по SQL.
Зачем искать вхождение фамилии в полях fam и name, я полагаю искать нужно только в fam. Поэтому код должен выглядеть примерно так:
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
 f:string;
begin
 f:=inputbox('Поиск по БД','Введите фамилию человека','');
if f <> '' then
  begin
  with Form1.Query1 do begin
  Close;
    SQL.Clear;
    SQL.Add('SELECT Number');
    SQL.Add('FROM MobNomera');
    SQL.Add(Format('WHERE fam LIKE %s',[QuotedStr('%'+f+'%')]));
  Open;
    if Form1.Query1.RecordCount>0 then
    ShowMessage(Form1.Query1.Fields[0].AsString);
    end;
  end;
end;
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 07.10.2008, 13:48
mik mik вне форума
Прохожий
 
Регистрация: 17.09.2008
Сообщения: 33
Репутация: 10
По умолчанию

and заменить на or
И переменную f не надо заключать в кавычки.

было
Код:
SQL.Add('WHERE Fam like "%'+'f'+'%" and Name like "%'+'f'+'%"');

надо
Код:
SQL.Add('WHERE Fam like "%'+f+'%" or Name like "%'+f+'%"');
Ответить с цитированием
  #4  
Старый 07.10.2008, 13:58
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию

Все равно почему то ничего не выводит((. Даже ваш код. В сообщении должен выводится номер телефона (Number) найденный по введенной фамилии.
А если изменить как то эту строчку?
SELECT * FROM MobNomera.db
Ответить с цитированием
  #5  
Старый 07.10.2008, 14:06
mik mik вне форума
Прохожий
 
Регистрация: 17.09.2008
Сообщения: 33
Репутация: 10
По умолчанию

Попробуйте в таблице создать запись с простой фамилией, например: "1", затем попробуйте поиск по этой фамилии.

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

Последний раз редактировалось mik, 07.10.2008 в 15:46.
Ответить с цитированием
  #6  
Старый 07.10.2008, 15:30
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от artemavd
Все равно почему то ничего не выводит((. Даже ваш код.
SELECT * FROM MobNomera.db
проверь какие столбцы в таблице
Есть там Fam и Name?
Ответить с цитированием
  #7  
Старый 07.10.2008, 15:40
mik mik вне форума
Прохожий
 
Регистрация: 17.09.2008
Сообщения: 33
Репутация: 10
По умолчанию

Поля такие есть, иначе программа ругнулась бы во время выполнения.
Скорее всего сравнение идет с учетом регистра. В базе - "Иванов", а в переменной присваивается - "иванов".
Ответить с цитированием
  #8  
Старый 07.10.2008, 15:54
Qwed86 Qwed86 вне форума
Новичок
 
Регистрация: 12.09.2008
Сообщения: 66
Репутация: 10
По умолчанию

Тут без исходника не угадаешь. Малоли что там в свойствах наворочено.
Ответить с цитированием
  #9  
Старый 07.10.2008, 16:02
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если дело в регистре, то надо так:

Код:
SQL.Add('WHERE UPPER(Fam) like "%'+AnsiUpperCase(f)+'%" or UPPER(Name) like "%'+AnsiUpperCase(f)+'%"');
Ответить с цитированием
  #10  
Старый 07.10.2008, 16:10
mik mik вне форума
Прохожий
 
Регистрация: 17.09.2008
Сообщения: 33
Репутация: 10
По умолчанию

Регистр, это только пример. Может быть и раскладка клавиатуры.
Пример с простой фамилией избавляет от первого и второго случаев, и при правильном использовании наших подсказок, artemavd сможет наконец-то посмотреть на результат своего творчества.
Ответить с цитированием
  #11  
Старый 07.10.2008, 16:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, да, согласен.
про регистр вообще просто лучше не забывать изначально. Поэтому лучше сразу на это заложиться.
Ответить с цитированием
  #12  
Старый 07.10.2008, 16:25
mik mik вне форума
Прохожий
 
Регистрация: 17.09.2008
Сообщения: 33
Репутация: 10
По умолчанию

Да, согласен. Про регистр. Про обработку исключений. Про защиту от "кривых" рук, или от "дураков", или как там это еще называется. Ну и т. п. Много есть всего, про что надо помнить.

Последний раз редактировалось mik, 07.10.2008 в 16:27.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter