| 
| 
 | Вопрос # 5 482/ вопрос решён / | 
 |  Здравствуйте, уважаемые эксперты!Прошу помочь в решении одного вопроса.
 Создается программа для выборки данных из базы MSSQL.
 Выборка данных осуществляется с помощью стандартных компонентов.
 ADOConnection, ADOQuery, DataSource, DBGrid.
 Программно формируется SQL запрос, куда вводятся условия выборки данных.
 Все нормально работает, если условия для ыборки данных наипростейшие, например, выбрать всех, у кого имя - Александр и отобразить данные по ним в DBGrid.
 И вот самое главное.
 Как сделать так, чтобы в DBGrid отобразить данные сразу по всем, у кого имя - Александр, Иван, Федор, Петр и т.д.
 В приложении привожу код с помощью которого пытаюсь это сделать.
 
 1. В текстовом файле перечисляю условия для выборки
 Александр
 Иван
 Федор
 Петр
 и т.д.
 2. Из файла перегоняю строки в ListBox и прохожусь циклом по строкам
 
 Но одновременно отобразить данные в DBGrid не удается. Отображаются данные сначала по Александру, затем эти данные затираются данными по Ивану и т.д.
 
 Подскажите, что не так делаю?
 Заранее благодарен
 Al_Sha
 Приложение:Переключить в обычный режим   procedure TForm1.Button1Click(Sender: TObject);beginif OpenDialog1.Execute then    Edit1.Text := OpenDialog1.FileName;    ListBox1.Items.LoadFromFile(Edit1.Text); end; //procedure TForm1.Button2Click(Sender: TObject);var  where: string;   k: Integer;begin  if not ADOConnection1.Connected then Exit;    for k := 0 to ListBox1.Items.Count-1 do  begin     where := '(IMENA.a1 = ''' + ListBox1.Items.Strings[k]+ ''')';    with ADOQuery1.SQL do    begin      Clear;      Add('USE BASE3');     Add('SET NOCOUNT ON');          Add('WHERE _____________ AND (' + where + ')');      Add('SET NOCOUNT OFF');    end;    try      ADOQuery1.Open;    except       Exit;    end;    DataSource1.DataSet := ADOQuery1;    DBGrid1.DataSource := DataSource1;    with DBGrid1.Columns do    begin      Items[0].Width := 80;      Items[1].Width := 80;      Items[2].Width := 100;      Items[3].Width := 70;      Items[4].Width := 70;      Items[5].Width := 190;      Items[6].Width := 400;      Items[7].Width := 599;      Items[8].Width := 599;    end;   end; end;
|  |   Вопрос задал: 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 (статус: 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 (статус: Посетитель), 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 (статус: 3-ий класс), 5 июля 2011, 22:07 [#4]:да, WHERE...IN почище будет, чем туча UNION виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  6 июля 2011, 09:09: Статус вопроса изменён на решённый (изменил автор вопроса — Al_Sha): Проблема мне кажется решена... Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |