Kaufmännische Software für Handel, Handwerk und Produktionsbetriebe
Dieses Formular ist dem Bereich Rechnung zugeordnet.
Das ZM-Formular benutzt für die erste Seite ein Deckblatt, eine Vorgabe für die Folgeseiten und einen komplexeren SQL-Befehl um die Vorquartale zu ermitteln. Außerdem wird bei Nullmeldungen ein Fehlertext ausgegeben. Das Formular befindet sich aktuell im Genehmigungsverfahren in Saarlouis und ist noch nicht rechtsgültig einsetzbar.

Das ZM-Meldeformular benötigt im Detailbereich die USt-ID sowie den Nettowarenwert. Alle identischen Ust-ID Umsätze müssen für den Meldezeitraum zusammengefasst werden. Da im Formular je nach Quartal die Jahreszahl an anderer Stelle ergänzt werden muss, wurden die Felder Q1 bis Q5 virtuell erzeugt. Alternativ hätte man auch im Formular durch Scripting auf diese Problematik eingehen können. Aus diesem Grund wird zusätzlich die Jahreszahl sowie das Quartal als 1-4 in der Datenquelle erzeugt.
Auf der ersten Seite soll ein Deckblatt ausgegeben werden, welches neben Stammdaten auch die Anzahl abgegebener Zusatzbögen enthalten soll. Die Anzahl Seiten ist normalerweise erst am Ende des Ausdrucks verfügbar, weshalb dem Formular die Eigenschaft „Zwei Durchgänge“ gegeben wurde.
Damit die Folgeseiten so echt wie möglich an das Original herankommt, wurden die Folgeseiten mit einem unterliegenden in EULANDA® erstellten Formular erzeugt. Die eingedruckten Detaildaten werden dann durch Überdrucken in das Formular gesetzt.
Das Formular soll PDF-fähig bleiben. Aus diesem Grund dürfen keine Sonderzeichensätze wie Wingdings benutzt werden. Außerdem dürfen keine transparenten Grafiken sowie Memos mit Auszeichnungen (RTF) benutzt werden.
Das Formular soll den Meldezeitraum eigenständig anhand des aktuellen Datums ermitteln und so alle Rechnungen des Vorquartals selektieren.
Für das ZM-Formular ist nur eine Daten-Pipelines, also Datenquellen, nämlich die Kopfdaten notwendig. Die Kopfdaten-Pipeline wird wie üblich mit pKopf bezeichnet.

Das neue Formular ist wie alle neuen Formulare vom Type MULTI. Als Subtype wird StandAlone eingetragen. Hierdurch muss keine Rechnung selektiert sein, das Formular ist also eigenständig.
SQLConfirmation enthält einen SQL-Befehl, der auf das Vorhandensein von Daten zu dem Meldezeitraum prüft. Sind keine entsprechenden Daten vorhanden, so wird eine Fehlermeldung ausgegeben.

Die Daten-Pipeline für die Kopfdaten wird über den folgenden SQL-Befehl definiert:
-- Dieser 1. Teil erzeugt eine Ust-ID Selectmenge für das Vorquartal
SELECT UstId,
CONVERT(NUMERIC(18,0),
SUM(VkNetto)) VkNetto,
DATEPART(qq,datum) Zeitraum,
DATEPART(YEAR,DATUM) Jahr,
(CASE WHEN DATEPART(qq,Datum)=1 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END) Q1,
(CASE WHEN DATEPART(qq,Datum)=2 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END) Q2,
(CASE WHEN DATEPART(qq,Datum)=3 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END) Q3,
(CASE WHEN DATEPART(qq,Datum)=4 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END) Q4,
'' Q5
FROM Rechnung WHERE
DATEPART(qq,DATEADD(qq,1,datum))=DATEPART(qq,GETDATE())
AND DATEPART(YEAR,DATEADD(qq,1,datum))=DATEPART(YEAR,GETDATE())
AND UstId>'' AND Land <> (SELECT TOP 1 Land FROM Intern_Konst)
GROUP BY
UstId,
DATEPART(qq,datum),
DATEPART(YEAR,DATUM),
(CASE WHEN DATEPART(qq,Datum)=1 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END),
(CASE WHEN DATEPART(qq,Datum)=2 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END),
(CASE WHEN DATEPART(qq,Datum)=3 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END),
(CASE WHEN DATEPART(qq,Datum)=4 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END)
ORDER BY UstId
-- Dieser 2. Teil erzeugt eine Ust-ID Selectmenge für das gesamte Jahr
/*
SELECT UstId,
CONVERT(NUMERIC(18,0), SUM(VkNetto)) VkNetto,
5 Zeitraum,
DATEPART(YEAR,DATUM) Jahr,
'' Q1,
'' Q2,
'' Q3,
'' Q4,
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) Q5
FROM Rechnung WHERE
DATEPART(YEAR,datum)=DATEPART(YEAR,GETDATE())-1
AND UstId>'' AND Land <> (SELECT TOP 1 Land FROM Intern_Konst)
GROUP BY
UstId,
DATEPART(YEAR,DATUM),
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10))
ORDER BY UstId
*/
Diese Definition wird im Eintrag CommandText hinterlegt. Es werden hier Rechnungen selektiert, die aus einem bestimmten Zeitraum sind und eine Ust-ID haben. Zusätzlich darf diese Ust-ID nicht aus dem eigenen Land sein. Die Ausgabe wird schließlich über das Feld Ust-ID zusammengefasst und anschließend danach sortiert.
Der zweite Teil des SQL-Befehls ist komplett auskommentiert und für den Ausnahmefall des jährlichen Meldezeitraums aufgeführt.
Dieser SQL-Befehl ist ein einziger Befehl und von daher auf den ersten Blick etwas schwieriger zu verstehen.
Wir fangen mit dem Select-Befehl und dort mit der Feldauswahl an:
.......
SELECT UstId,
CONVERT(NUMERIC(18,0),
SUM(VkNetto)) VkNetto,
DATEPART(qq,datum) Zeitraum,
DATEPART(YEAR,DATUM) Jahr,
(CASE WHEN DATEPART(qq,Datum)=1 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END) Q1,
(CASE WHEN DATEPART(qq,Datum)=2 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END) Q2,
(CASE WHEN DATEPART(qq,Datum)=3 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END) Q3,
(CASE WHEN DATEPART(qq,Datum)=4 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END) Q4,
'' Q5
.......
Das erste Feld ist die Ust-ID.
Das zweite Feld wird als Summe CONVERT(NUMERIC(18,0), SUM(VkNetto)) berechnet und mit dem Alias VkNetto versehen.
Das dritte Feld ist die Quartalszahl des Meldezeitraums. Diese kann zwischen 1 und 4 liegen und wird dem Alias Zeitraum zugewiesen.
Das vierte Feld ist die Jahreszahl des Meldezeitraums.
Die Felder fünf bis acht erzeugen ein Textfeld, welches mit dem Alias
Q1 bis Q4 bezeichnet wird. Es enthält die Jahresendzahl also bei 2001 die
„1“, aber nur in dem Feld, in dessen Quartal der Meldezeitraum
fällt. Dies wird benötigt um im Formular die vier Jahreszahl-Felder
automatisch zu erzeugen, wobei nur das Meldequartal ausgefüllt werden
darf.
Über CASE wird die Quartalszahl mit dem Rechnungsdatum verglichen
und ggf. durch eine Modulare Division durch 10 erzeugt. Der SQL-Befehl
für das modulare Teilen ist %. Da EULANDA® jedoch dieses Zeichen
intern als Parameter auswertet, muss es durch ein zweites gedoppelt
werden. Ist die CASE-Bedingung nicht zutreffen so wird das Feld als
Leertext erzeugt-
Das neunte Feld wird generell als Leerfeld mit dem Alias Q5 erzeugt. Q5 wird nur für den Sonderfall eines ganzjährigen Meldezeitraums benötigt. Diese seltene Fall wurde im SQL-Befehl auskommentiert und steht in Teil 2. des Befehl.
FROM Rechnung
Da bei der gesamten Ausgabe nur Grundfelder benötigt werden, sprechen wir die Rechnungs-Kopfdatentabelle direkt an, also nicht die Sichten wie MASTER_Rechnung usw. wie es im allgemeinen gemacht wird.
......
WHERE
DATEPART(qq,DATEADD(qq,1,datum))=DATEPART(qq,GETDATE())
AND DATEPART(YEAR,DATEADD(qq,1,datum))=DATEPART(YEAR,GETDATE())
AND UstId>'' AND Land <> (SELECT TOP 1 Land FROM Intern_Konst)
.....
Es wird in der ersten Zeile das Vorquartal ermittelt und verglichen. Hierzu wird auf der rechten Seite über DATEPART(qq,GETDATE()) eine Quartalsnummer von 1-4 erzeugt die vom aktuellen Tagesdatum abhängt. Dieser rechte Teil wird verglichen mit dem linken. Die Problematik ist auf der linken Seite das Vorquartal zu ermitteln. Hierzu wird mit DATEADD(qq,1,datum) zunächst auf das aktuelle Datum der Rechnungsmenge ein Quartal aufaddiert. Dieses hiermit erhaltene Datum wird nun wieder in eine Quartalszahl 1-4 überfolgenden Befehl DATEPART(qq,DATEADD(qq,1,datum)) berechnet.
In der zweiten Zeile wird über eine UND-Verbindung in ähnlicher Weise die Jahreszahl ermittelt, da ja ein Quartal 3 beispielsweise in allen Jahren existiert.
In der dritten Zeile wird geprüft, ob die Ust-ID einen Inhalt hat und es wird anhand der Internen-Konstanten Intern_Konst das dort hinterlegte Land mit dem Land der Rechnungskopfdaten verglichen. Nur Länder die nicht dem eigenen entsprechen werden selektiert.
Die gesamte Ausgabe soll gruppiert werden, so dass wir pro Ust-ID nur einen Warennettowert bekommen.
GROUP BY
UstId,
DATEPART(qq,datum),
DATEPART(YEAR,DATUM),
(CASE WHEN DATEPART(qq,Datum)=1 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END),
(CASE WHEN DATEPART(qq,Datum)=2 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END),
(CASE WHEN DATEPART(qq,Datum)=3 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END),
(CASE WHEN DATEPART(qq,Datum)=4 THEN
CONVERT(VARCHAR,(DATEPART(YEAR,Datum) %% 10)) ELSE '' END)
Im wesentlichen müssen alle Felder die in der Feldauswahl genannt wurden hier noch einmal aufgeführt werden, also auch die berechneten Ausgaben. Die Aliasnamen werden jedoch hier weggelassen. Da die Felder 3-9 sich nicht ändern, ist die Gruppe nur vom Feld Ust-ID abhängig. Das Feld mit der Summen-Bildung muss natürlich weggelassen werden.
Anschließend wird die Ausgabe nach dem Ust-ID-Feld sortiert.
Der ORDER-Zweig:
ORDER BY UstId
Die Ausgabe wird wunschgemäß nach der Ust-ID sortiert.
Als Friendlyname wird der Datenpipeline wie üblich RechnungsKopf zugewiesen.
Nachdem die Datenquellen eingerichtet sind starten Sie den Formulareditor über „Report bearbeiten“.
Aktivieren Sie im Menü, den Titel, den Kopf und den Seitenstil. Setzen Sie mit der Rechten Maus unter Position die Höhe für Titel und Seitenstil auf 297mm. Sollt diese Zahl nicht angenommen werden, so ist im Formular noch ein oberer oder unterer Rand definiert (Seiteneinstellung).
Wir haben bei der Erstellung des Formulars zwei Scans benutzt, die wir abgehellt als Bild importiert hatten. Das Nachgestalten der Hauptelemente war dann recht einfach.
Das Feld BOGEN im Titelbereich ist ein berechnetes Feld und bekommt als Wert die absolute Anzahl von Seiten minus eins, nämlich der des Deckblattes zugewiesen. Mit der rechten Maus kann an dieser Stelle der Scripteditor für das Feld gestartet werden.

Damit die Anzahl von Seiten bereits vor Druckbeginn benutzt werden kann, muss dem Formular unter dem Menüpunkt Bericht/Durchgänge die Option „doppelter Durchlauf“ aktiviert werden.
Der Kopfbereich des Formulars wird benutzt, um auf allen Folgeseiten den Detailbereich nicht am Seitenanfang beginnen zu lassen, sondern in der dafür vorgesehenen Fläche die im Seitenstil definiert wurde,

Das Formular darf nicht bis an den unteren Rand drucken, sondern muss im vorgesehen Bereich beendet werden.
Dies wird über eine Gruppenoption erreicht. Als Gruppenfeld wird ein Feld benutzt, dass sich bei jedem neuen Datensatz ändert, so dass die Prüfung zeilenweise erfolgen kann.
Als Wert haben wir hier 50mm eingetragen. Bei jedem Datensatz wird so geprüft, ob noch 50mm Platz zum unteren Rand vorhanden sind. Ist dies nicht der Fall wird ein Seitenvorschub ausgelöst und der Seitenstil wird zuvor unterlegt.
Der Seitenstil darf nicht auf der ersten Seite ausgegeben werden, da hier nur der Titel als Deckblatt stehen darf. Mit der rechten Maus über dem Seitenstil stellen wir deshalb unter Seiteneinstellung die Seitenzahlen 2-99 ein, zu denen der Seitenstil nur gedruckt werden darf. Sollten mehr Meldungen als 99 Seiten ausgegeben werden, so muss dies hier geändert werden.

Im Formular wurde auch bei den Zeilen mit gemischtem Text (fett/normal) kein Richtext (RTF) benutzt, da RTF sich durch den integrierten ODF-Wandler nicht ausgeben lässt. Aus diesem Grund wurden die Texte aus diversen Labels zusammengesetzt.
Alles weitere entnehmen Sie dem Original-Bericht.