Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 482

/ вопрос решён /

Здравствуйте, уважаемые эксперты!
Прошу помочь в решении одного вопроса.
Создается программа для выборки данных из базы MSSQL.
Выборка данных осуществляется с помощью стандартных компонентов.
ADOConnection, ADOQuery, DataSource, DBGrid.
Программно формируется SQL запрос, куда вводятся условия выборки данных.
Все нормально работает, если условия для ыборки данных наипростейшие, например, выбрать всех, у кого имя - Александр и отобразить данные по ним в DBGrid.
И вот самое главное.
Как сделать так, чтобы в DBGrid отобразить данные сразу по всем, у кого имя - Александр, Иван, Федор, Петр и т.д.
В приложении привожу код с помощью которого пытаюсь это сделать.

1. В текстовом файле перечисляю условия для выборки
Александр
Иван
Федор
Петр
и т.д.
2. Из файла перегоняю строки в ListBox и прохожусь циклом по строкам

Но одновременно отобразить данные в DBGrid не удается. Отображаются данные сначала по Александру, затем эти данные затираются данными по Ивану и т.д.

Подскажите, что не так делаю?
Заранее благодарен
Al_Sha

Приложение:
  1.  
  2.  
  3. procedure TForm1.Button1Click(Sender: TObject);
  4. begin
  5. if OpenDialog1.Execute then
  6. Edit1.Text := OpenDialog1.FileName;
  7. ListBox1.Items.LoadFromFile(Edit1.Text);
  8.  
  9. end;
  10.  
  11. //
  12. procedure TForm1.Button2Click(Sender: TObject);
  13. var
  14. where: string;
  15. k: Integer;
  16. begin
  17. if not ADOConnection1.Connected then Exit;
  18.  
  19.  
  20. for k := 0 to ListBox1.Items.Count-1 do
  21. begin
  22. where := '(IMENA.a1 = ''' + ListBox1.Items.Strings[k]+ ''')';
  23. with ADOQuery1.SQL do
  24. begin
  25. Clear;
  26. Add('USE BASE3');
  27. Add('SET NOCOUNT ON');
  28.  
  29.  
  30.  
  31.  
  32. Add('WHERE _____________ AND (' + where + ')');
  33. Add('SET NOCOUNT OFF');
  34. end;
  35. try
  36. ADOQuery1.Open;
  37. except
  38.  
  39. Exit;
  40. end;
  41. DataSource1.DataSet := ADOQuery1;
  42. DBGrid1.DataSource := DataSource1;
  43. with DBGrid1.Columns do
  44. begin
  45. Items[0].Width := 80;
  46. Items[1].Width := 80;
  47. Items[2].Width := 100;
  48. Items[3].Width := 70;
  49. Items[4].Width := 70;
  50. Items[5].Width := 190;
  51. Items[6].Width := 400;
  52. Items[7].Width := 599;
  53. Items[8].Width := 599;
  54. end;
  55.  
  56. end;
  57.  
  58. end;


Al_Sha Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Al_Sha (статус: Посетитель)
Вопрос отправлен: 5 июля 2011, 19:54
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Мережников Андрей

Здравствуйте, Al_Sha!
изменяете свой код (процедуру button2Click) следующим образом (всю процедуру переписывать не буду, только изменяемую часть):

procedure TForm1.Button2Click(Sender: TObject);
var
  where: string;
   k: Integer;
begin
  if not ADOConnection1.Connected then Exit;
 
  //Цикл по строкам ListBox
  where:=QuotedStr(ListBox1.Items.Strings[0]);
  for k:=1 to ListBox1.Items.Count-1
  do where:=where+','+QuotedStr(ListBox1.Items.Strings[k]);
  where:='(imena.al in ('+where+'))';
  with ADOQuery1.SQL do
  begin
    Clear;
    Add(\'USE BASE3\');
    Add(\'SET NOCOUNT ON\');
    Add(\'SELECT TOP 50 IMENA.a2 [ИМЯ], DATE_R.b2 [Дата рождения],_____________, \');
    //  ...................... SQL запрос достаточно большой
    //   ...................... поэтому
    //   ...................... сокращаю
    Add(\'WHERE _____________ AND (\' + where + \')\');
    Add(\'SET NOCOUNT OFF\');
  end;
  try
    ADOQuery1.Open;
  except
    ShowMessage(\'Неверный формат базы данных\');
    Exit;
  end;
//дальше остаток процедуры с настройкой компонентов, правда непонятно почему это нельзя сделать на этапе
//проектирования

Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 6 июля 2011, 06:45
Оценка за ответ: 5

Комментарий к оценке: Спасибо большое, все работает !!!
С уважением
Al_Sha

Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 5 июля 2011, 22:07; участников в обсуждении: 3.
bugmenot

bugmenot (статус: 3-ий класс), 5 июля 2011, 20:14 [#1]:

ключевое слово - UNION

а по-хорошему надо группировку по именам (без DDL гадать не буду)
виконання програми розпочинається з того самого мiсця, де призупинилося.

Мережников Андрей

Мережников Андрей (статус: Абитуриент), 5 июля 2011, 20:29 [#2]:

можно и без union. Для этого в цикле формируем строку из списка имен примерно так:
where:=QuotedStr(ListBox1.Items.Strings[0]);
for k:=1 to ListBox1.Items.Count-1
do where:=where+','+QuotedStr(ListBox1.Items.Strings[k]);
where:='(imena.al in ('+where+'))';
а дальше формируем полностью запрос и делаем open (ВНЕ ЦИКЛА!)
Al_Sha

Al_Sha (статус: Посетитель), 5 июля 2011, 20:40 [#3]:

Уважаемый Мережников Андрей

>Для этого в цикле формируем строку из списка имен примерно >так:
>where:=QuotedStr(ListBox1.Items.Strings[0]);
>for k:=1 to ListBox1.Items.Count-1
>do where:=where+','+QuotedStr(ListBox1.Items.Strings[k]);
>where:='(imena.al in ('+where+'))';
>а дальше формируем полностью запрос и делаем open (ВНЕ >ЦИКЛА!)

можно чуть поподробнее?
Al_Sha
bugmenot

bugmenot (статус: 3-ий класс), 5 июля 2011, 22:07 [#4]:

да, WHERE...IN почище будет, чем туча UNION
виконання програми розпочинається з того самого мiсця, де призупинилося.

6 июля 2011, 09:09: Статус вопроса изменён на решённый (изменил автор вопроса — Al_Sha): Проблема мне кажется решена...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:25
Выполнено за 0.03 сек.