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

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

Строка ключей и оператор SELECT [D6, D7, MSSQL]


isasa ©   (2007-04-17 22:02:00) 

Существует список ключей в виде строки 'key1,key,2,key3...keyN'. Необходимо сделать вяборку оператором SELECT,
в котором я должен в условие WHERE добавить выбор по списку(как видится, WHERE ... and Field in (mask) ).

Проблема в следующем:
я могу тупо написать строку запроса в D и модифицировать CommandText в самой программе

SQLcomm:= 'SELECT ... WHERE ... and Field in (%s)'
TADODataSet.CommandText:=format(SQLcomm,[MaskStr]);

но, приданном подходе текст запроса попадает в компилированный код, это плохо.

Второй, не пройденный вариант, модифицировать строку запроса на сервере.

create procedure AAA
  @Mask varchar(255)
...
begin
   declare SQLbuf varchar(1024)
...
   set @SQLbuf = 'SELECT ... WHERE ... and Field in ('+@Mask+')';
...
   execute (@SQLbuf)
end

Из D жанное чуде выбираем TADODataSet, где в CommandText:='execute AAA ...'

Второй вариант не работает, сообщение - нет набора данных.
Буду очень благодарен за соображения, избарляющие включенияе текста запроса в компилируемый код.


isasa   (2007-04-18 14:58:00) [1]

Ega23 ©   (18.04.07 13:53) [10]
:)
Да ну его. Датасет используется в невизуальном отдельном потоке. Мне дизайн там до лампочки.

Sergey13 ©   (18.04.07 14:19) [11]
Тут и так забываешь основные таблицы заказчику пересылать. :)
А тут еше служебная. Не хочется.


Sergey13   (2007-04-18 14:19:00) [2]

> [9] isasa ©   (18.04.07 13:41)
> Тоже вариант, но меня временные таблицы(как глобальные,
> так и локальные) уже задрали ...

Я не про временные, я про "служебные". Вполне себе постоянная таблица, в которой хранится инфа, например настроечная, для работы программы.


Ega23   (2007-04-18 13:53:00) [3]


> Матерится при запуске редактора полей TADODataSet.


Либо коннект только в ран-тайме выставляется, либо мастер-детальная связь, а мастер не открыт, либо дефолтные значения параметров не заданы.


isasa   (2007-04-18 13:41:00) [4]

Jan1   (18.04.07 13:08) [6]
не знаю. у меня грид все показал, как-то же он в рантайме получил список полей?


Грид все показывает. Тут все нормально. Матерится при запуске редактора полей TADODataSet.

Ega23 ©   (18.04.07 13:14) [7]
:)
Ну я приблизительно так и делаю. Я не все написал в вопросе. Комбинаций запроса - штук 16. Просто фильтр по списку дабавляется потом, как ты написал ... :)

Sergey13 ©   (18.04.07 13:15) [8]
:)
Тоже вариант, но меня временные таблицы(как глобальные, так и локальные) уже задрали ...


Sergey13   (2007-04-18 13:15:00) [5]

> [0] isasa ©   (17.04.07 22:02)

Как вариант. Завести в БД для таких случаев отдельную табличку со структурой (идентификатор, значение). Привязать ее к запросу. Меняя наполнение таблицы получаем то, что хотим.


Ega23   (2007-04-18 13:14:00) [6]


> Да, хронически виноват. В рантайм все работает. В дизайн
> не удается получить список полей, ну и фиг с ним.


Так попробуй:

create procedure AAA
@Mask varchar(255) =''
...
begin
 declare SQLbuf varchar(1024)
...
 set @SQLbuf = 'SELECT ... WHERE ... '
 if @Mask<>'' Set @SQLBuf=@SQLBuf + 'and Field in ('+@Mask+')';
...
 execute (@SQLbuf)
end


Jan1   (2007-04-18 13:08:00) [7]


> В дизайн не удается получить список полей, ну и фиг с ним.

не знаю. у меня грид все показал, как-то же он в рантайме получил список полей?


isasa   (2007-04-18 12:53:00) [8]

Jan1   (18.04.07 10:58) [4]

Да, хронически виноват. В рантайм все работает. В дизайн не удается получить список полей, ну и фиг с ним.

Johnmen ©   (18.04.07 09:14) [1]
>  избарляющие включенияе текста запроса в компилируемый код.
Религия? :)


:)
Почти. Но к заказчику легче апдейтом гнать один *.sql файл, размером пару килобайт, чем *.dll размером в несколько мегабайт ...


Jan1   (2007-04-18 10:58:00) [9]


> Второй вариант не работает, сообщение - нет набора данных.

только что проверил - работает. Мож ADO у тебя глюкавый или MDAC?


stone   (2007-04-18 10:53:00) [10]


> isasa ©   (17.04.07 22:02)  

Как вариант пишется довольно простая функция по разбору строки, возвращающая результат в виде рекордсета. А там уже хоть ин, хоть джойн.


Ega23   (2007-04-18 09:33:00) [11]


create procedure AAA
 @Mask varchar(255)
...
begin
  declare SQLbuf varchar(1024)
...
  set @SQLbuf = 'SELECT ... WHERE ... and Field in ('+@Mask+')';
...
  execute (@SQLbuf)
end


Должно работать.
В Query Analyzer процедура НД возвращает?


Johnmen   (2007-04-18 09:14:00) [12]


>  избарляющие включенияе текста запроса в компилируемый код.

Религия? :)


Наверх

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