Диаграмма с несколькими линиями

отредактировано 09:11 Раздел: FastReport 4.0
Есть запрос с полями: дата, клиент, сумма.

Как сделать так, чтобы для каждого клиента была отдельная кривая,
которая будет показывать в какой день на какую сумму клиент делал заказов?

Не могу добавить несколько chart-ов типа Line в дизайнере диаграммы,
так как заранее неизвестно, сколько клиентов будут выходить в результате запроса.

Комментарии

  • gpigpi
    отредактировано 09:11
    Для каждого клиента Вам нужно создавать отдельную серию и заполнять её в скрипте отчёта. Для этого можно отсортировать данные по клиентам и использовать в отчёте заголовок группы и дата-бэнд нулевой высоты. При выводе заголовка группы создавайте новую серию и добавляйте в неё данные при выводе дата-бэнда

    Серию в скрипте можно создавать так:
         Chart1.AddSeries(csBar);
         with Chart1.SeriesData[0] do
           begin
             DataType := dtFixedData;
             XSource := '1;2;3;4;5;6';
             YSource := '1;2;3;4;5;6';
           end;
    
  • отредактировано 09:11
    Спасибо, попробую!
  • отредактировано February 2015
    gpi написал: »
    Для каждого клиента Вам нужно создавать отдельную серию и заполнять её в скрипте отчёта. Для этого можно отсортировать данные по клиентам и использовать в отчёте заголовок группы и дата-бэнд нулевой высоты. При выводе заголовка группы создавайте новую серию и добавляйте в неё данные при выводе дата-бэнда

    Попробовал реализовать эту схему, что-то не очень получилось. :)
    Структура данных у меня аналогичная. Поэтому буду пользоваться теми же названиями. Данные в запросе отсортированы по полям Клиент, Дата.
    На страницу отчёта поместил GroupHeader (группа по полю "клиент") - высота 0, MasterData (нужный DataSet указан) - высота 0 и подвал данных - Footer.
    В Footer-е размещена пустая диаграмма Chart1.
    У меня Delphi и версия FastReport Basic. Соответственно всё пишем не на скрипте, а в коде Дельфи.
    Переменные глобальные в модуле:
    var
      Chart1: TfrxChartView;
      s: TChartSeries;
      Ser: TfrxSeriesItem;
    
    Диаграмму нахожу так
    Chart1 := dmReports.frxTest.FindObject('Chart1') as TfrxChartView;
    
    Остальное пытаюсь сделать в обработчике отчета OnBeforePrint:
    procedure TdmReports.frxTestBeforePrint(Sender: TfrxReportComponent);
    begin
      if Sender is TfrxGroupHeader then
      begin
        if TfrxGroupHeader(Sender).Name = 'GroupHeader1' then
        begin
          s := TChartSeries(TLineSeries.NewInstance);
          s.Create(Chart1);
          Chart1.Chart.AddSeries(s);
          ser:=Chart1.SeriesData.Add;
        end;
      end;
      if Sender is TfrxMasterData then
      begin
        if TfrxMasterData(Sender).Name = 'MasterData1' then
        begin
          with ser do
          begin
            DataType := dtDBData;
            DataSet := frxDBTest;
            XSource := 'frxDBTest."CURRDAY"';
            YSource := 'frxDBTest."SUMMA"';
          end;
        end;
      end;
    end;
    
    В результате диаграмму получаю, но не правильную. Судя по легенде, имею правильное количество серий. По Y нужная величина откладывается. Хорошее на этом всё.
    По X - что-то непонятное (должны быть три даты 19, 20, 21) и на самой диаграмме есть только одна линия, но как будто из всех данных вместе.

    Что я делаю не так?
  • отредактировано 09:11
    И тишина...
    Вот вроде получилось желаемое. Чудна конечно конструкция, но по-другому ничего не работало. Может кому пригодится:
    procedure TdmReports.frxTestBeforePrint(Sender: TfrxReportComponent);
    begin
      if Sender is TfrxGroupHeader then
      begin
        if TfrxGroupHeader(Sender).Name = 'GroupHeader1' then
        begin
          s := TChartSeries(TLineSeries.NewInstance);
          s.Create(Chart1);
          Chart1.Chart.AddSeries(s);
          ser:=Chart1.SeriesData.Add;
          ser.DataType := dtFixedData;
          ser.XType := xtDate;
          s.title := frxDBTest.DataSet.FieldValues['KLIENTNAME'];
        end;
      end;
      if Sender is TfrxMasterData then
      begin
        if TfrxMasterData(Sender).Name = 'MasterData3' then
        begin
          ser.XSource := ser.XSource + DateToStr(frxDBTest.DataSet.FieldValues['CURRDAY']) + ';';
          ser.YSource := ser.YSource + IntToStr(frxDBTest.DataSet.FieldValues['SUMMA']) + ';';
        end;
      end;
    end;
    

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.