Modul: Vertec CSV Exporter

Modul für den einfachen Python CSV Export aus Vertec, mit integriertem OCL und SQL

Produktlinie

Standard

|

Expert

Betriebsart

CLOUD ABO

|

ON-PREMISES

Module

Leistung & CRM

Budget & Teilprojekt

Fremdkosten

Ressourcenplanung

Business Intelligence

Erstellt: 01.12.2020
Aktualisiert: 09.04.2024 | Modul ausgetauscht (VertecCSVExporter.py). Falls ein file_name angegeben ist, wird das File neu an den Client gesendet, nicht mehr direkt auf dem Filesystem gespeichert. Damit ist es durchgängig cloudfähig.

Für das einfache Erstellen von CSV Files in Vertec bieten wir dieses Modul an. Es wird wie ein normales Script registriert und kann dann in anderen Scripts referenziert werden.

Script

VertecCSVExporter.py

Registrieren als Script , Bezeichnung VertecCSVExporterClasses.

Die Bezeichnung kann frei gewählt werden, darf einfach keine Leerschläge oder Sonderzeichen enthalten. In den Beispielen unten wird diese Bezeichnung verwendet; falls Sie eine andere Bezeichnung wählen, müssen Sie die Beispiele entsprechend anpassen.

Das Modul implementiert folgende Klassen:

  • VertecCSVExporter: Klasse, welche das Filehandling übernimmt und welche es ermöglicht, Listen direkt via OCL- oder SQL-Expression anzugeben.
  • OCLCSVRecord: Records, welche dem CSVExporter angehängt werden und die Zeilen darstellen, die geschrieben werden.

VertecCSVExporter

Der VertecCSVExporter hat folgende Eigenschaften:

Eigenschaft Beschreibung
encoding     Standard: 'UTF-8'
field_delimiter Standard: ';'
Feld-Trennzeichen
string_delimiter Standard: '"'
String-Trennzeichen
only_first_line_for_strings Standard: True
Gibt an, ob von mehrzeiligen Werten (z.B. ein Adress-text) nur die erste Zeile geschrieben werden soll.
Excel zum Beispiel kann mit CRLF in CSV-strings nicht umgehen.
file_name Wird ein File-Name angegeben, wird das CSV direkt an den Client gesendet und kann dort gespeichert werden.
field_names_in_first_line Standard: True
Schreibt die Feldnamen als erste Zeile im CSV.
row_delimiter Standard: '\n'
Zeilen-Trennzeichen.
add_row() Dem Exporter werden Zeilen vom Typ OCLCSVRecord angehängt.
populate_rows(listexpression, sqlwhere, ocl_filter_expression) Methode, welche die Zeilen erstellt mit OCL oder SQL.
Die Liste kann ausserdem mit OCL gefiltert werden (nützlich vor allem, wenn als Expression eine SQL-Expression verwendet wird).
  • listexpression: Als Listexpression kann folgendes angegeben werden:
    • Eine OCL-Expression, welche die Liste berechnet. Diese wird auf der Session berechnet, also ohne Context, mit vtcapp.evalocl().
    • Die Klasse für die Berechnung via getwithsql . Damit das so interpretiert wird, muss zusätzlich die Eigenschaft sqlwhere angegeben werden.
  • sqlwhere: Optional. Wird eine sqlwhere Bedingung angegeben, dann wird der Parameter listexpression als Klassennamen interpretiert (siehe oben).
  • ocl_filter_expression: Optional. Hier kann die Liste, welche mit getwithsql geladen wurde, noch via OCL gefiltert werden. Die Expression wird von der Liste via aufgerufen.
export_rows() Methode, die das CSV File erstellt und zurückgibt. Falls ein file_name angegeben ist (siehe oben), wird es direkt an den Client gesendet.

OCLCSVRecord

Die einzelnen Records, also die Zeilen, die geschrieben werden, sind von der Klasse OCLCSVRecord. Die Klasse hat folgende Eigenschaften:

Eigenschaft Beschreibung
key Feldname. Die Feldnamen werden standardmässig als erste Zeile ins CSV geschrieben, ausser die Option field_names_in_first_line beim Exporter wird auf False gesetzt (siehe oben)
default_value Standardwert. Hier kann ein Standardwert angegeben werden, welcher geschrieben wird, falls das Feld keinen Wert enthält. Wird kein Standardwert angegeben, muss None angegeben werden.
field_type Feldtyp. Die behandelten Feldtypen sind:
–    string. String-Handling, welches sich aktiv um das Encoding kümmert beim Schreiben eines Files.
–    float: Zahl mit zwei Nachkommastellen, Dezimaltrennzeichen ist der Punkt.
–    floatlocale: Zahl mit vier Nachkommastellen, Dezimaltrennzeichen gemäss lokalen Regionaleinstellungen oder gemäss replaceSeparatorBy (siehe Beschreibung weiter unten).
–    date: Datum, wird im Format Tag.Monat.Jahr geschrieben.
Alle anderen Feldtypen werden einfach als String interpretiert: str(value).
Es kann beispielsweise auch int verwendet werden, es gibt aber keine spezielle Behandlung für int.
ocl_expression

OCL: Optional. Für die Berechnung des Feldes kann eine OCL-Expression angegeben werden.


Die Zeilen werden als Unicode Strings zurückgegeben.

Beispiele

Variante 1: Alles automatisch berechnet, ohne File speichern

from VertecCSVExporterClasses import VertecCsvExporter

fields = [
    ('Project', None, 'string', 'code'),
    ('ProjectId', None, 'int', 'objid'),
    ('Currency', None, 'string', 'waehrung.asstring'),
    ('Betreffend', None, 'string', 'betreffend'),
]

exporter = VertecCsvExporter(fields)
exporter.populate_rows("projekt")
csv = exporter.export_rows()
Variante 1 mit SQL-Expression
exporter.populate_rows("Projekt", "CreationDateTime>='01.01.2020'", "self->orderby(code)")

CSV enthält nun das CSV als Unicode String und kann z.B. via vtcapp.sendfile() an den Client gesendet werden.

Da dieser String auch weiterverarbeitet werden könnte, wird das Encoding hier nicht berücksichtigt. Möchte man diesen String beispielsweise als UTF-8 haben, kann einfach ein .encode("UTF-8") angehängt werden.

Variante 2: Alles automatisch, mit Senden des Files an den Client

Aufbau wie oben, aber mit Angabe eines File-Namens:

exporter.file_name = 'export.csv'

Das exporter.export_rows() sendet das File dann automatisch an den Client via vtcapp.sendfile() .

Das File wird standardmässig in UTF-8 gesendet. Möchte man es in einem anderen Encoding haben, kann dies in exporter.encoding angegeben werden (z.B. exporter.encoding='Windows-1252').

Variante 3: Zeilen manuell anlegen, Felder ganz oder teilweise via Python setzen

Die Felder, welche OCL beinhalten, werden nach wie vor automatisch berechnet, können aber über die Angabe des Feldnamens auch überschrieben werden.

from VertecCSVExporterClasses import VertecCsvExporter

fields = [
    ('Project', None, 'string', 'code'),
    ('ProjectId', None, 'int', 'objid'),
    ('Currency', None, 'string', 'waehrung.asstring'),
    ('Betreffend', None, 'string', 'betreffend'),
    ('KomplizierteBerechnung', 0.0, 'float', ''),
]

exporter = VertecCsvExporter(fields)
for projekt in projekte:
    if projekt.typ = irgendeine_bedingung:
        row = exporter.add_row(projekt)
        row.KomplizierteBerechnung =  berechneter_wert
csv = exporter.export_rows()
Bitte wählen Sie Ihren Standort