Solved

Delphi 7 :: Rave Report - Several Reports Print in ONE spool JOB

Posted on 2007-12-05
7
5,980 Views
Last Modified: 2013-11-23
Dear Experts,

I am using Delphi 7 and Rave Reports.
I have a procedure which loops through a dataset and according to my parameters
prints reports.
How can I change my code to rather loop through the dataset and add all the reports, somewhere???, and after the loop I would like to do ONE print execute which will then print all added reports in one spool job.

I have looked at the nevrona tip at: http://www.nevrona.com/Default.aspx?tabid=117
but it is not clear enough to me. Because for each report I am setting some params as well.

Anyone that can please explain this to me in detail?


Please see my current code attached....

Thanks in advance.
function TfrmMain.PrintStillageLabel(const ABarCode :String): Boolean;

begin

  Try
 

    //Print the stillage labels if AutoPrintSL is flagged on

    qStillages.SQL.Text := 'SELECT S.BarCode, S.POrderNumber, S.Sequence, S.TheirDateTime, S.ItemDescription, '+

      'S.PartTypeNumber, P.StillageQty, P.PrintBOMSL ' +

      'FROM tblStillages S LEFT OUTER JOIN tblPartTypes P ON S.PartTypeNumber = P.PartTypeNumber '+

      'WHERE (BarCode = :BarCode) AND (S.SLPrinted = 0) AND (P.AutoPrintSL = 1) '+

      'ORDER BY TheirDateTime, Sequence';

    qStillages.Parameters.ParamByName('BarCode').Value := ABarCode;

    qStillages.Open; qStillages.Last; qStillages.First;

    If qStillages.IsEmpty then Exit;
 

    rvSystem.DefaultDest := rdPrinter;

    rvSystem.SystemSetups := rvSystem.SystemSetups - [ssAllowSetup];
 

    rvProject.Open;

    rvProject.SelectReport('repStillageLabel', False);

    rvProject.SetParam('Date', DateToStr(Date));

    rvProject.SetParam('Time', TimeToStr(Time));

    rvProject.SetParam('PartType', qStillages.FieldByName('PartTypeNumber').AsString);

    rvProject.SetParam('StillageQty', qStillages.FieldByName('StillageQty').AsString);

    rvProject.SetParam('BarCode', qStillages.FieldByName('BarCode').AsString);

    rvProject.Execute;
 

    //Mark this SL as printed.

    qUpdate.SQL.Text := 'UPDATE tblStillages SET SLPrinted = 1 WHERE BarCode = :BarCode';

    qUpdate.Parameters.ParamByName('BarCode').Value := ABarCode;

    qUpdate.ExecSQL;
 

    WriteToLog(logAttention, 'Stillage Label Printed: ' + ABarCode);

  Except

    On E:Exception do

    begin

      Result := False;

      WriteToLog(logError, E.Message);

    end;

  end;

end;

Open in new window

0
Comment
Question by:Marius0188
  • 5
  • 2
7 Comments
 

Author Comment

by:Marius0188
ID: 20410698
Also note that it is the same report that I print, just with different field values.
Thanks.
0
 

Author Comment

by:Marius0188
ID: 20410700
and different report parameters.
0
 
LVL 21

Accepted Solution

by:
developmentguru earned 500 total points
ID: 20411097
 According to Nevrona you need to print your separate reports from within the rvSystem.OnPrint event.  To print all of the reports call rvSystem.Execute.

  Here is a small example I did.  I pointed an rvProject to a project of mine via the object inspector and set it's system property to an rvSystem component.  I filled in the rvSystems OnPrint event and put a button on the form and responded to the OnClick event.  Here's the code.


unit Unit2;
 

interface
 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, RpBase, RpSystem, RpDefine, RpRave, rvLdCompiler, RvDLADO;
 

type

  TForm2 = class(TForm)

    RvProject1: TRvProject;

    RvSystem1: TRvSystem;

    Button1: TButton;

    procedure RvSystem1Print(Sender: TObject);

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;
 

var

  Form2: TForm2;
 

implementation
 

{$R *.dfm}
 

procedure TForm2.Button1Click(Sender: TObject);

begin

  RvSystem1.Execute;

end;
 

procedure TForm2.RvSystem1Print(Sender: TObject);

begin

  //print two

  with sender as TBaseReport do

    begin

      rvProject1.Open;

      rvProject1.SelectReport('WarehouseActivityReport', true);
 

      rvProject1.SetParam('Warehouse', 'CS-SHOE');

      rvProject1.ExecuteReport('WarehouseActivityReport');

      NewPage;
 

      rvProject1.SetParam('Warehouse', 'CS-AGGIND');

      rvProject1.ExecuteReport('WarehouseActivityReport');

      //NewPage; //if printing another report

    end;

end;
 

end.

Open in new window

0
Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 

Author Comment

by:Marius0188
ID: 20418428
Ok what I have done, was to call the rvSystem.Execute method in the in the OnPrint() I ran my code which check what should be printed or not. Just, or nearly, like nevrona's example.

But the problem is I get blank pages printed.
In the OnPrint() event's code I have a condition and when true then it should print but it prints for each loop whether condition true or not. Is this normal?

Check my OnPrint() code:
procedure TfrmMain.rvSystemPrint(Sender: TObject);

var

  X :Integer;

begin

  For X := 0 to slStillagePrintList.Count - 1 do

  begin

    Try

      //Print the stillage labels if AutoPrintSL is flagged on

      qStillages.SQL.Text := 'SELECT S.BarCode, S.POrderNumber, S.Sequence, S.TheirDateTime, S.ItemNumber, S.ItemDescription, '+

        'S.PartTypeNumber, P.StillageQty, P.PrintBOMSL ' +

        'FROM tblStillages S LEFT OUTER JOIN tblPartTypes P ON S.PartTypeNumber = P.PartTypeNumber '+

        'WHERE (BarCode = :BarCode) AND (S.SLPrinted = 0) AND (P.AutoPrintSL = 1) '+

        'ORDER BY TheirDateTime, Sequence';

      qStillages.Parameters.ParamByName('BarCode').Value := Trim(slStillagePrintList.Strings[X]);

      qStillages.Open; qStillages.Last; qStillages.First;

      If not qStillages.IsEmpty then

      begin

        qStillageBoms.Open;

        

        rvSystem.DefaultDest := rdPrinter;

        rvSystem.SystemSetups := rvSystem.SystemSetups - [ssAllowSetup];
 

        rvProject.Open;

        rvProject.SelectReport('repStillageLabel', False);

        rvProject.SetParam('Date', DateToStr(Date));

        rvProject.SetParam('Time', TimeToStr(Time));

        rvProject.SetParam('PartType', qStillages.FieldByName('PartTypeNumber').AsString);

        rvProject.SetParam('StillageQty', qStillages.FieldByName('StillageQty').AsString);

        rvProject.SetParam('BarCode', qStillages.FieldByName('BarCode').AsString);

        rvProject.Execute;
 

        //Mark this SL as printed.

        qUpdate.SQL.Text := 'UPDATE tblStillages SET SLPrinted = 1 WHERE BarCode = :BarCode';

        qUpdate.Parameters.ParamByName('BarCode').Value := slStillagePrintList.Strings[X];

        qUpdate.ExecSQL;
 

        WriteToLog(logAttention, 'Stillage Label Printed: ' + slStillagePrintList.Strings[X]);
 

        If X <> slStillagePrintList.Count - 1 then TBaseReport(Sender).NewPage;

      end;

      lsbPrinter.Selected[X] := True;

    Except

      On E:Exception do

      begin

        WriteToLog(logError, E.Message);

      end;

    end;

  end;

end;

Open in new window

0
 

Author Comment

by:Marius0188
ID: 20418474
Let me put it a little clearer.

I am doing as nevrona says. Do my printing in the OnPrint() event.
But I have procedure outside from the event which does some processing and when finished it calls the
rvSystem.Execute method.

But the problem is, not every call to rvSystem.Execute will have printable information. Therefore the condition see: Line 16 in code snippet above....
Printing should only occur when there are results in the dataset. But what currently happens is when the result is empty then it prints a blank page. Why this? All the code that relevant to printing is inside this If condition.

Please help.
0
 

Author Comment

by:Marius0188
ID: 20418707
Hi,

The problem is not my code, I believe.

I have build a demo application, with a TrvSystem and TrvProject component which are linked.
Added a TButton on the form.
The buttons OnClick() event has the following code:
   rvSystem1.Execute.

I have assigned the Rave Report project to the TrvProject.ProjectFile and have click StoreRav.

No code exists in the rvSystem1.OnPrint() event.
But when clicking button then a blank pages prints.

Why so?


Help?
0
 
LVL 21

Expert Comment

by:developmentguru
ID: 20442351
 Normally when I get blank pages the dataset is returning no records...  That can be due to not setting parameters or other issues.  It depends on what type of datasets you are using in Rave too.  First just create 3 form style reports that require no data.  All you have to do is put a shape, text box, etc on the report and save it.  Then, run your code calling those reports (so they print in one job).  This should work with no problems and indicate that there is nothing  wrong with your code.  You then need to figure out why your report has no records.
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Suggested Solutions

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
This video discusses moving either the default database or any database to a new volume.
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now