Конференция "Базы" » Диаграмма [D7, Paradox]
 
  • RamzesIII © (05.11.08 23:23) [0]
    есть ситуация:надо построить диаграмму продаж по месяцам...месяц выбирается из 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"юююесли же за месяц имеется более одного чека,то выдает ошибку...

    Что можно сделать,чтобы диаграмма все таки строилась???
  • Loginov Dmitry © (05.11.08 23:40) [1]
    > Но эть одна проблема:диаграмма строится только если за месяц
    > сохранилась только 1 запись в таблице "Chek"юююесли же за
    > месяц имеется более одного чека,то выдает ошибку...


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

    Сам SQL-код вроде правильный. Только не ясно:
    1) какой смысл от
    SUM( Prodazha.Kolichectvo )

    и
    GROUP BY

    ?
    2) зачем городить
    FROM "prodazha.DB" Prodazha

    когда можно просто
    FROM Prodazha

    ?
  • GRAND © (05.11.08 23:53) [2]

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


    GROUP BY необходим, если в запросе выбираются еще и обычные поля кроме агрегированных.
  • RamzesIII © (06.11.08 00:01) [3]

    > Кто выдает ошибку? В каком месте кода? Каков текст ошибки?
    > Сам 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 ) нужен чтобы посчитать какой диск в каком количестве продан
  • RamzesIII © (06.11.08 00:06) [4]
    все работает,если за месяц есть только одна запись в таблице 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
  • Германн © (06.11.08 03:50) [5]

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

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

    Фараоны вместе с верблюдами идут на север. (Ну или отдельно от верблюдов) Это уж их личное дело.
    !!!
    Если уж не читаешь книжки-учебники, то хотя б освой работу с отладчиком!
  • RamzesIII © (06.11.08 07:15) [6]
    на форме FormDiagProd имеется компонент QuickRep1...Диаграмма рисуется на TQRChart1юИсходными данными для диаграммы является компонент Query1. Просмотр отчета происходит при нажатии на кпопку(код приведен выше в первом сообщении)
  • RamzesIII © (06.11.08 07:17) [7]
    а есь возможность после
    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 в качестве исходных?
  • Loginov Dmitry © (06.11.08 08:00) [8]
    > 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 © (06.11.08 09:18) [9]
    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) ] ) ;
  • GRAND © (06.11.08 09:53) [10]

    > 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 © (06.11.08 10:02) [11]
    первый query с полем Chek.Data необходим,чтобы отфильтровать данные по выбранному месяцу
  • GRAND © (06.11.08 10:11) [12]

    > первый 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



    Остается только вместо наворотов со строкой фильтра передать в запрос параметрами первый день месяца и последний.
 
Конференция "Базы" » Диаграмма [D7, Paradox]
Есть новые Нет новых   [134477   +39][b:0][p:0.002]