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.