CrystalReports: Beispiel Angebotsformular: Unterschied zwischen den Versionen
K (→Betragsfelder optional ausblenden) |
|||
(17 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 25: | Zeile 25: | ||
- Abbau der Technik am 05.04.14 | - Abbau der Technik am 05.04.14 | ||
− | |||
erscheinen. Der Anhang "Equipmentaufstellung" beinhaltet die eigentlichen Positionen. | erscheinen. Der Anhang "Equipmentaufstellung" beinhaltet die eigentlichen Positionen. | ||
Zeile 31: | Zeile 30: | ||
Dazu wird die Register-Seite '''Termine''' in der Auftragsverwaltung von [[REFLEX]] verwendet. | Dazu wird die Register-Seite '''Termine''' in der Auftragsverwaltung von [[REFLEX]] verwendet. | ||
− | Nun könnte man von den Benutzern/Benutzerinnen verlangen, dass sie Termine in eine bestimmten Weise anlegen müssen, damit diese vernünftig im Formular erscheinen. Damit den Benutzern/Benutzerinnen die Arbeit erleichtert wird, kann man in den '''Programm-Parametern''' festlegen, dass beim Anlegen eines Auftrag schon Standard-Termine eingetragen werden. Das Formular wertet die Angaben in den Terminen aus und druckt die Termin-Angaben entsprechend aus. | + | Nun könnte man von den Benutzern/Benutzerinnen verlangen, dass sie Termine in eine bestimmten Weise anlegen müssen, damit diese vernünftig im Formular erscheinen. Damit den Benutzern/Benutzerinnen die Arbeit erleichtert wird, kann man in den '''Programm-Parametern''' festlegen, dass beim Anlegen eines Auftrag schon Standard-Termine eingetragen werden. Das Formular wertet die Angaben in den Terminen aus und druckt die Termin-Angaben entsprechend aus: |
+ | |||
+ | ;Überschrift: | ||
+ | :Der Termin "'''- Veranstaltungstechnik (gemäß Anhang "Equipmentaufstellung")'''" ist nur eine '''Überschrift''' und soll '''kein Datum''' drucken! Dazu verwenden wir das Datenbank-Feld '''MAUFJOB.TERMINART''' (MAUFJOB ist die Tabelle der Auftragstermine). Wenn da '''keine bestimmte Terminart''' angegeben wurde (MAUFJOB.TERMINART=0), dann soll auch '''kein Datum''' gedruckt werden. | ||
+ | :Die Datumsangaben selbst werden über eine Formel gedruckt. Wenn Datum von und -Bis '''gleich''' ist, soll "am XX.XX.XXXX" gedruckt werden, sonst "vom XX.XX.XXXX bis XX.XX.XXXX". Wie das genau geht, wird weiter unten beschrieben. | ||
+ | |||
+ | In den '''Programm-Parametern-> Kalender, Termine, Termine-Manager-->Automatische Auftragstermine''' hinterlegen wir diese Termine: | ||
+ | |||
+ | [[Datei:CrystalReports_Bsp_Angebot_AutoTermine.png]] | ||
+ | |||
+ | ;Aktion/Text | ||
+ | :Dieser Text wird gedruckt. | ||
+ | |||
+ | ;Bezugsdatum | ||
+ | :Gibt an, auf welche Spalte sich '''Relativ zum Datum''' bezieht. | ||
+ | |||
+ | ;Relativ zum Datum | ||
+ | :Gibt an, wie das Datum des automatischen Termins berechnet wird. | ||
+ | |||
+ | ;Nur bei Versandart | ||
+ | :Gibt an, dass der Termin nur eingefügt wird, wenn die Versandart des Auftrags mit der hier angegebenen übereinstimmt. | ||
+ | |||
+ | ;Terminart | ||
+ | :Wählen Sie hier die Terminart des Termins aus. Bei der Terminart "Allgemein" (Wert=0) soll kein Datum gedruckt werden! | ||
+ | |||
+ | Wenn Sie die Angaben wie oben beschrieben anlegen, werden beim '''Anlegen eines neuen Auftrags automatisch''' die entsprechenden Termine in den Auftrag eingefügt! Beispiel: | ||
+ | |||
+ | [[Datei:CrystalReports_Bsp_Angebot_AuftrTermine.png]] | ||
+ | |||
+ | == Der Report == | ||
+ | |||
+ | === Kopf === | ||
+ | |||
+ | Der Kopf besteht aus diesen Bereichen: | ||
+ | |||
+ | [[Datei:CrystalReports_Bsp_Angebot_Kopf.png|800px]] | ||
+ | |||
+ | Basis des Formulars ist das Standard-Formular, das mit REFLEX ausgeliefert wird. | ||
+ | |||
+ | ==== Firmen-Texte ==== | ||
+ | |||
+ | Sie meisten Felder der Firmen-Angaben sind nicht fest im Formular getextet, sondern kommen aus Formeln. Diese Formeln müssen festgelegte Namen haben, weil sie von REFLEX zur Laufzeit durch die hinterlegten Texte gefüllt werden. Einzelheiten werden [[CrystalReports: Formulartexte und Formeln|hier]] beschrieben. | ||
+ | |||
+ | ==== Adresse, Unterbericht ==== | ||
+ | |||
+ | Die Adresse des Kunden wird in einem '''Unterbericht''' ausgegeben. Dieses Verfahren hat u.a. den Vorteil, dass sich der Unterbericht dynamisch an die tatsächliche Größe der Anschrift anpasst. | ||
+ | |||
+ | Ein Unterbericht ist sozusagen ein Formular in einem Formular (ein Report in einem Report). Ein Unterbericht wird mit dem Hauptbericht über ein Datenbank-Feld verknüpft, in diesem Fall die Auftragsnummer im Auftragskopf (MAufKo.AuftrNr). Das heißt, dass der Unterbericht nur die Daten zu einer bestimmten Auftragsnummer zeigt. | ||
+ | |||
+ | ==== Termine im Auftragskopf ==== | ||
+ | |||
+ | Die Termine im Auftragskopf werden in einem '''Unterbericht''' ausgegeben. Dieser führt die Auftragstermine chronologisch auf [[CrystalReports:_Beispiel_Angebotsformular#Automatische_Termine|(s.o.)]]. Der Unterbericht ist schlicht und einfach: | ||
+ | |||
+ | [[Datei:CrystalReports_Bsp_Angebot_AuftrTermineUnterbericht.png]] | ||
+ | |||
+ | Der Unterbericht verwendet die Tabelle '''MAufJob''', in der die Termine zu den Aufträge stehen. | ||
+ | |||
+ | Es steht das Feld '''Text''' in der Zeile, gefolgt von einer Formel: | ||
+ | |||
+ | '''Die Formel {@DatumVonBis}''' hat die Aufgabe, die Datumsfelder auszugeben (oder zu unterdrücken): | ||
+ | |||
+ | // Terminart 0 = Allgemein ist OHNE TERMINANGABE, nur der Text: | ||
+ | if {MAUFJOB.TERMINART}=0 then | ||
+ | "" | ||
+ | else | ||
+ | if {MAUFJOB.DATUM}={MAUFJOB.DATUMBIS} then | ||
+ | " am " + ToText ({MAUFJOB.DATUM},"dd.MM.yyyy" ) | ||
+ | else | ||
+ | " vom " + ToText ({MAUFJOB.DATUM},"dd.MM.yyyy" ) + " bis " + ToText ({MAUFJOB.DATUMBIS},"dd.MM.yyyy" ); | ||
+ | |||
+ | |||
+ | * Wenn die Terminart=0 (Allgemein) ist, dann soll '''kein Datum''' ausgegeben werden! Diese Zeile dient nur der Überschrift. | ||
+ | * Wenn ein Datum ausgegeben werden soll, wird geprüft, ob Von- und Bis-Datum gleich sind. Wenn ja, wird nur der Text "am" ausgegeben, sonst der Text " vom "..."bis". | ||
+ | |||
+ | === Positionen === | ||
+ | |||
+ | ==== Betragsfelder optional ausblenden ==== | ||
+ | |||
+ | Die Betragsfelder in den Positionen können optional ausgeblendet werden. Dazu wird in REFLEX das '''Auftragskennzeichen 1''' verwendet. Beim Drucken in REFLEX kann man dieses Kennzeichen auf "Nein" stellen. | ||
+ | |||
+ | [[Datei:CrystalReports_Bsp_Angebot_DruckAuftrKennz.png]] | ||
+ | |||
+ | Dadurch werden die Betragsfelder unterdrückt. | ||
+ | |||
+ | * Einzelheiten werden [[CrystalReports:_Formular-Steuerung_durch_Auftragskennzeichen|hier]] beschrieben. | ||
+ | |||
+ | Die Formeln zur Unterdrückung könnten jeweils das Datenbankbankfeld '''MAufKo.Kennz1''' abfragen, um die Unterdrückung einzuschalten. Tun sie aber nicht! Statt dessen wird eine sog. "Variable" benutzt, die am Anfang des Formulares definiert wurde. Warum? | ||
+ | |||
+ | Das macht man, um die Lesbarkeit der Formeln zu verbessern und um die Festlegung der Kennzeichen an einer '''zentralen Stelle''' des Formulars zu definieren. | ||
+ | |||
+ | Es gibt deshalb im obersten Berichtskopf die Formel '''@Parameter'''. Diese Formel fragt die Auftragskennzeichen ab und setzt die Variablen entsprechend auf '''True''' (=Ja) oder '''False''' (=Nein). Die anderen Formeln können nun auf die Variablen zugreifen und die gewünschte Unterdrückung einschalten. | ||
+ | |||
+ | Der Vorteil ist, dass die Variablen-Namen aussagekräftiger sind als die Kennzeichen 1 bis 10. Außerdem kann man schnell mal ein Kennzeichen ändern, wenn man z.B. doch lieber das Kennzeichen 3 verwenden will statt dem Kennzeichen 1. In diesem Fall muss man nur an einer Stelle die Variablen definieren. Schließlich muss man die komplexe Abfrage der Kennzeichen ("UpperCase" usw.) nur einmal am Anfang ausführen. | ||
+ | |||
+ | Die Formel: | ||
+ | |||
+ | Shared BooleanVar DryHire := true; | ||
+ | Shared BooleanVar Einzelpreis := true; | ||
+ | Shared BooleanVar Einzelposition := true; | ||
+ | Shared BooleanVar Kapitelpreis := true; | ||
+ | Shared BooleanVar Gesamtpreis := true; | ||
+ | Shared BooleanVar KapZusammenfassung := true; | ||
+ | |||
+ | if ( UpperCase({maufko.KENNZ1}) StartsWith("N") ) then Einzelpreis := false; | ||
+ | if ( UpperCase({maufko.KENNZ2}) StartsWith("N") ) then DryHire := false; | ||
+ | if ( UpperCase({maufko.KENNZ3}) StartsWith("N") ) then Einzelposition := false; | ||
+ | if ( UpperCase({maufko.KENNZ4}) StartsWith("N") ) then Kapitelpreis := false; | ||
+ | if ( UpperCase({maufko.KENNZ5}) StartsWith("N") ) then Gesamtpreis := false; | ||
+ | if ( UpperCase({maufko.KENNZ7}) StartsWith("N") ) then KapZusammenfassung := false; | ||
+ | |||
+ | ;Shared BooleanVar | ||
+ | :Das ist die sog. "Deklaration" der Variablen. '''Shared''' gibt an, dass die Variable auch in anderen Bereichen des Berichts abgefragt (oder verändert) werden kann. '''Boolean''' legt fest, dass die Variable eine sog. [http://de.wikipedia.org/wiki/Boolesche_Variable Boolesche Variable] ist, die nur den Zustand '''True''' oder '''False''' haben kann. | ||
+ | |||
+ | ;UpperCase(...) | ||
+ | :Legt fest, dass die Eingabe des Kennzeichens in REFLEX bei der Abfrage in Großbuchstaben umgewandelt wird. Die Abfrage wird mit dem Großbuchstaben "N" gemacht. Somit ist es egal, ab der/die Anwender/innen "nein" oder "Nein" oder "NEIN" abgegeben haben. | ||
+ | |||
+ | ==== Text ==== | ||
+ | |||
+ | Unter der Bezeichnungszeile wird der formatierbare Text aus den Auftragspositionen ausgegebenen. In diesem Fall aber wird nicht direkt das Datenbankfeld '''MAufPo.Text''' verwendet, sondern diese Formel: | ||
+ | |||
+ | '''@Text_mit_Bullets''' | ||
+ | |||
+ | Replace ({MAUFPO.TEXT}, "\pntext", "\listtext") | ||
+ | |||
+ | Der Grund liegt in der ungenauen Definition der sog. [http://de.wikipedia.org/wiki/Rich-Text-Format|RTF-Format (Rich-Text-Formatierung)]. Diese verwendet für Aufzählungen verschiedene Möglichkeiten, wobei die von Crystal verwendete besser zu Crystal passt als die von REFLEX. REFLEX benutzt die vom Betriebssystem-Hersteller kommende Komponente zur Eingabe von RTF-Text, das ist aus technischen Gründen so. Die hier gezeigte Formel setzt die Formatierung auf das Crystal-RTF-Format um. | ||
+ | |||
+ | * Wenn man keine "Bullets" verwendet, muss man die Formel nicht einsetzen. | ||
+ | |||
+ | |||
+ | |||
+ | === Fuss === | ||
+ | |||
+ | ==== Rabatt-Betrag und -Prozent ==== | ||
+ | |||
+ | Hier wird der Rabatt-Betrag und -Prozentwert per Formel errechnet und ausgedruckt. Die Zeile sieht so aus: | ||
+ | |||
+ | [[Datei:CrystalReports_Bsp_Angebot_FussRabattzeile.png]] | ||
+ | |||
+ | '''Die Formel für den Rabatt-Betrag:''' | ||
+ | |||
+ | // Der Gesamt-Rabattbetrag errechnet sich aus der Kalkulationssumme (Netto-Betrag ohne Rabatt) | ||
+ | // und der rabattierten Summe auf Material (ohne Arb.-Zeit und Dienstleistungen): | ||
+ | {MAUFFU.KalkSumme} - {MAUFFU.PosSumme1} | ||
+ | |||
+ | |||
+ | |||
+ | '''Die Formel für den Rabatt-Prozentwert:''' | ||
+ | |||
+ | // Prozentsatz berechnen: | ||
+ | if {MAUFFU.KalkSumme} > 0 then // Falls kein Betrag drin steht! Sonst Fehler "Division durch 0"!!! | ||
+ | 100 - ( {MAUFFU.PosSumme1} / {MAUFFU.KalkSumme} * 100 ) | ||
+ | else | ||
+ | 0; | ||
+ | Für den (unwahrscheinlichen) Fall, das man ein Angebot ohne Betrag drucken, wird die Abfrage | ||
+ | if {MAUFFU.KalkSumme} > 0 then | ||
+ | verwendet. Da eine Division durch 0 unzulässig ist, würde sonst eine Fehlermeldung erscheinen! | ||
+ | Die Sektion wird unterdrückt, wenn es keinen Rabatt gibt. Die Unterdrückungsformel dazu: | ||
+ | // Unterdrücken, wenn kein Gesamt-Rabatt enthalten ist: | ||
+ | {@GesRabattBetrag} = 0 | ||
+ | ==== Texte im Fuss ==== | ||
+ | Die Texte werden über Formeln aus den Programmparametern geholt. Einzelheiten werden [[CrystalReports: Formulartexte und Formeln|hier]] beschrieben. | ||
== Links == | == Links == |
Aktuelle Version vom 29. April 2014, 12:54 Uhr
Inhaltsverzeichnis
1 Allgemeines
Dieser Artikel zeigt den Aufbau eines Beispiel-Formulares für ein Angebot.
Es enthält:
- Einen Kopf mit einer Grafik
- Im Kopf den internen Ansprechpartner mit Name, Telefon, E-Mail usw.
- Einen Kopf-Text, der sich aus dem eingegebenen Kopftext und den angegebenen Terminen bezieht.
- Eine "Mit freundlichen Grüßen"-Floskel
- Die Positionen mit Kapitel-Überschrift
- Im Fuss die Summen
2 Vorarbeiten
2.1 Automatische Termine
Die Termine sollen in der Art
- Veranstaltungstechnik (gemäß Anhang "Equipmentaufstellung")
- Aufbau der Technik am 27.03.14 und 28.03.14
- Betreuung Ihrer Veranstaltung am 31.03.14
- Abbau der Technik am 05.04.14
erscheinen. Der Anhang "Equipmentaufstellung" beinhaltet die eigentlichen Positionen.
Dazu wird die Register-Seite Termine in der Auftragsverwaltung von REFLEX verwendet.
Nun könnte man von den Benutzern/Benutzerinnen verlangen, dass sie Termine in eine bestimmten Weise anlegen müssen, damit diese vernünftig im Formular erscheinen. Damit den Benutzern/Benutzerinnen die Arbeit erleichtert wird, kann man in den Programm-Parametern festlegen, dass beim Anlegen eines Auftrag schon Standard-Termine eingetragen werden. Das Formular wertet die Angaben in den Terminen aus und druckt die Termin-Angaben entsprechend aus:
- Überschrift
- Der Termin "- Veranstaltungstechnik (gemäß Anhang "Equipmentaufstellung")" ist nur eine Überschrift und soll kein Datum drucken! Dazu verwenden wir das Datenbank-Feld MAUFJOB.TERMINART (MAUFJOB ist die Tabelle der Auftragstermine). Wenn da keine bestimmte Terminart angegeben wurde (MAUFJOB.TERMINART=0), dann soll auch kein Datum gedruckt werden.
- Die Datumsangaben selbst werden über eine Formel gedruckt. Wenn Datum von und -Bis gleich ist, soll "am XX.XX.XXXX" gedruckt werden, sonst "vom XX.XX.XXXX bis XX.XX.XXXX". Wie das genau geht, wird weiter unten beschrieben.
In den Programm-Parametern-> Kalender, Termine, Termine-Manager-->Automatische Auftragstermine hinterlegen wir diese Termine:
- Aktion/Text
- Dieser Text wird gedruckt.
- Bezugsdatum
- Gibt an, auf welche Spalte sich Relativ zum Datum bezieht.
- Relativ zum Datum
- Gibt an, wie das Datum des automatischen Termins berechnet wird.
- Nur bei Versandart
- Gibt an, dass der Termin nur eingefügt wird, wenn die Versandart des Auftrags mit der hier angegebenen übereinstimmt.
- Terminart
- Wählen Sie hier die Terminart des Termins aus. Bei der Terminart "Allgemein" (Wert=0) soll kein Datum gedruckt werden!
Wenn Sie die Angaben wie oben beschrieben anlegen, werden beim Anlegen eines neuen Auftrags automatisch die entsprechenden Termine in den Auftrag eingefügt! Beispiel:
3 Der Report
3.1 Kopf
Der Kopf besteht aus diesen Bereichen:
Basis des Formulars ist das Standard-Formular, das mit REFLEX ausgeliefert wird.
3.1.1 Firmen-Texte
Sie meisten Felder der Firmen-Angaben sind nicht fest im Formular getextet, sondern kommen aus Formeln. Diese Formeln müssen festgelegte Namen haben, weil sie von REFLEX zur Laufzeit durch die hinterlegten Texte gefüllt werden. Einzelheiten werden hier beschrieben.
3.1.2 Adresse, Unterbericht
Die Adresse des Kunden wird in einem Unterbericht ausgegeben. Dieses Verfahren hat u.a. den Vorteil, dass sich der Unterbericht dynamisch an die tatsächliche Größe der Anschrift anpasst.
Ein Unterbericht ist sozusagen ein Formular in einem Formular (ein Report in einem Report). Ein Unterbericht wird mit dem Hauptbericht über ein Datenbank-Feld verknüpft, in diesem Fall die Auftragsnummer im Auftragskopf (MAufKo.AuftrNr). Das heißt, dass der Unterbericht nur die Daten zu einer bestimmten Auftragsnummer zeigt.
3.1.3 Termine im Auftragskopf
Die Termine im Auftragskopf werden in einem Unterbericht ausgegeben. Dieser führt die Auftragstermine chronologisch auf (s.o.). Der Unterbericht ist schlicht und einfach:
Der Unterbericht verwendet die Tabelle MAufJob, in der die Termine zu den Aufträge stehen.
Es steht das Feld Text in der Zeile, gefolgt von einer Formel:
Die Formel {@DatumVonBis} hat die Aufgabe, die Datumsfelder auszugeben (oder zu unterdrücken):
// Terminart 0 = Allgemein ist OHNE TERMINANGABE, nur der Text: if {MAUFJOB.TERMINART}=0 then "" else if {MAUFJOB.DATUM}={MAUFJOB.DATUMBIS} then " am " + ToText ({MAUFJOB.DATUM},"dd.MM.yyyy" ) else " vom " + ToText ({MAUFJOB.DATUM},"dd.MM.yyyy" ) + " bis " + ToText ({MAUFJOB.DATUMBIS},"dd.MM.yyyy" );
- Wenn die Terminart=0 (Allgemein) ist, dann soll kein Datum ausgegeben werden! Diese Zeile dient nur der Überschrift.
- Wenn ein Datum ausgegeben werden soll, wird geprüft, ob Von- und Bis-Datum gleich sind. Wenn ja, wird nur der Text "am" ausgegeben, sonst der Text " vom "..."bis".
3.2 Positionen
3.2.1 Betragsfelder optional ausblenden
Die Betragsfelder in den Positionen können optional ausgeblendet werden. Dazu wird in REFLEX das Auftragskennzeichen 1 verwendet. Beim Drucken in REFLEX kann man dieses Kennzeichen auf "Nein" stellen.
Dadurch werden die Betragsfelder unterdrückt.
- Einzelheiten werden hier beschrieben.
Die Formeln zur Unterdrückung könnten jeweils das Datenbankbankfeld MAufKo.Kennz1 abfragen, um die Unterdrückung einzuschalten. Tun sie aber nicht! Statt dessen wird eine sog. "Variable" benutzt, die am Anfang des Formulares definiert wurde. Warum?
Das macht man, um die Lesbarkeit der Formeln zu verbessern und um die Festlegung der Kennzeichen an einer zentralen Stelle des Formulars zu definieren.
Es gibt deshalb im obersten Berichtskopf die Formel @Parameter. Diese Formel fragt die Auftragskennzeichen ab und setzt die Variablen entsprechend auf True (=Ja) oder False (=Nein). Die anderen Formeln können nun auf die Variablen zugreifen und die gewünschte Unterdrückung einschalten.
Der Vorteil ist, dass die Variablen-Namen aussagekräftiger sind als die Kennzeichen 1 bis 10. Außerdem kann man schnell mal ein Kennzeichen ändern, wenn man z.B. doch lieber das Kennzeichen 3 verwenden will statt dem Kennzeichen 1. In diesem Fall muss man nur an einer Stelle die Variablen definieren. Schließlich muss man die komplexe Abfrage der Kennzeichen ("UpperCase" usw.) nur einmal am Anfang ausführen.
Die Formel:
Shared BooleanVar DryHire := true; Shared BooleanVar Einzelpreis := true; Shared BooleanVar Einzelposition := true; Shared BooleanVar Kapitelpreis := true; Shared BooleanVar Gesamtpreis := true; Shared BooleanVar KapZusammenfassung := true; if ( UpperCase({maufko.KENNZ1}) StartsWith("N") ) then Einzelpreis := false; if ( UpperCase({maufko.KENNZ2}) StartsWith("N") ) then DryHire := false; if ( UpperCase({maufko.KENNZ3}) StartsWith("N") ) then Einzelposition := false; if ( UpperCase({maufko.KENNZ4}) StartsWith("N") ) then Kapitelpreis := false; if ( UpperCase({maufko.KENNZ5}) StartsWith("N") ) then Gesamtpreis := false; if ( UpperCase({maufko.KENNZ7}) StartsWith("N") ) then KapZusammenfassung := false;
- Shared BooleanVar
- Das ist die sog. "Deklaration" der Variablen. Shared gibt an, dass die Variable auch in anderen Bereichen des Berichts abgefragt (oder verändert) werden kann. Boolean legt fest, dass die Variable eine sog. Boolesche Variable ist, die nur den Zustand True oder False haben kann.
- UpperCase(...)
- Legt fest, dass die Eingabe des Kennzeichens in REFLEX bei der Abfrage in Großbuchstaben umgewandelt wird. Die Abfrage wird mit dem Großbuchstaben "N" gemacht. Somit ist es egal, ab der/die Anwender/innen "nein" oder "Nein" oder "NEIN" abgegeben haben.
3.2.2 Text
Unter der Bezeichnungszeile wird der formatierbare Text aus den Auftragspositionen ausgegebenen. In diesem Fall aber wird nicht direkt das Datenbankfeld MAufPo.Text verwendet, sondern diese Formel:
@Text_mit_Bullets
Replace ({MAUFPO.TEXT}, "\pntext", "\listtext")
Der Grund liegt in der ungenauen Definition der sog. (Rich-Text-Formatierung). Diese verwendet für Aufzählungen verschiedene Möglichkeiten, wobei die von Crystal verwendete besser zu Crystal passt als die von REFLEX. REFLEX benutzt die vom Betriebssystem-Hersteller kommende Komponente zur Eingabe von RTF-Text, das ist aus technischen Gründen so. Die hier gezeigte Formel setzt die Formatierung auf das Crystal-RTF-Format um.
- Wenn man keine "Bullets" verwendet, muss man die Formel nicht einsetzen.
3.3 Fuss
3.3.1 Rabatt-Betrag und -Prozent
Hier wird der Rabatt-Betrag und -Prozentwert per Formel errechnet und ausgedruckt. Die Zeile sieht so aus:
Die Formel für den Rabatt-Betrag:
// Der Gesamt-Rabattbetrag errechnet sich aus der Kalkulationssumme (Netto-Betrag ohne Rabatt) // und der rabattierten Summe auf Material (ohne Arb.-Zeit und Dienstleistungen): {MAUFFU.KalkSumme} - {MAUFFU.PosSumme1}
Die Formel für den Rabatt-Prozentwert:
// Prozentsatz berechnen: if {MAUFFU.KalkSumme} > 0 then // Falls kein Betrag drin steht! Sonst Fehler "Division durch 0"!!! 100 - ( {MAUFFU.PosSumme1} / {MAUFFU.KalkSumme} * 100 ) else 0;
Für den (unwahrscheinlichen) Fall, das man ein Angebot ohne Betrag drucken, wird die Abfrage
if {MAUFFU.KalkSumme} > 0 then
verwendet. Da eine Division durch 0 unzulässig ist, würde sonst eine Fehlermeldung erscheinen!
Die Sektion wird unterdrückt, wenn es keinen Rabatt gibt. Die Unterdrückungsformel dazu:
// Unterdrücken, wenn kein Gesamt-Rabatt enthalten ist: {@GesRabattBetrag} = 0
3.3.2 Texte im Fuss
Die Texte werden über Formeln aus den Programmparametern geholt. Einzelheiten werden hier beschrieben.