Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Диаграмма [D7, Paradox]


RamzesIII ©   (2008-11-05 23:23:00) 

есть ситуация:надо построить диаграмму продаж по месяцам...месяц выбирается из MonthComboBox,год вводится в YearEdit.
при нажатии на кнопку выполняется процедура:
procedure TFormVvodMes.BitBtn1Click(Sender: TObject);
var MaxDay: integer;
begin
formDiagProd.Query1.Filtered:=false;
FormDiagProd.Query1.Active:=false;
FormDiagProd.Query1.SQL.Clear;
FormDiagProd.Query1.SQL.Add('SELECT Diski.Nazvanie, SUM( Prodazha.Kolichectvo ),chek.data');
FormDiagProd.Query1.SQL.Add('FROM "prodazha.DB" Prodazha INNER JOIN "diski.DB" Diski ON (Prodazha.Shtrih_kod = Diski.Shtrih_kod)  INNER JOIN "chek.db" Chek ON  (Prodazha.Kod_cheka = Chek.Kod_cheka)');
FormDiagProd.Query1.SQL.Add('GROUP BY Diski.Nazvanie, chek.data');
FormDiagProd.Query1.Active:=true;
MaxDay:=0;
case (MonthComboBox.ItemIndex) of
0,2,4,6,7,9,11:  MaxDay := 31;
3,5,8,10:  MaxDay := 30;
else     MaxDay := 28;
end;
FormDiagProd.Query1.Filter :=
  Format(' Data>=''' + '01.%.02d.%d' + '''   and    Data<='''+'%.02d.%.02d.%d'+'''',
     [ MonthComboBox.ItemIndex+1, StrToInt(YearEdit.Text),  MaxDay,
       MonthComboBox.ItemIndex+1, StrToInt(YearEdit.Text) ] ) ;
FormDiagProd.Query1.Filtered:=true;
YearEdit.Clear;
FormVvodMes.Close;
FormDiagProd.QuickRep1.Preview;
end;

Но эть одна проблема:диаграмма строится только если за месяц сохранилась только 1 запись в таблице "Chek"юююесли же за месяц имеется более одного чека,то выдает ошибку...

Что можно сделать,чтобы диаграмма все таки строилась???


GRAND   (2008-11-06 10:11:00) [1]


> первый query с полем Chek.Data необходим,чтобы отфильтровать
> данные по выбранному месяцу
>


SELECT Diski.Nazvanie, SUM( Prodazha.Kolichectvo )
FROM "prodazha.DB" Prodazha
INNER JOIN "diski.DB" Diski ON (Prodazha.Shtrih_kod = Diski.Shtrih_kod)  
INNER JOIN "chek.db" Chek ON  (Prodazha.Kod_cheka = Chek.Kod_cheka)
WHERE Chek.data BETWEEN :Date1 AND :Date2
GROUP BY Diski.Nazvanie


Остается только вместо наворотов со строкой фильтра передать в запрос параметрами первый день месяца и последний.


RamzesIII   (2008-11-06 10:02:00) [2]

первый query с полем Chek.Data необходим,чтобы отфильтровать данные по выбранному месяцу


GRAND   (2008-11-06 09:53:00) [3]


> chek.data это только дата. вротой Query нужен чтобы отобрать
> из отфильтрованного первого Query поля Nazvanie и SUM(Kolichectvo
> ),без даты,чтобы сформировать диаграмму


Тогда непонятно, зачем нужен первый Query. Вот такой запрос:

SELECT Diski.Nazvanie, SUM( Prodazha.Kolichectvo )
FROM "prodazha.DB" Prodazha
INNER JOIN "diski.DB" Diski ON (Prodazha.Shtrih_kod = Diski.Shtrih_kod)  
GROUP BY Diski.Nazvanie


может и сам по себе прекрасно работать. Если диаграмму нужно формировать без даты, то тогда вообще больше ничего не нужно.


RamzesIII   (2008-11-06 09:18:00) [4]

chek.data это только дата. вротой Query нужен чтобы отобрать из отфильтрованного первого Query поля Nazvanie и SUM(Kolichectvo ),без даты,чтобы сформировать диаграмму

ps Я можно ли в данной задаче испльзовать конструкцию select(from select)??? использую при этом в строке Where выражение Chek.Data=Format(' Data>=''' + '01.%.02d.%d' + '''   and    Data<='''+'%.02d.%.02d.%d'+'''',
   [ MonthComboBox.ItemIndex+1, StrToInt(YearEdit.Text),  MaxDay,
     MonthComboBox.ItemIndex+1, StrToInt(YearEdit.Text) ] ) ;


Loginov Dmitry   (2008-11-06 08:00:00) [5]

> GROUP BY необходим, если в запросе выбираются еще и обычные
> поля кроме агрегированных.


Да понятно :)
Только я не об этом!

Есть запрос:
SELECT Diski.Nazvanie, SUM( Prodazha.Kolichectvo ),chek.data
 FROM "prodazha.DB" Prodazha
 INNER JOIN "diski.DB" Diski ON (Prodazha.Shtrih_kod = Diski.Shtrih_kod)  
 INNER JOIN "chek.db" Chek ON  (Prodazha.Kod_cheka = Chek.Kod_cheka)
GROUP BY Diski.Nazvanie, chek.data


мы просим, чтобы запрос выдавал наименование проданного товара Diski.Nazvanie.

> А SUM( Prodazha.Kolichectvo ) нужен чтобы посчитать какой
> диск в каком количестве продан


chek.data - это что? Это "дата" или "дата/время"?
Если это "дата", то я бы так сформулировал:
SUM( Prodazha.Kolichectvo ) нужен чтобы посчитать какой диск в каком количестве продан за каждый день

Если chek.data -  это "дата/время", тогда указанный запрос ничем не будет отличаться от:
SELECT Diski.Nazvanie, Prodazha.Kolichectvo,chek.data
 FROM "prodazha.DB" Prodazha
 INNER JOIN "diski.DB" Diski ON (Prodazha.Shtrih_kod = Diski.Shtrih_kod)  
 INNER JOIN "chek.db" Chek ON  (Prodazha.Kod_cheka = Chek.Kod_cheka)



> а есь возможность во второй Query(Query) вписать запрос,
> который бы брал данные из Query1 в качестве исходных?


Что еще за второй Query(Query)?


RamzesIII   (2008-11-06 07:17:00) [6]

а есь возможность после
FormDiagProd.Query1.Filter :=
 Format(' Data>=''' + '01.%.02d.%d' + '''   and    Data<='''+'%.02d.%.02d.%d'+'''',
    [ MonthComboBox.ItemIndex+1, StrToInt(YearEdit.Text),  MaxDay,
      MonthComboBox.ItemIndex+1, StrToInt(YearEdit.Text) ] ) ;
во второй Query(Query) вписать запрос,который бы брал данные из Query1 в качестве исходных?


RamzesIII   (2008-11-06 07:15:00) [7]

на форме FormDiagProd имеется компонент QuickRep1...Диаграмма рисуется на TQRChart1юИсходными данными для диаграммы является компонент Query1. Просмотр отчета происходит при нажатии на кпопку(код приведен выше в первом сообщении)


Германн   (2008-11-06 03:50:00) [8]


> Что можно сделать,чтобы диаграмма все таки строилась???
>

Какая диаграмма? Где в в приведённом коде строится хоть какая-то диаграмма!?

Фараоны вместе с верблюдами идут на север. (Ну или отдельно от верблюдов) Это уж их личное дело.
!!!
Если уж не читаешь книжки-учебники, то хотя б освой работу с отладчиком!


RamzesIII   (2008-11-06 00:06:00) [9]

все работает,если за месяц есть только одна запись в таблице Chek, тоесть продажа была совершена единожды,но если продаж было несколько и за месяц в таблице Chek имеются несколько записей,то Project D:\CD\cd.exe fauled with message: 'access violation at 0x7d61f085:write of address 0x00030fc8'. Process Stopped.Use Step or Run to continue


RamzesIII   (2008-11-06 00:01:00) [10]


> Кто выдает ошибку? В каком месте кода? Каков текст ошибки?
> Сам SQL-код вроде правильный. Только не ясно:1) какой смысл
> от SUM( Prodazha.Kolichectvo ) и GROUP BY?2) зачем городить
> FROM "prodazha.DB" Prodazha  когда можно просто FROM Prodazha?
>


текст ошибки:
Project D:\CD\cd.exe fauled with message: 'access violation at 0x7d61f085:write of address 0x00030fc8'. Process Stopped.Use Step or Run to continue

так как диаграмма должна строиться по месяцам,то нужны даты продвж,которые фиксируются в таблице Chek. А SUM( Prodazha.Kolichectvo ) нужен чтобы посчитать какой диск в каком количестве продан


GRAND   (2008-11-05 23:53:00) [11]


> 1) какой смысл от SUM( Prodazha.Kolichectvo ) и GROUP BY?


GROUP BY необходим, если в запросе выбираются еще и обычные поля кроме агрегированных.


Loginov Dmitry   (2008-11-05 23:40:00) [12]

> Но эть одна проблема:диаграмма строится только если за месяц
> сохранилась только 1 запись в таблице "Chek"юююесли же за
> месяц имеется более одного чека,то выдает ошибку...


Кто выдает ошибку? В каком месте кода? Каков текст ошибки?

Сам SQL-код вроде правильный. Только не ясно:
1) какой смысл от SUM( Prodazha.Kolichectvo )и GROUP BY?
2) зачем городить FROM "prodazha.DB" Prodazhaкогда можно просто FROM Prodazha?


Наверх

Титульная страница Поиск, карта сайта Написать письмо