CrystalReports: Beispiel Angebotsformular

Aus GEVITAS
Wechseln zu: Navigation, Suche

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:

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:

CrystalReports Bsp Angebot AuftrTermine.png

3 Der Report

3.1 Kopf

Der Kopf besteht aus diesen Bereichen:

CrystalReports Bsp Angebot Kopf.png

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:

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".

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.

CrystalReports Bsp Angebot DruckAuftrKennz.png

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:

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

3.3.2 Texte im Fuss

Die Texte werden über Formeln aus den Programmparametern geholt. Einzelheiten werden hier beschrieben.

4 Links