Fastreport 4 Beispiel für eine Rechnung das Prinzip n. verst
Hallo Zusammen,
Gibt es ein Beispiel für einen Rechnungs-Report? Irgendwie hab ich das Prinzip nicht verstanden. Wie wird bitte ein Report für eine Rechnung erstellt wenn ich zwei DataSets habe. Das MasterDataset enthält alle Rechnungskopfdaten und das DetailDataset die Rechnungspositionen. Eine Rechnung kann über mehrere Seiten gehen und es werden immer mehr wie eine Rechnung in einem Druckjob gedruckt. Auf welches Band werden die Rechnungskopfdaten platziert und wo die Rechnungspositionen. Ich habe ein Report dafür erzeugt. Die Rechnung wird richtig gedruckt wenn nur ein Datensatz zu drucken ist oder wenn ich TfrxIBODataset.RangeBegin:=rbCurrent und TfrxIBODataset.RangeEnd:=rbCurrent einstelle. Ich habe auf dem PageHeaderBand die Kopfdaten der Rechnung abgelegt wie Adresse, Datum u.s.w. Auf das MasterDataBand die Rechnungsnummer und auf das DetailDataBand die PositionNr, ArtikelNr, Bezeichnung,Preis u.s.w. Wenn das DataSet mehr wie einen Datensatz enthält, wird auf der ersten Seite im PageHeaderBand die Adresse des letzen Datensatzes angezeigt. Ich hatte neulich ein ähnliches Problem und habe es lösen können indem ich Gruppiert habe. Gefühlsmäßig ist dieser Weg nicht richtig. Da gibt es sicherlich einen besseren Weg. Gruß Kostas |
Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn es mit nur einer Rechnung funktioniert mach es Dir doch einfach und "Prepare" alle Einzelrechnungen. Dann zeigst Du den kompletten Report an oder druckst ihn aus (in dem Beispiel habe ich sogar 3 Datasets, Belegkopfdaten, Positionsdaten und Summendaten mit mehreren Mehrwert-Steuersätzen):
Delphi-Quellcode:
Die statischen Werte aus BKopf landen im TFrxPageHeader sowie TfrxReportSummary. Die Positionsdaten und Summendaten befinden sich in zwei TFrxMasterData.with TPrintModule.Create(Application) do begin // BelegIds ist ein dynamisches Array mit den IDs der Belege ;) for i := 0 to High(BelegIds) do begin qryBKopf.ParamByName('Id').AsFloat := BelegIds[i]; 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; end; frxReport1.ShowPreparedReport; Free; end; |
Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v
Hallo Union,
ja so ähnlich mache ich es derzeit auch. Ein Select auf jede einzelne Rechnung und danach drucken. Du machst es noch besser indem Du alle Rechnungen in ein File zusammen fast. Coole Idee werde ich übernehmen. Aber ich finde das muss doch auch so gehen. Eigentlich ist Rechnung drucken doch das Prinzip des Master/Detail-Reports. Das Problem ist nur, dass das PageHeaderBand mit dem MasterBand nicht synchronisiert. Interessant ist, dass die erste Rechnung die Kopfdaten der letzen Rechnung druckt. Ab der zweiten Rechnung jedoch funkt alles wie es soll. Das ist ein refresh Problem, möglicherweise ist das auch ein Bug. Oder ist der Reporter wirklich so Designed wie Du es gemacht hast? Gruß Kostas |
Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v
Ich habe die Funktion mal umgeschrieben, so dass sie mit nur einem Open auskommt (durch ersetzen der where-Klausel):
Delphi-Quellcode:
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.
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; 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. |
Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v
Hallo Union,
würde mich nicht wundern, wenn es sich um einen Bug handelt. Ich selbst habe schon mehrere sollcher seltsamen "Phänomene" in der aktuellen Version von Fastreport gefunden. Gruß Micha |
Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v
Ich hab das jetzt mal mit TFrxDataSet Komponenten im Designer probiert. Der Trick ist, dass man nicht nur die TFrxParams setzen muß, sondern auch das Feld Master auf die Kopfdatenmenge:
Code:
Läßt man das Setzen des Master weg, so gibt es tatsächlich ziemliches Durcheinander. Der dazugehörige (scheußliches Design) Testreport:
Rgkopf : TFrx...DataSet
SQL: Select * from Rgkopf Rgpos : Tfrx...DataSet SQL: Select * from RgPos where rgkopf_id = :id Params.Name : id Params.Datatype: ftFloat Params.Value: <RgKopf."ID"> Master: RGKopf
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<TfrxReport Version="4.5" DotMatrixReport="False" IniFile="\Software\Fast Reports" PreviewOptions.Buttons="4095" PreviewOptions.Zoom="1" PrintOptions.Printer="Default" PrintOptions.PrintOnSheet="0" ReportOptions.Compressed="True" ReportOptions.CreateDate="39490,6341565972" ReportOptions.Description.Text="" ReportOptions.LastChange="39617,448543287" ScriptLanguage="PascalScript" ScriptText.Text="begin end." StoreInDFM="False" PropData="044C656674021003546F70020808446174617365747301010C2600000020446174615365743D2252674B6F70662220446174615365744E616D653D2252674B6F70662200010C2400000020446174615365743D225267504F732220446174615365744E616D653D225267506F73220000095661726961626C65730100055374796C650100"> <TfrxDataPage Name="Data" Height="1000" Left="0" Top="0" Width="1000"> <TfrxADSQuery Name="RgKopf" UserName="RgKopf" CloseDataSource="True" FieldAliases.Text="" IgnoreDupParams="False" SQL.Text="select top 3 * from rgkopf " DatabaseName="AdsConnection" PropData="05704C65667402640470546F7002540A506172616D65746572730100"/> <TfrxADSQuery Name="RgPOs" UserName="RgPos" CloseDataSource="True" FieldAliases.Text="" Master="RgKopf" IgnoreDupParams="False" SQL.Text="select * from rgpos where rgkopf_id = :id " DatabaseName="AdsConnection" PropData="05704C656674039C000470546F7002540A506172616D657465727301010C48000000204E616D653D226964222044617461547970653D226674466C6F6174222045787072657373696F6E3D22262336303B52674B6F70662E262333343B4944262333343B262336323B220000"/> </TfrxDataPage> <TfrxReportPage Name="Page1" PaperWidth="210" PaperHeight="297" PaperSize="9" LeftMargin="0" RightMargin="0" TopMargin="0" BottomMargin="0" ColumnWidth="0" ColumnPositions.Text="" HGuides.Text="" VGuides.Text=""> <TfrxMasterData Name="MasterData1" Height="22,67718" Left="0" Top="16" Width="793,7013" ColumnWidth="0" ColumnGap="0" DataSet="RgKopf" DataSetName="RgKopf" RowCount="0"> <TfrxMemoView Name="RgKopfRGNR" Left="0" Top="0" Width="158,74026" Height="18,89765" DataField="RGNR" DataSet="RgKopf" DataSetName="RgKopf" Font.Charset="1" Font.Color="-16777208" Font.Height="-13" Font.Name="Arial" Font.Style="1" ParentFont="False" Text="[RgKopf."RGNR"]"/> <TfrxMemoView Name="RgKopfID" Left="166,29932" Top="0" Width="79,37013" Height="18,89765" DataField="ID" DataSet="RgKopf" DataSetName="RgKopf" Font.Charset="1" Font.Color="-16777208" Font.Height="-13" Font.Name="Arial" Font.Style="0" ParentFont="False" Text="[RgKopf."ID"]"/> </TfrxMasterData> <TfrxDetailData Name="DetailData1" Height="22,67718" Left="0" Top="60" Width="793,7013" ColumnWidth="0" ColumnGap="0" DataSet="RgPOs" DataSetName="RgPos" RowCount="0"> <TfrxMemoView Name="RgPosRGKOPF_ID" Left="166,29932" Top="0" Width="79,37013" Height="18,89765" DataField="RGKOPF_ID" DataSet="RgPOs" DataSetName="RgPos" Font.Charset="1" Font.Color="-16777208" Font.Height="-13" Font.Name="Arial" Font.Style="0" ParentFont="False" Text="[RgPos."RGKOPF_ID"]"/> <TfrxMemoView Name="RgPosPOS_NR" Left="264,5671" Top="0" Width="79,37013" Height="18,89765" DataField="POS_NR" DataSet="RgPOs" DataSetName="RgPos" Font.Charset="1" Font.Color="-16777208" Font.Height="-13" Font.Name="Arial" Font.Style="0" ParentFont="False" Text="[RgPos."POS_NR"]"/> <TfrxMemoView Name="RgPosMENGE_SOLL" Left="359,05535" Top="0" Width="79,37013" Height="18,89765" DataField="MENGE_SOLL" DataSet="RgPOs" DataSetName="RgPos" Font.Charset="1" Font.Color="-16777208" Font.Height="-13" Font.Name="Arial" Font.Style="0" ParentFont="False" Text="[RgPos."MENGE_SOLL"]"/> <TfrxMemoView Name="RgPosMENGE_IST" Left="461,10266" Top="0" Width="79,37013" Height="18,89765" DataField="MENGE_IST" DataSet="RgPOs" DataSetName="RgPos" Font.Charset="1" Font.Color="-16777208" Font.Height="-13" Font.Name="Arial" Font.Style="0" ParentFont="False" Text="[RgPos."MENGE_IST"]"/> </TfrxDetailData> </TfrxReportPage> </TfrxReport> |
Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v
Hallo Union,
einen Moment bitte. Du schreibst man muss die TFrxParams setzen, habe ich noch nie gemacht! Kann ich auch nicht finden. Wie komme ich da bitte ran? Ebenfalls für mich sehr interessant, das „Feld Master muss auf die Kopfdatenmenge zeigen“. Habe ich auch nicht gemacht und finde nirgends eine Eigenschaft. Wo ist bitte das Zeug versteckt. Das wird vermutlich die Lösung sein. Gruß Kostas |
Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v
Wenn Deine Komponenten das nicht unterstützen, sind sie nicht vollständig implementiert. Sie müssen von TfrxCustomQuery bzw. TfrxCustomTable abgeleitet sein und dann die Properties Master und Params (bei der Query) unterstützen.
|
Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v
Zitat:
In Designer gibt eine unter dem Tab Data eine Komponentenpalette unter anderem auch eine TfrxIB_Query und eine TfrxIB_Table die haben die Propertys Master und Params. Du arbeitest also mit diesen Komponenten. Ich verwende die TfrxIBODataset Komponente die auf ein Form platziert wird! Die Komponente hat keine master und Params. Das ist der Unterschied. Dann habe ich wohl ein Problem. Gruß Kostas |
Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v
So arbeite ich aber meistens auch. TDataSet Komponente(n) auf Formular, alles verknüpfen und dem Report bekanntmachen mittels TFrxDBDataSet(s). Aber auch bei Deiner TfrxIBODataset-Komponente muß es ja eine Möglichkeit geben, Master-Detail-Verknüpfungen zu machen. Du musst nur rausfinden wie. Die TfrxKomponenten die im Designer benutzt werden verwende ich nur, wenn ich einen User-Designer zur Verfügung stelle. Dann kann / muß sich der Benutzer um alles selber kümmern.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz