Menü

ZM für Saarlouis als Bericht erstellen

Zurück | Ebene zurück

 

Dieses Formular ist dem Bereich Rechnung zugeordnet.


Lernziel

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.


Voraussetzungen an das Formular?

Welche Daten werden benötigt?

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.

Die erste Seite ist ein Deckblatt

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.

Folgeseiten mit festem Layout

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.

PDF-fähig bleiben

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.

Zeiträume eigenständig ermitteln

Das Formular soll den Meldezeitraum eigenständig anhand des aktuellen Datums ermitteln und so alle Rechnungen des Vorquartals selektieren.


Aufbau des Formulars

 

Einstellung im Datenkonfigurator

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.

Die ROOT-Daten

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

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.

 

Daten-Pipeline pKopf

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:

Die Feldauswahl des SELECT-Befehls:
.......
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.

 

Der FROM-Zweig:
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. 

 

Als nächstes mit der WHERE-Clause:
......
 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.

Der GROUP BY - Zweig:
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.

Der Formulareditor

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, 

Layoutband: Gruppe

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.