Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как составить динамический запрос? [D6, IB6.x]


Страницы:   1 2

NightCon ©   (2002-10-15 12:09:00) 

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


Nikolay M.   (2002-10-15 16:02:00) [1]


> 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 + " ANDpole1 =2"
else
if (CheckBox2.Checked)
s:=s + "AND pole2 =20"
........
else
if (CheckBox3.Checked)
s:=s + "AND pole3 =4"


gek   (2002-10-15 15:28:00) [2]

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

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

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


Nikolay M.   (2002-10-15 15:23:00) [3]


> 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 orfield1="value1" andfield2="value2"". Это уже нюансы :)


gek   (2002-10-15 13:40:00) [4]

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


Alexandr   (2002-10-15 13:39:00) [5]

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


Max Zyuzin   (2002-10-15 13:36:00) [6]

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


Max Zyuzin   (2002-10-15 13:36:00) [7]

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


Alexandr   (2002-10-15 13:32:00) [8]

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

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


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

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

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


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

А вот и ни черта, если будет
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:26:00) [11]

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


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

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


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

AlexandrRULEZZZ!!!


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

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


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

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


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


NightCon   (2002-10-15 12:56:00) [16]

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


Alexandr   (2002-10-15 12:43:00) [17]

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


NickBat   (2002-10-15 12:39:00) [18]

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

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


gek   (2002-10-15 12:39:00) [19]

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)


Max Zyuzin   (2002-10-15 12:38:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо