Menü

Angebot als Bericht erstellen

Zurück | Ebene zurück

 

Das Angebotsformular ist von den Vorgangsformularen eines der einfacheren und eignet sich am besten das Konzept dieses Formularbereichs zu erklären.


Lernziel

Das Angebotsformular benutzt innerhalb des Hauptberichts sogenannte Unterberichte, also SUB-Formulare. Zusätzlich wird der Umgang mit Regionen beschrieben. Diese werden benötigt um abhängige Bereiche zu verschieben und ein- bzw. auszublenden. Scripts werden benötigt um diese Aufgaben zu steuern.
Das Angebotsformular ist die Vorstufe zu den komplexeren Formulare wie Lieferschein und Rechnungen.


Voraussetzungen an das Formular?

Welche Daten sind die Haupt-Detaildaten?

Das Formular soll eine beliebige Menge verschiedener Angebote verarbeiten. Diese Menge wird über den Datenkonfigurator zur Verfügung gestellt. Hierdurch ergibt sich automatisch, dass nicht mehr die Positionen eines Angebots das Detail sein können, sondern die Angebotskopfdaten müssen es sein. Nur hierdurch ist gewährleistet, dass mehrere Angebote in einem Druckjob ausgegeben werden können.

Der Briefkopf der ersten Seite  soll unabhängig von dem der zweiten Seite sein 

Auf der ersten Seite des Briefpapiers kann zum Beispiel die Absenderzeile und die Bankverbindung stehen, auf den Folgeseiten zum Beispiel nur ein Logo. Hat jemand vorgedrucktes Papier soll die zweite Seite ggf. tiefer anfangen usw. 

Es sollen bei Bedarf zwei MwSt-Sätze ausgedruckt werden können

Bedarf hört sich nach einer Formularbedingung an. Dies wird dementsprechend über Scripts realisiert. In der Regel wird jeder nur einen MwSt-Satz in einem Angebot benutzen. EULANDA® unterstützt jedoch mehrere MwSt-Sätze so dass wir hier ein allgemeingültiges Formular schaffen möchten, das bei vorhandenem 2. MwSt-Satz diesen zusätzlich ausdrucken kann. 


Aufbau des Formulars

 

Einstellung im Datenkonfigurator

Für das Angebotsformular sind nur zwei Daten-Pipelines, also Datenquellen notwendig. Dies sind die Kopfdaten und die Positionsdaten, die mit pKopf und pPos bezeichnet sind. 

 

Daten-Pipeline pKopf

Die Daten-Pipeline für die Kopfdaten wird über den SQL-Befehl: 

SELECT * FROM PRINT_Angebot WHERE id 
in (%:0s) order by KopfNummer

im Eintrag CommandText hinterlegt. Es werden also alle Angebote selektiert, die als ID-Menge an den Konfigurator übergeben werden. Zusätzlich werden die Angebote nach der Angebotsnummer sortiert.

Damit man diese Pipeline nicht im Formulareditor mit pKopf aufrufen muss, setzen wir den FriendlyName auf „AngebotsKopf“.

 

Daten-Pipeline pPos

Die Daten-Pipeline für die Positionen wird über den SQL-Befehl:

SELECT * FROM PRINT_AngebotPos WHERE KopfID 
in (%:0S) Order by KopfId,PosNummer

im Eintrag CommandText hinterlegt. Hierdurch werden alle Positionen die zu der Angebotsmenge gehören selektiert. Diese werden dann nach Angeboten und innerhalb der Angebote nach Positionsnummern sortiert.

Damit man diese Pipeline nicht im Formulareditor mit pPos aufrufen muss, setzen wir den FriendlyName auf „AngebotsPosition“.

 

Verlinkung Master/Detail

Da die Kopfdaten die Hauptdatenquelle für den Hauptbereicht darstellen, enthält diese Pipe keinen Eintrag in Link. Bei den Positionen hingegen beziehen sich alle Positionen natürlich auf einen bestimmten Kopfdatensatz. Deswegen wird der Linkbefehl: pKopf:KopfID=ID gesetzt. Der Link bezieht sich also auf pKopf, wobei das Feld KopfID der Positionen sich auf das Feld ID im Kopfdatensatz bezieht.

 

Feldnamen

Alle Felder im Formulareditor werden beim Einfügen in die Bänder durch das System bezeichnet und mit fortlaufenden Nummern versehen. Diese Benennung der Feldnamen ist im Normalfall unwichtig. Wird ein Formular jedoch mit Scripts versehen, so macht es durchaus Sinn, den Feldern sprechende Namen zu geben. Sie können alle Namen wie DbText22 usw. mit aussagefähigen Namen versehen. Hierzu blenden Sie den Berichtsbaum aus dem Menü Ansicht, Werkzeugleiste ein. Es ist sinnvoll die Feldnamen erst am Ende des Designs für alle Felder zu setzten, jedoch vor der Erstellung der Scripts. Standardmäßig wurden alle Auslieferformulare, die mit dem EULANDA®-System installiert werden mit sprechenden Namen versehen.

 

 

 

 

Hauptbericht

Daten-Pipeline zuordnen

Dem Hauptbericht muss zunächst eine Daten-Pipeline zugeordnet werden. Dies erfolgt über den Punkt „Daten“ im Menü „Bericht“. Hier wurde die Daten-Pipeline „AngebotsKopf“ gewählt. Dieser Name entspricht pKopf, nur wird der im Konfigurator vorhandene Eintrag FriendlyName zur Anzeige benutzt.

 
 
Layoutband: Detailbereich

Im Layout-Band Detailbereich werden alle Kopfdatenfelder gesetzt. Der Unterbericht für die Positionen wird an das Ende des Detail-Berichts positioniert. Mit der rechten Maus kann man noch einmal kontrollieren, ob die Höhe des Detail-Bandes dynamisch ist. Dies ist erforderlich, da der Unterbericht eine beliebige Anzahl Positionen enthalten kann. Die Unterberichte „verlängern“ die Höhe des Detailbereichs im Hauptbericht.

 

Layoutband: Gruppe

Eingangs haben wir als Voraussetzung geschrieben, dass in einem Druckjob mehrere Angebotsformulare hintereinander druckbar sein sollen. Dies bedeutet, dass die Seitennummern für jedes Angebot wieder mit 1 beginnen sollen, und dass ein neues Angebot auch immer auf einer neuen Seite anfangen muss. Beide Eigenschaften lassen sich mit Gruppen lösen.

Gruppen sind zusätzliche Bänder, die einen Detail-Bereich „verwaltbar“ machen. Man kann beliebig viele Gruppen um einen Detail-Bereich schachteln. Eine Gruppe wird für den Generator immer als zusammengehörig gesehen, wenn ein beliebiges Feld einer Daten-Pipeline einen identischen Inhalt hat.

Um besonders flexibel zu sein, ist es auch möglich dieses Gruppenfeld als Benutzerfeld zu definieren und den Inhalt über Scripts zu setzen.

Wir benutzen im Angebots-Formular das Feld ID. Dieses ist in jedem Angebot mit einem eindeutigen Wert gefüllt. Ein Wechsel der ID ist also immer ein Wechsel eines Angebots. Zusätzlich werden im Gruppendialog die Optionen „Neue Seite beginnen“ und „Seitennummerierung zurücksetzen“ angewählt.

 

Layoutband: Fuss

Der Fuss des Hauptberichts wird über den entsprechenden Punkt im Menü Bericht gesetzt. Die Höhe dieses Layoutbandes ist statisch. Wir haben hier im Rechte-Mausmenü die Höhe auf 30,163mm festgesetzt. Als einzige Variable benutzen wir hier das Feld Systemvariable und wählen in der Toolleiste die Option Seite (ausführlich) aus.

 

Layoutband: Seitenstil

Über den Seitenstil können wir unter jede Seite unserer Ausdrucke einen Briefkopf unterlegen. Alle anderen Elemente wie Kopfdaten. Positionen usw. werden dann über diesen Seitenstil gedruckt. Der Seitenstil ist also wie eine untergelegte Folie zu verstehen. 

Wird vom Überdrucken Gebrauch gemacht, so ist darauf zu achten, dass alle Elemente die in den Detailbändern benutzt werden im Rechte-Mausmenü auf Transparent gesetzt sind. 

Für den Seitenstil setzen wird im Rechte-Mausmenü die Höhe unter Position auf 297mm. Sollte diese Zahl nicht einstellbar sein, so sind für das Formular noch Ränder definiert. Diese können im Toolmenü über Seiteneinstellungen bzw. im Menü Datei unter Seite einrichten auf 0 gesetzt werden.

 

Unterbericht: Positionen

Sobald der Unterbericht im Detailbereich des Hauptberichts eingefügt wurde, steht am unteren Bildschirmrand eine  TAB-Leiste zur Verfügung. Auf dieser kann man zwischen dem Hauptbericht und beliebigen Unterberichten wechseln.

 

Daten-Pipeline zuordnen

Dem Unterbericht muss zunächst eine Daten-Pipeline zugeordnet werden. Dies erfolgt über den Punkt „Daten...“ im Menü „Bericht“. Hier wurde die Daten-Pipeline „AngebotsPositionen“ gewählt. Dieser Name entspricht pPos, nur wird der im Konfigurator vorhandene Eintrag FriendlyName zur Anzeige benutzt.

 

Layoutband: Detailbereich

Der Detailbereich enthält alle Positionsfelder. Da das Feld Langtext eine verschiedene Anzahl Zeilen enthalten kann hat das Band automatisch eine dynamische Höhe. 

Die senkrechten Linien müssen nach dem Einfügen in das Band modifiziert werden.  

  • Zunächst sollten alle Linien im Toolmenü auf Links gesetzt werden. Dies erlaubt eine durchgängige einfacherer Behandlung von Linien wenn mit Scripts gearbeitet wird. Da dort Elemente immer mit der linken oberen Ecke im Koordinatensystem angegeben werden.
  • Setzen Sie alle Linien im Rechte-Mausmenü unter Position auf 1,2mm Breite. Breite Werte haben den Nachteil, dass einige Druckertreiber den rechten transparenten Teil einer Linie als weiß drucken und ggf. dadurch das rechts stehende Feld abdecken.
  • Im Rechte-Mausmenü setzen Sie die Option Höhe der Stammkomponente Die Linie ist dann immer bündig mit dem Detailbereich.
  • Im Rechte-Mausmenü setzen Sie die Option Bei Überlauf erneut drucken. Durch diese Option werden Linien, wenn innerhalb einer Position ein Seitenwechsel erfolgt, erneut ausgegeben. Ganz im Gegensatz zu Positionsnummer, Menge usw. die natürlich auf der Folgeseite nicht noch einmal gedruckt werden sollen.
  • Im Rechte-Mausmenü setzen Sie die Option Mit Vorgänger Dehnen.  Im Normalfall muss diese Option jedoch nicht unbedingt gesetzt werden, schaden tut's jedoch nicht und man ist zukünftig hier bereits auf Erweiterungen wie Regionen usw. im Formular vorbereitet.

 

Layoutband: Gruppen

Im Unterbericht müssen einige Gruppen gebildet werden um die vielen Optionen, die wir erreichen möchten zu bekommen. Hierzu gehören: Seitenwechsel wenn nur noch ein zu kleiner Raum vorhanden ist, die Erzeugung eines Positionskopfes auf den Folgeseiten und die Erzeugung eines Abstands zum oberen Blattrand mit der Möglichkeit in diesem Bereich einen eigenen Briefkopf für Folgeseiten zu hinterlegen.

Wir betrachten die Gruppen von innen nach außen und beginnen mit dem Gruppenbereich 2.

 

Gruppenbereich 2

Diese Gruppe wird gesteuert über die ID der Position. Die Gruppe ist also für jede einzelne Position abgeschlossen und wird nur benötigt um einen frühen Seitenwechsel zu erzwingen. Nämlich dann wenn zu Druckbeginn der Position weniger als 50mm freier Platz vorhanden ist. Wir benutzen diese Eigenschaft deswegen, weil wir die Endsumme nicht einzeln auf einer Seite stehen haben wollen. Der Platz von 50mm sollte also mindestens so groß wie die Höhe der Endsumme, also des Layoutbandes Zusammenfassung sein.

 

Gruppenbereich 1

Dieser Gruppenbereich wird über die KopfID der Position gesteuert. Diese Gruppe bezieht sich damit immer auf ein komplettes Angebot und wird benutzt um den Positionskopf bei einem Seitenwechsel erneut zu drucken. Als Option im Gruppendialog wird deswegen Gruppenkopf bei nachfolgenden Seiten drucken, angegeben. Im Layoutmodus kann man mit der Maus den Gruppenkopf aufziehen und so die Elemente für den Gruppenkopf dort platzieren.

 

Gruppenbereich 0

Dieser äußerste Bereich wird benötigt um den Folgeseiten einen eigenen Briefkopf zu ermöglichen. Wir definieren deswegen ebenfalls die KopfID als Gruppenmerkmal und die selbe Option wie im Gruppenbereich 1, nämlich Gruppenkopf bei nachfolgenden Seiten drucken. Den Gruppenkopf ziehen wir auf 50mm auf, so dass jede neue Seite um diesen Bereich versetzt anfängt. Innerhalb dieses Gruppenkopfes kann man natürlich auch Elemente wie Logos usw. platzieren.

 

Layoutband: Zusammenfassung

Am Ende der Positionen, also des Detailbereichs wird die Zusammenfassung mit den Endsummen gedruckt. Da mehrere MwSt-Sätze vorkommen können, sind die hiervon abhängigen Felder in Regionen eingefügt. Diese kann man im Script mit einer Zeile in Abhängigkeit der benutzten MwSt unsichtbar schalten. Außerdem kann man Bereiche in Abhängigkeit von anderen Bereichen verschieben und dadurch immer ein geschlossenes Bild der Endsumme erzeugen - unabhängig davon, ob ein MwSt-Satz benutzt wird, oder nicht.

Über das Rechte-Mausmenü wird für die zweite und dritte Region die Option Verschieben im Verhältnis zu angewählt. Dort wird jeweils die vorherstehende Region angewählt.

 

Scripts einbauen

Im Angebotsformular werden nur zwei Scripts im Unterbericht benötigt.  Das eine steuert die Ein-/Ausblendung des Briefkopfes auf dem Positions-Unterbericht und das andere steuert die Ausblendung nicht benötigter Regionen von MwSt-Sätzen.

 

Script: OnStartPage

Dieses Ereignis ist direkt dem Report, also der Root zugeordnet. Das Ereignis OnStartPage wird vor jeder Seitenerzeugung aufgerufen und eignet sich zur Steuerung des Briefkopfes für die Folgeseiten. Normalerweise würde der 50mm hohe Gruppenkopf auch auf der ersten Seite gedruckt, da ja die Position und damit die Gruppe auch auf der ersten Seite beginnt.

if report.pageno=1 then
  GroupHeaderBand4.Visible:=false
else
  GroupHeaderBand4.Visible:=true;

Über diese Zeilen wird das Band mit dem Gruppenkopf nur dann sichtbar geschaltet, wenn es sich nicht um die erste Seite handelt.

Script: Summary.BeforePrint

Dieses Ereignis wird jeweils vor der Erzeugung der Zusammenfassung angesteuert.

if AngebotsKopf['VkNettoMwst2']=0 then
  RegionMwst2.visible:=false
else
  RegionMwst2.visible:=true;
if AngebotsKopf['VkNettoMwst3']=0 then
  RegionMwst3.visible:=false
else
  RegionMwst3.visible:=true;

Der Betrag des MwSt-Satzes 2 (normaler Steuersatz) wird im Script abgeprüft. Ist dieser „0“, so wird die Region in der die Felder zu diesem Steuersatz definiert sind unsichtbar geschaltet. Analog hierzu wird der reduzierte Steuersatz in MwSt-Satz 3 berücksichtigt.

Wird zum Beispiel die Region RegionMwSt2 unsichtbar, so verschiebt sich die andere Region an die Stelle der unsichtbaren, da wir im Formular ja die Option „Verschieben im Verhältnis zu...“ angewählt hatten. Die Zahlungsbedingung verschiebt sich ebenfalls so dass keine unerwünschte weiße Lücke im Ausdruck entsteht.

Werden in einem Formular Scripts benutzt, so dürfen Elemente die in Scripts angesteuert werden nicht im Layout entfernt oder umbenannt werden. Das Script und damit das Formular kann ansonsten nicht ausgeführt werden und es gibt eine entsprechende Fehlermeldung.

Möchten Sie dennoch die betroffenen Teile ändern, so muss das Script ebenfalls angepasst werden
.

Elemente die nicht entfernt oder umbenannt werden dürfen lauten im Angebotsformular:

  • Daten-Pipeline: FriendlyName „AngebotsKopf“
  • RegionMwSt2
  • RegionMwSt3
  • Es muss ein GroupHeaderBand4 im Unterbericht vorhanden sein. Die Gruppen dürfen in diesem Bereich dementsprechend nicht entfernt werden.