Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.04;
Скачать: CL | DM;

Вниз

Как составить динамический запрос?   Найти похожие ветки 

 
NightCon ©   (2002-10-15 12:09) [0]

Вся проблема в том что в запрос может входить разное число полей. Выглядит это примерно так: на форме запроса ставится галочка (CheckBox) напротив поля, и вводится значение.


 
Max Zyuzin ©   (2002-10-15 12:22) [1]

Ну и в чем проблемма?
В цикле проходите по всем вашим checkbox ам и добавляете связонное с ними имя поля в строку запроса...


 
Наталия ©   (2002-10-15 12:23) [2]

with Query1 do
begin
active:=false;
sql.clear;
sql.add("select ");
if (условие) then sql.add("pole1,");
.....
sql.add("from table1")
active:=true;
end;


 
NightCon ©   (2002-10-15 12:34) [3]

Наверна, я немного неправильно объяснил...
запрос будет выглядеть примерно так:

select * from table where
pole1 = x
pole2 = y
pole4 = z;

Т.е. может не быть pole1 и быть pole3.


 
Max Zyuzin ©   (2002-10-15 12:38) [4]

Ну и какая разница?
в цикле добавляй строки
pole1 = x;
Или вы не знаете как проити в цикле по всем CheckBox..??


 
gek ©   (2002-10-15 12:39) [5]

var
s:string
begin
s:="select * from table where ";
if (CheckBox1.Checked)
s:=s + " pole1 =2"
else
if (CheckBox2.Checked)
s:=s + "AND pole2 =20"
........
else
if (CheckBox3.Checked)
s:=s + "AND pole3 =4"

см Наталия © (15.10.02 12:23)


 
NickBat ©   (2002-10-15 12:39) [6]

все равно никакой проблемы:

if CheckBox then
... добавляешь свое условие.


 
Alexandr ©   (2002-10-15 12:43) [7]

ну и что...
в чем проблема? Такие задачки изучают еще в школе на уроках программирования...


 
NightCon ©   (2002-10-15 12:56) [8]

2 GEK:
CheckBox1.Checked = False;
CheckBox2.Checked = True;
=>
select * from table where and pole2=y and pole3=z;
вот на такую строку запроса IMHO выпадет ошибка.
2 Alexandr
А хочется сделать красиво, а не в лоб как в школе...


 
gek ©   (2002-10-15 13:03) [9]

Ну ешки-матрешки


var
s,s1,s2:string
bool:boolean;
begin
bool:=false;
s:="select * from table ";
s2:="where ";
if (CheckBox1.Checked)
begin
bool:=true;
s1:=s1 + " pole1 =2";
end
.........
if bool then
s:=s + s2 + s1


 
Alexandr ©   (2002-10-15 13:14) [10]

нет просто надо было в всое время в школе тоже красиво код писать а не тяп ляп.
Тут же все проще паренной репы.
А вы развели флейм.
2NightCon: если уж совсем руки не оттдута растут, то после того как получишь select * from table where and pole2=y and pole3=z;
примени патч replacestr(s, "where and" "and");


 
novill ©   (2002-10-15 13:21) [11]

Alexandr RULEZZZ!!!


 
NightCon ©   (2002-10-15 13:23) [12]

Все уже разобрался...
2Alexandr: и это по-твоему красиво?


 
Alexandr ©   (2002-10-15 13:26) [13]

да, и еще хочу добавить.
Пока эту задачу не научишься решать минимум 5 алгоритмически разными способами при этом с первого раза, без ошибок компиляции и исполнения, к программированию реальных задач не приступай.


 
gek ©   (2002-10-15 13:27) [14]

А вот и ни черта, если будет
select * from table where and pole2=y and pole3=z;
а затем - replacestr(s, "where and" "and");
то получим
select * from table and pole2=y and pole3=z;
тогда уж надо
replacestr(s, "where and" "");



 
Alexandr ©   (2002-10-15 13:30) [15]

а на форуме кричать "Я ДУРАК потому что не могу решить элементарную задачку, что говорит о том, что в школе я учился исключительно плохо" красиво?
Мой тебе совет: пей поменьше "вотки" пока не поздно...

Ну все пора останавливаться, а то меня понесло...


 
Alexandr ©   (2002-10-15 13:32) [16]

бля,
replacestr(s, "where and" "where");

ну что, уж так трудно сообразить?


 
Max Zyuzin ©   (2002-10-15 13:36) [17]

Алекс, успокойся :)) Сходи на хоккей :))


 
Max Zyuzin ©   (2002-10-15 13:36) [18]

Сорри за оффтоп.


 
Alexandr ©   (2002-10-15 13:39) [19]

я спокоен.
Просто некоторые меня выводят.
Ну не понимаю я их, как врочем и хоккей ;)


 
gek ©   (2002-10-15 13:40) [20]

> Alexandr © (15.10.02 13:32)
Саня, не кипятись.


 
Nikolay M. ©   (2002-10-15 15:23) [21]


> NightCon © (15.10.02 12:56)
> select * from table where and pole2=y and pole3=z;
> вот на такую строку запроса IMHO выпадет ошибка.

А я обычно формирую перед циклом или таким вот списком условий не строку "select * from table where", а "select * from table where 1", а дальше не думая добавляю условия " and fieldN="valueN"". Даже если не пройдет ни одно из условий, запрос будет синтаксически правильный (select * from table where 1) и не нужно вбивать костыли вроде флага или replace-а.
ПС
Ну, ессесно с поправками, что может быть не "1", а "true", грамотно расставить скобки, чтобы не получилось "where 1 or field1="value1" and field2="value2"". Это уже нюансы :)


 
gek ©   (2002-10-15 15:28) [22]

приведи реальный код, а именно
на

select * from table where 1
select * from table where true

это как же такое может работать?


 
Nikolay M. ©   (2002-10-15 16:02) [23]


> gek © (15.10.02 15:28)
> приведи реальный код, а именно на
> select * from table where 1


А что именно не нравится? Синтаксис запроса? Он будет разным, в зависимости от СУБД. MySQL, например, на "select * from table where 1" выдаст целиком всю таблицу. В IB, наверное, нужно писать "select * from table where true" или любое другое незначащее условие, вроде "1=1". Или вопрос по поводу кода, формирующего запрос? Вот твой вариант, в котором добавлено всего 4 символа:

var
s:string
begin
s:="select * from table where 1";
if (CheckBox1.Checked)
s:=s + " AND pole1 =2"
else
if (CheckBox2.Checked)
s:=s + "AND pole2 =20"
........
else
if (CheckBox3.Checked)
s:=s + "AND pole3 =4"




Страницы: 1 вся ветка

Текущий архив: 2002.11.04;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.014 c
3-11114
jen_bond
2002-10-12 14:16
2002.11.04
Узнать разницу между датами


7-11504
Arkan
2002-07-07 10:35
2002.11.04
Модем


3-11115
Антоха
2002-10-16 12:42
2002.11.04
Констрайнт


1-11267
Stocker!
2002-10-22 12:24
2002.11.04
Цветная кнопка TSpeedButton и иже с ними


1-11304
GGWIN
2002-10-21 18:53
2002.11.04
Ламерский вопрос про создание своих компонентов