Marius0188
asked on
Delphi 7 :: Rave Report - Several Reports Print in ONE spool JOB
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.
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;
ASKER
and different report parameters.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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:
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;
ASKER
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.
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.
ASKER
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?
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?
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.
ASKER
Thanks.