Rave - General
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 .
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.