Форум: "Базы";
Текущий архив: 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
спасибо
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.011 c