Страница 1 из 1

А можно как-нибудь обращаться к "секциям" запроса?

Добавлено: 14 май 2008, 15:31
Antoxa
Можно обратиться к секции where или order by, или group by ?

Т.е. например есть запрос SELECT * FROM table1 WHERE field1=1

IBDataSet1.SQL(WHERE):='field2=2';

в результате запрос:

SELECT * FROM table1 WHERE field2=2

Re: А можно как-нибудь обращаться к "секциям" запр

Добавлено: 14 май 2008, 15:33
Antoxa
Antoxa писал(а): IBDataSet1.SQL(WHERE):='field2=2';
IBDataSet1.SelectSQL(WHERE):='field2=2';

Re: А можно как-нибудь обращаться к "секциям" запр

Добавлено: 14 май 2008, 15:42
Kotъ-Begemotъ
Ну, можно использовать FibDataset там есть макросы, можно вообще чёрта лысого сделать, а не только условие во WHERE поменять :) Как вариант.

Re: А можно как-нибудь обращаться к "секциям" запр

Добавлено: 15 май 2008, 08:05
dragon_art
создай запрос с параметрами.
типа:

Код: Выделить всё

select
  f1,
  f2,
  f3
from
  t1
where
  f1=:prmF1
перед открытием делай:

Код: Выделить всё

IBDataSet1.ParamByName('prmF1'):=something;
ps: давно занялся программированием и БД?

Re: А можно как-нибудь обращаться к "секциям" запр

Добавлено: 15 май 2008, 12:34
WildSery
dragon_art писал(а):ps: давно занялся [censored] ?
Прежде чем писать всякое, почитай чего хочет автор.
Какой параметр я должен подставить в твой запрос, если хочу изменить поле для сравнения?

Re: А можно как-нибудь обращаться к "секциям" запр

Добавлено: 15 май 2008, 14:24
KKomov
Antoxa писал(а):Можно обратиться к секции where или order by, или group by ?

Т.е. например есть запрос SELECT * FROM table1 WHERE field1=1

IBDataSet1.SQL(WHERE):='field2=2';

в результате запрос:

SELECT * FROM table1 WHERE field2=2
Вот как нечто подобное сделал я.

Сначала нам понадобится инструментарий:

Код: Выделить всё

//копия хвоста
String CopyTail(String s, int pos)
{
    return s.SubString(pos, s.Length()-pos+1);
}

//отрезать хвост
void CutTail(String *s, int pos)
{
    s->Delete(pos, size(s)-pos+1);
}

//перенести хвост, начиная с данной подстроки
void MoveTail(String *s, String mark, String *tail)
{
    int pos = s.Pos(mark);
    if(pos == 0)
    {
        *tail = "";
        return;
    }

    *tail = CopyTail(*s, pos);
    CutTail(s, pos);
}
Затем условимся во всех наших запросах начинать секции SELECT, FROM и т.д. с новой строки. После чего сочиним вот такой потрошитель:

Код: Выделить всё

//разделить оператор SQL на части
void SplitSQL(String SQL, String *S, String *F, String *W, String *O, String *G, String *H)
{
    MoveTail(&SQL, HAVING, H);
    MoveTail(&SQL, GROUP_BY, G);
    MoveTail(&SQL, ORDER_BY, O);
    MoveTail(&SQL, WHERE, W);
    MoveTail(&SQL, FROM, F);
    *S = SQL;
}
По конкретному вопросу секции WHERE:

Код: Выделить всё

//задать секцию WHERE
void SetWhereList(TStrings *SQL, String s)
{
    String S, F, W, O, G, H;
    SplitSQL(SQL->Text, &S, &F, &W, &O, &G, &H);
    W = "";
    if(s != "")
        W = String("WHERE\n")+s+"\n";
    //аккуратно упакуем
    SQL->Text = S+F+W+O+G+H;
}
Теперь можно так:

Код: Выделить всё

SetWhereList(IBDataSet1.SQL, "field2=2");

Re: А можно как-нибудь обращаться к "секциям" запр

Добавлено: 15 май 2008, 16:50
dragon_art
WildSery писал(а):...
прошу прощения у Antoxa...

вариант: юзать динамические запросы.
или то, что предлагает Kotъ-Begemotъ