Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.012 c
1-1143126816
voha
2006-03-23 18:13
2006.04.30
PReport &amp; Delphi 2006


6-1137397801
Pazitron_Brain
2006-01-16 10:50
2006.04.30
Как организовать чат с использованием TClientSocket и TServerSock


3-1141902097
anubis
2006-03-09 14:01
2006.04.30
Экспорт таблицы В Excel


4-1139568531
Vlad2
2006-02-10 13:48
2006.04.30
Как определить, нажата ли левая клавиша мыши


15-1144400144
McSimm
2006-04-07 12:55
2006.04.30
Кстати, может кому-то интересно все-таки решить кто не знает.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский