FastReport Tipps und Tricks: Variablen: Unterschied zwischen den Versionen

Aus GEVITAS
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „== Variablen == === Fortlaufende Nummer === Wenn man eine fortlaufende Nummer im Report braucht, kann man dazu die System-Variable '''Line''' verwenden. '''L…“)
 
 
(9 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 36: Zeile 36:
 
'''[[FastReport: Zähler-Variable zum Unterdrücken von wiederholten Werten|Dieser Artikel]]''' beschreibt, wie man das Problem mit einer Variable lösen kann.
 
'''[[FastReport: Zähler-Variable zum Unterdrücken von wiederholten Werten|Dieser Artikel]]''' beschreibt, wie man das Problem mit einer Variable lösen kann.
  
== Verwendung von Feldern ==
 
  
=== Zeilenumbruch innerhalb von Feldern ===
+
=== Variablen im Code mit Inhalten füllen ===
  
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.
+
Im Report kann man ja eigene Variablen einfügen (Menü Report ⇒ Variablen... ).
  
Der ungewollte Zeilenumbruch kann dazu führen, dass unterhalb der Felder "Geisterschatten" stehen. Beispiel:
+
Leider kann man den Inhalte von Variablen '''nicht einfach so füllen'''...
  
[[Datei:FastReport_Tipps_Zeilenumbruch_GeisterSchatten_Bsp_01.png]]
+
<nowiki><Meine Variable> := 'Irgendwas'</nowiki>
  
 +
...sondern muss die Funktion
  
 +
<nowiki>Set( 'Meine Variable, 'Irgendwas');</nowiki>
  
=== Zeilenabstand in Feldern ===
+
...verwenden.
  
Wenn man den Zeilenabstand innerhalb eines Memo-Felder ändern will, kann man die Eigenschaft '''LineSpacing''' vom Standardwert 2 z.B. auf 6 ändern.
+
Wenn man Felder einfügen will, ist das verhältnismäßig klar:
  
 +
<nowiki>Set('LfdNr', <LfdNr> + 1);</nowiki>
 +
 +
Wenn man jedoch Text gemischt mit Feldern einfügen will, wird es etwas aufwändiger:.
 +
Hier soll z.B. die Variable "Versand" mit Text und einem Datenbank-Feld gefüllt werden.
  
 +
Das muss dann so aussehen:
  
=== Berechnungen in einem Feld ===
+
<nowiki>Set( 'Versand','''Anlieferung durch UPS am ' + DateToStr( <AuftragsKopf."AufbauDatum"> )  + ' vor 12 Uhr.' + '''' );</nowiki>
  
Wenn man in einem Feld etwas berechnen möchte, muss man dazu keine Formel oder Variable verwenden wie in CrystalReports&copy;! Man kann die Rechenformel einfach in das Feld schreiben.
+
oder
  
Beispiel:
+
<nowiki>Set( 'Versand','''Anlieferung durch UPS am ' + DateToStr( <AuftragsKopf."AufbauDatum"> )  + ' vor 12 Uhr.''' );</nowiki>
  
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 '''ersten''' drei einfache Anführungszeichen '''<nowiki>'''</nowiki>''' leiten den Text ein, die '''letzten''' drei einfachen Anführungszeichen '''<nowiki>'''</nowiki>''' zeigen das Ende des Textes an.
  
Die Feldnamen kann man mit diesem Button holen:
+
;Drei einfache Anführungszeichen '''<nowiki>'''</nowiki>???
 +
* In FastReport ist das einfache Anführungszeichen der Beginn eines Textes.
 +
* Das erste einfache Anführungszeichen zeigt an, dass nun ein Text folgt.
 +
* Das zweite einfache Anführungszeichen ist das Anführungszeichen.
 +
* Das dritte einfache Anführungszeichen zeigt an, dass der Text (für das Anführungszeichen) zu Ende ist.
 +
* FastReport bekommt also '''ein''' einfaches Anführungszeichen geliefert und "weiß" nun, dass ein Text folgt und keine Zahl, kein Feld usw.
  
[[Datei:FastReport_Memo_MitFormel.png]]
 
  
Die eckigen Klammern
+
Damit "weiß" FastReport, dass ein Text in die Variable eingefügt werden soll.
  
[ ... ]
+
Da hier ein Datumsfeld als Text eingefügt werden soll, muss man die Funktion '''<nowiki>DateToStr( )</nowiki>''' verwendet, um das Datum in einen Text umzuwandeln.
 +
Wenn man '''<nowiki>DateToStr( )</nowiki>''' nicht verwendet bekommt man eine Fehlermeldung ...
  
legen den Anfang und das Ende der Formel fest.
+
Variante des Typs (UnicodeString) konnte nicht in Typ (Date) konvertiert werden
  
Normalerweise werden Datenbank-Felder in eckigen Klammern angegeben,
+
oder
  
;<big>Wenn innerhalb der Formel Datenbank-Felder eingebunden werden, müssen diese jedoch in '''spitzen Klammern''' angegeben werden!</big>
+
  Variante des Typs (Float) konnte nicht in Typ (Date) konvertiert werden
 
 
;Falsch:
 
 
 
[[Positionen."Menge"] + [Positionen."MengeReserve"] - [Positionen."MengeFremd"] ]
 
 
 
;Richtig:
 
 
 
[<Positionen."Menge"> + <Positionen."MengeReserve"> - <Positionen."MengeFremd">]
 
 
 
 
 
 
 
=== 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]]'''.
 
 
 
 
 
 
 
=== 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:
 
 
 
<nowiki>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></nowiki>
 
 
 
:Das Ergebnis sieht so aus:
 
 
 
[[Datei:FastReport_Rechnung_Skonto_Unformatiert.png|border]]
 
 
 
:Damit die Ergebnisse formatiert werden, kann man die eingebaute Funktion <code>FormatFloat( 'Format',Zahl )</code> verwenden. Diese formatiert die Zahl anhand der Vorgaben im Text '''Format'''.
 
 
 
:Die Formel dazu sieht nun so aus:
 
<nowiki> 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></nowiki>
 
 
 
:Das Ergebnis:
 
 
 
[[Datei:FastReport_Rechnung_Skonto_Formatiert.png|border]]
 
 
 
;Die Ausdrücke der Formel im Einzelnen:
 
 
 
<nowiki>Bei Zahlung bis zum <b>[RechnungsFuss."Skonto1BisDatum"]</b> gewähren wir [RechnungsFuss."Skonto1Prozent"] % Skonto</nowiki>
 
 
 
: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:
 
 
 
<nowiki>Bei Zahlung bis zum <b>[<RechnungsFuss."Skonto1BisDatum">]</b> gewähren wir [<RechnungsFuss."Skonto1Prozent">] % Skonto</nowiki>
 
 
 
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:
 
 
 
<nowiki>% Skonto = [FormatFloat('#,##0.00 €',<RechnungsFuss."Skonto1Betrag">)].</nowiki>
 
 
 
Mit
 
 
 
[...]
 
 
 
wird der "Ausdruck" (also die Formel in der Formel) begrenzt. Innerhalb des Ausdrucks befindet sich die Funktion <code>FormatFloat</code>. Dieser wird zuerst die gewünschte Formatierung übergeben <code>'#,##0.00 €'</code> und nach dem Komma der Wert, der zu formatieren ist:
 
 
 
<nowiki><RechnungsFuss."Skonto1Betrag"></nowiki>
 
 
 
Bei der Berechnung...
 
 
 
<nowiki>Zahlungsbetrag mit Skonto: <b>[FormatFloat('#,##0.00 €', <RechnungsFuss."GesamtBetragBrutto"> - <RechnungsFuss."Skonto1Betrag">    )]</b></nowiki>
 
 
 
ist das genau das Gleiche, nur dass halt zwei Datenbankfelder verrechnet werden!
 
 
 
;Hinweis
 
:Leider unterstützt <code>FormatFloat</code> die universelle Währungsangaben <code>%2.2m</code> '''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;
 
 
 
 
 
 
 
 
 
=== 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.
 
  
 +
;Grund:
 +
:Datumswerte werden in der Datenbank als Fließkommazahl gespeichert, das Datum ist der Wert vor dem Komma, die Uhrzeit der Wert nach  dem Komma.
  
  

Aktuelle Version vom 23. Februar 2024, 14:44 Uhr

1 Variablen

1.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;


1.2 Zähler-Variable zum Unterdrücken von wiederholten Werten

Manchmal möchte man wiederholte Werte, die untereinander stehen, nicht drucken. Beispiel einer Auftragsposition:

1.1 Artikel A

Alternativ:
1.2 Artikel B 

Alternativ:
1.3 Artikel C

Das Wort Alternativ: soll hier nur bei der ersten Alternative stehen, die direkt danach folgenden sollen unterdrückt werden.

Eigentlich gibt es dazu in FastReport eine Option "wiederholte Werte unterdrücken" auf der rechten Maustaste eines Objektes. In einfachen Listen funktioniert das auch, in komplexen Formularen mit wechselseitigem Ausblenden von Bändern aber nicht (immer)!

Dieser Artikel beschreibt, wie man das Problem mit einer Variable lösen kann.


1.3 Variablen im Code mit Inhalten füllen

Im Report kann man ja eigene Variablen einfügen (Menü Report ⇒ Variablen... ).

Leider kann man den Inhalte von Variablen nicht einfach so füllen...

<Meine Variable> := 'Irgendwas'

...sondern muss die Funktion

Set( 'Meine Variable, 'Irgendwas');

...verwenden.

Wenn man Felder einfügen will, ist das verhältnismäßig klar:

Set('LfdNr', <LfdNr> + 1);

Wenn man jedoch Text gemischt mit Feldern einfügen will, wird es etwas aufwändiger:. Hier soll z.B. die Variable "Versand" mit Text und einem Datenbank-Feld gefüllt werden.

Das muss dann so aussehen:

Set( 'Versand','''Anlieferung durch UPS am ' + DateToStr( <AuftragsKopf."AufbauDatum"> )  + ' vor 12 Uhr.' + '''' );

oder

Set( 'Versand','''Anlieferung durch UPS am ' + DateToStr( <AuftragsKopf."AufbauDatum"> )  + ' vor 12 Uhr.''' );


Die ersten drei einfache Anführungszeichen ''' leiten den Text ein, die letzten drei einfachen Anführungszeichen ''' zeigen das Ende des Textes an.

Drei einfache Anführungszeichen '''???
  • In FastReport ist das einfache Anführungszeichen der Beginn eines Textes.
  • Das erste einfache Anführungszeichen zeigt an, dass nun ein Text folgt.
  • Das zweite einfache Anführungszeichen ist das Anführungszeichen.
  • Das dritte einfache Anführungszeichen zeigt an, dass der Text (für das Anführungszeichen) zu Ende ist.
  • FastReport bekommt also ein einfaches Anführungszeichen geliefert und "weiß" nun, dass ein Text folgt und keine Zahl, kein Feld usw.


Damit "weiß" FastReport, dass ein Text in die Variable eingefügt werden soll.

Da hier ein Datumsfeld als Text eingefügt werden soll, muss man die Funktion DateToStr( ) verwendet, um das Datum in einen Text umzuwandeln. Wenn man DateToStr( ) nicht verwendet bekommt man eine Fehlermeldung ...

Variante des Typs (UnicodeString) konnte nicht in Typ (Date) konvertiert werden

oder

Variante des Typs (Float) konnte nicht in Typ (Date) konvertiert werden
Grund
Datumswerte werden in der Datenbank als Fließkommazahl gespeichert, das Datum ist der Wert vor dem Komma, die Uhrzeit der Wert nach dem Komma.


2 Links