Ich habe die Funktion mal umgeschrieben, so dass sie mit nur einem Open auskommt (durch ersetzen der where-Klausel):
Delphi-Quellcode:
procedure TfrmBelegKopf.PrintSelectedBeleg;
var
i : integer;
BelegId : extended;
BelegIds : array of extended;
BelegIDString : string;
begin
for i := 0 to cxGridBelegeDBTableView1.Controller.SelectedRowCount -1 do
begin
if cxGridBelegeDBTableView1.Controller.SelectedRows[i] is TcxGridDataRow then
begin
BelegId := cxGridBelegeDBTableView1.Controller.SelectedRows[i].Values[0];
SetLength(BelegIds, Length(BelegIds)+1);
BelegIds[High(BelegIds)] := BelegId;
end;
end;
if Length(BelegIds) > 0 then
begin
// IN(...) String zusammensetzen
for i := 0 to High(BelegIds) do
begin
BelegIDString := BelegIDString+IntToStr(trunc(BelegIDs[i]))+',';
end;
// letztes Komma abschneiden
BelegIDString := copy(BelegIDString,1,length(BelegIDString)-1);
with TPrintModule.Create(Application) do
begin
// Where ersetzen
qryBKopf.SQL.Strings[qryBKopf.SQL.Count-1] := 'where bkopf.id in ('+BelegIDString+')';
qryBKopf.Open;
qryBPos.Open;
qrySummen.Open;
if Length(BelegIds) > 1 then
frxReport1.ReportOptions.Name :=
Format('%s - %s',['Sammeldruck', qryBelegart.FieldByName('Beleg_text').AsString])
else
frxReport1.ReportOptions.Name :=
Format('%1:s %0:s',[qryBKopf.FieldByName('Bnr').AsString, qryBelegart.FieldByName('Beleg_text').AsString]);
frxReport1.PrepareReport(False);
qryBKopf.Close;
frxReport1.ShowPreparedReport;
Free;
end;
end;
end;
Die Rechnungen werden alle gedruckt wie im Einzeldruck. Nur die #Page Variablen stimmen natürlich nicht mehr, deshalb drucke ich die ja (wie im letzen Psoting) normalerweise einzen. Dann brauche ich mir die Seiten nicht selber zu numerieren.
Kopf und Fussdaten sind die richtigen, da wird nichts vermischt. Wie hast Du denn Deine Datasets verbunden? Ich habe eine ganz normale Verbindung über DataSource der Kopfdaten in die DataSourcen der Positions- und Summendaten gemacht. Ich verwende hier
keine speziellen TFrx...DataSet Komponenten. Vielleicht steckt ja auch da der Fehler drin.