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




Вниз

Проблема с составлением запроса и выводом его в QReport 


Andrey Pogorelov   (2001-12-02 10:49) [0]

Имеется 3 таблицы
Table1 Реестр животных
id
vid
categoria
--------------
id vid categoria
1, 1, 2
2, 1, 2
3, 2, 1
--------------
Table2 Виды животных
id
name
--------------
1, Собаки
2, Кошки
--------------
Table3 - Категории животых
id
name
--------------
1, Домашнее
2, Бездомное
--------------
Необходимо подсчитать кол-во животных в базе, кол-во домашних и бездомных по видам и результаты поместить в QReport
те получить в виде
Вид Домашнее Бездомное
Собаки 0 2
Кошки 1 0
Всего: 3
Помогите очень надо, заранее Огромное спасибо.



asafr   (2001-12-03 15:14) [1]

Берешь TQuery, обзываешь, например qr_Work. Пишешь запрос:
SELECT VID, CATHEGORY, COUNT(*) AS SUM_ FROM TABLE1
GROUP BY VID, CATHEGORY
- этот qr_Work объявляешь источником для QReport. Результат запроса:
VID CATHEGORY SUM_
1 2 2
2 1 1

В QReport in DetailBand делаешь так:
----------------------------------------
<--DetailHeader
VID Cathegory Sum_
----------------------------------------
<-- Detail Band
[QRLabel1] [QRLabel2] [QRDBText1]
----------------------------------------
QRDBText1 - связываешь с полем Sum_

В Events QRLabel1 пишешь:
procedure TForm1.QRLabel1Print(sender: TObject; var Value: String);
begin
if qr_Work.FirldByName("vid").AsInteger=1 then QRLabel1.Caption:="Собаки"
else QRLabel1.Caption:="Кошки"
end;


Соответственно
procedure TForm1.QRLabel2Print(sender: TObject; var Value: String);
begin
if qr_Work.FirldByName("cathegory").AsInteger=1
then QRLabel2.Caption:="Домашнее"
else QRLabel2.Caption:="Бездомное"
end;



Ну а ВСЕГО: - можно найти несколькими путями. Либо используй QRExpr, либо на QRDBText1Print приплюсовывай значения Sum_ каждой строчки. Только перед печатью не забывай делать Sum_:=0 - ибо тогда значения каждой распечатки будут приплюсовываться друг к другу.



Dick Gonsales   (2001-12-04 03:14) [2]

Запрос
/* Тут в зависимости как хочешь чтобы выглядло*/
/* Вариант 1 */
SELECT T3.name, T2.name, count(T1.*)
FROM T3, T2, T1
WHERE T3.id=T1.categoria and T2.id=T1.vid
GROUP BY T3.name, T2.name
UNION
SELECT T3.name, " Итого", count(T1.*)
/* пробел дабы правильно сработал order by*/
FROM T3, T1
WHERE T3.id=T1.categoria
GROUP BY T3.name
ORDER BY T3.name
/* Категория1 Вид1 кол-во */
/* Категория1 Вид2 кол-во */
/* Категория1 Итого кол-во */
/* Категория2 Вид1 кол-во */
/* Категория1 Вид2 кол-во */
/* Категория1 Итого кол-во */

/* Вариант 2 */
SELECT T2.name, T3.name, count(T1.*)
FROM T3, T2, T1
WHERE T3.id=T1.categoria and T2.id=T1.vid
GROUP BY T2.name, T3.name
UNION
SELECT T2.name, " Итого", count(T1.*)
FROM T2, T1
WHERE T2.id=T1.vid
GROUP BY T2.name
ORDER BY T2.name
/* Вид1 Категория1 кол-во */
/* Вид1 Категория2 кол-во */
/* Вид1 Итого кол-во */
/* Вид2 Категория1 кол-во */
/* Вид2 Категория2 кол-во */
/* Вид2 Итого кол-во */



Запрос вешаешь на Report, и расписываешь поля,
а в принципе можешь воспользоваться
дельфийским мастером для генерации Report
используя выше описаный SELECT и он тебе все сделает.

Вариант который предложил asafr можно использовать
если у тебя мало категорий и видов и они не будут изменяться,
т.к. они жестко прописанны в коде. Тут это не важно.




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




Наверх





Память: 0.73 MB
Время: 0.031 c
3-21986           Dreamer               2001-12-06 15:43  2002.01.08  
Data Field not permitted on open DataSet


3-21950           Hermit                2001-12-05 11:38  2002.01.08  
Неявно стартуемые транзакции


1-22062           Alexander             2001-12-19 00:17  2002.01.08  
Как мне к определённой (TDateTime) дате прибавить N дней?


1-22186           ShnurO.K.             2001-12-15 23:05  2002.01.08  
Как скрыть свою программу при нажатие Alt+Ctrl+Del?


1-22029           neo_                  2001-12-18 12:33  2002.01.08  
убить TThread