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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2012, 21:24   #1
Xakand_2009
Пользователь
 
Регистрация: 09.01.2010
Сообщений: 23
Восклицание Не работает сравнение "Фамилии" с "ФИО"

Здравствуйте.

Имеется база данных MS Access, в ней таблицы. В одной из таблиц имеются Фамилии сотрудников, которые выводятся в ListBox. При клике на фамилии в ListBox'е в DBGrid выводится вся необходимая информация о выбранном сотруднике. Почему если в ListBox'е находятся Фамилии с инициалами, то данная схема не работает (см. приложенный файл)?

Спасибо.
Разницы нет, когда не-с-чем сравнить!
Xakand_2009 вне форума Ответить с цитированием
Старый 11.07.2012, 22:32   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

А почему непонятно?
Возьмем, к примеру, условие фильтра запроса:
Код:
SQL.Add('Where Анкета.Фамилия Like '+QuotedStr('%'+ListBox1.Items[ListBox1.ItemIndex]+'%'));
Что получим в результирующем тексте запроса?
Правильно:
...Where Анкета.Фамилия Like '%Иванов И. И.%'
А строка со значением "Иванов И. И." в поле Фамилия таблицы Анкета есть?
Вот результат запроса и получается пустым.
Прик вне форума Ответить с цитированием
Старый 11.07.2012, 22:42   #3
Xakand_2009
Пользователь
 
Регистрация: 09.01.2010
Сообщений: 23
Вопрос

Цитата:
Сообщение от Прик Посмотреть сообщение
А почему непонятно?
Возьмем, к примеру, условие фильтра запроса:
Код:
SQL.Add('Where Анкета.Фамилия Like '+QuotedStr('%'+ListBox1.Items[ListBox1.ItemIndex]+'%'));
Что получим в результирующем тексте запроса?
Правильно:
...Where Анкета.Фамилия Like '%Иванов И. И.%'
А строка со значением "Иванов И. И." в поле Фамилия таблицы Анкета есть?
Вот результат запроса и получается пустым.
Как убрать символы после фамилии и сравнить фамилию с фамилией без имени-отчества?
Разницы нет, когда не-с-чем сравнить!
Xakand_2009 вне форума Ответить с цитированием
Старый 11.07.2012, 23:09   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Как убрать...
В листбоксе надо спасти идентификатор строк и здесь же сформировать строку из фамилии и инициалов:
Код:
{---------------Выбор закладки из ComboBox'а------------}
procedure TForm1.ComboBox1Select(Sender: TObject);
var
  S : string;
begin
  Label1.Caption:=ComboBox1.Text;
  ListBox1.Clear;
//-----------------------------
  with ADOQuery4 do begin
    Close;
    SQL.Text := 'Select * From Анкета Where Фамилия LIKE '+QuotedStr(ComboBox1.Text+'%')+
                ' ORDER BY Фамилия';
    Open;
    while not Eof do begin
      S := ADOQuery4.FieldByName('Фамилия').AsString+' '+
           Copy(ADOQuery4.FieldByName('Имя').AsString, 1, 1)+'.'+
           Copy(ADOQuery4.FieldByName('Отчество').AsString, 1, 1)+'.';
      ListBox1.Items.AddObject(S, TObject(ADOQuery4.FieldByName('КодАнкеты').AsInteger));
    ADOQuery4.Next;
  end;
end;
Дополнительный запрос уже не нужен.
При выборке из листбокса фамилии в условие подставляем не фамилию, а сохраненное ранее значение идентификатора строки из таблицы Анкета:
Код:
//-------------Выбор фамилии в ListBox'е----------------------
procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Edit1.Text := ListBox1.Items[ListBox1.ItemIndex];
  try
    with ADOQuery3 do begin
      Active:=False;
      SQL.Clear;
      SQL.Add('SELECT Анкета.Фамилия, Анкета.Имя, Анкета.Отчество, Анкета.[Дата занесения],');
      SQL.Add('[Места работы].[Дата поступления], [Места работы].[Место работы],');
      SQL.Add('[Места работы].[Дата увольнения], [Места работы].[Причина увольнения]');
      SQL.Add('FROM Анкета INNER JOIN [Места работы]');
      SQL.Add('ON Анкета.КодАнкеты=[Места работы].КодАнкеты');
      SQL.Add('Where Анкета.КодАнкеты = '+IntToStr(Integer(ListBox1.Items.Objects[ListBox1.ItemIndex])));
      Open;
    end
  except
    On e : EDatabaseError do
      messageDlg(e.message, mtError, [mbOK],0);
   end
end;
И все.

Последний раз редактировалось Прик; 11.07.2012 в 23:12.
Прик вне форума Ответить с цитированием
Старый 11.07.2012, 23:55   #5
Xakand_2009
Пользователь
 
Регистрация: 09.01.2010
Сообщений: 23
Хорошо

Цитата:
Сообщение от Прик Посмотреть сообщение
...И все.
Прик, Спасибо за подробный ответ!
Разницы нет, когда не-с-чем сравнить!
Xakand_2009 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
МасОС не работает ,хоть и Видит,Интернет и "сломалась" "Сеть" =/ ApxuKILLER Операционные системы общие вопросы 2 05.05.2011 08:22
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04