Modul: Vertec CSV Exporter

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

Standard

|

Expert

CLOUD ABO

|

ON-PREMISES

Leistung & CRM

Budget & Teilprojekt

Fremdkosten

Ressourcenplanung

Business Intelligence

Erzeugt: 01.12.2020
Aktualisiert: 21.01.2022 | Schreibfehler im Script korrigiert.

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 Standard: ''
Pfad zum Speichern des Files auf dem Filesystem.
Wird kein File-Name angegeben, wird der CSV-Text nicht gespeichert, nur im Memory zurückgegeben.
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 listexpres-sion 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 es auf dem File-system abspeichert oder im Memory zurückgibt (falls kein file_name angegeben wird).

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 ge-schrieben 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 (sie-he 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 spe-zielle 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

Es gibt verschieden Möglichkeiten, das zu nutzen:

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 File speichern

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

exporter.file_name = r'c:\temp\export.csv'

Das exporter.export_rows() speichert dann ein Textfile, standardmässig in UTF-8.

Via exporter.encoding kann irgendein 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