![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Диаграмма [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?