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()