Create Rave Reports without using the Visual Designer

Category

Rave - General

Question

How do I create reports that use the Rave engine without using the visual designer.

This is an interesting question as Rave started out as a powerful code-based reporting tool with no visual designer. That powerful code-based side is still there and is solely limited by the abilities and experience of the programmer. The code-base side is the foundation to Rave Reports. A powerful visual designer was added "on top" of the code-base engine. Now, you want to use "code" to create an on-the-fly reporting solution that uses the Rave visual engine which was based upon the code-based engine .

Solution

Create a new application. Then drop the following components on your form. No events were used on any of the DataSet or Rave components.

RvSystem (RvSystem1)
     RvProject (RvProject1) with "Engine" set to "RvSystem1"
     TTable (pointing to customer type table)
     DataSource with "DataSet" set to your Ttable
     RvDataSetConnection with "DataSet" set to your Ttable
     Button to close the form (optional)
     Button to "execute" the on-the-fly report with an OnClick event

You must use a data table that has "Last", "First", "Street", "City", "State" and "Zip" columns (fields) in it or adjust the "DataText" areas to meet your table structure. The following code includes the "button" OnClick event

Delphi:

Unit Unit1;

Interface

Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  DB, Dialogs, StdCtrls, Buttons, Math, ApoDSet,
  RpBase, RpCon, RpConDS, RpDefine, RpDevice, RpRave, RpSystem,
  RvClass, RvCsData, RvCsDraw, RvCsStd, RvCsRpt, RvData, RvDefine, RvDirectDataView, RvUtil;

Type
  TForm1 = Class(TForm)
    ApolloTable1: TApolloTable;
    btnClose: TBitBtn;
    btnReport: TButton;
    DataSource1: TDataSource;
    RvDataSetConnection1: TRvDataSetConnection;
    RvProject1: TRvProject;
    RvSystem1: TRvSystem;
    Procedure btnReportClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  End;

Var
  Form1: TForm1;

Implementation

{$R *.dfm}

Procedure TForm1.btnReportClick(Sender: TObject);
Var
  MyBand, MyTitleBand: TRaveBand;
  MyDataBand: TRaveDataBand;
  MyDataCnx: TRaveDataConnection;
  MyDataText: TRaveDataText;
  MyDataView: TRaveDataView;
  MyLine: TRaveHLine;
  MyPage: TRavePage;
  MyRegion: TRaveRegion;
  MyText: TRaveText;
  nMarginBottom, nMarginLeft, nMarginRight, nMarginTop: Double;
  // I1: integer;
Begin
  // Select the project file
  // RvProject1.ProjectFile := 'Project1.rav';
  // RvProject1.Open;
  //     OR
  RvProject1.New;

  // 1 - use a blank page "Page 1 in Report 1" ======================
  MyPage := RvProject1.ProjMan.FindRaveComponent('Report1.Page1', Nil) As TRavePage;
  MyPage.WasteFit := True;
  // Set all margins to "waste" or 0.5 which ever is greater
  nMarginBottom := MaxValue([RpDev.Waste.Bottom / RpDev.YDPI, 0.5]);
  nMarginLeft := MaxValue([RpDev.Waste.Left / RpDev.XDPI, 0.5]);
  nMarginRight := MaxValue([RpDev.Waste.Right / RpDev.XDPI, 0.5]);
  nMarginTop := MaxValue([RpDev.Waste.Top / RpDev.YDPI, 0.5]);

  // If you need to Delete all components on the page
  //for I1 := MyPage.ComponentCount - 1 downto 0 do begin
  //  MyPage.Components[I1].Free;
  //end;

  // 2 - Create DataView using Connection ===========================
  MyDataCnx := CreateDataCon(RvDatasetConnection1);
  MyDataView := RvProject1.ProjMan.NewDataObject(TRaveDataView) As TRaveDataView;
  MyDataView.ConnectionName := MyDataCnx.Name;
  MyDataView.DataCon := MyDataCnx;
  CreateFields(MyDataView, Nil, Nil, true);
  // 2a - place "Page Number" directly ON the page NOT a band
  MyDataText := MyPage.CreateChild(TRaveDataText, 'dtPage') As TRaveDataText;
  MyDataText.DataField := '"Page of " + Report.CurrentPage + " of " + Report.TotalPages';
  MyDataText.FontJustify := pjRight;
  MyDataText.Width := 2; // Width MUST be before LEFT assignment
  MyDataText.Left := MyPage.PageWidth - nMarginRight - MyDataText.Width;
  MyDataText.Top := nMarginTop;
  // 2b - place "Date" directly ON the page NOT a band
  MyDataText := MyPage.CreateChild(TRaveDataText, 'dtDate') As TRaveDataText;
  MyDataText.DataField := 'Report.DateLong';
  MyDataText.FontJustify := pjRight;
  MyDataText.Width := 2; // Width MUST be before LEFT assignment
  MyDataText.Left := MyPage.PageWidth - nMarginRight - MyDataText.Width;
  MyDataText.Top := nMarginTop + 0.2;

  // 3 - create a region and set it's properties ====================
  MyRegion := TRaveRegion.Create(MyPage);
  MyRegion.Left := nMarginLeft;
  MyRegion.Name := 'Region1';
  MyRegion.Parent := MyPage;
  MyRegion.Top := nMarginTop + 0.4; // Top MUST be before HEIGHT assignment
  MyRegion.Width := MyPage.PageWidth - (nMarginLeft + nMarginRight);
  MyRegion.Height := MyPage.PageHeight - (MyRegion.Top + nMarginBottom);

  // 4 - Create Databand named "DetailBand" First (controller) ======
  MyDataBand := MyRegion.CreateChild(TRaveDataBAnd, 'DetailBand') As TRaveDataBand;
  MyDataBand.DataView := MyDataView; // Always set the band dataview property
  // 4a - Place DataText components in "DetailBand" just created
  MyDataText := MyDataBand.CreateChild(TRaveDataText, 'dtName') As TRaveDataText;
  // concatenate fields with comma between them
  MyDataText.DataField := 'Last' + ' + ", " + ' + 'First';
  MyDataText.DataView := MyDataView;
  MyDataText.FontJustify := pjLeft;
  MyDataText.Left := MyPage.PageLeft + 0.2;
  MyDataText.Top := 0.01;
  MyDataText.Width := 2;
  // 4b
  MyDataText := MyDataBand.CreateChild(TRaveDataText, 'dtStreet') As TRaveDataText;
  MyDataText.DataField := 'Street';
  MyDataText.DataView := MyDataView;
  MyDataText.FontJustify := pjLeft;
  MyDataText.Left := MyPage.PageLeft + 2.1;
  MyDataText.Top := 0.01;
  MyDataText.Width := 2;
  // 4c
  MyDataText := MyDataBand.CreateChild(TRaveDataText, 'dtCityStZip') As TRaveDataText;
  // concatenate fields with space between them
  MyDataText.DataField := 'City' + ' & ' + 'State' + ' & ' + 'Zip';
  MyDataText.DataView := MyDataView;
  MyDataText.FontJustify := pjLeft;
  MyDataText.Left := MyPage.PageLeft + 4.1;
  MyDataText.Top := 0.01;
  MyDataText.Width := 2;

  // 5 - Create Header Band controlled by "DetailBand" ==============
  MyBand := MyRegion.CreateChild(TRaveBand, 'HeaderBand') As TRaveBand;

  //      BandStyle Print Location codes
  // BandStyle PrintLoc b plBodyFooter
  // BandStyle PrintLoc g plGroupFooter
  // BandStyle PrintLoc r plRowFooter
  // BandStyle Printloc D plDetail
  // BandStyle Printloc R plRowHeader
  // BandStyle Printloc G plGroupHeader
  // BandStyle Printloc B plBodyHeader
  MyBand.BandStyle.PrintLoc := MyBand.BandStyle.PrintLoc + [plBodyHeader];

  //      BandStyle Print Occurrence codes
  // BandStyle PrintOcc C poNewColumn
  // BandStyle PrintOcc P poNewPage
  // BandStyle PrintOcc 1 poFirst
  MyBand.BandStyle.PrintOcc := MyBand.BandStyle.PrintOcc + [poFirst, poNewPage];

  MyBand.ControllerBand := MyDataBand;
  MyBand.Height := 0.2;
  MyBand.Left := MyRegion.Left;
  MyBand.MoveBehind; // Looks better when you "view it"
  MyBand.Top := MyRegion.Top;
  MyBand.Width := MyRegion.Width;

  // 5a - Place Text components in "HeaderBand" just created
  MyText := MyBand.CreateChild(TRaveText, 'TextName') As TRaveText;
  MyText.Left := MyBand.Left + 0.2;
  MyText.Top := 0.01; // Band.Top ???
  MyText.Font.Size := 10;
  MyText.Font.Style := MyText.Font.Style + [fsBold];
  MyText.FontJustify := pjLeft;
  MyText.Text := 'Surname, First';
  MyText.Width := 2; // DataText.Name.dtName.width ???
  // 5b
  MyText := MyBand.CreateChild(TRaveText, 'TextStreet') As TRaveText;
  MyText.Left := MyBand.Left + 2.1; // prior text + 0.1 ???
  MyText.Top := 0.01; // Band.Top ???
  MyText.Font.Size := 10;
  MyText.Font.Style := MyText.Font.Style + [fsBold];
  MyText.FontJustify := pjCenter;
  MyText.Text := 'Street';
  MyText.Width := 2; // DataText.Name.dtName.width ???
  // 5c
  MyText := MyBand.CreateChild(TRaveText, 'TextStreet') As TRaveText;
  MyText.Left := MyBand.Left + 4.1; // prior text + 0.1 ???
  MyText.Top := 0.01;
  MyText.Font.Size := 10;
  MyText.Font.Style := MyText.Font.Style + [fsBold];
  MyText.FontJustify := pjCenter;
  MyText.Text := 'City State Zip';
  MyText.Width := 2; // DataText.Name.dtName.width ???
  // 5d - draw a horizontal line
  MyLine := MyBand.CreateChild(TRaveHLine, 'BottomLine') As TRaveHLine;
  MyLine.Left := 0; // MyBand.Left;
  MyLine.LineWidth := 2;
  //MyLine.LineWidthType := wtPoints;
  MyLine.Top := MyBand.Height - 0.01;
  MyLine.Width := MyRegion.Width;

  // 6 - Create Report Title Band controlled by "DetailBand" ========
  MyTitleBand := MyRegion.CreateChild(TRaveBand, 'TitleBand') As TRaveBand;
  MyTitleBand.ControllerBand := MyDataBand;
  MyTitleBand.MoveBehind; // Looks better when you "view it"
  MyTitleBand.MoveBehind;
  MyTitleBand.BandStyle.PrintLoc := MyTitleBand.BandStyle.PrintLoc + [plBodyHeader];
  MyTitleBand.Left := MyRegion.Left;
  MyTitleBand.Width := MyRegion.Width;
  MyTitleBand.Height := 0.35;
  // 6a - Create Text component for "Report Title"
  MyText := MyTitleBand.CreateChild(TRaveText, 'TitleText') As TRaveText;
  MyText.Left := MyTitleBand.Left;
  MyText.Top := 0.01;
  MyText.Font.Size := 20;
  MyText.FontJustify := pjCenter;
  MyText.Text := 'Sample Members Report';
  MyText.Width := MyTitleBand.Width;

  // 7 - OK, run it =================================================
  RvProject1.ExecuteReport('Report1');
  // ONLY use this so you can view report design
  // RvProject1.ProjectFile := 'ProjectTest.rav';
  // RvProject1.Save; 
  RvProject1.Close;
End;

End.