AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Fastreport 4 Beispiel für eine Rechnung das Prinzip n. verst
Thema durchsuchen
Ansicht
Themen-Optionen

Fastreport 4 Beispiel für eine Rechnung das Prinzip n. verst

Ein Thema von Kostas · begonnen am 17. Jun 2008 · letzter Beitrag vom 19. Jun 2008
Antwort Antwort
Seite 1 von 3  1 23      
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Fastreport 4 Beispiel für eine Rechnung das Prinzip n. verst

  Alt 17. Jun 2008, 19:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v

  Alt 18. Jun 2008, 00:33
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:
      
   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;
Die statischen Werte aus BKopf landen im TFrxPageHeader sowie TfrxReportSummary. Die Positionsdaten und Summendaten befinden sich in zwei TFrxMasterData.
Miniaturansicht angehängter Grafiken
fastreport_rechnung_194.jpg  
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v

  Alt 18. Jun 2008, 09:36
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v

  Alt 18. Jun 2008, 10:28
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von DerAndereMicha
DerAndereMicha

Registriert seit: 1. Jul 2004
Ort: Berlin
208 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v

  Alt 18. Jun 2008, 10:35
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
Der Weg ist das Ziel...
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v

  Alt 18. Jun 2008, 10:49
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:
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
Läßt man das Setzen des Master weg, so gibt es tatsächlich ziemliches Durcheinander. Der dazugehörige (scheußliches Design) Testreport:
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>
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v

  Alt 18. Jun 2008, 11:26
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v

  Alt 18. Jun 2008, 11:36
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v

  Alt 18. Jun 2008, 11:49
Zitat von Union:
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.
Jetzt kommen wir der Sache schon näher.
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Fastreport 4 Beispiel für eine Rechnung das Prinzip n. v

  Alt 18. Jun 2008, 12:04
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:26 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