Главная страница
    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
спасибо



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

Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.011 c
1-1143133889
Alex_C
2006-03-23 20:11
2006.04.30
Как изменить св-ва создвнного Automation Object?


15-1144440543
Цукор5
2006-04-08 00:09
2006.04.30
narod.ru


8-1132999133
_Sergey_
2005-11-26 12:58
2006.04.30
Чтение тэгов из WMA и OGG


1-1143312945
Muhan_
2006-03-25 21:55
2006.04.30
Как программно поменять раскладки клавы с англ. на русскую ...


2-1144790278
Skandri
2006-04-12 01:17
2006.04.30
INI, меню и др.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский