Передача отдельных переменных в отчет

отредактировано 16:11 Раздел: FastReport VCL
Добрый день. Начинаю осваивать FastReport и никак не пойму принцип. Пытаюсь реализовать такую вещь. В программе есть переменная. В FastReport тоже есть переменная, связанная с первой. Задача: при изменении переменной в программе (например, на значения 1, 2 и 3) необходимо вывести их на отчетах - каждую на свою страницу (т.е. страниц будет 3). Подскажите, пожалуйста, путь решения.

Комментарии

  • gpigpi
    отредактировано 16:11
    Пропишите в главной процедуре отчёта
    begin
      Page1.Visible := <YourVar> = 1;
      Page2.Visible := <YourVar> = 2;
      Page3.Visible := <YourVar> = 3;
    end.
    
  • отредактировано 16:11
    gpi написал: »
    Пропишите в главной процедуре отчёта
    begin
      Page1.Visible := <YourVar> = 1;
      Page2.Visible := <YourVar> = 2;
      Page3.Visible := <YourVar> = 3;
    end.
    

    Спасибо за участие.
    Вы имеете ввиду - в скрипте самого отчета?
    А непосредственно в Delphi никак нельзя?
  • gpigpi
    отредактировано 16:11
    написал:
    Задача: при изменении переменной в программе (например, на значения 1, 2 и 3) необходимо вывести их на отчетах - каждую на свою страницу (т.е. страниц будет 3)
    Приложите пример того, что Вы хотите получить
  • отредактировано 16:11
    gpi написал: »
    Приложите пример того, что Вы хотите получить

    что-то вроде этого:

    for m:=1 to 3 do begin

    frxReport1.Variables := m;

    Page := TfrxReportPage.Create(frxReport1);

    end;

    но ТАК не работает (на ПЕРВОЙ странице отчета оказывается цифра 3)
  • gpigpi
    отредактировано 16:11
    Используйте переменную Page для отображения номера страницы или приложите тестовый проект
  • отредактировано 16:11
    gpi написал: »
    Используйте переменную Page для отображения номера страницы или приложите тестовый проект

    мне не НОМЕР СТРАНИЦЫ надо на каждый лист выводить, а управлять выводом МОИХ переменных (из программы) на НУЖНЫЕ листы отчета
    например: в заданное мемо-поле на первом листе отчета мне нужно вывести строку "поле", а на третьем листе отчета в ЕГО мемо-поле вывести строку "лес"
    задача-то очень простая, но как реализовать - не могу найти(
  • gpigpi
    отредактировано 16:11
    В зависимости от конкретного случая, это можно реализовать с помощью TfrxReport.OnBeforePrint, TfrxReport.OnGetValue или TfrxUserDataset
  • отредактировано 16:11
    gpi написал: »
    В зависимости от конкретного случая, это можно реализовать с помощью TfrxReport.OnBeforePrint, TfrxReport.OnGetValue или TfrxUserDataset

    Спасибо, ничего не получается(
    логика совершенно не понятна
    примерчик можете кинуть?
  • gpigpi
    отредактировано 16:11
    object Form1: TForm1
      Left = 645
      Top = 198
      Width = 1740
      Height = 900
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object frxReport1: TfrxReport
        Version = '5.6.8'
        DotMatrixReport = False
        IniFile = '\Software\Fast Reports'
        PreviewOptions.Buttons = [pbPrint, pbLoad, pbSave, pbExport, pbZoom, pbFind, pbOutline, pbPageSetup, pbTools, pbEdit, pbNavigator, pbExportQuick]
        PreviewOptions.Zoom = 1.000000000000000000
        PrintOptions.Printer = 'Default'
        PrintOptions.PrintOnSheet = 0
        ReportOptions.CreateDate = 43053.859612326390000000
        ReportOptions.LastChange = 43053.859612326390000000
        ScriptLanguage = 'PascalScript'
        ScriptText.Strings = (
          'begin'
          ''
          'end.')
        Left = 128
        Top = 168
        Datasets = <
          item
            DataSet = frxUserDataSet1
            DataSetName = 'frxUserDataSet1'
          end>
        Variables = <>
        Style = <>
        object Data: TfrxDataPage
          Height = 1000.000000000000000000
          Width = 1000.000000000000000000
        end
        object Page1: TfrxReportPage
          PaperWidth = 210.000000000000000000
          PaperHeight = 297.000000000000000000
          PaperSize = 9
          LeftMargin = 10.000000000000000000
          RightMargin = 10.000000000000000000
          TopMargin = 10.000000000000000000
          BottomMargin = 10.000000000000000000
          DataSet = frxUserDataSet1
          DataSetName = 'frxUserDataSet1'
          object Memo1: TfrxMemoView
            Left = 555.590910000000000000
            Top = 22.677180000000000000
            Width = 94.488250000000000000
            Height = 18.897650000000000000
            Memo.UTF8 = (
              '[frxUserDataSet1."field1"]')
          end
        end
      end
      object frxUserDataSet1: TfrxUserDataSet
        UserName = 'frxUserDataSet1'
        OnCheckEOF = frxUserDataSet1CheckEOF
        OnFirst = frxUserDataSet1First
        OnNext = frxUserDataSet1Next
        OnPrior = frxUserDataSet1Prior
        Fields.Strings = (
          'field1')
        OnGetValue = frxUserDataSet1GetValue
        Left = 184
        Top = 160
      end
    end
    
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, frxClass;
    
    type
      TForm1 = class(TForm)
        frxReport1: TfrxReport;
        frxUserDataSet1: TfrxUserDataSet;
        procedure frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean);
        procedure frxUserDataSet1First(Sender: TObject);
        procedure frxUserDataSet1Next(Sender: TObject);
        procedure frxUserDataSet1Prior(Sender: TObject);
        procedure frxUserDataSet1GetValue(const VarName: String;
          var Value: Variant);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
      i: integer;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.frxUserDataSet1CheckEOF(Sender: TObject;
      var Eof: Boolean);
    begin
      Eof := i = 4;
    end;
    
    procedure TForm1.frxUserDataSet1First(Sender: TObject);
    begin
      i := 1;
    end;
    
    procedure TForm1.frxUserDataSet1Next(Sender: TObject);
    begin
      inc(i);
    end;
    
    procedure TForm1.frxUserDataSet1Prior(Sender: TObject);
    begin
      dec(i);
    end;
    
    procedure TForm1.frxUserDataSet1GetValue(const VarName: String;
      var Value: Variant);
    begin
      if VarName = 'field1' then Value := i;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      frxReport1.ShowReport();
    end;
    
    end.
    
  • отредактировано 16:11
    gpi написал: »
    object Form1: TForm1
      Left = 645
      Top = 198
      Width = 1740
      Height = 900
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object frxReport1: TfrxReport
        Version = '5.6.8'
        DotMatrixReport = False
        IniFile = '\Software\Fast Reports'
        PreviewOptions.Buttons = [pbPrint, pbLoad, pbSave, pbExport, pbZoom, pbFind, pbOutline, pbPageSetup, pbTools, pbEdit, pbNavigator, pbExportQuick]
        PreviewOptions.Zoom = 1.000000000000000000
        PrintOptions.Printer = 'Default'
        PrintOptions.PrintOnSheet = 0
        ReportOptions.CreateDate = 43053.859612326390000000
        ReportOptions.LastChange = 43053.859612326390000000
        ScriptLanguage = 'PascalScript'
        ScriptText.Strings = (
          'begin'
          ''
          'end.')
        Left = 128
        Top = 168
        Datasets = <
          item
            DataSet = frxUserDataSet1
            DataSetName = 'frxUserDataSet1'
          end>
        Variables = <>
        Style = <>
        object Data: TfrxDataPage
          Height = 1000.000000000000000000
          Width = 1000.000000000000000000
        end
        object Page1: TfrxReportPage
          PaperWidth = 210.000000000000000000
          PaperHeight = 297.000000000000000000
          PaperSize = 9
          LeftMargin = 10.000000000000000000
          RightMargin = 10.000000000000000000
          TopMargin = 10.000000000000000000
          BottomMargin = 10.000000000000000000
          DataSet = frxUserDataSet1
          DataSetName = 'frxUserDataSet1'
          object Memo1: TfrxMemoView
            Left = 555.590910000000000000
            Top = 22.677180000000000000
            Width = 94.488250000000000000
            Height = 18.897650000000000000
            Memo.UTF8 = (
              '[frxUserDataSet1."field1"]')
          end
        end
      end
      object frxUserDataSet1: TfrxUserDataSet
        UserName = 'frxUserDataSet1'
        OnCheckEOF = frxUserDataSet1CheckEOF
        OnFirst = frxUserDataSet1First
        OnNext = frxUserDataSet1Next
        OnPrior = frxUserDataSet1Prior
        Fields.Strings = (
          'field1')
        OnGetValue = frxUserDataSet1GetValue
        Left = 184
        Top = 160
      end
    end
    
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, frxClass;
    
    type
      TForm1 = class(TForm)
        frxReport1: TfrxReport;
        frxUserDataSet1: TfrxUserDataSet;
        procedure frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean);
        procedure frxUserDataSet1First(Sender: TObject);
        procedure frxUserDataSet1Next(Sender: TObject);
        procedure frxUserDataSet1Prior(Sender: TObject);
        procedure frxUserDataSet1GetValue(const VarName: String;
          var Value: Variant);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
      i: integer;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.frxUserDataSet1CheckEOF(Sender: TObject;
      var Eof: Boolean);
    begin
      Eof := i = 4;
    end;
    
    procedure TForm1.frxUserDataSet1First(Sender: TObject);
    begin
      i := 1;
    end;
    
    procedure TForm1.frxUserDataSet1Next(Sender: TObject);
    begin
      inc(i);
    end;
    
    procedure TForm1.frxUserDataSet1Prior(Sender: TObject);
    begin
      dec(i);
    end;
    
    procedure TForm1.frxUserDataSet1GetValue(const VarName: String;
      var Value: Variant);
    begin
      if VarName = 'field1' then Value := i;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      frxReport1.ShowReport();
    end;
    
    end.
    



    Спасибо.
    А куда вставлять первый блок кода?
  • gpigpi
    отредактировано 16:11
    в форму (DFM)
  • отредактировано 16:11
    gpi написал: »
    в форму (DFM)


    Что значит "в форму"? В форме (тексте модуля) как раз второй блок...
  • gpigpi
    отредактировано 16:11
    На форме в Delphi - правый клик мышью - View as Text - вставляете текст - правый клик - View as Form
  • отредактировано 16:11
    gpi написал: »
    На форме в Delphi - правый клик мышью - View as Text - вставляете текст - правый клик - View as Form

    Большое спасибо, что-то начало получаться.
    А без frxUserDataSet нельзя обойтись? Т.е. прямым присваиванием в программе значения отдельной переменной?

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

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