Unterschiede zwischen Office- und Vertec-generierten Legacy Word-Berichten
Standard
|Expert
CLOUD ABO
|ON-PREMISES
Leistung & CRM
Budget & Teilprojekt
Fremdkosten
Ressourcenplanung
Business Intelligence
Die Word-Vorlagen von Legacy Office-Berichten funktionieren grundsätzlich gleich, egal ob sie durch Vertec oder durch Office generiert werden, mit folgenden Unterschieden:
Ab Vertec 6.1 werden Datenfelder in Vertec-generierten Legacy Word-Berichten unterstützt, um das Einfügen von Daten in Kopf- und Fusszeilen zu ermöglichen.
Die Felder werden in den erweiterten Eigenschaften im Word Dokument geführt, Menü Datei > Informationen > Eigenschaften > Erweiterte Eigenschaften > Anpassen:
Der Feldname muss mit var
beginnen. Der Feldwert beinhaltet die OCL Expression. Typ ist immer Text.
Im Editiermodus der Kopf- oder Fusszeile kann mittels Einfügen > Schnellbausteine > Feld im Feld DocProperty die gewünschte Variable als Feld übernommen werden:
Die Expressions der Dokumenteigenschaften werden beim Erstellen einmalig auf dem aktuellen Vertec-Objekt (argobject) ausgewertet. Die OCL Expression wird durch deren Ergebnis ersetzt, wobei mehrzeilige Texte ebenfalls übernommen werden.
Ab Vertec 6.3.0.4 wird in Vertec-generierten Legacy Word-Berichten die Möglichkeit unterstützt, Expressions in Kopf- und Fusszeilen einzufügen.
Expressions in doppelten geschweiften Klammern werden wie bei den erweiterten Office-Berichten, als OCL Expressions interpretiert und beim Ausführen mit den entsprechenden Daten befüllt.
Beispiel
{{TimSession.allinstances->first.login}}
fügt den Namen des in Vertec eingeloggten Benutzers in die Kopf- bzw. Fusszeile ein.
Der Inhalt von Feldern in Word kann maximal 255 Zeichen lang sein. Längere Texte werden beim Auswerten der Feldexpression deshalb auf 255 Zeichen abgeschnitten.
In Kopfzeilen und Fusszeilen von Office-generierten Word-Berichten kann kein OCL ausgewertet werden, weil keine Kommentare eingefügt werden können. Falls man doch Werte aus Vertec einsetzten möchte, gibt es folgende Möglichkeiten:
In Versionen vor Vertec 6.1 gibt es den folgenden Umweg über den Makrocode:
Als Variable wird ein Text eingefügt, der später über den Code eindeutig wieder zu finden ist. Im Beispiel unten lautet der Text xProjektcode:
Das Beispiel möchte auf einer Rechnung den Projektcode in der Kopf- bzw. Fusszeile anzeigen. Damit das funktioniert, muss auf dieser Rechnungsvorlage ein Makro erstellt werden mit dem Namen BeforeReport2 oder AfterReport3. Makros mit solchem Namen werden automatisch ausgelöst, wenn ein Bericht aus Vertec heraus aufgerufen wird (siehe Abschnitt Event Makros im Artikel Wordberichte).
Der Code, um den Text in der Kopf- und Fusszeile zu ersetzen lautet für dieses Beispiel wie folgt:
Sub AfterReport3(vertec As Object, dok As Object, root As Object, optarg As Object, akt As Object) Dim i as integer For i = 1 To dok.Sections.Count 'Setzte den Wert im Header dok.Sections(i).Headers(wdHeaderFooterPrimary).Range.Find.Execute FindText:="xProjektcode", ReplaceWith:=root.Eval("projekt.code"), Replace:=wdReplaceAll 'Setzte den Wert im Footer dok.Sections(i).Footers(wdHeaderFooterPrimary).Range.Find.Execute FindText:="xProjektcode", ReplaceWith:=root.Eval("projekt.code"), Replace:=wdReplaceAll Next End Sub
Der zu ersetzende Text (xProjektcode) muss direkt in die Kopfzeile geschrieben werden. Wenn er sich in einem Textfeld oder einer Tabelle befindet, wird er von der beschriebenen Methode nicht gefunden.
Eine andere Variante ist, einen bestimmten Textteil innerhalb des Berichts im Header bzw. Footer zu referenzieren. Dies kann wie folgt geschehen:
Ausgangslage: es ist ein Masterband vorhanden, und darin befindet sich ein Text Projektcode. Dieser Text ist mit dem Kommentar code versehen.
Markieren Sie nun den Text Projektcode und gehen dann in die Formatvorlagen. Wählen Sie Neue Formatvorlage. Im daraufhin erscheinenden Dialogfenster geben Sie als Namen Projektcode ein und wählen beim Formatvorlagetyp Zeichen aus und klicken auf OK.
Wechseln Sie dann in den Header (bzw. in den Footer) an die Stelle, wo Sie den Projektcode anzeigen möchten. Schreiben Sie Projektcode und markieren Sie diesen Text. Klicken Sie auf Einfügen > Schnellbausteine > Feld. Bei den Kategorien wählen Sie Verknüpfungen und Verweise aus und beim Feldnamen StyleRef. Wählen Sie Projektcode und klicken Sie auf OK.
Zu sehen ist auf den ersten Blick nichts, aber wenn Sie das Dokument dann ausführen, wird an dieser Stelle der entsprechende Projektcode angedruckt.
Da diese Variante über StyleRef Felder nicht mit Vertec-generierten Word-Berichten mit Ausgabeformat PDF funktioniert, kann, um zu wissen, ob es sich bei einem Feld um ein StyleRef Feld handelt, mit dem Tastaturkürzel Shift-F9 der Feld-Code angezeigt werden:
In Word-Berichten kann ein Zeilenumbruch via ASCII-Code chr(13) + chr(10) eingefügt werden:
txt1 = "Erste Zeile" & Chr(13) & Chr(10) & "zweite Zeile" ActiveDocument.Range.Find.Execute FindText:="Text1", ReplaceWith:= txt1, Replace:=wdReplaceAll
Befindet sich die zu ersetzende Variable in einer Tabelle, funktioniert das nicht. In diesem Fall muss der Zeilenumbruch über ^p eingefügt eingefügt werden:
txt2 = "Erste Zeile" & "^p" & "zweite Zeile" ActiveDocument.Range.Find.Execute FindText:="Text2", ReplaceWith:=txt2, Replace:=wdReplaceAll
Je nachdem, wie die Textmarke (Bookmark) eines Bands definiert ist, wird der Umfang des Bands in Office- und Vertec-generierten Berichten geringfügig anders interpretiert. Die Unterschiede haben üblicherweise mit der Behandlung von leeren Abschnitten (Paragraphs) zu tun.
Es gibt dabei 2 generelle Arten von Unterschieden:
Im Gegensatz zum VBA-basierten Bericht-Generator der Office-generierten Berichte unterstützt das Server-basierte Berichtsystem für die Vertec-generierten Berichte nur Band-Definitionen, deren Anfang und Ende sich auf gleicher Ebene befindet. Das bedeutet folgendes:
Band-Start | Band-Ende | Vertec-generierte Berichte |
Text (normaler Paragraph) | Text (normaler Paragraph) | OK |
Text (normaler Paragraph) | Text (innerhalb Table) | nicht OK |
Text (normaler Paragraph) | Ende von Tabellenzeile | nicht OK |
Beginn Tabellenzeile | Ende von Tabellenzeile | OK |
Beginn Tabellenzeile | Text in einer Tabellenzelle, nicht am Ende | nicht OK |
Damit diese Bedingungen möglichst gut erfüllt sind, werden Band-Start und Band-Ende möglichst grosszügig interpretiert.
Wenn sich z.B. ein Band-Start am Ende eines Absatzes, welcher Text enthält befindet, aber nur die Absatzmarke umfasst, ist das eigentlich nicht gültig. Damit der Bericht trotzdem funktioniert, wird der Band-Start interpretativ nach vorne an den Beginn des nächsten Elements (Absatz oder Table) geschoben, falls das Band-Ende am Ende einer Tabellenzeile oder eines Absatzes ist:
Diese automatische Anpassung führt natürlich dazu, dass ein Absatzwechsel weniger dargestellt wird. Dies ist also im Output sichtbar.
Solche Bands sollten nach Möglichkeit nicht definiert werden, sondern möglichst immer ganze Abschnitte oder Start und Ende innerhalb des Textes als Band definiert werden.
Befindet sich der Start des Bands sogar mitten im Absatztext, wie in der folgenden Abbildung dargestellt, dann erscheint eine Fehlermeldung betreffend ungültiger Band-Definition.
Es gibt Fälle von Band-Definitionen, welche im server-basierten Code nicht unterschieden werden können, obwohl sie in Word visuell unterscheidbar sind.
Dies ist zum Beispiel dann der Fall, wenn eine Textmarke am Schluss eines leeren Absatzes endet, welcher auf eine Tabelle folgt:
In diesem Fall befindet sich das Bookmark-Ende innerhalb des leeren Absatzes. Endet das Band aber am Ende der Tabelle, enthält den leeren Absatz also nicht, dann befindet sich das Bookmark-Ende ebenfalls im darauffolgenden Abschnitt.
Bookmark-Enden in einem sonst leeren Absatz werden deshalb immer als Ende der vorangehenden Tabelle interpretiert.
Soll ein leerer Absatz nach einer Tabelle explizit zum Band gehören, kann dies erreicht werden, indem im Absatz irgendein Text (z.B. ein Leerzeichen) eingefügt wird. Dann wird der Absatz als zum Band zugehörig interpretiert.
Wenn ein Band am Anfang einer leeren Tabellenzeile beginnt, dann muss in dieser Tabellenzeile mindestens ein Leerzeichen eingefügt werden:
Ansonsten erscheint eine Fehlermeldung der Art: Invalid overlapping bands bndXY and bndYZ
.
Vor dem Ausführen eines Office-Berichts werden folgende OCL Variablen angelegt:
Diese Variablen sind in OCL definiert und nur innerhalb einer OCL Expression zugänglich (rootObj und optArg können auch aus den Methodenparametern evaluiert werden (AfterReport3)).
Die Variablen würden für obiges Beispiel folgende Rückgabewerte liefern:
Expression | Resultat |
---|---|
Vertec.eval("rootObj") |
Liefert die Rechnung (16070001, COMINSTALL) zurück. |
Vertec.eval("optArg") |
Liefert die optional eingegebene Adresse (Eliwag AG) zurück. Wird in diesem Dialog keine Adresse optional eingegeben, liefert diese Variable die Standardadresse zurück (Comtelsat AG). |
Vertec.eval("betreff") | Liefert den String Rechnung Juni 2016 zurück. |
Vertec.eval("kommentar") | Liefert den String Diese Rechnung geht einmalig an die Firma Eliwag AG zurück. |
In Vertec-generierten Word-Berichte können keine Before- und AfterReport Makros ausgeführt werden.
Da diese oft verwendet werden, um Werte in die Kopf- oder Fusszeilen zu schreiben, wurde dafür ein alternativer Ansatz entwickelt, der im Abschnitt Datenfelder in Kopf- und Fusszeilen einfügen beschrieben ist.
Im Gegensatz zu den Vertec-generierten Word-Berichten muss bei der Office-generierten Variante auch lokal auf den Clients ein Word installiert sein. Vertec-generierte Word-Berichte sind cloudfähig und können somit auch in der Cloud App und der Web App laufen. Wohingegen Office-generierte Word-Berichte weniger performant und nicht cloudfähig sind.
Bei der Berichtsregistrierung kann eingestellt werden, ob der Bericht durch Vertec oder durch Office generiert wird.
Word-Berichte können von Vertec generiert und die resultierenden Dokumente an die Apps geliefert werden. Das bedeutet, dass Vertec Word-Berichte cloudfähig sind und somit auch in der Cloud App und der Web App laufen.
In den meisten Fällen ist die Ausführung von Vertec-generierten Word-Berichten wesentlich schneller als die lokale Ausführung, und es wird keine Office-Installation benötigt, weder auf dem Server, noch auf den Clients.
Bei der Berichtsregistrierung kann eingestellt werden, ob der Bericht durch Vertec oder durch Office generiert wird.
Office generierte Word-Berichte basieren auf einem speziellen VisualBasic Makro in der Word Standard-Vorlage, welches bestimmte Elemente in einer Berichtsvorlage interpretiert und via COM bzw. ActiveX auf das Vertec Objektsystem zugreift.
Zum Ausführen von Vertec Word-Berichten wird in Word spezieller Makrocode benötigt. Diese Makros befinden sich im Vorlagendokument VertecReport.dotm.
Dieses Vorlagendokument wird standardmässig im Vertec Installationsverzeichnis abgelegt. Vertec lädt diese Makrodatei bei Bedarf explizit als Word Add-in, daher ist auch keine Signatur notwendig.
Im Office-generierten Word Bericht Mechanismus gibt es die Möglichkeit, VB Makros, die vor und nach dem eigentlichen Bericht aufgerufen werden, zu erstellen. Makros mit folgenden Namen werden berücksichtigt:
Wird vom Bericht Mechanismus aufgerufen, bevor die Daten aus Vertec im Bericht eingesetzt werden. Das bietet zum Beispiel die Möglichkeit, einen Dialog anzuzeigen, der eine bestimmte Vorauswahl trifft.
Die Deklaration ist wie folgt:
sub BeforeReport2(vertec As Object, dok As Object) end sub
Der Zugriff auf Vertec wird mit der Variable vertec übergeben. Es kann auf Vertec also direkt zugegriffen werden. Beispiel:
sub BeforeReport2(vertec As Object, dok As Object) dim projektliste as IVtcObjectList set projektliste = Vertec.eval("projekt->select(aktiv)") end sub
Der Word-Bericht wird mit der Variable dok übergeben.
Dieses Makro wird aufgerufen, nachdem die Daten aus Vertec im Bericht eingesetzt worden sind.
Die Deklaration ist wie folgt:
sub AfterReport2(vertec As Object, dok As Object) end sub
Der Zugriff auf Vertec wird mit der Variable vertec übergeben.
Der Word-Bericht wird mit der Variable dok übergeben.
Ab Version 5.5. Dieses Word-Bericht Eventmakro ermöglicht den Zugriff auf die dazugehörige Aktivität. Dabei handelt es sich um die Aktivität, die erzeugt wird, um den Bericht mit dem Objekt in Vertec zu verknüpfen.
Dieses Makro wird aufgerufen, nachdem die Daten aus Vertec im Bericht eingesetzt worden sind.
Die Deklaration ist wie folgt:
sub AfterReport3(vertec as Object, dok as Object, root as Object, optarg as Object, akt as Object) end sub
Argumente:
optarg und akt können auch leer sein, in VB entspricht das "nothing". Das Makro wird aufgerufen, nachdem die Daten aus Vertec im Bericht eingesetzt worden sind.
Die übergebene Aktivität hat bereits den vorgesehenen Pfad gesetzt. Wird der Pfad der Aktivität im Eventmakro verändert, wirkt sich das auf den Speicherpfad des Dokuments aus.
Die Aktivität wird dafür vor dem Ausführen des Berichts bereits erstellt. Tritt dabei irgendwo ein Fehler auf, wird die Aktivität wieder gelöscht.