Lade...
 

Beispiel Drucken (Dokumenterstellung)

Dokumentbearbeitung

Anhang

Allgemein

Dokumente sind die Vorlage für die Druckausgabe aus ClassiX®, wobei die erzeugten Dokumente selbstverständliche auch gespeichert oder per Email/Fax versand werden können. Dokumente bestehen in der Regel aus Dokumentbausteinen mit hinterlegen Worddokumenten. In Ausnahmefällen für den Etikettdruck kann es auch sein, dass nur ein Baustein (Worddokument) für den Druck benötigt wird, welche dann direkt im Dokument integriert wird und Beispielsweise auch die Maße vorgibt. Im folgenden wird aber nur der Druck von Belegen wie zum Beispiel Angebote, Bestellungen etc. betrachtet.

 

Vergleich Drucken über MS Word mit Drucken über XML

Beim Drucken wird derzeit zwischen zwei Druckmethoden unterschieden, dem Drucken über MS Word und dem Drucken über XML. In diesem Abschnitt wird ein erster Überblick gegeben, wie die Druckmethoden funktionieren und welche Vor- und Nachteile sie besitzen. Eine detailliertere Beschreibung erfolgt weiter unten.

Ganz allgemein lässt sich das Drucken über MS Word wie folgt beschrieben. Zu Beginn des Druckvorgangs wird ein leeres Worddokument erzeugt. Anschließend werden die dem Dokument zugewiesenen Dokumentbausteine sukzessive in das erzeugte leere Worddokument eingefügt. Der Typ oder auch die Reihenfolge Bausteine definiert hierbei wann und wo die Bausteine eingefügt werden. Durch den Typ "Fußzeile" wird zum Beispiel die Fußzeile des Dokuments erzeugt. Das Ergebnis ist, dass das eingangs leere Worddokument mit Inhalt gefüllt wurde und nun gedruckt, gespeichert u. s. w. werden kann.

Beim Drucken über XML wird hinter dem Dokument ein Template hinterlegt. Dieses gibt das Layout des Ausdrucks vor. Dies kann zum einen durch den Verweis auf die zu verwenden Dokumentbausteine erfolgen der Inhalt kann aber auch direkt im Template hinterlegt werden. So kann in der Fußzeile des Templates ein Verweis erfolgen, dass der Baustein des Dokuments zum Drucken der Fußzeile gezogen werden soll oder aber der Inhalt kann direkt in Fußzeile des Templates hinterlegt werden. Beim Drucken wird das Layout gezogen und ausgewertet (gemerged), hierdurch werden die Inhalte alle Platzhalter (Dokumentvariabeln) gesetzt. Das Template ist ein Word XML Dokument welches erst nach der Aufbereitung in ein Word-Dokument als COM Objekt umgewandelt wird.

  Drucken über Word Drucken über XML
Systemvoraussetzung Beliebiges MS Office ab MS Office 2010
Performance Langsam, da permanent zwischen ClassiX und MS-Office kommuniziert wird. Sehr schnelle, das die Druckaufbereitung ausschließlich über XML erfolgt.
Stabilität Mäßig, es kann zu COM-Fehler kommen kann, da Word parallel zum Drucken laufen muss und ständig zwischen Word und ClassiX kommuniziert wird. Gut, da die Aufbereitung des Drucks (fast) ausschließlich über ClassiX stattfindet.
Funktionalität Gut, Dokumente beliebig designt werden. Sehr gut, da das Template beliebig gestaltet werden kann.

 

Erstellen eines neuen Dokuments für den XML-Druck

In diesem Abschnitt wird an einem Beispiel gezeigt, wie für zum Drucken der Lieferscheine ein neues Dokument erzeugt wird.

Anlegen eines Dokuments

Der erste Schritt zum Erstellen eines neuen Dokuments ist das Anlegen des Dokuments selbst. In diesem Beispiel wird dem Dokument die Nummer "SDN" der Name "Lieferschein" vergeben. Im Anwendungsbereich wird der Bereich "Verkauf" definiert und über die Einschränkung kann gesetzt werden, dass das Dokument nur für Lieferscheine (Klasse CX_DELIVERY_NOTE) gültig ist.

Document Sdn De

Anlegen des Templates

Der entscheidende Schritt ist nun aber das Anlegen des Templates. Das Template wird als Word-Dokument in dem Verzeichnis "CX_ROOTDIR\appswh\data\Template\Forms\CX_PROJECT_NAME" unter dem Namen des Dokuments gespeichert, in diesem Fall also unter defaultTemplate.doc.

Das Template könnte in etwa wie folgt aussehen. Es besitzt eine Kopfzeile und ein Fußzeile mit entsprechenden Dokumentvariablen, welche gleich beschrieben werden. Zudem besitzt es zwei Abschnittswechsel und weitere Dokumentvariablen.

Document Word Template1

Allerdings gibt es auch noch ein paar versteckte Dokumentvariablen. Fügt man vor dem ersten Abschnittswechsel ein paar Zeilenumbrüche ein, so sieht man, dass das Dokument eine abweichende Kopfzeile auf der Folgeseite hat. Gleiches gilt für die zwei durch die Abschnittswechsel definierten Abschnitte.

Die Dokumentvariablen, welche in der nächsten Tabelle beschrieben werden, sorgen dafür, dass der Inhalt aus den im Dokument definierten Dokumentbausteinen ausgelesen und an entsprechender Stelle eingefügt wird. Alternativ könnte man wie zuvor schon beschrieben den Inhalt aber auch direkt im Template einfügen. So könnte man die Dokumentvariable "call(XMLPrintListHeader)" zum Einfügen des Bausteins des Listenkopfes entfernen und den Listenkopf hier direkt definieren, wie das folgende Bild zeigt.

Document Word Template2 De

Dokumentvariable Beschreibung
call(XMLPrintPageHeaderFirstPage) Es wird der Baustein "Kopfzeile" eingefügt. Ist dieser bedingt, so wird die Bedingung hinsichtlich "erste Seite" ausgewertet.
call(XMLPrintPageHeaderFollowingPages) Es wird der Baustein "Kopfzeile" eingefügt. Ist dieser bedingt, so wird die Bedingung hinsichtlich "Folgeseite" ausgewertet.
call(XMLPrintPageFooterFirstPage) Es wird der Baustein "Fußzeile" eingefügt. Ist dieser bedingt, so wird die Bedingung hinsichtlich "erste Seite" ausgewertet: print.counter=11111
call(XMLPrintPageFooterFollowingPages) Es wird der Baustein "Fußzeile" eingefügt. Ist dieser bedingt, so wird die Bedingung hinsichtlich "Folgeseite" ausgewertet: print.counter=99999
call(XMLPrintPageFooterLastPage)

Es wird der Baustein "Fußzeile" auf der letzten Seite eingefügt. Ist dieser bedingt, so wird die Bedingung hinsichtlich der "letzten Seite" ausgewertet: last.printPage=1
Der Aufruf im Template kann nur über eine Bedingung bzgl. der Seitenzahl gesteuert werden, so dass entweder die normale Fußzeile der Folgeseite oder die Fußzeile der letzten Seite gedruckt wird:

{ IF { NUMPAGES } <> { PAGE } "{ DOCVARIABLES call(XMLPrintPageFooterFollowingPages) }" "{ DOCVARIABLES call(XMLPrintPageFooterLastPage) }" }

Im Fußzeilen-Baustein können dann bedingte Bausteine definiert werden:

  • if(available(last.printPage))(last.printPage=1)else false
  • print.counter=99999|print.counter=11111
call(XMLPrintDocumentHeader) Es wird der Baustein "Dokumentkopf + Kopfzeile (Folgeseite)". Dieser ist in der Regel bedingt. Die Bedingung wird hinsichtlich der "ersten Seite" ausgewertet.
call(XMLPrintDocumentFooter) Es wird der Baustein "Dokumentfuß" eingefügt.
call(XMLPrintListHeader) Es wird der Baustein "Listenkopf" eingefügt.
call(XMLPrintListItems) Es wird für jede Position der Baustein "Listenposition" eingefügt.
call(XMLPrintListFooter) Es wird der Baustein "Listenfuß" eingefügt.
call(XMLPrintComponentsBeforeListItems) Es werden alle sonstigen Bausteine wie zum Beispiel vom Typ "Konditionen" oder "Freier Baustein" eingefügt, welche in der Reihenfolge der Bausteine im Dokument vor der Positionsliste (Typ "Listenkopf" oder "Listenposition") aufgeführt werden. Sind mehrere Bausteine vorhanden, so werden diese in der Reihenfolge eingefügt wie sie im Dokument einsortiert wurden.
call(XMLPrintComponentsAfterListItems) Es werden alle sonstigen Bausteine wie zum Beispiel vom Typ "Konditionen" oder "Freier Baustein" eingefügt, welche in der Reihenfolge der Bausteine im Dokument nach der Positionsliste (Typ "Listenkopf" oder "Listenposition") aufgeführt werden. Sind mehrere Bausteine vorhanden, so werden diese in der Reihenfolge eingefügt wie sie im Dokument einsortiert wurden.

Es ist aber auch möglich Inhalte ohne die Verwendung vom Dokumentbausteinen in das Template einzufügen. Dies ist sogar wesentlich einfacher, bietet aber nicht die Möglichkeit Bausteine zu kapseln und mehrfach zu verwenden. Einfacher ist es deswegen, weil man die Inhalte direkt im Template einfügen kann. So wäre es denkbar die Listenüberschrift der Positionsliste direkt in der Kopfzeile des Templates statt die Dokumentvariable "call(XMLPrintListHeader)" einzufügen. Gleiches gilt für den Dokumentkopf, die Fußzeile und so weiter. Und obwohl man in diesem Fall nicht über die Dokumentbausteine geht, können trotzdem ebenfalls Dokumentvariablen als Platzhalter für das Einfügen von ClassiX Daten, wie zum Beispiel "uniqueID" zum Einfügen der Belegnummer, verwendet werden.

 

Dokumentbausteine

Über Dokumentbausteine werden Worddokumente verwaltet, welche in das Template eingefügt werden. Den Dokumenten muss eine ID vergeben werden, welche eindeutig sein muss, damit die Dokumente ex- und importiert werden können. Es empfiehlt sich die Bausteine wie das Dokument zu benennen, in welches sie eingefügt werden sollen, ergänzt ein Kürzel, welches den Typ beschreibt. Es könnte auch eine fortlaufende Nummer sein, die ID wäre dann aber nicht sprechend. Folgende Erweiterungen haben sich am Beispiel des Dokuments "SDN" etabliert.

ID Beschreibung
SDN_DH Dokumentenkopf (Document header)
SDN_DF Dokumentfuß (Document footer)
SDN_LH Listenkopf (List header)
SDN_LI Listenposition (List item)
SDN_LF Listenfuß (List footer)
SDN_CO Kondition (Condition)

Durch den Typ des Dokumentbausteins wird gesteuert, welche Aufgabe der Baustein erfüllt und an welche Stelle dieser eingefügt werden soll. So wird der Bausteine "Listenkopf" an all den Stellen im Template eingefügt, an denen die Dokumentvariabel "call(XMLPrintListHeader)" definiert wurde.

Das Word-Dokument kann bedingt in den Dokumentbausteinen hinterlegt werden. Dies können sowohl feste Bedingungen sein, wie zum Beispiel ob der Bausteine "Kopfzeile" gerade auf der ersten oder auf der Folgeseite eingefügt werden soll. Die Bedingungen können aber auch abhängig von allgemeinen Systeminformationen (z. Bsp. Abfrage bzgl. des angemeldeten Mandanten) oder Daten des zu druckenden Beleges (z. Bsp. Abfrage bzgl. der Auftragsart) etc. formuliert werden.

Variable Beschreibung
print.counter = 11111 Erste Seite
print.counter = 99999 Folgeseite
last.printPage = 1 Letzte Seite, diese Abprüfung steht nur zur Verfügung, wenn im Template zwischen den Prozeduren XMLPrintPageFooterLastPage und XMLPrintPageFooterFollowingPages unterschieden wird. Ein entsprechendes Beispiel finden Sie weiter oben bei den XML-Dokumentvariablen.
var(cyberEnterprise).uniqueID = "001" Abfrage bzgl. des angemeldeten Mandanten (In diesem Fall wenn der angemeldete Mandant die ID "001" hat)
type(this)=CX_PURCHASE_ORDER Abfrage bzgl. der Belegart (In diesem Fall ob eine Bestellung gedruckt wird.)

Eine Besonderheit besitzt der Bausteine "Dokumentkopf", welche in der Regel immer bedingt ist. So gibt es die Bedingung für die erste Seite ("print.counter=11111"). Das Dokument, welches hier hinterlegt wurde wird als Dokumentkopf ausgegeben. Das Word-Dokument, welches hinter der Bedingung für die Folgeseite ("print.counter=99999") wird hingegen für die Kopfzeile der Folgeseite verwendet. Der Vorteil ist, dass trotz einer Dokument übergreifenden einheitlichen Kopfzeile auf der ersten Seite ohne eine Dokument individuelle Kopfzeile auf den Folgeseiten eingerichtet werden kann.

Neben dem Worddokument kann der Baustein auch noch Optionen, wie zum Beispiel "neue Seite vor dem Baustein", definieren. Diese Optionen gelten jedoch nur für Bausteine vom Typ "Listenposition" bzw. "Listegruppen" sowie den Bausteinen, welche frei vor oder nach der Liste eingefügt werden.

 

Dokumentvariablen

Im MS-Word Editor kann der Layoutentwurf für den Dokumentkopf entworfen werden. Falls noch keine Erfahrungen im Umgang von MS-Word mit dynamischen Datenfeldern bestehen empfiehlt es sich zuerst einen statischen Layoutentwurf zu erstellen indem die Formatierung von Tabellen, Schrift und eingefügten Grafiken festgelegt wird (siehe o. a. Abbildung).

Dynamische Datenfelder

Sobald der Layoutentwurf steht können die statischen Angaben (z. B. Name, Vorname, Ansprechpartner, Datum etc.) durch dynamische Feldvariablen ersetzt werden. Markieren Sie das Feld (z. B. Name) und wählen Sie aus dem MS-Word-Menüpunkt: "Einfügen"->"Feld...". In der Kategorie: "Dokumentautomation" befindet sich der Feldname: "DocVariable". Wählen Sie diesen Feldnamen und fügen Sie den Variablennamen hinzu (z. B. "DOCVARIABLE customer.partner.name"). Falls die eingefügten Feldnamen im MS-Word Dokument in einer ungewohnten Form erscheinen können die Feldfunktionen über ALT + F9 ein oder ausgeschaltet werden.

{DOCVARIABLE customer.partner.name \*MERGEFORMAT}
eingeschaltete Feldfunktionen (umschalten mit ALT + F9)

 

<< customer.partner.name >>
ausgeschaltete Feldfunktionen (umschalten mit ALT + F9)

 

Diese Methode kann jetzt auf sämtliche in dem MS-Word Dokument zu sehenden Felder angewandt werden. Dazu gehört evtl. auch die Absendadresse im Firmenkopf (z. B. bei unterschiedlichen Auslieferungslagern).

Verbinden mit ClassiX®-Makros

Anstatt auf den Variablennamen zu verweisen können auch ClassiX® Makros aufgerufen werden. Der Aufruf erfolg über die Methode "Call"

{ DOCVARIABLE call(OrderItemDescription) \* MERGEFORMAT }

Verwenden von Methoden der ClassiX®-Objekte

Es ist auch möglich, Objektmethoden aus Word aufzurufen. Dazu wird das ClassiX®-Objekt wie oben beschrieben eingefügt. Der Zugriff auf die Objektmethode geschieht dann nach C++-Konvention. Die Übergabe von Parametern ist möglich.

{ DOCVARIABLEquantity.string(NF_DIMENSIONED,NF_SIG_PRECISION)\*MERGEFORMAT }

Ablaufsteuerung über IF-Anweisung

Word bietet die Möglichkeit, den Ablauf über Verzweigung zu steuern. Dies geschieht mit der IF-Anweisung. Diese wird über das Menü Einfügen/Feld und der Auswahl des Feldnamens IF in der Kategorie Dokumentautomation eingefügt. Eingefügt wird der Eintrag { IF }. Die Anweisung ist nun mit der Bedingung und den Anweisungen für die beiden Fälle wahr und falsch aufzufüllen.

Der Eintrag 
            { IF } 
ist zu ändern in 
            { IF bedingung „Anweisung für wahr“ „Anweisung für falsch“ }

Wichtig sind die Anführungsstriche bei den Anweisung. Diese kapseln die Anweisung.

Bedingtes Dokument

In diesem Beispiel "Lieferschein drucken" wurde ein einfaches Dokument erstellt welches somit nur in einer einzigen Form existiert. ClassiX® bietet die Möglichkeit die Dokumente "bedingt" darzustellen. Als leicht verständliches Beispiel dient die Fallannahme, das ab einen bestimmten Zeitpunkt (z. B. 01. Jan. 2003) ein neues Firmenlogo mit neuem Dokumentkopf gilt. Wir wählen nun also den Dokumentbaustein aus der Dokumentbaustein Auswahlliste und gehen in den Bearbeitungsmodus. Wird die Auswahlbox des Inhalts von "Einfaches Dokument" auf "Bedingtes Dokument" gesetzt kann der Inhalt nun in den bedingten Dokumentbaustein übernommen werden. 

Document Conditioned De

Das Dokumentbausteinfenster hat jetzt sein Design geändert. Statt einer Vorschau auf das OLE-Objekt sieht man nun die verschiedenen Auswahlbedingungen. Über die rechte Maustaste kann nun eine weitere Bedingung hinzugefügt oder eine selektierte Bedingung entfernt werden.

Festlegen der Bedingungen

Per Doppelklick erhält man nun ein weiteres Fenster in dem die Bedingung für das Dokument festgelegt werden kann. Für das o. G. Beispiel kann man jetzt die entsprechende Bedingung einfügen. Der Ursprungskopf soll für alle Belege gelten, welche noch im Jahr 2002 erstellt wurden. Die Formel lautet: "date.YearOfDate()<2002".

Für das Beispiel kann jetzt die Formatierung aus dem Worddokument entweder lokal gespeichert oder in die Zwischenablage kopiert werden. Eine neue Bedingung lässt sich mit der rechten Maustaste erzeugen.

Die Bedingungen werden der Reihe nach von Oben nach unten durchgearbeitet. Ist eine Bedingung erfüllt, wird der Vergleich abgebrochen. Es ist also nicht notwendig eine Else-Bedingung für den Alternativ-Dokumentkopf einzugeben. Über die Tasten Pfeiltaste rauf und Pfeiltaste runter kann die Reihenfolge der Bedingungen getauscht werden.

Für die zweite Bedingung kann jetzt der Inhalt der Zwischenablage in das neue Dokument eingefügt werden und nach eigenen Vorstellungen geändert werden (z. B. anderes Logo, anderes Postfache etc.).

Als nächster Schritt in dem Beispiel "Lieferschein drucken" sollte jetzt. Der Dokumentenkopf für die Folgeseiten (Dokumentenkopf 2.Seite) definiert werden. Und der Dokumentfuß (Hauptseite und Folgeseiten)

Standardbedingungen

Da das Layout von Bausteinen sich häufig in Abhängigkeit von der Seitenanzahl anders darstellt wurden in ClassiX® folgende Standardbedingungen eingefügt:

  • Einfügen (Bedingung für erste Seite)
  • Einfügen (Bedingung für Folgeseite)
  • Einfügen (Listenkopf für Listenanfang)
  • Einfügen (Listenkopf 2. Seite bei Listen die größer sind als eine Seite)

Bsp: Eine Liste, welche sich auf  mehrere Seiten verteilt hat auf der ersten Seite einen Ausführlichen Listenkopf und auf den folgenden Seiten auf denen die Liste fortgesetzt wird eine nur verkürzte Form hiervon.

Beispiele für die Erstellung von Bedingungen sind im Dokument "Belege Drucken" aufgeführt.

Listendefinition

Listen können aus:

  • Listengruppe
  • Listenkopf
  • Listenposition
  • Listenfuß
  • Listenübertrag oben
  • Listenübertrag unten

bestehen. Die Vorgehensweise zum Erstellen eines Listen-Dokumentenbaustein unterscheidet sich nicht von denen der anderen Bausteine. Der Unterschied besteht in der Aufbereitung der angezeigten Daten. Während die Dokumentbausteine (Kopf, Fuß etc.) alle eine Feste Position im Dokumentenlayout haben richtet sich die Anzeige der Listenpositionen nach dem dafür zu Verfügung stehenden Platz und verteilt nicht angezeigte Positionen auf die nachfolgenden Seiten.

Zusammenfügen der Bausteine zu einem Dokument.

Sind nun alle benötigten Dokumentbausteine für das gewünschte Ergebnis erstellt worden können diese zu einem Hauptdokument zusammengefügt werden.

Neue Dokumente können über den Menüpunkt "Basisdaten"->"Dokumente"->"Dokument" angelegt werden. Dokumente haben eine frei zu vergebende Id, einen Dokumententyp (für welche Arbeitsgruppe dieses Dokument gilt. z. B. Verkauf oder Einkauf) und eine Dokumentbezeichnung. Auch hier kann die Bezeichnung wieder in mehreren Sprachen angegeben werden. Für das Beispiel (Lieferscheindruck) verwenden wir den Dokumententyp Verkauf.

Für das Hauptdokument kann ein festdefiniertes Layout angegeben werden, welches sich über die Randabstände (oben, unten, links, rechts) einstellen lässt. Für das Beispiel (Lieferscheindruck) geben wir ein Standardmaß (links: 25mm, oben: 10mm rechts: 0mm unten: 5mm) ein.

Über die Schaltflächen "Einfügen" und "Entfernen" lassen sich jetzt bequem die benötigten Dokumentbausteine hinzufügen. Die in einem Dokument enthaltene Bausteine werden sequentiell von oben nach unten abgearbeitet. Die Reihenfolge der Bausteine kann über die Tasten Pfeiltaste rauf und Pfeiltaste runter geändert werden. 

Über die Schaltfläche Baumstruktur anzeigen können die eingefügten Bausteine in einer Baumstruktur angezeigt werden. Die Baumstruktur ist hilfreich wenn Dokumentbausteine weitere Unterdokumentbausteine enthalten.

Testen (Verwenden) des Dokuments

Um das Beispieldokument jetzt als Gesamtheit zu betrachten gehen wir in den Hauptmenüpunkt "Tätigkeiten->Verkauf->Lieferschein" oder Lieferschein und rufen einen bestehenden Lieferschein auf (Falls noch keiner vorhanden ist muss einer angelegt werden

Weiter geht es über den Druckdialog Druck auslösen (mit OLE im Vordergrund). Um sich das das Dokument anzusehen kann man noch folgende Optionen  hinzufügen oder weglassen:

  • Anschreiben ausdrucken
  • Fusstext ausdrucken
  • Konditionen ausdrucken

Diese drei Möglichkeiten bieten eine Ausnahme in der Programmlogik des Belegdruckes. Es bietet sich an diese Zusatzinformationen auch über einen weiteren Dokumentbaustein zu realisieren. Da diese Möglichkeit aber für alle Vorgänge zur Verfügung steht wurde sie in den Dialog mit eingebunden. Im Druckauswahldialog kann des weiteren noch die Sprache eingestellt werden. Und es wird die Option geboten das Dokument auf verschiedene Arten zu archivieren.

Das Dokument kann über die Schaltfläche "Vorschau" angezeigt werden. Das Vorschau-Tool bietet die Möglichkeit der Skalierug und Seitennavigation. Änderungen am Layout können nun an den Dokumentbausteinen vorgenommen werden. Es können weitere Bausteine hinzugefügt oder überflüssige entfernt werden.


Problembehebung + (Tipps & Tricks)

Aufgrund dem Zusammenspiel der Software mit OLE-Objekten ist ClassiX® nicht gegen die Eigenheiten von Microsoft-Word gewappnet. In dem gesonderten Dokument: "Problembehebung bei OLE-Objekten" sind die bekannten Eigenheiten und Möglichkeiten diese zu umgehen aufgeführt.


Anhang

Einbinden des Druckdialogs Druck auslösen

Einfügen eines Buttons

Festlegen eines Defaultdokument für einen Vorgang

Operativer Betrieb