FastReport Tipps und Tricks: Unterschied zwischen den Versionen

Aus GEVITAS
Wechseln zu: Navigation, Suche
(Zahlen und Datum formatieren)
(Formatieren in einem Textfeld)
Zeile 401: Zeile 401:
 
==== Formatieren in einem Textfeld ====
 
==== Formatieren in einem Textfeld ====
  
Wenn man ein Datum in einem Textfeld (Memo) formatieren will, kann man dazu die eingebaute Funktion '''FormatDateTime''' verwenden.
+
Wenn man ein Datum in einem Textfeld (Memo) formatieren will, kann man dazu die eingebaute Funktion '''FormatDateTime(Format-String,[Feld])''' verwenden.
 +
 
 +
Im Format-String kann man die Formatierung festlegen.
  
 
Beispiel:
 
Beispiel:
Zeile 412: Zeile 414:
 
  6-Apr-2016
 
  6-Apr-2016
  
 
+
Das Ausschreiben des Monats verhindert Missverständnisse mit englisch- bzw. amerikanischen Ländern. Die Monats-Namen werden jedoch aus der Einstellung des '''Rechners''' geholt, d.h. ist der Rechner auf Deutsch eingestellt, werden auch die deutschen Monats-Namen verwendet!
  
 
* Siehe auch [[FastReport_Tipps_und_Tricks#Zahlenwert_in_Text_umwandeln]]
 
* Siehe auch [[FastReport_Tipps_und_Tricks#Zahlenwert_in_Text_umwandeln]]

Version vom 27. April 2016, 09:49 Uhr

Inhaltsverzeichnis

1 Allgemeines

Dieser Artikel beschreibt kleine Tipps und Tricks für das Erstellen von Reports mit FastReport, die im Alltag hilfreich sein können.


2 Eingebaute Funktionen und Variablen

2.1 Anzahl der Datensätze

Manchmal hat man das Problem, dass bestimmte Bereiche unterdrückt werden sollen, wenn es nur einen einzigen Datensatz gibt. Beispielsweise hat man ein Mahnungsformular mit der Tabelle der fälligen Rechnungen und darunter die Gesamtsumme. Die Gesamtsumme soll aber unterdrückt werden, wenn es nur eine angemahnte Rechnung in der Tabelle gibt. Dann kann im Objektinspektor des Bereich auf das Ereignis

OnBeforePrint 

doppelklicken und diesen Code schreiben:

procedure Child2OnBeforePrint(Sender: TfrxComponent);
begin
   // Band mit der Gesamtsumme unterdrücken, wenn es nur EINE Rechnung gibt:
   if <Line#> = 1 then
       Child2.Visible := False
   else
       Child2.Visible := True;               
end;

Die System-Variable <Line#> beihaltet die Anzahl der Zeilen (Datensätze) des Detail-Bandes.


3 Vom Programm zur Verfügung gestellte Variablen

Das Programm stellt dem Report einige Variablen zur Verfügung. Diese müssen über Report ⇒ Variablen angelegt werden.


3.1 Kopie des Ausdrucks

Die Variable Copy enthält die Kopie-Nummer des Ausdrucks, wenn man die Auswahl "Kopien" verwendet.

  • Diese Variable wird nur beim Drucken des Reports gefüllt! Bei der Vorschau oder dem Export enthält die Variable immer 0!
0 = Original
1 = Erste Kopie
2 = Zweite Kopie

usw.

Man kann die Variable z.B. dazu benutzen, auf der Kopie ein Logo zu unterdrücken oder das Wort "Kopie" auf den Kopien auszudrucken.

Weitere Informationen dazu zeigt dieser Artikel.


3.2 Report-Name

Die Variable ReportName enthält den Dateinamen des verwendeten Reports.


4 Seiten-Ansteuerung

4.1 Manueller Seitenwechsel im Code

Wenn man im Report einen manuellen Seitenwechsel anhand eines Kennzeichens erzeugen will, muss man im Ereignis OnBeforePrint des gewünschten Bandes diesen Code einfügen:

procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);
begin
  // Dieser Code wird ausgeführt, BEVOR das Positionen-Gruppenkopf-Band (die Kapitel-Überschrift) ausgegeben wird.
  // Wenn das Kennzeichen "Seitenwechsel Vorher" gesetzt ist:
  if <Positionen."Seitenwechsel_0Nein_1Vorher_2Nachher"> = 1 then
    Engine.NewPage;                                   // Neue Seite, Seitenkopf usw. drucken
end;

procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent);
begin
  // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band ausgegeben wird.

  // Kapitel-Position ausblenden:
  if <Positionen."PosNr"> = 0 then
  begin
    DetailPositionen.Visible := False;
  end
  else
    DetailPositionen.Visible := True;

  // Wenn das Kennzeichen "Seitenwechsel Vorher" gesetzt ist:
  if <Positionen."PosNr"> > 0 then                                   // NICHT bei Kapitel-Position, das wird da schon gemacht!
    if <Positionen."Seitenwechsel_0Nein_1Vorher_2Nachher"> = 1 then
      Engine.NewPage;                                                // Neue Seite, Seitenkopf usw. drucken
end;

Das Feld, mit dem die Seitenwechsel-Option gespeichert wird, heißt übrigens wirklich Seitenwechsel_0Nein_1Vorher_2Nachher. Das ist zwar ungewöhnlich, zeigt aber schon im Feldnamen, welche Optionen es gibt. Ungewöhnlich aber praktisch!


4.2 Report-Zusammenfassung am Ende der Seite

Wenn man die Report-Zusammenfassung (Report Summary) am Ende der Seite drucken will, muss man im Ereignis ReportSummary1OnBeforePrint diesen Code einfügen:


procedure ReportSummary1OnBeforePrint(Sender: TfrxComponent);
begin
  Engine.CurY := Engine.CurY + Engine.FreeSpace - ReportSummary1.Height - 1;  
end;

Einzelheiten zu FastReport-Engine werden unter FastReport Engine: Der Report-Erzeuger beschrieben.


4.3 Leerzeilen verhindern bei unterdrücktem Feld

Wenn man in einem Report mehrere Felder untereinander hat, von denen das unterste unterdrückt werden soll, hat man das Problem, dass das Feld zwar ausgeblendet wird (Visible := False), der Platz unten aber leider nicht, es bleibt also eine Leerzeile:

Beispiel:

In diesem Bereich...


FastReport TippsUndTrick Positionen TextPosition.png

...wird das TextPositionen-Feld RichTextArtikelText mit diesem Code ausgeblendet:

 procedure RichTextArtikelTextOnBeforePrint(Sender: TfrxComponent);
 begin
   // Kennzeichen 6 = Artikel-Texte sichtbar Ja/Nein:  //JC//160111//
   // (oder wenn leer)
   RichTextArtikelText.Visible:= True;  //JC//160111//
   if ( <AuftragsKopf."KENNZ6"> = 'Nein' )
   or ( <Positionen."TextPosition"> = '' ) then
   begin
     RichTextArtikelText.Visible    := False;
   end;
 end;

Das Ergebnis:

FastReport TippsUndTrick Positionen TextPosition Vorher.png

An den markierten Stellen gibt es Leerzeilen. FastReport kann zwar Felder nach unten schieben und auch das Band vergrößern, wenn ein darüberliegendes Feld größer wird, aber das Band wird leider nicht verkleinert, wenn das letzte Feld ausgeschaltet wird.

Um das zu verhindern, kann man folgenden Code einfügen:

 procedure RichTextArtikelTextOnAfterPrint(Sender: TfrxComponent);
 begin
    // Druckposition um die Höhe des Feldes nach oben verschieben:
    if  RichTextArtikelText.Visible = False then
       Engine.CurY := Engine.CurY - RichTextArtikelText.Height;
 end;

Die Zeilen verschieben die Druckposition um die Höhe des Feldes nach oben, wenn das Feld unsichtbar ist.

Das Ergebnis nun:

FastReport TippsUndTrick Positionen TextPosition Nachher.png


4.4 Aufteilung erlauben

Wenn man z.B. im Fuss umfangreichen Text hat, können unerwünschte Seitenumbrüche entstehen. Um das zu vermeiden, können Sie die Option "Aufteilung erlaben" für das Band einschalten.



5 Bänder

5.1 Kapitel-Positionen zusammenhalten

Es kann vorkommen, dass auf die Seite nur noch die Kapitel-Überschrift passt und keine Position mehr. Beispiel:

FastReport TippsUndTrick KapitelPositionen Zusammenhalten Vorher.png

Um das zu verhinden, setzt man die Option:

FastReport TippsUndTrick KapitelPositionen Zusammenhalten Option.png

Nachher:


FastReport TippsUndTrick KapitelPositionen Zusammenhalten Nachher.png


5.2 Band per Code unterdrücken

Im Prinzip kann man ein Band ganz einfach im Code unterdrücken, indem man eine Formel schreibt, die unter bestimmten Umständen die Eigenschaft Visible (=sichtbar) auf False (falsch, nein) stellt. Beispiel:

 // Kapitel-Position ausblenden:
 if <Positionen."PosNr"> = 0 then     // Wenn es eine Kapitel-Position ist!
 begin
   DetailPositionen.Visible := False;
 end;

oder kürzer:

 if <Positionen."PosNr"> = 0 then     // Wenn es eine Kapitel-Position ist!
   DetailPositionen.Visible := False;


Im Detail-Bereich (z.B. bei Auftrags-Positionen), der ja mehrfach wiederholt wird, würde sich dieses Unsichtbar schalten aber auf alle folgenden Detail-Daten auswirken! Ab dem Moment würden die restlichen Position nicht mehr erscheinen! Also muss man im Code festlegen, was sonst ("else") passieren soll, wenn die Bedingung nicht erfüllt ist. Das könnte dann so aussehen:

 // Kapitel-Position ausblenden:
 if <Positionen."PosNr"> = 0 then     // Wenn es eine Kapitel-Position ist!
 begin
   DetailPositionen.Visible := False;
 end
 else                                // Wenn es KEINE Kapitel-Position ist!
   DetailPositionen.Visible := True;


Etwas schwieriger wird es, wenn es mehrere Abfragen im Code gibt, die das Visible für das Band ein- oder ausschalten. Dieser Artikel beschreibt, wie man da am Besten vorgeht.


5.3 Band dehnen

Eine wichtige und tolle Eigenschaft eines Bands in FastReport ist es, dass es sich optional dehnen kann, also an die Größe (genauer gesagt Höhe) der auszugebenden Daten anpassen kann.

Dieser Artikel beschreibt das.


6 Formatierung

6.1 Farbe eines Bandes abwechselnd grau/weiß

Wenn man die Farbe eines Bandes (z.B. den Detail-Bereich, also die Positionen eines Auftrags) abwechselnd grau/weiß hinterlegen will, muss man ein bisschen in die Trickkiste greifen. Im OnBeforePrint-Ereignis des Bandes schreibt man diesen Code:


procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent);
begin
  // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band ausgegeben wird.

  // Farbe abwechselnd weiß/grau:
  if <Line> mod 2 = 1 then  // Bei jeder GERAD-STELLIGEN Zeile!
  begin              
    TfrxBrushFill(DetailPositionen.Fill).BackColor := cl3dLight;  
    TfrxBrushFill(ChildDetailPositionen.Fill).BackColor := cl3dLight;  
  end                
  else
  begin              
    TfrxBrushFill(DetailPositionen.Fill).BackColor := clNone;
    TfrxBrushFill(ChildDetailPositionen.Fill).BackColor := clNone;  
  end;
end;

Der erste Trick ist die Zeile

  if <Line> mod 2 = 1 then  // Bei jeder GERAD-STELLIGEN Zeile!

<Line> ist eine System-Variable, die eine fortlaufende Zeilennummer (Datensatz-Nummer) zurückgibt, die FastReport einfach hochzählt. Der erste Datensatz hat einfach die Zeilennummer 1, der nächste 2 usw.

mod 2 ist eine Division und bringt den Rest der Divison zurück.


6.2 Gruppenkopf auf letzter Seite unterdrücken, wenn keine Daten mehr kommen

Man kann den Gruppenkopf einer Gruppe ganz gut dazu benutzen, eine Überschrift über die Positionen zu drucken, die auch auf jeder Seite wiederholt wird. Es kann nun aber vorkommen, dass die Positionen gerade an Ende einer Seite aufhören und auf der nächsten Seite trotzdem noch die Überschrift dazu gedruckt wird. Das sieht unschön aus. Dieser Artikel beschreibt, wie man das verhindert.


6.3 Report mit Sub-Detail-Band wird abgebrochen, wenn es keine Sub-Daten gibt

Ein Report hat folgende Bänder:

  • Master (Kopfdaten)
    • Details (Positionen)
      • SubDetails (Unterpositionen zu jeder Position)

Der Report wird wird jedoch abgebrochen, denn es keine Sub-Daten gibt!

Grund:

Man muss die Option "Drucken wenn Detail leer" auf dem Detail-Band einschalten!



6.4 Unterschiedliche Schriftarten in Auftrags-/Rechnungspositions-Texten

In den Textbausteinen eines Angebots, Auftrags oder einer Rechnung kommen die Texte in unterschiedlichen Schriftarten oder -Größen. Die Schriftart-Änderung im Report ist ohne Wirkung.

Grund
Die Schriftarten kommen aus den Texten selbst, also aus der Datenbank, nicht aus dem Report!
Es handelt sich hier ja um RTF-formatierte Texte. Die Schriftart/-Größe wird in den Stammdaten festgelegt. Das ermöglicht es, innerhalb des Textes Formatierungen vorzunehmen, z.B. Fettschrift.
Beim Einfügen eines solchen Textes wird die Formatierung aus den Stammdaten in die Positionen 1:1 übernommen.
Lösung
Man muss also die Schriftart in den Artikelstammdaten⇒Texte ändern!
Will man die Änderung testen, hat das zuerst keine Auswirkung! Grund: Änderungen in den Stammdaten werden nicht in die bestehenden Positionen übernommen, sonst würden dort eventuelle individuelle Änderungen unkontrolliert überschrieben. Man muss daher in den Positonen im Textbereich rechts unten auf den Sternchen-Button klicken, damit der Text neu aus den Stammdaten in die Position geholt wird.



6.5 Rahmen per Code setzen

Manchmal möchte man den Rahmen eines Objektes nur unter bestimmten Bedingungen setzen. Beispiel: Im Fuss eines Auftrags wird ja die Mehrwertsteuer ausgewiesen. Hat man nun einen Auftrag ohne Mehrwertsteuer, so sollen die Brutto-Felder (mit doppeltem Rahem unten) ausgeblendet werden und das Netto-Feld als Summenfeld den doppelten Rahmen bekommen. Beispiel:

FastReport Rahmen Code 01.png


Dazu kann man folgenden Code verwenden:

procedure FussPositionenOnBeforePrint(Sender: TfrxComponent);
begin
  // Ohne Mwst.: Mwst-Felder unterdrücken:
  if <AuftragsFuss."MwstBetrag"> = 0 then
  begin
    memoFussGesamtBrutto.Visible:= False;
    AuftragsFussMwstBetrag.Visible:= False;
    AuftragsFussMwstSatzProzent.Visible:= False;
    AuftragsFussGesamtBetragBrutto.Visible:= False;
    memoFussGesamtNetto.Text := 'Endbetrag in €';      // Ohne Mwst gibt's kein brutto/netto!
    memoFussGesamtNetto.Frame.Typ := ftBottom;         // Rahmen unten
    memoFussGesamtNetto.Frame.BottomLine.Style := fsDouble;         // Rahmen-Style "Doppelt"
  end;
end;


Hinweis
Das Textfeld memoFussGesamtNetto reicht bis zum rechten Rand des Formulars! Es liegt also teilweise unter dem Feld "NettoBetrag". Durch diesen Trick wird die Linie unten bis zum Betragsfeld rechts gezogen.


6.6 Positionsangaben im Code

Manchmal möchte man im Code ein Objekt verschieben.

Beispiele
  • Der Pauschal-Betrag in einem Angebot soll nach links eingerückt werden.
  • Ein Feld soll nach oben verschoben werden, wenn andere darüber ausgeblendet werden.

Dann kann man im Code die Position des Objektes festlegen:

Left
Legt die horizontale Position des Objektes fest, bezogen auf den linken Rand des Bands.
Top
Legt die vertikale Position des Objektes fest, bezogen auf das Band.

Beispiel:

  if <BestellFuss."Nettobetrag1"> = 0 then //JC//160209//
  begin
      RichFussStandardText.Top := 0.5 * fr1cm;
  end;

Dieser Code verschiebt ein Feld nach oben, und zwar auf 0,5 cm, bezogen auf das Band, auf dem es liegt.

"fr1cm" ist dabei eine Umrechnungs-Variable, die FastReport zur Verfügung stellt.

Der Grund: Alle Angaben von Positionen im Code wie Top, Left usw. werden in Pixeln gemacht. Dadurch ist eine sehr genaue und Hardware-unabhängige Positionierung möglich. Damit man nun die Angaben von Pixeln z.B. in cm einfach angeben kann, muss man nur die gewünschte cm-Anzahl mit fr1cm multiplizieren.

Im Beispiel oben wird das Textfeld auf die Top-Position (=von oben auf dem Band) auf 0,5 cm gesetzt.

  • Beachten Sie, dass das Kommata im Code der Punkt ist! Wenn man im Code also "0,5" schreibt, erhält man eine Fehlermeldung! Man muss "0.5" schreiben!


6.7 Top-Position im Code ändern

Manchmal möchte man die Top-Position von Objekten (also die "Zeile") im Code unter bestimmten Umständen ändern, z.B. Felder nach oben schieben, wenn die "Zeile" darüber ausgeblendet wurde.

In diesem Artikel wird ein Beispiel dazu beschrieben.


6.8 Feld reagiert nicht auf Änderung der Schriftgröße

Wenn man im Designer die Schriftgröße eines Feldes ändern und es wird trotzdem noch zu groß/zu klein/zu fett dargestellt, ist vermutlich ein sog. "Highlight" auf dem Feld gesetzt. Um das zu prüfen und zu entfernen, doppelklicken Sie auf das Feld und entfernen das Highlight.


6.9 Zahlen und Datum formatieren

6.9.1 Formatieren über die Objekt-Eigenschaften

Um Zahlen zu formatieren, klickt man mit der rechten Maustaste auf das Feld und wählt "Anzeigeformat". Neben den Standard-Formatierungen kann man dort auch individuelle Formate angeben:


Format-String Beschreibung, Beispiel
00 Formatiert die Zahl mit zwei Stellen. Wenn die Zahl einstellig ist, wird die leere Stelle mit "0" aufgefüllt. Anwendung z.B. für Tages- oder Monatszahlen. Beispiele "01", "02", "10", "12".
%0.0n Formatiert die Zahl ohne Nachkommastellen. Beispiele "1", "2", "10", "12".
%1.1f Formatiert die Zahl ohne Nachkommastellen. Beispiele "1,4", "2,5", "10,0", "12,0".
ddd dd.mm.yyyy Formatiert ein Datumsfeld mit Wochentag und Datum. Beispiel: "Mo 29.02.2016".

Diese Format-Strings können in das Eingabefeld "Formatstring" eingegeben werden.

6.9.2 Formatieren in einem Textfeld

Wenn man ein Datum in einem Textfeld (Memo) formatieren will, kann man dazu die eingebaute Funktion FormatDateTime(Format-String,[Feld]) verwenden.

Im Format-String kann man die Formatierung festlegen.

Beispiel:

<b>[AuftragsKopf."AuftrNr"]</b>
[FormatDateTime(  'd-mmm-yyyy' ,  <AuftragsKopf."DruckDat">) ]

ergibt das Datum

6-Apr-2016

Das Ausschreiben des Monats verhindert Missverständnisse mit englisch- bzw. amerikanischen Ländern. Die Monats-Namen werden jedoch aus der Einstellung des Rechners geholt, d.h. ist der Rechner auf Deutsch eingestellt, werden auch die deutschen Monats-Namen verwendet!

6.10 Monats-Namen aus Monats-Zahl

Da es keine eingebaute Funktion gibt, mit der man eine Monats-Nummer in einen Namen umwandelt, kann man sich eine eigene Funktion bauen:

procedure PageHeader1OnBeforePrint(Sender: TfrxComponent);
var
  Monatsnamen : Array[0..12] of String = ['FEHLT!','Januar','Februar','März','April','Mai','Juni','Juli',
                                          'August','September','Oktober','November','Dezember' ];
begin
    MemoTitel.Text := 'Statistik ' + Monatsnamen[<Monat>] + '  [Jahr]'
end;

Die Funktion geht davon aus, dass es eine Variable <Monat> gibt, in der die Zahl 1 bis 12 steht.

Um die Monatsnummer aus einem Datumsfeld zu bekommen, kann man die eingebaute Funktion MonthOf(Date) verwenden. Wenn z.B. das Datum aus einem Datenbank-Feld kommt, sähe der Code so aus:

procedure PageHeader1OnBeforePrint(Sender: TfrxComponent);
var
  Monatsnamen : Array[0..12] of String = ['FEHLT!','Januar','Februar','März','April','Mai','Juni','Juli',
                                          'August','September','Oktober','November','Dezember' ];
   Monat : Integer;
begin
  Monat := MonthOf( <Statistik."Datum">  );
  MemoTitel.Text := 'Statistik ' + Monatsnamen[<Monat>] + '  [Jahr]'
end;

7 Variablen

7.1 Fortlaufende Nummer

Wenn man eine fortlaufende Nummer im Report braucht, kann man dazu die System-Variable Line verwenden. Line gibt die Nummer des gerade abgerufenen Datensatzes an, von 1 beginnend.

Wenn man jedoch z.B. eine Gruppierung im Report hat und nur die Daten aus dem Gruppenfuß drucken will, kann man Line nicht verwenden, weil in einer Gruppe ja viele Datensätze enthalten sind und Line die Datensätze zählt, nicht die Gruppenergebnisse.

Um die Aufgabe zu lösen, deklariert man eine eigene Variable im Report und setzt den Standardwert auf 0.

Im Code gibt man z.B. im Gruppenfuß folgenden Code ein:

procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);
begin
  Set('LfdNr', <LfdNr> + 1);
end;



8 Verwendung von Feldern

8.1 Zeilenumbruch innerhalb von Feldern

Wenn man ein Feld in den Report einfügt, ist die Eigenschaft "Zeilenumbruch" (leider) immer eingeschaltet. Da man diesen bei den meisten Feldern nicht benötigt, kann man ihn ausschalten: Mit der rechten Maustaste auf das Feld klicken und die Eigenschaft Zeilenumbruch ausschalten.

Der ungewollte Zeilenumbruch kann dazu führen, dass unterhalb der Felder "Geisterschatten" stehen. Beispiel:

FastReport Tipps Zeilenumbruch GeisterSchatten Bsp 01.png


8.2 Zeilenabstand in Feldern

Wenn man den Zeilenabstand innerhalb eines Memo-Felder ändern will, kann man die Eigenschaft LineSpacing vom Standardwert 2 z.B. auf 6 ändern.


8.3 Berechnungen in einem Feld

Wenn man in einem Feld etwas berechnen möchte, muss man dazu keine Formel oder Variable verwenden wie in CrystalReports©! Man kann die Rechenformel einfach in das Feld schreiben.

Beispiel:

In einer Ladeliste möchte man eine Spalte haben mit der Auftragsmenge zzgl. der Reserve-Mengte, abzgl. der Fremdmenge, also die zu ladende eigene Menge. Dazu zieht man man einfach ein Textfeld in das entsprechende Detail-Band und stellt die Formel zusammen:

[<Positionen."Menge"> + <Positionen."MengeReserve"> - <Positionen."MengeFremd">]

Die Feldnamen kann man mit diesem Button holen:

FastReport Memo MitFormel.png

Die eckigen Klammern

[ ... ]

legen den Anfang und das Ende der Formel fest.

Normalerweise werden Datenbank-Felder in eckigen Klammern angegeben,

Wenn innerhalb der Formel Datenbank-Felder eingebunden werden, müssen diese jedoch in spitzen Klammern angegeben werden!
Falsch
[[Positionen."Menge"] + [Positionen."MengeReserve"] - [Positionen."MengeFremd"] ]
Richtig
[<Positionen."Menge"> + <Positionen."MengeReserve"> - <Positionen."MengeFremd">]


8.4 Zahlenwert in Text umwandeln

Manchmal hat man die Aufgabe, einen Zahlenwert aus der Datenbank in einen Text umzuwandeln. Ein Beispiel dafür zeigt der Report für das Lagerprotokoll.


8.5 Berechnungen in einem Feld mit Formatierung

Wenn man in einem Feld etwas berechnet, wird das Ergebnis so ausgegeben, wie es die Berechnung ergibt. Wenn man z.B. mit zwei Fließkommazahlen rechnet, wird das Ergebnis auch mit allen resultierenden Nachkommstellen ausgegeben.

Beispiel
Im Rechnungsfuß wird der Skonto-Betrag und Skonto-Zahlungsbetrag errechnet und ausgegeben. Der Text im Feld lautet:
Bei Zahlung bis zum <b>[RechnungsFuss."Skonto1BisDatum"]</b> gewähren wir [RechnungsFuss."Skonto1Prozent"] % Skonto = [RechnungsFuss."Skonto1Betrag"]. 
 Zahlungsbetrag mit Skonto: <b>[<RechnungsFuss."GesamtBetragBrutto"> - <RechnungsFuss."Skonto1Betrag">]</b>
Das Ergebnis sieht so aus:

FastReport Rechnung Skonto Unformatiert.png

Damit die Ergebnisse formatiert werden, kann man die eingebaute Funktion FormatFloat( 'Format',Zahl ) verwenden. Diese formatiert die Zahl anhand der Vorgaben im Text Format.
Die Formel dazu sieht nun so aus:
 Bei Zahlung bis zum <b>[RechnungsFuss."Skonto1BisDatum"]</b> gewähren wir [RechnungsFuss."Skonto1Prozent"] % Skonto = [FormatFloat('#,##0.00 €',<RechnungsFuss."Skonto1Betrag">)]. 
 Zahlungsbetrag mit Skonto: <b>[FormatFloat('#,##0.00 €', <RechnungsFuss."GesamtBetragBrutto"> - <RechnungsFuss."Skonto1Betrag">    )]</b>
Das Ergebnis:

FastReport Rechnung Skonto Formatiert.png

Die Ausdrücke der Formel im Einzelnen
Bei Zahlung bis zum <b>[RechnungsFuss."Skonto1BisDatum"]</b> gewähren wir [RechnungsFuss."Skonto1Prozent"] % Skonto
Es sind Verweise auf Datenbankfelder in der Formel enthalten, die mit eckigen Klammern eingefügt werden. Eigentlich müsste es nach den Regeln von oben so heißen:
Bei Zahlung bis zum <b>[<RechnungsFuss."Skonto1BisDatum">]</b> gewähren wir [<RechnungsFuss."Skonto1Prozent">] % Skonto

Das ist auch zulässig. FastReport erlaubt es jedoch, die spitzen Klammern wegzulassen, wenn der Ausdruck nur eine Variable oder nur ein Datenbank-Feld beinhaltet!

Die Formatierung
% Skonto = [FormatFloat('#,##0.00 €',<RechnungsFuss."Skonto1Betrag">)].

Mit

[...]

wird der "Ausdruck" (also die Formel in der Formel) begrenzt. Innerhalb des Ausdrucks befindet sich die Funktion FormatFloat. Dieser wird zuerst die gewünschte Formatierung übergeben '#,##0.00 €' und nach dem Komma der Wert, der zu formatieren ist:

<RechnungsFuss."Skonto1Betrag">

Bei der Berechnung...

Zahlungsbetrag mit Skonto: <b>[FormatFloat('#,##0.00 €', <RechnungsFuss."GesamtBetragBrutto"> - <RechnungsFuss."Skonto1Betrag">    )]</b>

ist das genau das Gleiche, nur dass halt zwei Datenbankfelder verrechnet werden!

Hinweis
Leider unterstützt FormatFloat die universelle Währungsangaben %2.2m nicht. Man muss das Währungssymbol also fest angeben. Wenn die Währung in Ihrem Land nicht der EURO ist, müssten Sie den Report an dieser Stelle entsprechend anpassen.


Unterdrücken, wenn kein Skonto
Mit diesem, Code kann man das Feld unterdrücken, wenn kein Skonto angegeben wurde:
procedure RechnungsFussSkonto1BisDatumOnBeforePrint(Sender: TfrxComponent);
begin
  if <RechnungsFuss."Skonto1Betrag"> = 0 then
    RechnungsFussSkonto1BisDatum.Visible := False;
end;



8.6 Datumsfeld unterdrücken, wenn kein Datum drin steht

Wenn man ein Datumsfeld im Report hat, steht dort je nach Formatierung "0" oder "30.12.1899" drin, wenn es gar kein Datum gibt. Behelfen könnte man sich, indem man das Feld im Code OnBeforePrint unterdrückt, wenn kein Datum drin steht. Einfacher ist es aber, auf dem Feld mit der rechten Maustaste zu klicken und die Option Nullen verbergen einzuschalten!

Wenn man einen Rahmen um das Feld angegeben hat, weil man die Daten tabellarisch anzeigen möchte, so fehlt in diesem Fall das Feld und auch der Rahmen. Um diese "Zahnlücke" zu füllen, kann man ein leeres Textfeld über oder unter das Datumsfeld setzen, das genauso groß ist und die Lücke füllt, falls das Datumsfeld ausgeblendet wird.

9 Dialoge im Report

9.1 Ausführen des Reports per Kennzeichen verhindern

Wenn man das Ausführen (Vorschau, Drucken usw.) eines Reports über ein Kennzeichen verhindern will, kann man dazu in den Report ein Dialog-Fenster einbauen, das unter bestimmten Bedingungen angezeigt wird und die Ausführung des verhindert.

Beispiel
Man verwendet das Auftragskennzeichen 8 ("Ladeliste freigegeben"), um das Drucken einer Ladeliste zu verhindern. Wenn dort "Nein" ausgewählt wird, darf die Ladeliste nicht gedruckt werden.

Dazu fügt man im Designer mit dem Menü Datei ⇒ einen neuen Dialog ein. In diesen Dialog fügt man ein Label (Text) und einen Button ein, wie in diesem Beispiel:


FastReport TippsUndTrick Dialog 01.png


  • Stellen Sie die Schriftart ("Font") und die Farbe ("Color") der Objekte nach Ihren Ansprüchen ein!
  • Die Eigenschaft ModalResult" ("Ergebnis des Dialogs") des Buttons stellen Sie auf "mrCancel" (Abbruch).

Wenn Sie nun den Report ausführen, wird der Dialog angezeigt und der Report nicht ausgeführt!!!

So wollen wird das natürlich nicht haben! Der Dialog soll ja nur angezeigt werden, wenn das Kennzeichen 8 nicht auf "Nein" steht.

Deshalb suchen Sie im Report-Baum den Report "Report" aus.

  • Den Report-Baum können Sie über das Menü Ansicht ⇒ Symbolleisten einschalten.


Klicken Sie nun im Objektinspektor auf Ereignisse und dort doppelklicken Sie auf frxReport1OnRunDialogs.

  • Den Objektinspektor können Sie über das Menü Ansicht ⇒ Symbolleisten einschalten.

Geben Sie nun diesen Code ein:

procedure frxReport1OnRunDialogs(var Result: Boolean);
begin
  if <AuftragsKopf."KENNZ8"> = 'Nein' then
    Result := DialogPage1.ShowModal = mrOK
  else
    Result := True;
end;


Die Variable Result ist das Ergebnis der Abfrage:

  • Wird sie auf True gestellt, wird der Report ausgeführt.
  • Wird sie auf False gestellt, wird der Report nicht ausgeführt.

Wenn das Kennzeichen auf "Nein" steht, wird dieser Dialog angezeigt:

FastReport TippsUndTrick Dialog 02.png


10 Fehler

Wie bei jedem umfangreichen Software-System gibt es auch bei der Report-Erstellung mit FastReport© jede Menge Fehler-Möglichkeiten.

Unserer Erfahrung nach die allermeisten Anwender-Fehler, nur selten ist FastReport schuld.

Einzelheiten werden hier beschrieben:


10.1 Tabelle wird im Report nicht angezeigt

Wenn eine bestimmte Tabelle wird im Report nicht angezeigt wird, obwohl sie eigentlich vorhanden sein müsste, müssen Sie diese Tabelle u.U. erst im Report auswählen. Siehe FastReport Dataset (Tabelle) wird im Report nicht angezeigt.

Wenn eine Tabelle nicht ausgewählt wird, kann es auch zu einer Fehlermeldung kommen:

Fehler im Ausdruck ´Tabellenname."Feld": Identifier expected

In diesem Fall wird der Report nicht ausgeführt. Anstelle der Daten kommen die Feldnamen des Reports oder auch gar nichts!


10.2 Band wird nicht gedruckt, obwohl Daten vorhanden sind

Ein bestehende Report wurde geändert, z.B. ein Detail-Band wurde entfernt. Das Master-Band wird nicht gedruckt, obwohl Daten vorhanden sind.

Grund:

Das Master-Datenband wurde im Original-Report nicht gebraucht und daher dauerhaft ausgeblendet. Stellen Sie die Eigenschaft Visible von False auf True.


10.3 Anzahl Seitennummern ist 0

In einem Report gibt es ein Feld, in dem die aktuelle Seite und die Gesamt-Seitenanzahl im Kopf gedruckt werden. Die Gesamt-Seitenanzahl ist jedoch immer 0!

Das Feld hat folgenden Inhalt:

Stand: [Date]    Seite [Page] von [TotalPages]

Beispiel:

FastReport Bsp Zweipass 01.png

Warum zeigt [TotalPages] immer 0 statt der Anzahl der Seiten?

Grund
Damit [TotalPages] funktioniert, muss man dem Report "sagen", dass er zuerst den Report intern durchrechnen soll. Erst danach weiß der Report, wie viele Seiten erzeugt werden!
Dazu muss man den Report im Designer öffnen und dann auf das Menü Report⇒Optionen klicken. Dann schaltet man die Option Zweipass ein:

FastReport Bsp Zweipass 02.png

Das Ergebnis:

FastReport Bsp Zweipass 03.png


10.4 Fehlermeldung "Alternativ nicht gefunden" in Rechnung

Wenn Sie einen als Auftragsformular erstellten Report kopieren und als Rechungsformular (-Grundlage) verwenden wollen, erhalten Sie eine Fehlermeldung wie diese:

FastReport Rechnung Fehlermeldung Alternativ.png

Grund:

In Rechnungen gibt es kein Alternativ.

Lösung:

Entfernen Sie mit dem Report-Designer alle Verweise auf das Alternativ-Feld!

11 Export

11.1 Export PDF

Reports können auch im Format PDF/A exportiert werden.

Einzelheiten



12 Im Druck-Fenster

12.1 Windows-Explorer mit dem Formular-Ordner öffnen

Wenn man schnell den Windows-Explorer mit dem eingestellten Formular-Ordner öffnen will, doppelklickt man einfach auf das Auswahlfeld im Druck-Fenster.

Wenn man dort z.B. eine Report-Datei umbenennt, muss man auf den kleinen Refresh-Button neben dem Auswahlfeld klicken. Damit wird die Auswahlliste des Feldes aktualisiert.



13 Links