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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2008, 15:47   #1
RDS2008
 
Регистрация: 06.03.2008
Сообщений: 6
По умолчанию Как сформировать запрос

Привет всем! У меня задача тут неразрешимая, мож кто подкинет идейку

Есть БД Access, в ней 10 таблиц с одинаковой структурой. На форме лежит CheckListBox с 10 строками (названия таблиц, но в удобоваримом виде, т.е. по русски). Что нужно: допустим пользователь выбирает одну или несколько таблиц (отмечает галочками в CheckListBox) и по нажатию кнопки формируем запрос по некоторому параметру (не важно какому) из тех и только из тех таблиц которые отмечены флажками. Я застрял на том что если пользователь выбрал 1 таблицу (поставил один флажок) то запрос будет один, а если выбрано сразу 7 таблиц - то запрос соответственно другой...подскажите какой нить вариант решения плиз...хоть намек никак не заборю
RDS2008 вне форума Ответить с цитированием
Старый 06.03.2008, 16:34   #2
ГОСЕАН
Форумчанин
 
Аватар для ГОСЕАН
 
Регистрация: 03.05.2007
Сообщений: 247
По умолчанию

а что должно выполняться? вычисление , отбор? сводный расчет?
ГОСЕАН вне форума Ответить с цитированием
Старый 06.03.2008, 16:41   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А что у вас за затруднения?
Пусть так:
Код:
tmp:='select * from ';
for i:=0 to CheckListBox1.Items.Count-1 do
begin
if CheckListBox1.Checked[i] then
begin
if tmp<>'select * from ' then
tmp:=tmp+', '+QuotedStr(имя [i]-й таблицы) else
tmp:=tmp+QuotedStr(имя [i]-й таблицы);
end;
end;
tmp:=tmp+' where ...';
//тут ваши условия (могут формироваться и ранее, с учетом выбранных таблиц)
Query.SQL.Text:=tmp;
Query.Open;

Последний раз редактировалось mihali4; 06.03.2008 в 16:43.
mihali4 вне форума Ответить с цитированием
Старый 06.03.2008, 16:41   #4
RDS2008
 
Регистрация: 06.03.2008
Сообщений: 6
По умолчанию

Цитата:
Сообщение от ГОСЕАН Посмотреть сообщение
а что должно выполняться? вычисление , отбор? сводный расчет?
Да нет, просто надо выводить содержимое отмеченных таблиц на печать, всего делов Но для того чтобы вывести данные в отчет нужен запрос...
RDS2008 вне форума Ответить с цитированием
Старый 06.03.2008, 16:46   #5
RDS2008
 
Регистрация: 06.03.2008
Сообщений: 6
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
А что у вас за затруднения?
Пусть так:
Код:
tmp:='select * from ';
for i:=0 to CheckListBox1.Items.Count-1 do
begin
if CheckListBox1.Checked[i] then
begin
if tmp<>'select * from ' then
tmp:=tmp+', '+QuotedStr(имя [i]-й таблицы) else
tmp:=tmp+QuotedStr(имя [i]-й таблицы);
end;
end;
tmp:=tmp+' where ...';
//тут ваши условия (могут формироваться и ранее, с учетом выбранных таблиц
Query.SQL.Text:=tmp;
Query.Open;
так так, уже ближе
вот это немного не понятно >> QuotedStr(имя [i]-й таблицы)
В CheckListBox1 не хранятся имена таблиц так как в БД, т.е. в CheckListBox1 например первая строка "Марка телефона" а в БД соответствующая таблица называется Mark_Phone
RDS2008 вне форума Ответить с цитированием
Старый 06.03.2008, 16:59   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
вот это немного не понятно
А вы совершите насилие над собой и заставьте себя заглянуть в хэлп...
Возможно, вы привыкли потреблять все разжеванным, но у нас и самостоятельно думать нужно...
Цитата:
В CheckListBox1 не хранятся имена таблиц так как в БД
Не дураки сидят...
Опять-таки - этот момент уж сами, пожалуйста...
mihali4 вне форума Ответить с цитированием
Старый 07.03.2008, 09:03   #7
RDS2008
 
Регистрация: 06.03.2008
Сообщений: 6
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
А вы совершите насилие над собой и заставьте себя заглянуть в хэлп...
Возможно, вы привыкли потреблять все разжеванным, но у нас и самостоятельно думать нужно...

Не дураки сидят...
Опять-таки - этот момент уж сами, пожалуйста...
Спасибо. Про QuotedStr я имел ввиду зачем здесь ее применять, ведь эта функция заключает строку в кавычки. Я прекрасно знаю что это за функция и хелпы читаю. Кавычки здесь не нужны.

Вообщем то я разобрался как сделать простой запрос, без where:

tmp:='select * from ';
for i:=0 to CheckListBox1.Items.Count-1 do
begin
if CheckListBox1.Checked[i] then
begin
if tmp<>'select * from ' then begin
tmp:=tmp+', '+TableArray[i];
end
else begin
tmp:=tmp+TableArray[i];
end;
end;
end;

Закатал все имена таблиц в массив TableArray, все нормально. Тока вот с where не получается пока. Если ее вставить после цикла то не получается обозначить таблицу (или несколько таблиц опять таки):
tmp:=tmp+' where '+TableArray[i] + '.ID=11';
т.к. значения для TableArray[i] мы получаем в зависимости от значения i. Потому как выставить условие надо для каждой таблицы

Значит надо впихнуть это в цикл, но куда?
Пока думаю. Есть мнения? Можно без разжевывания

Последний раз редактировалось RDS2008; 07.03.2008 в 09:16.
RDS2008 вне форума Ответить с цитированием
Старый 07.03.2008, 09:45   #8
RDS2008
 
Регистрация: 06.03.2008
Сообщений: 6
По умолчанию

Если сделать еще один цикл:

for i:=0 to CheckListBox1.Items.Count-1 do
begin
if CheckListBox1.Checked[i] then
begin
tmp:=tmp+ ' where ' +TableArray[i] + '.ID=11';
end;

то все получается с Where, но если талиц >1 то where пишется несколько раз:

'SELECT * FROM Table_1, Table_2 WHERE Table_1.ID=11 WHERE Table_2.ID=11'

Как бы убрать вторую и последующие where ...условие какое то надо придумать, думаю
RDS2008 вне форума Ответить с цитированием
Старый 07.03.2008, 14:09   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Советую все же обратить внимание на
Цитата:
if tmp<>'select * from ' then
tmp:=tmp+', '+QuotedStr(имя [i]-й таблицы) else
tmp:=tmp+QuotedStr(имя [i]-й таблицы);
Тогда и последние вопросы снимутся...
mihali4 вне форума Ответить с цитированием
Старый 07.03.2008, 14:13   #10
Domovoy
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 254
По умолчанию

Код:
  tmp:=copy(tmp,1,PosEx('WHERE',tmp,PosEX('WHERE',tmp)+6)-1);
Вот таким вот не хитрым способом ты избывишся от 2,3,4...where
Domovoy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запрос ссылается на несвязанный с ним запрос kolebatel SQL, базы данных 0 11.06.2008 12:50