Support vertec.com

Erweiterte Office-Berichte erstellen: Schritt-für-Schritt-Anleitung

Hier finden Sie eine Schritt-für-Schritt-Anleitung zur Erstellung eines erweiterten Office-Berichtes in Word oder Excel.

Standard

|

Expert

CLOUD ABO

|

ON-PREMISES

Leistung & CRM

Budget & Teilprojekt

Fremdkosten

Ressourcen & Projektplanung

Business Intelligence

Erstellt: 31.08.2021
Aktualisiert: 31.08.2021

In diesem Artikel erfahren Sie Schritt für Schritt, wie Sie einen Erweiterten Office-Bericht (EOB) mit Word oder Excel erstellen. Anhand eines Beispiels wird ein einfacher EOB geschrieben. Details zu den Möglichkeiten und zur Erstellung von EOBs finden Sie in den Artikeln Erweiterte Office-Berichte und Python-Code für erweiterte Office-Berichte.

Basisklasse festlegen und Office-Dokument erstellen

Die erste Frage bei der Erstellung eines EOB ist: Wie soll der fertige Bericht aussehen, wenn er aus Vertec erstellt wird? Es ist daher eine gute Strategie, zunächst ein entsprechendes Beispiel in Word oder Excel zu erstellen.

In unserem Beispiel sollen für ein Projekt die Leistungen nach Bearbeitern gruppiert aufgelistet werden.

Das Ergebnis soll wie folgt aussehen:

Word

Excel

Wir beginnen mit der Erstellung des Office-Dokumentes und legen das Haupt-Frame (main_frame ) fest. Ausserdem möchten wir schon ein erstes Python-Code für erweiterte Office-Berichte erstellen.

Word

Wir erstellen ein leeres Word-Dokument und fügen eine Tabelle ein. So ist es später einfacher, die Textmarken zu setzen.

Zunächst hat unser Word-Dokument nur eine Zeile. Dort möchten wir den Projektcode eintragen. Wir schreiben daher das Wort Code in die Zeile und versehen dieses Wort mit einem Kommentar. Der Kommentar selbst bleibt leer.

Anschliessend markieren wir das gesamte Dokument und fügen eine Textmarke ein. Diese ist das Band für unser Haupt-Frame und nennt sich bndMain :

Nun speichern wir das Dokument als .docx -Datei.

Excel

Wir erstellen ein leeres Excel-Dokument und schreiben das Wort Code in die erste Zeile. Wir versehen das Feld mit einem Kommentar. Der Kommentar selbst bleibt leer.

Wie im Word-Dokument muss auch im Excel das Haupt-Frame festgelegt werden. Hier ist es aber nicht möglich, das gesamte Blatt zu markieren, das wären zu viele Zellen. Stattdessen beschränken wir uns auf den Bereich den wir tatsächlich für unseren Report benötigen. Der Bereich kann nachträglich jederzeit erweitert werden. Den markierten Bereich versehen wir mit dem Namen bndMain .

Nun speichern wir das Excel-Dokument als .xlsx -Datei

Python-Code: Haupt-Frame festlegen und Klasse definieren

Der nächste Schritt wird im Vertec ausgeführt. Wir legen einen neuen Erweiterten Office-Bericht an und beginnen den Python-Code zu schreiben.

Im neu erstellten EOB tragen wir als Klasse Projekt ein. Dann laden wir die soeben erstellte Word- oder die Excel-Datei hoch, je nachdem, welches Ausgabeformat der Bericht haben soll.

Wenn die Datei als pdf ausgegeben werden soll, muss eine Word-Vorlage hochgeladen werden.

Nun können wir den Python-Code beginnen. Der Python-Code wird auf der Seite Bericht-Definition hinterlegt.

Wir tragen zunächst ein, welche Klasse unser Haupt-Frame hat. Ausserdem erstellen wir die Klasse Projekt und das erste Feld. Da unsere Bezeichnung des Feldes code mit der OCL-Expression übereinstimmt, kann auf eine detaillierte OCL-Expression verzichtet werden.

Der Bericht kann nun schon gedruckt werden. Es wird der Code des Projektes ausgegeben. Bitte probieren Sie schon an dieser Stelle aus, ob sich der Bericht erstellen lässt. Falls nicht, suchen Sie nach dem Fehler. Häufige Fehler sind:

  • In einem Feld ist ein Leerzeichen im Kommentar enthalten.
  • Das Haupt-Frame umfasst das Feld nicht.
  • Es gibt einen Syntax-Fehler im Python-Code.

Weitere Felder und Frames hinzufügen

Nun können weitere Felder hinzugefügt werden. Wir beginnen wieder im Office-Dokument. Dort tragen wir jeweils einen Platzhalter ein und versehen diesen (Word) bzw. die entsprechende Zelle (Excel) mit einem Kommentar.

Word

 Excel

In der Bericht-Definition in Vertec tragen wir die entsprechenden Felder ein:

# Projekt mit Leistungen

class Projekt(Frame):
    fields = [
        OclTextField("code"),
        OclTextField("kunde"),
        OclTextField("betreffend"),
    ]

main_frame = Projekt

Nun möchten wir für jeden Bearbeiter auf dem Projekt einen eigenen Abschnitt einfügen. Dafür benötigen wir ein Sub-Frame.

Word

Wir markieren einen Abschnitt im Word-Dokument, am besten mehrere Zeilen der Tabelle. Dort fügen wir eine neue Textmarke ein. Die Textmarke nennen wir bndBearbeiter . Nun müssen wir innerhalb der Textmarke festlegen, welches Frame im Python-Code zu dieser Textmarke gehört. Dazu platzieren wir folgenden Text in der Textmarke

und versehen diesen Text mit einem Kommentar. Zusätzlich legen wir in dem neu erstellten Frame bereits ein Feld an, nämlich den Namen des Bearbeiters:

Excel

In Excel definieren wir für ein neues Frame einen Namen. Es ist wichtig, dass der Bereich des neuen Frames vollständig im Haupt-Frame enthalten ist. Ausserdem können wir im Excel nicht ein Feld und einen Namen in ein und dasselbe Feld schreiben. Wir schreiben daher die Expression für das Frame in eine eigene Spalte:

Der Python-Code für das neue Frame ist für Word und Excel identisch. Wir fügen für das Frame ein Feld in der Klasse Projekt ein. Das Feld definieren wir als OclFrameField. Dort geben wir an

  • welchen Namen das Frame hat (bearbeiter)
  • in welcher Klasse die Felder des Frames definiert werden (Projektbearbeiter)
  • die OCL-Expression für welche Objekte ein solches Frame angelegt werden soll (offeneleistungen.bearbeiter->asset->orderby(name))
# Projekt mit Leistungen

class Projektbearbeiter(Frame):
    fields = [
        OclTextField("name"),
    ]

class Projekt(Frame):
    fields = [
        OclTextField("code"),
        OclTextField("betreffend"),
        OclTextField("kunde"),
        OclFrameField("bearbeiter", "Projektbearbeiter", "offeneleistungen.bearbeiter->asSet->orderby(name)")
    ]

main_frame = Projekt

Die Klasse Projektbearbeiter legen wir analog zur Klasse Projekt im Python-Code an und definieren dort das Feld name .

Bitte probieren Sie aus, ob sich der Bericht mit diesen Angaben erstellen lässt. Es sollten alle Namen von Projektbearbeitern aufgelistet werden, die offene Leistungen auf dem Projekt haben.

Word

Excel

Weitere Sub-Frames hinzufügen

Im Folgenden möchten wir die Leistungen jedes Bearbeiters auflisten. Das Vorgehen ist analog zu dem Frame für Bearbeiter. Wir definieren innerhalb des Frames für Bearbeiter ein OclFrameField für Leistungen. Im Office-Dokument fügen wir eine Zeile für die Leistungen ein:

Word

 

 

 

Excel

 

 

In beiden Fällen steht die mit einem Kommentar versehene Expression bndLeistungenExp:leistungen innerhalb des Bandes.

Dabei steht bndLeistungen für den Namen der Textmarke, Exp: ist das Schlüsselwort für eine Band-Expression und leistungen ist der Name des Feldes im Python-Code.

Wichtig ist hier, dass die Textmarke für Leistungen sowohl im bndMain als auch im bndBearbeiter enthalten sein muss.

Im Python-Code erstellen wir für Leistungen eine neue Klasse mit Feldern für datum , text , aufwand und honorar . Für unterschiedliche Datentypen gibt es unterschiedliche Feld-Typen. Eine genaue Übersicht finden Sie hier.

 

# Projekt mit Leistungen

class Leistung(Frame):
    fields = [
        OclDateField("datum"),
        OclMinuteField("aufwand", "minutenint"),
        OclCurrencyField("honorar", "wertext"),
        OclTextField("text", "textvoll"),
    ]
    
class Projektbearbeiter(Frame):
    fields = [
        OclTextField("name"),
        OclFrameField("leistungen", "Leistung", "offeneLeistungen->select(projekt=varProjekt)->orderby(datum)"),
    ]

class Projekt(Frame):
    fields = [
        OclTextField("code"),
        OclTextField("betreffend"),
        OclTextField("kunde"),
        OclFrameField("bearbeiter", "Projektbearbeiter", "offeneleistungen.bearbeiter->asSet->orderby(name)")
    ]

main_frame = Projekt

 

Wir profitieren hier davon, dass es für jedes übergeordnete Frame eine Variable gibt, die direkt im OCL verwendet werden kann. So können wir die offenen Leistungen des Bearbeiters auf das aktuelle Projekt filtern.

Um nicht alle offenen Leistungen des Bearbeiters zu laden, gibt es performantere Lösungen. Eine davon zeigen wir hier, um zu sehen, wie man Frame-Felder nicht über OCL sondern über eine Funktion definiert.

 

# Projekt mit Leistungen

class Leistung(Frame):
    fields = [
        OclDateField("datum"),
        OclMinuteField("aufwand", "minutenint"),
        OclCurrencyField("honorar", "wertext"),
        OclTextField("text", "textvoll"),
    ]
    
class Projektbearbeiter(Frame):
    fields = [
        OclTextField("name"),
        FrameField("leistungen", "Leistung", "calc_leistungen"),
    ]

    def calc_leistungen(context):
        projekt = context.varProjekt
        bearbeiter = context.varProjektbearbeiter
        leistungen = vtcapp.getwithsql("OffeneLeistung", "projekt = {} and bearbeiter = {}".format(projekt.objid, bearbeiter.objid), "datum")
        return Leistung(context, leistungen)

class Projekt(Frame):
    fields = [
        OclTextField("code"),
        OclTextField("betreffend"),
        OclTextField("kunde"),
        OclFrameField("bearbeiter", "Projektbearbeiter", "offeneleistungen.bearbeiter->asSet->orderby(name)")
    ]

main_frame = Projekt

 

Möglich wäre es auch, die Leistungen des Projektes in einer Before Report Funktion nur einmalig in eine Liste zu laden und anschliessend mit der Liste weiter zu arbeiten. 

Summen bilden

Wir möchten über die Leistungen eine Summe bilden und anschliessend über alle Leistungen aller Bearbeiter eine Gesamtsumme. Dazu brauchen wir kein neues Feld im Python-Code. Stattdessen können wir im Word bzw. Excel direkt auf das Band verweisen, über das wir die Summe bilden möchten:

Word

Excel

Der Text bzw. die entsprechenden Felder müssen mit einem Kommentar versehen sein. Das Schlüsselwort für die Summe ist sum: . Dann kommen die Namen der Python Frames über die summiert werden soll und schliesslich das Feld, das summiert wird, hier aufwand bzw. honorar . Wichtig ist, dass die Summe über die Leistungen eines Bearbeiters in der Textmarke bndBearbeiter enthalten ist. Die Summe über alle Bearbeiter muss dagegen ausserhalb stehen:

Der Output des Berichtes sollte nun dem gewünschten Ergebnis entsprechen.

Hier finden Sie die Office Dateien, sowie den Python-Code für das soeben erstellte Beispiel:

Projekt mit Leistungen.docx

Projekt mit Leistungen.xlsx

Projekt mit Leistungen.py

Projekt mit Leistungen SQL.py

Die Möglichkeiten von Erweiterten Office-Berichten sind in diesem Bericht bei weitem nicht ausgeschöpft. Detailinformationen und Hilfestellungen finden sie unter Python-Code für erweiterte Office-Berichte. Insbesondere gibt es die Möglichkeit, Felder in Python Funktionen zu definieren, in einer Before Report Funktion Abfragen vorzunehmen oder Listen vorzuberechnen und Frames im Python-Code sukzessive aufzubauen.

Bitte wählen Sie Ihren Standort