Много колонок

отредактировано 07:51 Раздел: FastReport 3.0
Начинаю осваивать FastReport. Попробовал решить
в нем простую задучу: Есть набор данных (Query1) в большим числом
колонок. Необходимо создать на его основе отчет с группировкой (несколько уровней) с подведением подитогов. Число колонок таково, что на одной странице все столбцы не помещаются. Хотелось бы получить требуемый отчет, в котором колонки не помещающиеся на странице, печатались бы на следующей.
Стандартный Crosstab для этих целей, как я понял, не годится. Попробовал такую технику. В FastReport положил два MasterBand банда.
Один обычный (для вывода записей набора данных) и подключил его к frxDbDataset(свойство datase, свойство dataset ссылается на запрос Query1. Второй банд - вертикальный, для вывода заголовков столбцов. Подключил его к frxUserDataset, который в обработчике события OnGetValue возвращает Query1.Fields[frxUserDataSet1.Recno].DisplayLabel
При работе наблюдается такая картина. Если количество столбцов таково, что они все помещаеются на странице ( в моем примере 7), то все нормально. Если же количество столбцов таково, что на странице они все не помещаются, то происходит зацикливание в построении отчета.

procedure TForm1.frxUserDataSet1CheckEOF(Sender: TObject;
var Eof: Boolean);
begin
eof := frxUserDataSet1.Recno = Query1.FieldCount-1;
// eof := frxUserDataSet1.Recno = 7;
end;

Мало того, при нажатии кнопки "Останов" на форме предварительного просмотра идет явный Exception. Глядя на исходный код видно, что при этом происходит утечка ресурсов (созданные TList не разрушаются и нет try finally end).

Данный эксперемент проводился с версией FastReport 3.1 в среде Delphi 4.5. Ниже приведен исходный код dfm и pas файлов.

Кто-нибудь может подсказать, как решить исходную проблему средствами
FastReport? Заранее благодарен за ответ. Мой e-mail : m_pr@ukr.net



unit1.dfm :

object Form1: TForm1
Left = 179
Top = 103
Width = 556
Height = 433
Caption = 'Print a table'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 16
Top = 8
Width = 513
Height = 308
DataSource = DataSource1
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
end
object Button2: TButton
Left = 48
Top = 336
Width = 75
Height = 25
Caption = 'Print '
TabOrder = 1
OnClick = Button2Click
end
object DataSource1: TDataSource
DataSet = Query1
Left = 168
Top = 40
end
object Query1: TQuery
Active = True
DatabaseName = 'DBDEMOS'
SQL.Strings = (

'SELECT OrderNo, CustNo, SaleDate, ShipDate, EmpNo, ShipToContact' +
', ShipToAddr1, ShipToAddr2, ShipToCity, ShipToState, ShipToZip, ' +
'ShipToCountry, ShipToPhone, ShipVIA, PO, Terms, PaymentMethod, I' +
'temsTotal, TaxRate, Freight, AmountPaid'
'FROM orders'
'ORDER BY CustNo')
Left = 208
Top = 336
end
object frxReport2: TfrxReport
DotMatrixReport = False
IniFile = '\Software\Fast Reports'
PreviewOptions.Buttons = [pbPrint, pbLoad, pbSave, pbExport, pbZoom, pbFind, pbOutline, pbPageSetup, pbTools, pbEdit, pbNavigator]
PreviewOptions.Zoom = 1
PrintOptions.Printer = 'По умолчанию'
ReportOptions.CreateDate = 38709.0265059028
ReportOptions.LastChange = 38709.0265059028
ScriptLanguage = 'PascalScript'
ScriptText.Strings = (
'begin'
''
'end.')
OnGetValue = frxReport2GetValue
Left = 312
Top = 344
Datasets = <
item
DataSet = frxDBDataset1
DataSetName = 'frxDBDataset1'
end
item
DataSet = frxUserDataSet1
DataSetName = 'frxUserDataSet1'
end>
Variables = <>
Style = <>
object Page1: TfrxReportPage
PaperWidth = 210
PaperHeight = 297
PaperSize = 9
LeftMargin = 10
RightMargin = 10
TopMargin = 10
BottomMargin = 10
object ReportTitle1: TfrxReportTitle
Height = 22.67718
Top = 18.89765
Width = 718.1107
object Memo2: TfrxMemoView
Align = baClient
Width = 718.1107
Height = 22.67718
HAlign = haCenter
Memo.Strings = (
'Привет')
end
end
object PageFooter1: TfrxPageFooter
Height = 22.67718
Top = 226.7718
Width = 718.1107
object Memo1: TfrxMemoView
Left = 642.419312533333
Width = 75.5906
Height = 18.89765
HAlign = haRight
Memo.Strings = (
'[Page#]')
end
end
object PageHeader1: TfrxPageHeader
Height = 21.5433070866142
Top = 64.25201
Width = 718.1107
object Memo4: TfrxMemoView
Left = 147.4015748
Width = 91.46456693
Height = 21.54330709
Color = clBlack
DataSet = frxUserDataSet1
DataSetName = 'frxUserDataSet1'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWhite
Font.Height = -13
Font.Name = 'Arial'
Font.Style = []
Frame.Typ = [ftLeft, ftRight, ftTop, ftBottom]
HAlign = haCenter
Memo.Strings = (
'[frxUserDataSet1."Caption"]')
ParentFont = False
end
end
object MasterData1: TfrxMasterData
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlack
Font.Height = -13
Font.Name = 'Arial'
Font.Style = []
Height = 19.67718
ParentFont = False
Top = 147.40167
Width = 718.1107
DataSet = frxDBDataset1
DataSetName = 'frxDBDataset1'
RowCount = 0
object Memo3: TfrxMemoView
Left = 147.40167
Width = 91.4645669291339
Height = 19.65354331
Frame.Typ = [ftLeft, ftRight, ftTop, ftBottom]
Memo.Strings = (
'[FieldValue]')
end
end
object MasterData2: TfrxMasterData
Height = 1046.92981
Left = 147.40167
Vertical = True
Width = 91.48825
DataSet = frxUserDataSet1
DataSetName = 'frxUserDataSet1'
RowCount = 0
end
end
end
object frxDBDataset1: TfrxDBDataset
UserName = 'frxDBDataset1'
CloseDataSource = False
DataSet = Query1
Left = 352
Top = 344
end
object frxUserDataSet1: TfrxUserDataSet
UserName = 'frxUserDataSet1'
OnCheckEOF = frxUserDataSet1CheckEOF
Fields.Strings = (
'Caption')
OnGetValue = frxUserDataSet1GetValue
Left = 392
Top = 344
end
end


===================
unit1.pas :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
frxClass, StdCtrls, frxCross, Db, DBTables, Grids, DBGrids, frxDBSet,
RxMemDS;

type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Query1: TQuery;
frxDBDataset1: TfrxDBDataset;
Button2: TButton;
frxUserDataSet1: TfrxUserDataSet;
frxReport2: TfrxReport;
procedure Button2Click(Sender: TObject);
procedure frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean);
procedure frxUserDataSet1GetValue(const VarName: String;
var Value: Variant);
procedure frxReport2GetValue(const VarName: String;
var Value: Variant);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button2Click(Sender: TObject);
begin

frxReport2.ShowReport;
end;

procedure TForm1.frxUserDataSet1CheckEOF(Sender: TObject;
var Eof: Boolean);
begin
eof := frxUserDataSet1.Recno = Query1.FieldCount-1;
// eof := frxUserDataSet1.Recno = 7;
end;

procedure TForm1.frxUserDataSet1GetValue(const VarName: String;
var Value: Variant);
begin
Value := Query1.Fields[frxUserDataSet1.Recno].DisplayLabel;
end;



procedure TForm1.frxReport2GetValue(const VarName: String;
var Value: Variant);
begin
Value := Query1.Fields[frxUserDataSet1.Recno].Value;
end;

end.

Комментарии

  • LexLex
    отредактировано 07:51
    Скачай FR 3.20 и попробуй там.
  • отредактировано 07:51
    Если в Query1 число колонок фиксировано, то и в отчёте сделать на 1-й странице - левые колонки, на другой - правые (без вертикального банда). Только как это сделать - ещё не знаю.
    ;)

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

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