enaio-Tabellen via Talend befüllen und auslesen

Hallo zusammen,

da ich dies auch immer wieder nachschlage, sind hier ein paar Beispiele, wie über Talend Tabellenfelder in enaio befüllt und wieder ausgelesen werden können:

Die Befüllung kann einerseits über die Komponente enaioImportTableField befüllt werden, oder andererseits über eine tJavaRow Komponente. Hier konzentriere ich mich auf die Lösung via tJavaRow, ich reiche aber auch gerne die alternative Lösung über die Komponente enaioImportTableField später noch nach.

Tabelle Schreiben

Hier ist ein Beispiel, wie das Befüllen mithilfe der tJavaRow-Komponente funktioniert:

In diesem Fall handelt es sich um eine einfache Tabelle, bestehend aus den beiden Spalten Key und Value. Die Tabelle hat vor dem tJavaRow noch nicht existiert und wird daher im Output-Teil des Schemas neu hinzugefügt. Wichtig ist, dass die Tabelle den Typ List erhält. Im Beispiel unten hiesse diese Spalte Metadata.

Während das tJavaRow höchstwahrscheinlich weitere Felder durchreicht im Stile von
output_row.mein_feld = input_row.mein_feld;
Kann unterhalb der Berechnungen aller bestehender Felder folgender Code eingefügt werden, der eine ArrayList erzeugt, deren Inhalte HashMaps sind. Jede Hashmap beinhaltet alle Spalten der Tabelle (in unserem Fall Key und Value)
Am Ende wird die erzeugte ArrayList in die zuvor erzeugte output_row.Metadata geschrieben.

ArrayList l = new ArrayList();

HashMap hm1 = new HashMap();
hm1.put("Key", "Exportzeitstempel");
hm1.put("Value", TalendDate.formatDateInUTC("yyyy-MM-dd'T'HH:mm:ss.SSSZ",input_row.Zeitstempel));
l.add(hm1);

HashMap hm2 = new HashMap();
hm2.put("Key", "Importzeitstempel");
hm2.put("Value", TalendDate.formatDateInUTC("yyyy-MM-dd'T'HH:mm:ss.SSSZ", new java.util.Date()));
l.add(hm2);

if (input_row.Comment != null) {
	HashMap hm3 = new HashMap();
	hm3.put("Key", "Bemerkung");
	hm3.put("Value", input_row.Comment);
	l.add(hm3);
}

output_row.Metadata = l;

Tabelle Auslesen

Die Tabelle wird zunächst, genau gleich wie jedes andere Feld über eine enaioSearch-Komponente in den Talend-Flow geholt. Hierbei ist wieder wichtig, dass das Feld im Schema der Search-Komponente als List definiert wird.

Wieder wird im Anschluss eine tJavaRow-Komponente verwendet, durch die, genau wie oben die Werte, die nicht von der Tabelle betroffen sind durchgereicht werden (output_row… = input_row…).
Angenommen wir würden den Exportzeitstempel, den wir oben in die Tabelle geschrieben haben, wieder aus der Tabelle herausziehen wollen und in eine Variable zeitstempel_alt speichern um sie für andere Zwecke nutzen zu können, so ginge das so:

Date zeitstempel_alt = null;

if (input_row.metadata != null){
    for(Map<String, Object> row: (List<Map<String, Object>>) input_row.metadata){
        if(row.get("Key").equals("Exportzeitstempel")){
            zeitstempel_alt = TalendDate.parseDateInUTC("yyyy-MM-dd'T'HH:mm:ss.SSSZ", (String)row.get("Value"));
        }
    }
}

Im Beispiel oben wird sogar geprüft, ob die ausgelesene Metadata-Tabelle überhaupt Inhalte hat, um NullPointers auszuschliessen.

Ich hoffe das Beispiel hilft euch genauso wie mir um eure Tabellen auslesen und befüllen zu können.

3 Likes

Wie oben erwähnt, gibt es noch einen anderen Weg, wie Tabellen in enaio befüllt werden können.

Die Komponente enaioImportTableField erleichtert den Zusammenbau einer Tabelle.

Hier die Komponente, wie sie vor einem Import im Flow eingefügt ist:
image

In der Komponente wird im Schema ein neues Feld hinzugefügt, in das die neue erzeugte Tabelle dann gespeichert werden kann:
image

Eingehende Felder eines Flows können zu Spalten der Tabelle werden, denen dann der Interne Name der Spalten, wie sie im enaio Editor definiert wurden, zugewiesen werden.

Auf der Import-Komponente kann dann zusätzlich gesteuert werden, ob die neuen Einträge in die bestehende Tabelle angefügt werden sollen, oder ob die komplette Tabelle ersetzt wird.
Ist der Haken in den Advanced Settings bei REPLACETABLEFIELDSgesetzt, so werden eventuelle bestehende Einträge in der Tabelle durch die neuen Einträge ersetzt.
image