-
есть ситуация:надо построить диаграмму продаж по месяцам...месяц выбирается из 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"юююесли же за месяц имеется более одного чека,то выдает ошибку...
Что можно сделать,чтобы диаграмма все таки строилась???
-
> Но эть одна проблема:диаграмма строится только если за месяц > сохранилась только 1 запись в таблице "Chek"юююесли же за > месяц имеется более одного чека,то выдает ошибку...
Кто выдает ошибку? В каком месте кода? Каков текст ошибки? Сам SQL-код вроде правильный. Только не ясно: 1) какой смысл от SUM( Prodazha.Kolichectvo ) и GROUP BY ? 2) зачем городить FROM "prodazha.DB" Prodazha когда можно просто FROM Prodazha ?
-
> 1) какой смысл от SUM( Prodazha.Kolichectvo ) и GROUP BY?
GROUP BY необходим, если в запросе выбираются еще и обычные поля кроме агрегированных.
-
> Кто выдает ошибку? В каком месте кода? Каков текст ошибки? > Сам 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 ) нужен чтобы посчитать какой диск в каком количестве продан
-
все работает,если за месяц есть только одна запись в таблице 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
-
> Что можно сделать,чтобы диаграмма все таки строилась??? >
Какая диаграмма? Где в в приведённом коде строится хоть какая-то диаграмма!?
Фараоны вместе с верблюдами идут на север. (Ну или отдельно от верблюдов) Это уж их личное дело. !!! Если уж не читаешь книжки-учебники, то хотя б освой работу с отладчиком!
-
на форме FormDiagProd имеется компонент QuickRep1...Диаграмма рисуется на TQRChart1юИсходными данными для диаграммы является компонент Query1. Просмотр отчета происходит при нажатии на кпопку(код приведен выше в первом сообщении)
-
а есь возможность после 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 в качестве исходных?
-
> 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)?
-
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) ] ) ;
-
> 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 может и сам по себе прекрасно работать. Если диаграмму нужно формировать без даты, то тогда вообще больше ничего не нужно.
-
первый query с полем Chek.Data необходим,чтобы отфильтровать данные по выбранному месяцу
-
> первый 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 Остается только вместо наворотов со строкой фильтра передать в запрос параметрами первый день месяца и последний.
|