|
Вопрос # 5 482/ вопрос решён / |
|
Здравствуйте, уважаемые эксперты!
Прошу помочь в решении одного вопроса.
Создается программа для выборки данных из базы MSSQL.
Выборка данных осуществляется с помощью стандартных компонентов.
ADOConnection, ADOQuery, DataSource, DBGrid.
Программно формируется SQL запрос, куда вводятся условия выборки данных.
Все нормально работает, если условия для ыборки данных наипростейшие, например, выбрать всех, у кого имя - Александр и отобразить данные по ним в DBGrid.
И вот самое главное.
Как сделать так, чтобы в DBGrid отобразить данные сразу по всем, у кого имя - Александр, Иван, Федор, Петр и т.д.
В приложении привожу код с помощью которого пытаюсь это сделать.
1. В текстовом файле перечисляю условия для выборки
Александр
Иван
Федор
Петр
и т.д.
2. Из файла перегоняю строки в ListBox и прохожусь циклом по строкам
Но одновременно отобразить данные в DBGrid не удается. Отображаются данные сначала по Александру, затем эти данные затираются данными по Ивану и т.д.
Подскажите, что не так делаю?
Заранее благодарен
Al_Sha
Приложение: Переключить в обычный режим-
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- if 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): Проблема мне кажется решена...
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|