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

Вниз

Delphi+SQL. Как добавить запрос к уже выполненому запросу   Найти похожие ветки 

 
alk ©   (2006-03-06 09:17) [0]

Есть заброс который выводит данные из 3х таблиц, как сделать новый запрос, чтобы выбрать данные из уже выполненного отчета. Например есть база книг с кодами книг, автора и издательства. В начале выводиться все книги, затем пользователь выбирает автора, как вывести всех авторов не меняя самый первый запрос. И затем пользователь выбирает издательство, как не меняя те два запроса отсортировать таблицу???


 
Sergey13 ©   (2006-03-06 09:23) [1]

2alk ©   (06.03.06 09:17)
>В начале выводиться все книги,
Зачем?

>затем пользователь выбирает автора,
Почему не сразу спросить его об авторе?

>как вывести всех авторов не меняя самый первый запрос.
Выполнить второй.


 
alk ©   (2006-03-06 09:27) [2]

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


 
Sergey13 ©   (2006-03-06 09:38) [3]

2[2] alk ©   (06.03.06 09:27)
Обычно - сначала спрашивают, что надо, потом делают, а не наоборот.
Можно написать универсальный запрос с параметрами, учитывающий все вводимые параметры (этот способ предпочтительнее всего). Можно переписывать текст запроса, анализирую пользовательский выбор (менее предпочтительно). Можно загрузить все себе и потом извращаться на клиенте с фильтрацией/сортировкой (возможно, но на больших объемах можно и обломиться ждавши). По разному в общем можно.


 
alk ©   (2006-03-06 09:40) [4]

а как так чтобы если пользователь не выбрал какой то пораметр, то параметр в sql выбирал все записи? у меня получаеться если не чего не выбираеться то значение равно  null. а как сделать чтобы было не null а все записи?


 
Ormada ©   (2006-03-06 09:48) [5]

ну делай временную таблицу в памяти(Rx к примеру) заполняй её а потом использую Rx какой то там query (а-ля TxQuery)можешь делать запросы к таблице


 
alk ©   (2006-03-06 09:51) [6]

а если в таблице будет 5000 записей, наверное будет проблемотично их переносить из одной базы в другую?


 
Sergey13 ©   (2006-03-06 09:54) [7]

2[4] alk ©   (06.03.06 09:40)
>а как так чтобы если пользователь не выбрал какой то пораметр
where....
...and ((:par is null) or (field_name=:par))


 
alk ©   (2006-03-06 10:03) [8]

вот первый запрос который выберает всех авторов

select * from Book, avtors,izdatelstva,litra where avtors.kod_avtora=:kod_avt and book.kod_izdatelstva=izdatelstva.kod_izdatelstva and book.kod_tip_litra=litra.kod_tip_litra and book.kod_avtora=:kod_avt

второй запрос который выбирает все издательства

select * from Book, avtors,izdatelstva,litra where avtors.kod_avtora=book.kod_avtora and izdatelstva.kod_izdatelstva=:kod_izd and book.kod_tip_litra=litra.kod_tip_litra and book.kod_izdatelstva=:kod_izd

как их модифицировать???


 
Sergey13 ©   (2006-03-06 10:09) [9]

select *
from Book, avtors,izdatelstva,litra
where book.kod_izdatelstva=izdatelstva.kod_izdatelstva and book.kod_tip_litra=litra.kod_tip_litra and book.kod_avtora=avtors.kod_avtora
and ((:kod_avt is null) or (avtors.kod_avtora=:kod_avt))
and ((:kod_izd is null) or (book.kod_izdatelstva=:kod_izd))


 
alk ©   (2006-03-06 10:16) [10]

при данном запросе если не чего не выбираешь пишет: could not convert variant of type(null) into type (string)
а если один параметр не задан(или даже оба заданы): dynamic SQL Error SQL error code=-804 Data type unknown


 
Sergey13 ©   (2006-03-06 10:18) [11]

2[10] alk ©   (06.03.06 10:16)
>при данном запросе если не чего не выбираешь
Код присвоения параметров покажи.


 
alk ©   (2006-03-06 10:20) [12]

DataModule2.BOOK.Params.Add;
DataModule2.BOOK.Params.Items[0].Name:="kod_avt";
DataModule2.BOOK.Params.Items[0].Text:=DBLookupComboBox1.KeyValue;


 
alk ©   (2006-03-06 10:23) [13]

ну или так присваиваються оба параметра)))
DataModule2.BOOK.Params.Add;
DataModule2.BOOK.Params.Items[0].Name:="kod_avt";
DataModule2.BOOK.Params.Items[0].Text:=DBLookupComboBox1.KeyValue;
DataModule2.BOOK.Params.Add;
DataModule2.BOOK.Params.Items[1].Name:="kod_izd";
DataModule2.BOOK.Params.Items[1].Text:=DBLookupComboBox2.KeyValue;


 
ANB ©   (2006-03-06 10:35) [14]

Имхо. В таких случаях лучше модифицировать текст запроса, т.к. запросы с OR могут поломать план исполнения.
ЗЫ. Какое то странное присвоение параметров, используемые компоненты текст запроса парсить не умеют ?


 
alk ©   (2006-03-06 10:37) [15]

ANB, А как параметры надо присваивать тогда??? и чтобы ты мог посоветовать???


 
Sergey13 ©   (2006-03-06 10:43) [16]

2[13] alk ©   (06.03.06 10:23)
А зачем ты их добавляешь? Что за компоненты доступа?
if DBLookupComboBox1.Text<>"" theh
  DataModule2.BOOK.Params.ParamByName("kod_avt").asString := DBLookupComboBox1.KeyValue
else
 DataModule2.BOOK.Params.ParamByName("kod_avt").Clear;


 
alk ©   (2006-03-06 10:47) [17]

Sergey13
все отображаеться в dbgrid"е, обработка идет через ibquery. а как тогда сделать, чтобы не добавлять. просто через саму среду разработки добавить параметры?


 
Плохиш ©   (2006-03-06 10:56) [18]


> alk ©   (06.03.06 10:47) [17]
>  а как тогда сделать, чтобы не добавлять. просто через саму
> среду разработки добавить параметры?

Для начала рекомендую почитать про свойство Prepared и метод Prepare.


 
Sergey13 ©   (2006-03-06 10:56) [19]

2[17] alk ©   (06.03.06 10:47)
>все отображаеться в dbgrid"е,
Это понятно.

>обработка идет через ibquery
Т.е. IBX. Тогда предпочтительнее использовать IBDataSet.

>просто через саму среду разработки добавить параметры
Написав запрос ты уже их задал. После только присваивать значения.


 
ANB ©   (2006-03-06 10:57) [20]


> alk ©   (06.03.06 10:47) [17]

Вообще то практически все компоненты - дейтасеты сами парсят запрос при его присваивании и заполняют параметры.
Исключение - DOA, но там вообще вместо параметров - переменные.


 
alk ©   (2006-03-06 10:59) [21]

Плохиш
а где можно прочитать про это свойство и этот метод???


 
alk ©   (2006-03-06 11:00) [22]

Sergey13
тоесть в начале надо писать сам запрос, а затем присваивать значение параметрам???


 
Плохиш ©   (2006-03-06 11:06) [23]


> alk ©   (06.03.06 10:59) [21]
> Плохиш
> а где можно прочитать про это свойство и этот метод???

Это военная тайна и её по секрету расказывают только начинающим.


 
alk ©   (2006-03-06 11:07) [24]

Плохишь
))) ну так скажи по секрету)))


 
Sergey13 ©   (2006-03-06 11:09) [25]

2[22] alk ©   (06.03.06 11:00)
>тоесть в начале надо писать сам запрос, а затем присваивать значение параметрам???
Да запрос сначала, причем если ты воспользуешься моим советом, то лучше его написать в Дизайн-тайме (во время разработки).

2[24] alk ©   (06.03.06 11:07)
>))) ну так скажи по секрету)))
Это военная тайна. Могу сказать только F1. 8-)


 
alk ©   (2006-03-06 11:13) [26]

Sergey13
написал я после запроса, один фиг не работает.
если не чего не выбираешь или выбираешь 1 параметр пишет из null в string,
а если два параметра то data type unknown


 
Sergey13 ©   (2006-03-06 11:18) [27]

2 [26] alk ©   (06.03.06 11:13)
Свой запрос приведи. Полностью, без купюр.


 
alk ©   (2006-03-06 11:21) [28]

вот что написанно в обработчике по нажатию кнопки(должен сортировать таблицу используя параметры выбранные пользователем)

DataModule2.BOOK.Close;
     DataModule2.BOOK.SQL.Clear;
     DataModule2.BOOK.SQL.Text:="select *";
     DataModule2.BOOK.SQL.Add("from Book, avtors,izdatelstva,litra");
     DataModule2.BOOK.SQL.Add("where book.kod_izdatelstva=izdatelstva.kod_izdatelstva and");
     DataModule2.BOOK.SQL.Add("book.kod_tip_litra=litra.kod_tip_litra and book.kod_avtora=avtors.kod_avtora");
     DataModule2.BOOK.SQL.Add("and ((:kod_avt is null) or (avtors.kod_avtora=:kod_avt))");
     DataModule2.BOOK.SQL.Add("and ((:kod_izd is null) or (book.kod_izdatelstva=:kod_izd))");
     DataModule2.BOOK.Params.ParamByName("kod_avt").Text:=DBLookupComboBox1.KeyValue;
     DataModule2.BOOK.Params.ParamByName("kod_izd").Text:=DBLookupComboBox2.KeyValue;
     DataModule2.BOOK.Open;


 
Sergey13 ©   (2006-03-06 11:23) [29]

2[26] alk ©   (06.03.06 11:13)
2[28] alk ©   (06.03.06 11:21)
А кому я писал [16] Sergey13 ©   (06.03.06 10:43)?


 
ANB ©   (2006-03-06 11:25) [30]


> alk ©   (06.03.06 11:21) [28]

Чтобы записать Null надо почистить параметр (clear), а чтобы записать число, надо использовать AsInteger; Все имхо.


 
alk ©   (2006-03-06 11:29) [31]

Sergey13
он теперь везде пишет data type unknown


 
alk ©   (2006-03-06 11:29) [32]

ANB
это я давным давно знаю.


 
Sergey13 ©   (2006-03-06 11:32) [33]

2[31] alk ©   (06.03.06 11:29)
>он теперь
Блин, ну каждый раз код просить надо?

>везде пишет data type unknown
Везде - это даже на стенах в туалете?


 
alk ©   (2006-03-06 11:37) [34]

Sergey13
вот код, а везде это значит хоть выбирай один, хоть два параметра, хоть вообще не одного, один фиг эта ошибка.
DataModule2.BOOK.Close;
     DataModule2.BOOK.SQL.Clear;
     DataModule2.BOOK.SQL.Text:="select *";
     DataModule2.BOOK.SQL.Add("from Book, avtors,izdatelstva,litra");
     DataModule2.BOOK.SQL.Add("where book.kod_izdatelstva=izdatelstva.kod_izdatelstva and");
     DataModule2.BOOK.SQL.Add("book.kod_tip_litra=litra.kod_tip_litra and book.kod_avtora=avtors.kod_avtora");
     DataModule2.BOOK.SQL.Add("and ((:kod_avt is null) or (avtors.kod_avtora=:kod_avt))");
     DataModule2.BOOK.SQL.Add("and ((:kod_izd is null) or (book.kod_izdatelstva=:kod_izd))");
     if DBLookupComboBox1.Text<>"" then DataModule2.BOOK.Params.ParamByName("kod_avt").asString := DBLookupComboBox1.KeyValue
     else DataModule2.BOOK.Params.ParamByName("kod_avt").Clear;
     if DBLookupComboBox2.Text<>"" then DataModule2.BOOK.Params.ParamByName("kod_izd").Text:=DBLookupComboBox2.KeyValue
     else DataModule2.BOOK.Params.ParamByName("kod_avt").Clear;
     DataModule2.BOOK.Open;


 
vovnuke ©   (2006-03-06 11:45) [35]

тип параметра присвоить надо


 
Sergey13 ©   (2006-03-06 11:47) [36]

2[34] alk ©   (06.03.06 11:37)
Какого типа в БД поля "kod_avt" и "kod_izd"?
Почему ты в одном случае делаешь ("kod_avt").asString а в другом ("kod_izd").Text?


 
alk ©   (2006-03-06 11:48) [37]

оба они типа integer


 
alk ©   (2006-03-06 11:50) [38]

я поменял и сделал в обоих случаях asinteger. И все равно не чего не измениось


 
msguns ©   (2006-03-06 11:55) [39]

>alk ©  
Отправил по почте проект похожего приложения, где поиск информации в библиотечной картотеке реализован полностью (кроме фильтров)


 
alk ©   (2006-03-06 11:57) [40]

msguns
спасибо


 
alk ©   (2006-03-06 12:10) [41]

ко мне так не чего и не пришло кинь пожалуйста еще вот на этот ящик
alk20@yandex.ru


 
Sergey13 ©   (2006-03-06 12:21) [42]

2[38] alk ©   (06.03.06 11:50)
Понял. ИБ так вроде совсем не пропускает. Надо вводить еще один параметр-флаг на каждое поле. Типа
....and ((:F_kod_avt=0) or (:F_kod_avt=1 and avtors.kod_avtora=:kod_avt))
где флаг :F_kod_avt присваивать в зависимости от пустоты условия 0 или 1


 
alk ©   (2006-03-06 12:24) [43]

Sergey13
просто где раньше было  
((:kod_avt is null) or (avtors.kod_avtora=:kod_avt))")
сделать
((:F_kod_avt=0) or (:F_kod_avt=1 and avtors.kod_avtora=:kod_avt))


 
Sergey13 ©   (2006-03-06 12:29) [44]

Да. И присвоить параметры ессно.


 
Виталий Панасенко   (2006-03-06 12:37) [45]

FIBPLus, если мне память не изменяет, сами перестраивают запрос вида PARAM=NUL в PARAM is NULL


 
alk ©   (2006-03-06 12:38) [46]

Sergey13
говорит что f_kod_avt не найден)))
     DataModule2.BOOK.Close;
     DataModule2.BOOK.SQL.Clear;
     DataModule2.BOOK.SQL.Text:="select *";
     DataModule2.BOOK.SQL.Add("from Book, avtors,izdatelstva,litra");
     DataModule2.BOOK.SQL.Add("where book.kod_izdatelstva=izdatelstva.kod_izdatelstva and");
     DataModule2.BOOK.SQL.Add("book.kod_tip_litra=litra.kod_tip_litra and book.kod_avtora=avtors.kod_avtora");
     DataModule2.BOOK.SQL.Add("and ((:f_kod_avt=0) or (:f_kod_avt=1 and avtors.kod_avtora=:kod_avt))");
     DataModule2.BOOK.SQL.Add("and ((:f_kod_izd=0) or (:f_kod_izd=1 and avtors.kod_avtora=:kod_izd))");
     if DBLookupComboBox1.Text<>"" then
       begin
         DataModule2.BOOK.Params.ParamByName("kod_avt").AsInteger := DBLookupComboBox1.KeyValue;
         DataModule2.BOOK.Params.ParamByName("f_kod_avt").AsInteger:=1;
       end
     else
       begin
         DataModule2.BOOK.Params.ParamByName("kod_avt").Clear;
         DataModule2.BOOK.Params.ParamByName("f_kod_avt").AsInteger:=0;
       end;

     if DBLookupComboBox2.Text<>"" then
       begin
         DataModule2.BOOK.Params.ParamByName("kod_izd").AsInteger := DBLookupComboBox2.KeyValue;
         DataModule2.BOOK.Params.ParamByName("f_kod_izd").AsInteger:=1;
       end
     else
       begin
         DataModule2.BOOK.Params.ParamByName("kod_izd").Clear;
         DataModule2.BOOK.Params.ParamByName("f_kod_izd").AsInteger:=0;
       end;
 DataModule2.BOOK.Open;


 
alk ©   (2006-03-06 12:43) [47]

Виталий Панасенко
а это куда вставлять или вообще что это?


 
Sergey13 ©   (2006-03-06 12:52) [48]

Перед
if DBLookupComboBox1.Text<>"" then
попробуй вставить
DataModule2.BOOK.Prepare;

Зачем ты запрос в коде пишешь?


 
Виталий Панасенко   (2006-03-06 12:55) [49]

www.devrace.com


 
alk ©   (2006-03-06 12:58) [50]

Sergey13все равно f_kod_avt не найдено


 
msguns ©   (2006-03-06 13:19) [51]

>alk ©   (06.03.06 12:10) [41]

Отправил на alk20@yandex.ru


 
alk ©   (2006-03-06 13:22) [52]

msguns
спасибо еще раз))


 
alk ©   (2006-03-06 13:34) [53]

а можно выслать тоже самое только в зипе, а то у меня винрара нету))) и поставить не откуда


 
msguns ©   (2006-03-06 14:02) [54]

>alk ©   (06.03.06 13:34) [53]
>..поставить не откуда

http://www.rarlab.com/download.htm


 
alk ©   (2006-03-06 14:23) [55]

msguns
там нет не одной команды sql, и не чего такого что могло бы мне помочь


 
Sergey13 ©   (2006-03-06 14:31) [56]

2[55] alk ©   (06.03.06 14:23)
BOOK - это что? Квери или датасет? Почему не пропишешь запрос в дизайне? В кверике вообще сразу после написания можно Params посмотреть в инспекторе.


 
alk ©   (2006-03-06 14:38) [57]

book это квери, запрос уже прописал в дизайне. а в кверике появляеться 5 параметров, kod_avt,kod_izd, f_kod_avt=1,f_kod_avt=1,f_kod_izd=0,F_kod_izd=0


 
msguns ©   (2006-03-06 14:43) [58]

>alk ©   (06.03.06 14:23) [55]
>там нет не одной команды sql, и не чего такого что могло бы мне помочь

;)

Там моря сиквеля: в модуле данных, в модуле-форме Child.
Поиск же реализован в универсальной библиотеке MsLibr/DBServ


 
alk ©   (2006-03-06 14:47) [59]

msguns
там сделан поиск, а мне бы надо не поиск а фильтрацию


 
Sergey13 ©   (2006-03-06 14:50) [60]

2[57] alk ©   (06.03.06 14:38)
> запрос уже прописал в дизайне. а в кверике появляеться 5 параметров, kod_avt,kod_izd, f_kod_avt=1,f_kod_avt=1,f_kod_izd=0,F_kod_izd=0

Вот прям так имя параметра "f_kod_avt=1"? Попробуй в тексте запроса отделить имена параметров пробелом от всего. Или вместо :f_kod_avt=1 поставь 1=:f_kod_avt. Уменя в БДЕ помнится подобный глюк был, в ИБХ не помню.


 
alk ©   (2006-03-06 14:56) [61]

Sergey13
я отделил наименования параметров стали нормальными, осталось 4 параметров и нифига все равно не работает, ошибки не пишет но и результата нет. А если оставлять 6 параметров то запрос работает, но только на авторов на издательства не работает


 
Sergey13 ©   (2006-03-06 15:06) [62]

Ну так если запрос осталсятаким же, не мудрено. 8-)

    DataModule2.BOOK.SQL.Add("and ((:f_kod_avt=0) or (:f_kod_avt=1 and avtors.kod_avtora=:kod_avt))");
    DataModule2.BOOK.SQL.Add("and ((:f_kod_izd=0) or (:f_kod_izd=1 and avtors.kod_avtora=:kod_izd))");


 
alk ©   (2006-03-06 15:12) [63]

Sergey13
))) да я нашел, он был таким))) причем работает когда 6 параметров, то есть 2 f_kod_avt и 2 f_kod_izd. если по одному оставить тоработать не будет)))


 
alk ©   (2006-03-06 15:13) [64]

и еще один вопросик, а как сделать так чтобы он выводил все книги в названии которых встречаеться введеная комбинация, тоесть введена буква а и он выводит все книги в которых есть буква а. какбы *а*. вот так))) как это можно сделать???


 
Sergey13 ©   (2006-03-06 15:27) [65]

2[64] alk ©   (06.03.06 15:13)

book_name LIKE "%А%"
Но это будет возможно очень медленно. Не забыть привести к одному регистру.


 
alk ©   (2006-03-06 15:29) [66]

Sergey13
Отромаднейшее тебе спасибо)))
Просто вселенского масштаба, так глядишь и уму разуму научусь)))


 
Виталий Панасенко   (2006-03-06 17:02) [67]


> alk ©   (06.03.06 15:29) [66]
> Sergey13
> Отромаднейшее тебе спасибо)))
> Просто вселенского масштаба, так глядишь и уму разуму научусь)))

Только перед этим не мешало бы чего-нибудь из теории почитать. А то положишь массу народу своими постами и долбанием мозгов. Как в анекдоте о сельской семье. Решили очередного ребенка завести, дождались темноты и начали делать.А так как в селе, то спятт на печке.Разбушевались, аж кирпич из печи выскочил и вниз, к остальным детям упал."Мам, пап !. Вы пока одного сделаете, троих убьете, нах..!"


 
msguns ©   (2006-03-06 17:25) [68]

>Виталий Панасенко   (06.03.06 17:02) [67]
>Только перед этим не мешало бы чего-нибудь из теории почитать

Я ему выложил практически готовый проект (в интерфейсной части на 90%) с ТЗ, структурой БД с комментариями.. Там есть даже "каркас" фильтра, не реализованный пока, но идеологически продуманный..
А он прочитал его по диагонали (скорее всего просто поиском по SQL*), даже не обратив внимание на решение.

А ты говоришь о чтении каких-то мануалов и хэлпов ;(



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

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

Наверх




Память: 0.65 MB
Время: 0.03 c
15-1144384315
Sweetboy
2006-04-07 08:31
2006.04.30
Вопрос о установке компонентов в Delphi


15-1144408126
Курдль
2006-04-07 15:08
2006.04.30
Какие средства разработки выбрать для исполнения Solaris/Windows


2-1144209485
de_ICER-T44
2006-04-05 07:58
2006.04.30
Даты в базах DBF


15-1144518844
ArtemESC
2006-04-08 21:54
2006.04.30
О чем вы думали когда придумывали свои ники?


1-1143133889
Alex_C
2006-03-23 20:11
2006.04.30
Как изменить св-ва создвнного Automation Object?