<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Talend Forum - Alle Foren]]></title>
		<link>http://www.talendforum.de/</link>
		<description><![CDATA[Talend Forum - http://www.talendforum.de]]></description>
		<pubDate>Sun, 05 Sep 2010 09:39:28 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[tfileOutputDelimeted - ohne ""-Zeichen??!]]></title>
			<link>http://www.talendforum.de/thread-43.html</link>
			<pubDate>Fri, 03 Sep 2010 13:56:38 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-43.html</guid>
			<description><![CDATA[Hallo zusammen,<br />
ich bin ein absoluter Neuling, betreffend TOS. Doch nach vielen Recherchen bin ich zur Entscheidung gekommen, dass nur TOS mich bei zukünftigen Anforderungen weiter bringen wird. Es ist ein gewaltiges Tool - und ich stecke schon bei einfachsten Bedingungen fest.<br />
<br />
Aufgabe:<br />
Zusammenführung 2er tfileDelimited-Dateien im csv.Format.<br />
<br />
Die Quelldaten sind getrennt durch ";" und "\n" als Zeleninterpreter.<br />
Der Text wird OHNE ""-Zeichen geliefert.<br />
<br />
Und hier mein Problem: <br />
TOS führt mir die Daten wunderbar zusammen - aber jeglicher Text wird in "" (Anführungszeichen) gesetzt!!!!!<br />
<br />
Das soll und darf so nicht sein. Ich habe keine Einstellungsmöglichkeit gefunden, die dies verhindert. Ich könnte zwar manuell mit "Suchen/Ersetzen" an der ausgelieferten Datei arbeiten - aber dann bräuchte ich ja TOS im Grunde auch nicht, gell ??<br />
<br />
Wäre schön, wenn Ihr mir helfen könntet!!<br />
<br />
Gruß, Brainy]]></description>
			<content:encoded><![CDATA[Hallo zusammen,<br />
ich bin ein absoluter Neuling, betreffend TOS. Doch nach vielen Recherchen bin ich zur Entscheidung gekommen, dass nur TOS mich bei zukünftigen Anforderungen weiter bringen wird. Es ist ein gewaltiges Tool - und ich stecke schon bei einfachsten Bedingungen fest.<br />
<br />
Aufgabe:<br />
Zusammenführung 2er tfileDelimited-Dateien im csv.Format.<br />
<br />
Die Quelldaten sind getrennt durch ";" und "\n" als Zeleninterpreter.<br />
Der Text wird OHNE ""-Zeichen geliefert.<br />
<br />
Und hier mein Problem: <br />
TOS führt mir die Daten wunderbar zusammen - aber jeglicher Text wird in "" (Anführungszeichen) gesetzt!!!!!<br />
<br />
Das soll und darf so nicht sein. Ich habe keine Einstellungsmöglichkeit gefunden, die dies verhindert. Ich könnte zwar manuell mit "Suchen/Ersetzen" an der ausgelieferten Datei arbeiten - aber dann bräuchte ich ja TOS im Grunde auch nicht, gell ??<br />
<br />
Wäre schön, wenn Ihr mir helfen könntet!!<br />
<br />
Gruß, Brainy]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Business Development Representatives (m/w)]]></title>
			<link>http://www.talendforum.de/thread-42.html</link>
			<pubDate>Mon, 30 Aug 2010 17:10:35 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-42.html</guid>
			<description><![CDATA[Talend ist der führende Softwarehersteller von OpenSource Datenintegrationslösungen. Unsere Produkte finden immer dann Einsatz, wenn Daten aus unterschiedlichen Quellen in andere Systeme überführt werden oder die Datenqualität sich verbessern soll. Neben dem grundlegenden Open Source Gedanken, verfolgen wir aber auch den kommerziellen Aspekt eines klassischen Softwareherstellers. Durch gezielte Produkterweiterungen im Bereich Master Data Management bauen wir unseren Markanteil kontinuierlich aus. Unsere Strategie und die damit verbundene Produktphilosophie bieten uns einen nahezu unerschöpflichen weltweiten Absatzmarkt. Aktuelle Analystenstudien und unsere derzeit 250 Mitarbeiter bestätigen unseren Kurs und Erfolg.<br />
<br />
Im Rahmen unserer bisherigen und zukünftigen Expansion suchen wir ab sofort Business Development Representatives (m/w) für unsere deutsche Niederlassung.<br />
<br />
Sie sind für die telefonische Beratung von Kunden und Interessenten verantwortlich. Grundlage der Gespräche sind dabei hauptsächlich eingehende Anfragen. Ihre Aufgabe ist es mit den Interessenten Termine für Präsentationen der Produkte zu vereinbaren und diese Kontakte an unser Vertriebsteam zu übergeben. <br />
<br />
Was wir uns wünschen:<br />
- Sie haben eine kaufmännische Ausbildung und können mit Begriffen wie Datenbanken, OpenSource und Linux etwas anfangen.<br />
- Gerne auch Berufseinsteiger. <br />
- Sie können gut argumentieren und überzeugen. <br />
- Sie haben sehr gute Deutsch- und gute Englischkenntnisse.<br />
- Ein sicheres und sympathisches Auftreten mit hoher Service- und Kundenorientierung<br />
<br />
Haben wir Ihr Interesse geweckt? Falls Ja, dann freuen wir uns über Ihre aussagekräftige Bewerbung (gerne per E-Mail). Vergessen Sie bitte nicht Ihre Gehaltsvorstellungen und den nächstmöglichen Eintrittstermin.<br />
<br />
Talend GmbH <br />
Herr Marcus Deutschmann <br />
Südwestpark 44 <br />
90449 Nürnberg<br />
Telefonnummer: +49 (9 11) 41 08 02 14<br />
E-Mail: mdeutschmann@talend.com]]></description>
			<content:encoded><![CDATA[Talend ist der führende Softwarehersteller von OpenSource Datenintegrationslösungen. Unsere Produkte finden immer dann Einsatz, wenn Daten aus unterschiedlichen Quellen in andere Systeme überführt werden oder die Datenqualität sich verbessern soll. Neben dem grundlegenden Open Source Gedanken, verfolgen wir aber auch den kommerziellen Aspekt eines klassischen Softwareherstellers. Durch gezielte Produkterweiterungen im Bereich Master Data Management bauen wir unseren Markanteil kontinuierlich aus. Unsere Strategie und die damit verbundene Produktphilosophie bieten uns einen nahezu unerschöpflichen weltweiten Absatzmarkt. Aktuelle Analystenstudien und unsere derzeit 250 Mitarbeiter bestätigen unseren Kurs und Erfolg.<br />
<br />
Im Rahmen unserer bisherigen und zukünftigen Expansion suchen wir ab sofort Business Development Representatives (m/w) für unsere deutsche Niederlassung.<br />
<br />
Sie sind für die telefonische Beratung von Kunden und Interessenten verantwortlich. Grundlage der Gespräche sind dabei hauptsächlich eingehende Anfragen. Ihre Aufgabe ist es mit den Interessenten Termine für Präsentationen der Produkte zu vereinbaren und diese Kontakte an unser Vertriebsteam zu übergeben. <br />
<br />
Was wir uns wünschen:<br />
- Sie haben eine kaufmännische Ausbildung und können mit Begriffen wie Datenbanken, OpenSource und Linux etwas anfangen.<br />
- Gerne auch Berufseinsteiger. <br />
- Sie können gut argumentieren und überzeugen. <br />
- Sie haben sehr gute Deutsch- und gute Englischkenntnisse.<br />
- Ein sicheres und sympathisches Auftreten mit hoher Service- und Kundenorientierung<br />
<br />
Haben wir Ihr Interesse geweckt? Falls Ja, dann freuen wir uns über Ihre aussagekräftige Bewerbung (gerne per E-Mail). Vergessen Sie bitte nicht Ihre Gehaltsvorstellungen und den nächstmöglichen Eintrittstermin.<br />
<br />
Talend GmbH <br />
Herr Marcus Deutschmann <br />
Südwestpark 44 <br />
90449 Nürnberg<br />
Telefonnummer: +49 (9 11) 41 08 02 14<br />
E-Mail: mdeutschmann@talend.com]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ETL-Job: Datenbanken mit verschiedenen Schemas]]></title>
			<link>http://www.talendforum.de/thread-41.html</link>
			<pubDate>Tue, 24 Aug 2010 17:12:11 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-41.html</guid>
			<description><![CDATA[Möchte mit 2 Datenbanken - verschiedene DB-Typen (FB und MySQL) und verschiedene Schemas - Datentransfer zwischen ausgewählten Tabellen-Spalten ausführen. Mit tMap funktioniert das bei mir nicht. Ist Talend OpenStudio oder TMDMCE (aktuelle Version) überhaupt dazu geeignet? Wenn ja, wie geht es dann?]]></description>
			<content:encoded><![CDATA[Möchte mit 2 Datenbanken - verschiedene DB-Typen (FB und MySQL) und verschiedene Schemas - Datentransfer zwischen ausgewählten Tabellen-Spalten ausführen. Mit tMap funktioniert das bei mir nicht. Ist Talend OpenStudio oder TMDMCE (aktuelle Version) überhaupt dazu geeignet? Wenn ja, wie geht es dann?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[MDM wozu eigentlich?]]></title>
			<link>http://www.talendforum.de/thread-40.html</link>
			<pubDate>Mon, 16 Aug 2010 07:32:54 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-40.html</guid>
			<description><![CDATA[Hallo,<br />
<br />
ich denke der Titel sagt alles. Intessant ist im Prinziep nur, ob wir die Talend MDM-Lösungen wirklich auch bei unseren Kunden verwenden können.<br />
Über Input wäre ich dankbar.<br />
<br />
danke<br />
mv]]></description>
			<content:encoded><![CDATA[Hallo,<br />
<br />
ich denke der Titel sagt alles. Intessant ist im Prinziep nur, ob wir die Talend MDM-Lösungen wirklich auch bei unseren Kunden verwenden können.<br />
Über Input wäre ich dankbar.<br />
<br />
danke<br />
mv]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Gartner Studie / DQ]]></title>
			<link>http://www.talendforum.de/thread-39.html</link>
			<pubDate>Mon, 16 Aug 2010 07:30:48 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-39.html</guid>
			<description><![CDATA[Hallo,<br />
<br />
hat sich schon mal jemand mit den DQ-Lösungen von Talend beschäftigt?<br />
Nach der Durchsicht der aktuellen Gartner Studie, wird Talend dort nur namentlich erwähnt und das sieht bekanntlich nicht so spannend aus.<br />
<br />
mv]]></description>
			<content:encoded><![CDATA[Hallo,<br />
<br />
hat sich schon mal jemand mit den DQ-Lösungen von Talend beschäftigt?<br />
Nach der Durchsicht der aktuellen Gartner Studie, wird Talend dort nur namentlich erwähnt und das sieht bekanntlich nicht so spannend aus.<br />
<br />
mv]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Talend / GPL v2]]></title>
			<link>http://www.talendforum.de/thread-38.html</link>
			<pubDate>Mon, 16 Aug 2010 07:26:59 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-38.html</guid>
			<description><![CDATA[Hallo,<br />
<br />
kann mir jemand kurz die Lizenzform von Talend erklären?<br />
Das Studio läuft doch unter GPL v2 und unter welcher Lizenz werden<br />
jetzt die Prozesse exportiert?<br />
Hintergrund, wir wollen die exportierten Jobs in unsere Lösung einbauen und<br />
natürlich keinen Lizenzbruch begehen.<br />
<br />
danke<br />
mv]]></description>
			<content:encoded><![CDATA[Hallo,<br />
<br />
kann mir jemand kurz die Lizenzform von Talend erklären?<br />
Das Studio läuft doch unter GPL v2 und unter welcher Lizenz werden<br />
jetzt die Prozesse exportiert?<br />
Hintergrund, wir wollen die exportierten Jobs in unsere Lösung einbauen und<br />
natürlich keinen Lizenzbruch begehen.<br />
<br />
danke<br />
mv]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Talend - Funktionale Erweiterungen]]></title>
			<link>http://www.talendforum.de/thread-37.html</link>
			<pubDate>Sun, 01 Aug 2010 09:55:35 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-37.html</guid>
			<description><![CDATA[<span style="font-weight: bold;">Talend – funktionale Erweiterungen</span><br />
<br />
Früher oder später ist man an dem Punkt, an dem sich Transformationen durchaus komplexer gestalten können als ein 1:1 Mapping von Quelle und Source. Auch eine leistungsfähige Komponente wie der tMap zeigt hier schnell seine Schwächen. Stellt man sich folgende Logik einmal vor:<br />
1. Wenn der Kundenort in Nürnberg ist und<br />
2. der Umsatz größer 1000 ist, dann soll<br />
3. der Kunde mit einem „A“ klassifiziert werden.<br />
4. Alle andern Datensätze erhalten als Merkmal ein „B“<br />
<br />
Grundsätzlich lässt sich solch eine Funktion im tMap mit den Boardmitteln wie folgt abbilden:<br />
[attachment=127&#93;<br />
  <br />
Die Logik in der Expression hätte somit folgenden Aufbau:<br />
[attachment=128&#93;<br />
 <br />
Nach der Ausführung, wie gewohnt über tLogRow, erhält man folgende Ausgabe:<br />
[attachment=129&#93;<br />
 <br />
Das Ergebnis konnte jetzt nur einen einzigen Datensatz mit „A“ klassifizieren, obwohl die Kundennummer 8 auch hier mit reinfallen dürfte? Auf Basis der Anforderung würde man nun die Funktion um eine Umlautkonvertierung und einen Vergleich mit Kleinbuchstaben erweitern:<br />
[attachment=130&#93;<br />
 <br />
Das Ergebnis wäre zwar OK aber die Nachteile an einer solchen Umsetzung liegen allerdings auf der Hand:<br />
1. Der Ausdruck ist sehr komplex zu lesen und zu verstehen<br />
2. Durch die starke Schachtelung ist die Logik fehleranfällig<br />
3. Sollte dieser Ausdruck auch noch an einer anderen Stelle benötigt werden, so ist man wieder bei 1. und 2.<br />
4. Erweiterungen z.B. „wenn jemand in München wohnt und der Umsatz kleiner 1000 ist, dann soll der Datensatz mit einem B klassifiziert werden“ sind umständlich implementierbar und die Punkte 1 bis 3 verstärken dieses Konstrukt wiederrum.<br />
<br />
Glücklicherweise ist Talend eine offene Lösung die auf Java aufsetzt und Funktionen wie oben beschrieben lassen sich mit wenig Aufwand relativ einfach einbauen. Solche „Routinen“ lassen sich zentral ablegen, sind somit auch zentral modifizierbar und können an unterschiedlichsten Stellen direkt wiederverwendet werden. An dieser Stelle möchte ich auch einen Gruß an die „Anderen ETL-Tools“ aussprechen.<br />
<br />
<br />
<span style="font-weight: bold;">Routinen/Funktionen</span><br />
<br />
Eigene Routinen lassen sich unter der Kategorie „Code“ direkt in TOS abbilden. Mittels Rechts-Klick auf den Eintrag „Code-Routines“ kann im Context-Menu nach der Auswahl „Create-Routine“ direkt eine neue Routine implementiert werden.<br />
[attachment=131&#93;<br />
 <br />
Bei einer Routine handelt es sich um eine Art Pool in dem unterschiedlichste Funktionen direkt abgebildet werden können. Aus Java Sicht wird hiermit eine neue Klasse erstellt welche nur statische Methoden beinhalten. Übersetzt kann man sagen dass hier keine Objekt-Instanzen erstellt und wiederverwendet werden, sondern die Methoden wirklich nur für einen funktionalen Aufruf (Etwas kommt rein, etwas geht raus) benutzt werden können. Allerdings erleichtert ein solche vorgehen auch unheimlich die Übersichtlichkeit.<br />
[attachment=132&#93;<br />
<br />
<br />
<span style="font-weight: bold;">Funktionsaufbau / Deklaration</span><br />
<br />
Nachdem die Routine erstellt und mit einem Namen versehen wurde, kann mit der Erstellung begonnen werden. Wie oben bereits erwähnt, handelt es sich bei diesen Routinen um keine „richtigen“ Objekte, sondern nur um Funktionen welche Parameter entgegennehmen und anschließend einen Wert/Objekt zurückliefern müssen. Dieses hat die Einschränkung, dass in der Funktion keine Manipulation an den übergegeben Werten vorgenommen werden können. Also die Prinzipien von C/C++/SCALA greifen hier nicht!<br />
[attachment=133&#93;<br />
 <br />
Eine Funktion wird immer nach folgendem Schema aufgebaut:<br />
[attachment=134&#93; <br />
<br />
Der Bezeichner „public“ leitet die Funktion ein und definiert hiermit eine generelle Verfügbarkeit auch außerhalb des Funktionspools. Dieses ist natürlich immer gewünscht, schließlich soll die Funktion im tMap auch ansprechbar sein.<br />
<br />
Das Attribut „static“ dient hierbei als Merkmal für eine Verwendung der Funktion ohne vorhergende Objekt Initiierung. Einfach ausgedrückt, man kann sie ohne irgendwelche Vorarbeiten direkt aufrufen.<br />
<br />
Da eine Funktion im Regelfall irgendwas zurückliefern soll, muss natürlich auch sichergestellt werden um welchen Typ es sich hierbei handelt. Talend unterstützt hierbei nur bestimmte Typen und nicht den kompletten Java-Umfang. Verdeutlicht wird das auch durch die Bereitstellung der Datentypen innerhalb einer Schemadefinition.<br />
<br />
<br />
<br />
<table>
<tr>
<td><span style="font-weight: bold;">Unterstützter Java Type durch Talend</span></td><td><span style="font-weight: bold;">Beschreibung</span></td><td><span style="font-weight: bold;">Verwendungs-häufigkeit</span></td>
</tr>
<tr>
<td>String</td><td>Speichert so ziemlich sämtliche Zeichen. Egal ob numerich, text oder sonderzeichen. Durch eine Codepage unabhängige Implementierung können String-Objekte auch klingonische Zeichen aufnehmen. ;-)</td><td>Oft</td>
</tr>
<tr>
<td>char / Character</td><td>Variablen dieses Types beinhalten immer nur ein einziges Zeichen. Der Unterschied zwischen char und Character besteht in der Implementierung. Während das Objekt Chracter auch NULL-Werte (also Nichts) enthalten kann, müssen Variablen vom Type char immer einen Wert beinhalten. Diese NULL-Regel gilt auch für die anderen aufgeführten Variablen-Paare.</td><td>Nie</td>
</tr>
<tr>
<td>long / Long</td><td>Speichert ganze Zahlen im Bereich −9.223.372.036.854.775.808 bis +9.223.372.036.854.775.807</td><td>Selten</td>
</tr>
<tr>
<td>int / Integer</td><td>Speichert ganze Zahlen im Bereich −2.147.483.648 bis +2.147.483.647</td><td>Oft</td>
</tr>
<tr>
<td>boolean / Boolean</td><td>Eine logische Variable die entweder true (wahr) oder false (falsch) beinhaltet. Dieser Type wird häufig als Rückgabe für Filterbedingungen verwendet.</td><td>Oft</td>
</tr>
<tr>
<td>dyte / Byte</td><td>Speichert ganze Zahlen im Wertbereich von −128 bis +127.</td><td>Nie</td>
</tr>
<tr>
<td>Date</td><td>Speichert die Zeit- und Datumswerte.</td><td>Oft</td>
</tr>
<tr>
<td>double / Double</td><td>Speichert Gleitkommazahlen im Bereich ±4,9E−324 bis ±1,7E+308</td><td>Oft</td>
</tr>
<tr>
<td>float / Float</td><td>Speicher Gleitkommazahlen im Bereich ±1,4E−45 bis ±3,4E+38</td><td>Selten</td>
</tr>
<tr>
<td>Object</td><td>Bei Java handelt es sich letztendlich um eine objektorientierte Programmiersprache und der Type Object ist „quasi“ der Vater aller Objekte (z.B. Long oder Character), daher kann dieser Type so ziemlich Alles beinhalten.</td><td>Nie</td>
</tr>
<tr>
<td>short / Short</td><td>Speichert ganze Zahlen im Bereich −32.768 bis +32.767</td><td>Nie</td>
</tr>
</table>
<br />
Die Verwendungshäufigkeit soll symbolisieren wie oft ich bereits die einzelnen Datentypen verwendet habe.<br />
Es macht somit keinen Sinn eine List aus der Funktion zurückzuliefern, wenn es sich bei der Datenbankspalte um einen „Varchar2“ handelt und der JDBC-Treiber diesen Typ nicht unterstützt. Ferner werden Funktionen mit nicht unterstützten Java-Typen auch nicht in der Funktionsliste (Expressionbuilder) angezeigt.<br />
<br />
Der „functionName“ sollte so gewählt sein, dass auf den ersten Blick direkt erkennbar ist was die Funktion letztendlich durchführt. Eine Bezeichnung wie test1 oder test2 macht also keinen Sinn.<br />
Die Klammern (…) aufgeführten Parameter bilden die Basis für eine Werteübergabe an die jeweilige Funktion. Hierbei muss beachten werden, dass der &lt;JavaType&gt; auch dem Datentype entspricht der beim Mapping übergeben wird. Eine Funktion welche numerische Werte erwartet kann mit String und/oder Datumswerten nicht besonders viel anfangen und würde somit zu einem Abbruch bei der Prozessgenerierung führen!<br />
Das Ende einer Funktion wird mit einem „return“ eingeleitet und umfasst den bei der Funktions-deklaration definierten Wert (&lt;TalendType&gt;). Dieser Wert wird natürlich innerhalb der Funktion als Variable deklariert und mit dem programmtechnisch erzeugten Wert bestückt.<br />
<br />
<br />
<span style="font-weight: bold;">Beschreibende Deklarationen</span><br />
<br />
Um Routinen auch gezielt z.B. im tMap ansprechen zu können, empfiehlt sich eigentlich eine beschreibende Deklaration direkt bei der Funktion mit aufzunehmen. Diese Beschreibungen verfolgen ein ähnliches Prinzip wie die Javadoc, sind aber um Talend spezifische Tags erweitert worden.<br />
Den Anfang sollten immer der Funktionsname und ein kurzer Kommentar („Funktionsname“ : „Kommentar“) machen. Gefolgt von dem Talendtype welcher aus der Funktion zurückgeliefert wird ( {talendTypes} &lt;TalendType&gt;). Die nächste Zeile bildet dann die Kategorie für die Funktion ( {Category} „Kategorie“ ). In den Kategorien werden u.A. die Funktionen innerhalb des tMap’s angezeigt. Um die Parameter-übergabe genauer zu spezifizieren werden sämtliche Übergabetypen ( {param} &lt;talendTypes&gt;(&lt;Beispiel Text&gt;) : &lt;Kommentar&gt; ) anschließend zeilenweise aufgeführt. Abschließend kann bei Bedarf noch ein Beispiel für den Aufruf mit angegeben werden ({example} „Funktionsname“(&lt;Beispiel Text&gt;) # &lt;Rückgabewert&gt;).<br />
<br />
<br />
<span style="font-weight: bold;">Umsetzung Beispiel</span><br />
<br />
Unser obiges Beispiel würde sich wie folgt darstellen.<br />
[attachment=135&#93;<br />
<br />
 <br />
Erkennbar ist hierbei die eindeutige Abfolge der oben beschriebenen Anforderung:<br />
1.	Überprüfung ob der Eingabeparameter überhaupt gefüllt ist?<br />
if(Ort == null) return "B";<br />
2.	Umwandlung der übergebenen „Stadt“ in Kleinbuchstaben<br />
Ort = Ort.toLowerCase();<br />
<br />
3.	Austausch des Buchstabens „ü“ durch „ue“<br />
Ort = Ort.replaceAll("ü", "ue");<br />
<br />
4.	Überprüfung ob die Stadt nicht den Wert „nuernberg“ entspricht.<br />
if(Ort.equals("nuernberg") == false) return "B";<br />
<br />
5.	Überprüfung ob der Umsatz größer als 1000 ist, falls „Ja“ erfolgt die Rückgabe von „A“.<br />
if(Umsatz &gt; 1000) return "A";<br />
<br />
6.	Rückgabe Default-Wert „B“<br />
return "B";<br />
<br />
Nach dem Speichern steht die Funktion dann direkt im Expression-Builder zu Verfügung und der Aufruf gestaltet sich an dieser Stelle relativ einfach. Statt einer langen Funktionskette kann nun die Funktion direkt in die Transformation eingebunden und mit den Werten des Input-Stroms aufgerufen werden. <br />
[attachment=136&#93;<br />
<br />
 <br />
Die Rückgabe sollte dann 1:1 folgendes Ergebnis liefern.<br />
[attachment=137&#93;<br />
 <br />
<br />
<span style="font-weight: bold;">Fazit</span><br />
<br />
Auch wenn es im ersten Moment etwas ungewöhnlich und aufwendig erscheint, so bietet die Verwendung von Funktionen ein breites Spektrum von diversen Einsatzszenarien. Allein die Tatsache mit der n-fachen Wiederverwendung und die Möglichkeit von zentralen Änderungen rechtfertigen eine Umsetzung direkt als Java-Funktion. Selbstverständlich ist es ohne größeren Aufwand möglich auch bereits existierende Java-Bibliotheken direkt mit einzubinden und zu nutzen.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;">Talend – funktionale Erweiterungen</span><br />
<br />
Früher oder später ist man an dem Punkt, an dem sich Transformationen durchaus komplexer gestalten können als ein 1:1 Mapping von Quelle und Source. Auch eine leistungsfähige Komponente wie der tMap zeigt hier schnell seine Schwächen. Stellt man sich folgende Logik einmal vor:<br />
1. Wenn der Kundenort in Nürnberg ist und<br />
2. der Umsatz größer 1000 ist, dann soll<br />
3. der Kunde mit einem „A“ klassifiziert werden.<br />
4. Alle andern Datensätze erhalten als Merkmal ein „B“<br />
<br />
Grundsätzlich lässt sich solch eine Funktion im tMap mit den Boardmitteln wie folgt abbilden:<br />
[attachment=127]<br />
  <br />
Die Logik in der Expression hätte somit folgenden Aufbau:<br />
[attachment=128]<br />
 <br />
Nach der Ausführung, wie gewohnt über tLogRow, erhält man folgende Ausgabe:<br />
[attachment=129]<br />
 <br />
Das Ergebnis konnte jetzt nur einen einzigen Datensatz mit „A“ klassifizieren, obwohl die Kundennummer 8 auch hier mit reinfallen dürfte? Auf Basis der Anforderung würde man nun die Funktion um eine Umlautkonvertierung und einen Vergleich mit Kleinbuchstaben erweitern:<br />
[attachment=130]<br />
 <br />
Das Ergebnis wäre zwar OK aber die Nachteile an einer solchen Umsetzung liegen allerdings auf der Hand:<br />
1. Der Ausdruck ist sehr komplex zu lesen und zu verstehen<br />
2. Durch die starke Schachtelung ist die Logik fehleranfällig<br />
3. Sollte dieser Ausdruck auch noch an einer anderen Stelle benötigt werden, so ist man wieder bei 1. und 2.<br />
4. Erweiterungen z.B. „wenn jemand in München wohnt und der Umsatz kleiner 1000 ist, dann soll der Datensatz mit einem B klassifiziert werden“ sind umständlich implementierbar und die Punkte 1 bis 3 verstärken dieses Konstrukt wiederrum.<br />
<br />
Glücklicherweise ist Talend eine offene Lösung die auf Java aufsetzt und Funktionen wie oben beschrieben lassen sich mit wenig Aufwand relativ einfach einbauen. Solche „Routinen“ lassen sich zentral ablegen, sind somit auch zentral modifizierbar und können an unterschiedlichsten Stellen direkt wiederverwendet werden. An dieser Stelle möchte ich auch einen Gruß an die „Anderen ETL-Tools“ aussprechen.<br />
<br />
<br />
<span style="font-weight: bold;">Routinen/Funktionen</span><br />
<br />
Eigene Routinen lassen sich unter der Kategorie „Code“ direkt in TOS abbilden. Mittels Rechts-Klick auf den Eintrag „Code-Routines“ kann im Context-Menu nach der Auswahl „Create-Routine“ direkt eine neue Routine implementiert werden.<br />
[attachment=131]<br />
 <br />
Bei einer Routine handelt es sich um eine Art Pool in dem unterschiedlichste Funktionen direkt abgebildet werden können. Aus Java Sicht wird hiermit eine neue Klasse erstellt welche nur statische Methoden beinhalten. Übersetzt kann man sagen dass hier keine Objekt-Instanzen erstellt und wiederverwendet werden, sondern die Methoden wirklich nur für einen funktionalen Aufruf (Etwas kommt rein, etwas geht raus) benutzt werden können. Allerdings erleichtert ein solche vorgehen auch unheimlich die Übersichtlichkeit.<br />
[attachment=132]<br />
<br />
<br />
<span style="font-weight: bold;">Funktionsaufbau / Deklaration</span><br />
<br />
Nachdem die Routine erstellt und mit einem Namen versehen wurde, kann mit der Erstellung begonnen werden. Wie oben bereits erwähnt, handelt es sich bei diesen Routinen um keine „richtigen“ Objekte, sondern nur um Funktionen welche Parameter entgegennehmen und anschließend einen Wert/Objekt zurückliefern müssen. Dieses hat die Einschränkung, dass in der Funktion keine Manipulation an den übergegeben Werten vorgenommen werden können. Also die Prinzipien von C/C++/SCALA greifen hier nicht!<br />
[attachment=133]<br />
 <br />
Eine Funktion wird immer nach folgendem Schema aufgebaut:<br />
[attachment=134] <br />
<br />
Der Bezeichner „public“ leitet die Funktion ein und definiert hiermit eine generelle Verfügbarkeit auch außerhalb des Funktionspools. Dieses ist natürlich immer gewünscht, schließlich soll die Funktion im tMap auch ansprechbar sein.<br />
<br />
Das Attribut „static“ dient hierbei als Merkmal für eine Verwendung der Funktion ohne vorhergende Objekt Initiierung. Einfach ausgedrückt, man kann sie ohne irgendwelche Vorarbeiten direkt aufrufen.<br />
<br />
Da eine Funktion im Regelfall irgendwas zurückliefern soll, muss natürlich auch sichergestellt werden um welchen Typ es sich hierbei handelt. Talend unterstützt hierbei nur bestimmte Typen und nicht den kompletten Java-Umfang. Verdeutlicht wird das auch durch die Bereitstellung der Datentypen innerhalb einer Schemadefinition.<br />
<br />
<br />
<br />
<table>
<tr>
<td><span style="font-weight: bold;">Unterstützter Java Type durch Talend</span></td><td><span style="font-weight: bold;">Beschreibung</span></td><td><span style="font-weight: bold;">Verwendungs-häufigkeit</span></td>
</tr>
<tr>
<td>String</td><td>Speichert so ziemlich sämtliche Zeichen. Egal ob numerich, text oder sonderzeichen. Durch eine Codepage unabhängige Implementierung können String-Objekte auch klingonische Zeichen aufnehmen. ;-)</td><td>Oft</td>
</tr>
<tr>
<td>char / Character</td><td>Variablen dieses Types beinhalten immer nur ein einziges Zeichen. Der Unterschied zwischen char und Character besteht in der Implementierung. Während das Objekt Chracter auch NULL-Werte (also Nichts) enthalten kann, müssen Variablen vom Type char immer einen Wert beinhalten. Diese NULL-Regel gilt auch für die anderen aufgeführten Variablen-Paare.</td><td>Nie</td>
</tr>
<tr>
<td>long / Long</td><td>Speichert ganze Zahlen im Bereich −9.223.372.036.854.775.808 bis +9.223.372.036.854.775.807</td><td>Selten</td>
</tr>
<tr>
<td>int / Integer</td><td>Speichert ganze Zahlen im Bereich −2.147.483.648 bis +2.147.483.647</td><td>Oft</td>
</tr>
<tr>
<td>boolean / Boolean</td><td>Eine logische Variable die entweder true (wahr) oder false (falsch) beinhaltet. Dieser Type wird häufig als Rückgabe für Filterbedingungen verwendet.</td><td>Oft</td>
</tr>
<tr>
<td>dyte / Byte</td><td>Speichert ganze Zahlen im Wertbereich von −128 bis +127.</td><td>Nie</td>
</tr>
<tr>
<td>Date</td><td>Speichert die Zeit- und Datumswerte.</td><td>Oft</td>
</tr>
<tr>
<td>double / Double</td><td>Speichert Gleitkommazahlen im Bereich ±4,9E−324 bis ±1,7E+308</td><td>Oft</td>
</tr>
<tr>
<td>float / Float</td><td>Speicher Gleitkommazahlen im Bereich ±1,4E−45 bis ±3,4E+38</td><td>Selten</td>
</tr>
<tr>
<td>Object</td><td>Bei Java handelt es sich letztendlich um eine objektorientierte Programmiersprache und der Type Object ist „quasi“ der Vater aller Objekte (z.B. Long oder Character), daher kann dieser Type so ziemlich Alles beinhalten.</td><td>Nie</td>
</tr>
<tr>
<td>short / Short</td><td>Speichert ganze Zahlen im Bereich −32.768 bis +32.767</td><td>Nie</td>
</tr>
</table>
<br />
Die Verwendungshäufigkeit soll symbolisieren wie oft ich bereits die einzelnen Datentypen verwendet habe.<br />
Es macht somit keinen Sinn eine List aus der Funktion zurückzuliefern, wenn es sich bei der Datenbankspalte um einen „Varchar2“ handelt und der JDBC-Treiber diesen Typ nicht unterstützt. Ferner werden Funktionen mit nicht unterstützten Java-Typen auch nicht in der Funktionsliste (Expressionbuilder) angezeigt.<br />
<br />
Der „functionName“ sollte so gewählt sein, dass auf den ersten Blick direkt erkennbar ist was die Funktion letztendlich durchführt. Eine Bezeichnung wie test1 oder test2 macht also keinen Sinn.<br />
Die Klammern (…) aufgeführten Parameter bilden die Basis für eine Werteübergabe an die jeweilige Funktion. Hierbei muss beachten werden, dass der &lt;JavaType&gt; auch dem Datentype entspricht der beim Mapping übergeben wird. Eine Funktion welche numerische Werte erwartet kann mit String und/oder Datumswerten nicht besonders viel anfangen und würde somit zu einem Abbruch bei der Prozessgenerierung führen!<br />
Das Ende einer Funktion wird mit einem „return“ eingeleitet und umfasst den bei der Funktions-deklaration definierten Wert (&lt;TalendType&gt;). Dieser Wert wird natürlich innerhalb der Funktion als Variable deklariert und mit dem programmtechnisch erzeugten Wert bestückt.<br />
<br />
<br />
<span style="font-weight: bold;">Beschreibende Deklarationen</span><br />
<br />
Um Routinen auch gezielt z.B. im tMap ansprechen zu können, empfiehlt sich eigentlich eine beschreibende Deklaration direkt bei der Funktion mit aufzunehmen. Diese Beschreibungen verfolgen ein ähnliches Prinzip wie die Javadoc, sind aber um Talend spezifische Tags erweitert worden.<br />
Den Anfang sollten immer der Funktionsname und ein kurzer Kommentar („Funktionsname“ : „Kommentar“) machen. Gefolgt von dem Talendtype welcher aus der Funktion zurückgeliefert wird ( {talendTypes} &lt;TalendType&gt;). Die nächste Zeile bildet dann die Kategorie für die Funktion ( {Category} „Kategorie“ ). In den Kategorien werden u.A. die Funktionen innerhalb des tMap’s angezeigt. Um die Parameter-übergabe genauer zu spezifizieren werden sämtliche Übergabetypen ( {param} &lt;talendTypes&gt;(&lt;Beispiel Text&gt;) : &lt;Kommentar&gt; ) anschließend zeilenweise aufgeführt. Abschließend kann bei Bedarf noch ein Beispiel für den Aufruf mit angegeben werden ({example} „Funktionsname“(&lt;Beispiel Text&gt;) # &lt;Rückgabewert&gt;).<br />
<br />
<br />
<span style="font-weight: bold;">Umsetzung Beispiel</span><br />
<br />
Unser obiges Beispiel würde sich wie folgt darstellen.<br />
[attachment=135]<br />
<br />
 <br />
Erkennbar ist hierbei die eindeutige Abfolge der oben beschriebenen Anforderung:<br />
1.	Überprüfung ob der Eingabeparameter überhaupt gefüllt ist?<br />
if(Ort == null) return "B";<br />
2.	Umwandlung der übergebenen „Stadt“ in Kleinbuchstaben<br />
Ort = Ort.toLowerCase();<br />
<br />
3.	Austausch des Buchstabens „ü“ durch „ue“<br />
Ort = Ort.replaceAll("ü", "ue");<br />
<br />
4.	Überprüfung ob die Stadt nicht den Wert „nuernberg“ entspricht.<br />
if(Ort.equals("nuernberg") == false) return "B";<br />
<br />
5.	Überprüfung ob der Umsatz größer als 1000 ist, falls „Ja“ erfolgt die Rückgabe von „A“.<br />
if(Umsatz &gt; 1000) return "A";<br />
<br />
6.	Rückgabe Default-Wert „B“<br />
return "B";<br />
<br />
Nach dem Speichern steht die Funktion dann direkt im Expression-Builder zu Verfügung und der Aufruf gestaltet sich an dieser Stelle relativ einfach. Statt einer langen Funktionskette kann nun die Funktion direkt in die Transformation eingebunden und mit den Werten des Input-Stroms aufgerufen werden. <br />
[attachment=136]<br />
<br />
 <br />
Die Rückgabe sollte dann 1:1 folgendes Ergebnis liefern.<br />
[attachment=137]<br />
 <br />
<br />
<span style="font-weight: bold;">Fazit</span><br />
<br />
Auch wenn es im ersten Moment etwas ungewöhnlich und aufwendig erscheint, so bietet die Verwendung von Funktionen ein breites Spektrum von diversen Einsatzszenarien. Allein die Tatsache mit der n-fachen Wiederverwendung und die Möglichkeit von zentralen Änderungen rechtfertigen eine Umsetzung direkt als Java-Funktion. Selbstverständlich ist es ohne größeren Aufwand möglich auch bereits existierende Java-Bibliotheken direkt mit einzubinden und zu nutzen.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Interessanter Open Source BI-Blog]]></title>
			<link>http://www.talendforum.de/thread-36.html</link>
			<pubDate>Mon, 19 Jul 2010 15:24:44 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-36.html</guid>
			<description><![CDATA[Interssanter Blog zum Thema Open Source BI.<br />
<a href="http://www.osbi-blog.de/" target="_blank">http://www.osbi-blog.de/</a><br />
Nicht nur zum Thema Talend.<br />
<br />
martin]]></description>
			<content:encoded><![CDATA[Interssanter Blog zum Thema Open Source BI.<br />
<a href="http://www.osbi-blog.de/" target="_blank">http://www.osbi-blog.de/</a><br />
Nicht nur zum Thema Talend.<br />
<br />
martin]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Insert in MySQL mit JasperETL aus Oracle]]></title>
			<link>http://www.talendforum.de/thread-35.html</link>
			<pubDate>Wed, 14 Jul 2010 14:19:25 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-35.html</guid>
			<description><![CDATA[Hallo,<br />
<br />
bin absolut neu im Thema JasperETL und möchte gerne eine<br />
Deltabefüllung aus Oracle in MySQL mit JasperETL realisieren.<br />
<br />
Also aus der Oracle werden Daten ausgelesen und sollen in eine MySQL Tabelle insertet werden. Sollte aber ein Datensatz bereits vorhanden sein soll dieser natürlich nicht wieder insertet werden. Sollte dieser Datensatz aber verändert worden sein (aktuellerer Changetimestamp) soll dieser dann doch erneut insertet werden.<br />
Ich hoffe man kann meine Beschreibung verstehen<br />
<br />
Wie kann ich das nun in JasperETL Umsetzen????<br />
Bzw. gibt es da Beispiele oder Muster???<br />
<br />
1000 thx<br />
Wo]]></description>
			<content:encoded><![CDATA[Hallo,<br />
<br />
bin absolut neu im Thema JasperETL und möchte gerne eine<br />
Deltabefüllung aus Oracle in MySQL mit JasperETL realisieren.<br />
<br />
Also aus der Oracle werden Daten ausgelesen und sollen in eine MySQL Tabelle insertet werden. Sollte aber ein Datensatz bereits vorhanden sein soll dieser natürlich nicht wieder insertet werden. Sollte dieser Datensatz aber verändert worden sein (aktuellerer Changetimestamp) soll dieser dann doch erneut insertet werden.<br />
Ich hoffe man kann meine Beschreibung verstehen<br />
<br />
Wie kann ich das nun in JasperETL Umsetzen????<br />
Bzw. gibt es da Beispiele oder Muster???<br />
<br />
1000 thx<br />
Wo]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Ausführbare JAR]]></title>
			<link>http://www.talendforum.de/thread-34.html</link>
			<pubDate>Thu, 10 Jun 2010 21:24:16 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-34.html</guid>
			<description><![CDATA[Hallo zusammen,<br />
<br />
ich habe eine Frage:<br />
woher kommt die Startkonfiguration im folgenden Dialogfeld her. <br />
Muss es vorher eingerichtet werden, wenn ja, wo?<br />
<br />
 [attachment=117&#93;<br />
<br />
Danke im Voraus<br />
R]]></description>
			<content:encoded><![CDATA[Hallo zusammen,<br />
<br />
ich habe eine Frage:<br />
woher kommt die Startkonfiguration im folgenden Dialogfeld her. <br />
Muss es vorher eingerichtet werden, wenn ja, wo?<br />
<br />
 [attachment=117]<br />
<br />
Danke im Voraus<br />
R]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Daten bewegen]]></title>
			<link>http://www.talendforum.de/thread-33.html</link>
			<pubDate>Thu, 03 Jun 2010 23:26:45 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-33.html</guid>
			<description><![CDATA[Hallo zusammen,<br />
ich bin gerade dabei, meine ersten Schritte im TOS zu machen.<br />
Leider komme ich immer wieder ins stocken. Mein aktuelles Problem:<br />
ich versuche die Daten zwischen zwei Datenbanken zyklich zu übertragen. Nur <br />
möchte ich nicht immer alles aus der Quelltabelle auswählen müssen, sondern nur die Datesätze, die in der Zieltabelle noch nicht vorhanden sind. Das Kriterium ist hier nicht wichtig. Als Beispiel nehme ich das Timestamp. Mit MAX(Timestamp) bekomme ich schon den Wert in TOS, den ich für das SELECT von der Quelle verwenden kann. Aber wie beue ich es ein? Alles aus der Quelle selektieren und dann in tMap ausfiltern macht bei 100mln Sätze wenig Sinn. Hat jemand Idee. <br />
Danke im Voraus]]></description>
			<content:encoded><![CDATA[Hallo zusammen,<br />
ich bin gerade dabei, meine ersten Schritte im TOS zu machen.<br />
Leider komme ich immer wieder ins stocken. Mein aktuelles Problem:<br />
ich versuche die Daten zwischen zwei Datenbanken zyklich zu übertragen. Nur <br />
möchte ich nicht immer alles aus der Quelltabelle auswählen müssen, sondern nur die Datesätze, die in der Zieltabelle noch nicht vorhanden sind. Das Kriterium ist hier nicht wichtig. Als Beispiel nehme ich das Timestamp. Mit MAX(Timestamp) bekomme ich schon den Wert in TOS, den ich für das SELECT von der Quelle verwenden kann. Aber wie beue ich es ein? Alles aus der Quelle selektieren und dann in tMap ausfiltern macht bei 100mln Sätze wenig Sinn. Hat jemand Idee. <br />
Danke im Voraus]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Talend - XML (>500 MB)]]></title>
			<link>http://www.talendforum.de/thread-32.html</link>
			<pubDate>Mon, 31 May 2010 07:21:39 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-32.html</guid>
			<description><![CDATA[<span style="font-weight: bold;">Talend &amp; XML</span><br />
<br />
Wie jede Datenintegrationslösung bietet auch TOS die Möglichkeit mit XML-Dateien umzugehen. Innerhalb von XML-Dateien können bekanntlich verschiedenste Strukturen über unterschiedliche  Knoten hinweg gruppiert werden. Grundsätzlich spricht nichts gegen ein solches „offenes“ Format betrachtet man im Gegenzug die alten Copy-Books, wo der Zugriff aufgrund der EBCDIC Codierung doch etwas umständlich erscheint. XML-Dateien lassen sich mit relativ wenig Aufwand erstellen. Man codiert eine Struktur und schreibt diese anschließend mittels einem Append in ein geöffnetes File. Abschließend noch die jeweiligen Ende-Tag's und die Datei ist fertig. Dieses Verfahren wird allerdings auch gerne für Massendaten verwendet, womit XML-Dateien &gt; 1GB keine Seltenheit mehr sind. Betrachtet man nun den Lese-Prozess so möchte der XML-Parser natürlich im Vorfeld sich mit der Struktur beschäftigen und versucht das komplette XML-Dokument in den Hauptspeicher zu laden und zu Parsen, es könnten ja Fehler enthalten sein!? Durch die Hauptspeicherlimitierung von einem 32Bit Java ist beim Lesen immer ein „Out of Memory Error“ zu erwarten. Wie jeder weiß, ist Talend ein Code-Generator und erstellt Java-Code.<br />
<br />
Dieses How-To soll zeigen, wie dennoch mit dem „Übel aller Dateiformate“ einigermaßen umgegangen werden kann.<br />
<br />
<br />
<span style="font-weight: bold;">Definition XML / Probleme</span><br />
<br />
In dem Beispiel soll eine XML-Datei mit 10 Millionen Kundensätzen und einer Größe von 1,8GB weiterverarbeitet werden.<br />
[attachment=94&#93;<br />
<br />
Der Aufbau der Input XML-Datei lässt sich wie folgt darstellen:<br />
[attachment=95&#93;<br />
<br />
Würde man nun versuchen die Datei mit einem tXMLFileInput zu lesen so würde, egal ob SAX oder XERCES Parser, ein Fehler produziert. Wie bereits erwähnt versucht der Parser diese Datei komplett in den Hauptspeicher zu laden. Diese geschieht auch wenn der Zugriff über das Metadaten-Repository erfolgt. Sollte bei diesem Versuch das Wizardfenster nicht mehr verschwinden, ein Fehlermeldung aufpoppen oder die Struktur nicht dargestellt werden, dann hilft nur noch ein Kill des Talend-Prozesses.<br />
<br />
<br />
<span style="font-weight: bold;">Definition XML / Lösungsansatz</span><br />
<br />
Um dennoch mit solchen XML-Monstern zu arbeiten hilft nur ein Zwischenschritt. Hierzu wird die XML-Datei in kleine Häppchen aufgesplittet und anschließend über eine Iteration weiterverarbeitet.<br />
Allerdings kann man aus bekanntlichem Problem für das Lesen nicht den tFileInputXML verwenden. Als Alternative bietet sich hier der normale tFileInputDelmited an. Dieser muss beim XML Lesen aber so konfiguriert werden, dass er komplette XML Blöcke als Einzelsatz lesen kann.<br />
[attachment=96&#93;<br />
<br />
[attachment=97&#93;<br />
<br />
Nachdem der Name und die Datei ausgewählt wurde, kann in dem dritten Wizard Fenster mit der Definition des Row und Field Separators der einzelne XML-Block definiert werden. Bitte auch die Codepage beachten. Diese ist beim Lesen und natürlich auch wieder beim Schreiben relevant.<br />
<br />
Als „Field Separator“ wird in der Drop-Down Box der Wert „Custom ANSI“ und beim Row Separator die Option „Custom String“ ausgewählt. Als Custom String wir der Begin-Tag &lt;Customer&gt; und beim Row Separator dann das Ende-Tag &lt;/Customer&gt; manuell eingetragen. Bitte die eingetragenen Werte in “&lt;WERT&gt;“ setzen, anderenfalls versucht Talend einen Variable mit dem jeweiligen Namen zu finden. Nach der Aktualisierung über den Button „Refresh Preview“ sollte sich das Fenster wie folgt darstellen:<br />
[attachment=98&#93;<br />
<br />
Die Spalte „Column 1“ enthält nun immer den kompletten „Customer“-Record.<br />
<br />
Diese gelesenen XML Blöcke können anschließend an einen tFileOutputXML mittels einem tMap weitergegeben und geschrieben werden. Wichtig bei diesem Schritt ist aber die Verarbeitung des Felds „Column 1“ als Type „Object“! Sollte dieses nicht geschehen, so wird Talend Sonderzeichen wie „&lt;“ oder „&gt;“ immer Umwandeln.<br />
[attachment=99&#93;<br />
<br />
Die Feldlänge spielt an dieser Stelle überhaupt keine Rolle, daher kann Sie getrost ignoriert werden.<br />
<br />
Der Mapping Schritt dient zum einen für das Entfernen der Spalte „Column 0“ und zum anderen für die neue Benennung der Spalte „Column 1“ in „Customer“.<br />
[attachment=100&#93;<br />
<br />
[attachment=101&#93;<br />
<br />
<br />
 Die Umbenennung ist insoweit relevant, damit bei der Erstellung die XML-Dateien einen ähnlichen Aufbau haben, wie die Ursprungsdatei. Innerhalb der Komponente tFileOutputXML wird nun ein neuer Dateinamen eingetragen. Es empfiehlt sich an dieser Stelle auch die Verwendung eines neuen Verzeichnisses. Schließlich wir der Output nicht nur eine Datei sondern X-Dateien erstellen und über ein neues Directory ist die anschließende Iteration leichter umzusetzen.<br />
[attachment=102&#93;<br />
<br />
Unter den <span style="font-style: italic;">Advanced settings</span> wir zusätzlich die Option „Split output in several files“ aktiviert. Es soll bekanntlich nicht wieder eine einzige Datei mit 10Mio Einträgen erstellt werden. Nach der definierten Zahl in der Eingabebox „Rows in each output file“ wird automatisch eine neue Datei erstellt. Die Parameterliste <span style="font-style: italic;">Output format</span> zeigt das Feld welches bei der Verarbeitung in die XML-Datei geschrieben wird.<br />
[attachment=103&#93;<br />
<br />
Leider ist die Komponente tFileOuputXML nicht in der Lage den eingegebenen Wert für den „Row tag“ zu ignorieren. Dieses hat die Folge, dass die Output Dateien eine zusätzliche Hierarchie bekommen werden. Hierfür muss dann ein neues XML-Input Schema definiert werden.<br />
[attachment=104&#93;<br />
<br />
Nach der Ausführung sollten dann 100 neue XML-Dateien in dem angegebenen Verzeichnis vorliegen.<br />
<br />
<br />
<span style="font-weight: bold;">XML-Metadaten tFileInputXML</span><br />
<br />
Um ein XML-Metadaten Eintrag zu erstellen, ist der Vorgang analog wie bei den anderen Komponenten. Rechts-Klick im Metadaten-Repository auf <span style="font-style: italic;">File xml</span> und anschließend <span style="font-style: italic;">Create file xml</span> auswählen.<br />
[attachment=105&#93;<br />
<br />
Einen vernünftigen Namen wählen und im nächsten Fenster dann eine von den neu erstellten XML-Dateien auswählen.<br />
[attachment=106&#93;<br />
<br />
Wie bereits beschrieben haben die XML-Strukturen einen weiteren Eintrag „row_Customer“ bekommen. Dieser muss natürlich im nächsten Fenster für die XPATH-Queries berücksichtigt werden.<br />
<br />
Sollte es bei dieser Darstellung bereits zu Fehlermeldungen kommen oder das nächste Fenster nicht erreicht werden, dann kann durch die Reduzierung des Split-limits bei der XML-Erstellung eine kleinere Datei mit gleichem Aufbau generiert werden.<br />
[attachment=107&#93;<br />
<br />
Mittels einfachen D&amp;D Operation wird dann der XML-Baum in die Einzelteile überführt, welche anschließend weiterverarbeitet werden sollen. Der Wert <span style="font-style: italic;">Loop-Limit</span> sollte direkt auf -1 gestellt werden um die komplette XML-Datei dann auch zu verarbeiten und nicht nach einer bestimmten Anzahl von Entitäten aufzuhören. Der Button Refresh-Preview ist auch mit Vorsicht zu genießen. Gerade wenn man das Mapping erstellt hat, möchte man an dieser Stelle nicht unbedingt einen Abbruch herbeiführen. Es empfiehlt sich durchaus mit kleineren Dateien zu arbeiten!<br />
<br />
Im nächsten Fenster wird dann nur noch das Schema definiert und die Metadaten-Beschreibung kann dann verwendet werden.<br />
<br />
<br />
<span style="font-weight: bold;">Input Prozess / Schritt 1</span><br />
<br />
Für die Prozessmodellierung wird mittels D&amp;D Operation nie neu erstellte Metadaten Definition in einen Prozess gezogen und der Main-Stream an eine Output-Komponente weitergegeben.<br />
[attachment=108&#93;<br />
<br />
<br />
<span style="font-weight: bold;">Input Prozess / Schritt 2 Iteration</span><br />
<br />
Da in dem Prozess nun die komplette gesplittete XML-Datei verarbeitet werden soll, muss als vorgelagerte Komponente ein iteratives Lesen über das verwendete Verzeichnis durchgeführt und sämtliche „passenden“ Dateinamen an den XML_Input_After_Split übergeben werden. Eine Iteration kann durch die Verwendung der Komponente tFileList erstellt werden. Da es sich bei tFileList um eine „rein“ iterierende Komponente handelt, kann auch nur ein Iterations Link mit der nächsten Komponente aufgebaut werden.<br />
[attachment=109&#93;<br />
<br />
Die Konfiguration der tFileList-Komponente geht auf das jeweilige Split-Verzeichnis und als „Filemask“ behilft man sich mi einem „*“. Es ist natürlich auch ein etwas genaueres Muster möglich.<br />
[attachment=110&#93;<br />
<br />
Aus der Variable ((String)globalMap.get("tFileList_1_CURRENT_FILEPATH")) kann nun der aktuelle Dateinamen (inklusive Pfad) entnommen werden. Der Einfachheit werden die Parameter der XML-Input Komponente von Repository auf Build-In gestellt und der die obige Variable mit C&amp;P in das Feld „File name/Stream“ eingefügt.<br />
[attachment=111&#93;<br />
<br />
Nach dem Prozessstart sollten dann alle Dateien verarbeitet werden.<br />
<br />
!Tipp! Iterationen sind die einfachste und billigste Art eine Parallelität zu implementieren. Allerdings funktioniert das Iterieren über XML nur mit den Komponenten aus der Version 3.2.1 noch Fehlerfrei. In neueren Version gibt es Probleme innerhalb der Speierverarbeitung.<br />
<br />
<br />
<span style="font-weight: bold;">Ausblick</span><br />
<br />
Sicherlich gibt es an dem obigen Part noch Verbesserungsmöglichkeiten aber ich denke mit dieser Lösung auch an Personen die als Opfer mit solchen XML-Monstern umgehen müssen. Vielleicht sollte man die Quelle diese Übels, nämlich die Personen die für solche Dateien letztendlich verantwortlich sind, einmal tiefer ins Gewissen reden. Eventuell bringt aber auch eine Diskussion in Richtung Management eine Verbesserung. Denken wir nur an die Zeit die bis jetzt vergeudet wurde um ein solchen Ansatz zu finden und diesen dann auch nachzuvollziehen? Auch wenn ich kein Freund von XML bin, es gibt Anwendungsfälle wo es definitiv Sinn macht Daten als XML Auszutauschen bzw. zu versenden, aber definitiv nicht um eine VBRK/VBRP Tabelle in ein DWH zu überführen. Auch andere ETL-Tools haben hiermit Schwierigkeiten(Stand 2010).]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;">Talend &amp; XML</span><br />
<br />
Wie jede Datenintegrationslösung bietet auch TOS die Möglichkeit mit XML-Dateien umzugehen. Innerhalb von XML-Dateien können bekanntlich verschiedenste Strukturen über unterschiedliche  Knoten hinweg gruppiert werden. Grundsätzlich spricht nichts gegen ein solches „offenes“ Format betrachtet man im Gegenzug die alten Copy-Books, wo der Zugriff aufgrund der EBCDIC Codierung doch etwas umständlich erscheint. XML-Dateien lassen sich mit relativ wenig Aufwand erstellen. Man codiert eine Struktur und schreibt diese anschließend mittels einem Append in ein geöffnetes File. Abschließend noch die jeweiligen Ende-Tag's und die Datei ist fertig. Dieses Verfahren wird allerdings auch gerne für Massendaten verwendet, womit XML-Dateien &gt; 1GB keine Seltenheit mehr sind. Betrachtet man nun den Lese-Prozess so möchte der XML-Parser natürlich im Vorfeld sich mit der Struktur beschäftigen und versucht das komplette XML-Dokument in den Hauptspeicher zu laden und zu Parsen, es könnten ja Fehler enthalten sein!? Durch die Hauptspeicherlimitierung von einem 32Bit Java ist beim Lesen immer ein „Out of Memory Error“ zu erwarten. Wie jeder weiß, ist Talend ein Code-Generator und erstellt Java-Code.<br />
<br />
Dieses How-To soll zeigen, wie dennoch mit dem „Übel aller Dateiformate“ einigermaßen umgegangen werden kann.<br />
<br />
<br />
<span style="font-weight: bold;">Definition XML / Probleme</span><br />
<br />
In dem Beispiel soll eine XML-Datei mit 10 Millionen Kundensätzen und einer Größe von 1,8GB weiterverarbeitet werden.<br />
[attachment=94]<br />
<br />
Der Aufbau der Input XML-Datei lässt sich wie folgt darstellen:<br />
[attachment=95]<br />
<br />
Würde man nun versuchen die Datei mit einem tXMLFileInput zu lesen so würde, egal ob SAX oder XERCES Parser, ein Fehler produziert. Wie bereits erwähnt versucht der Parser diese Datei komplett in den Hauptspeicher zu laden. Diese geschieht auch wenn der Zugriff über das Metadaten-Repository erfolgt. Sollte bei diesem Versuch das Wizardfenster nicht mehr verschwinden, ein Fehlermeldung aufpoppen oder die Struktur nicht dargestellt werden, dann hilft nur noch ein Kill des Talend-Prozesses.<br />
<br />
<br />
<span style="font-weight: bold;">Definition XML / Lösungsansatz</span><br />
<br />
Um dennoch mit solchen XML-Monstern zu arbeiten hilft nur ein Zwischenschritt. Hierzu wird die XML-Datei in kleine Häppchen aufgesplittet und anschließend über eine Iteration weiterverarbeitet.<br />
Allerdings kann man aus bekanntlichem Problem für das Lesen nicht den tFileInputXML verwenden. Als Alternative bietet sich hier der normale tFileInputDelmited an. Dieser muss beim XML Lesen aber so konfiguriert werden, dass er komplette XML Blöcke als Einzelsatz lesen kann.<br />
[attachment=96]<br />
<br />
[attachment=97]<br />
<br />
Nachdem der Name und die Datei ausgewählt wurde, kann in dem dritten Wizard Fenster mit der Definition des Row und Field Separators der einzelne XML-Block definiert werden. Bitte auch die Codepage beachten. Diese ist beim Lesen und natürlich auch wieder beim Schreiben relevant.<br />
<br />
Als „Field Separator“ wird in der Drop-Down Box der Wert „Custom ANSI“ und beim Row Separator die Option „Custom String“ ausgewählt. Als Custom String wir der Begin-Tag &lt;Customer&gt; und beim Row Separator dann das Ende-Tag &lt;/Customer&gt; manuell eingetragen. Bitte die eingetragenen Werte in “&lt;WERT&gt;“ setzen, anderenfalls versucht Talend einen Variable mit dem jeweiligen Namen zu finden. Nach der Aktualisierung über den Button „Refresh Preview“ sollte sich das Fenster wie folgt darstellen:<br />
[attachment=98]<br />
<br />
Die Spalte „Column 1“ enthält nun immer den kompletten „Customer“-Record.<br />
<br />
Diese gelesenen XML Blöcke können anschließend an einen tFileOutputXML mittels einem tMap weitergegeben und geschrieben werden. Wichtig bei diesem Schritt ist aber die Verarbeitung des Felds „Column 1“ als Type „Object“! Sollte dieses nicht geschehen, so wird Talend Sonderzeichen wie „&lt;“ oder „&gt;“ immer Umwandeln.<br />
[attachment=99]<br />
<br />
Die Feldlänge spielt an dieser Stelle überhaupt keine Rolle, daher kann Sie getrost ignoriert werden.<br />
<br />
Der Mapping Schritt dient zum einen für das Entfernen der Spalte „Column 0“ und zum anderen für die neue Benennung der Spalte „Column 1“ in „Customer“.<br />
[attachment=100]<br />
<br />
[attachment=101]<br />
<br />
<br />
 Die Umbenennung ist insoweit relevant, damit bei der Erstellung die XML-Dateien einen ähnlichen Aufbau haben, wie die Ursprungsdatei. Innerhalb der Komponente tFileOutputXML wird nun ein neuer Dateinamen eingetragen. Es empfiehlt sich an dieser Stelle auch die Verwendung eines neuen Verzeichnisses. Schließlich wir der Output nicht nur eine Datei sondern X-Dateien erstellen und über ein neues Directory ist die anschließende Iteration leichter umzusetzen.<br />
[attachment=102]<br />
<br />
Unter den <span style="font-style: italic;">Advanced settings</span> wir zusätzlich die Option „Split output in several files“ aktiviert. Es soll bekanntlich nicht wieder eine einzige Datei mit 10Mio Einträgen erstellt werden. Nach der definierten Zahl in der Eingabebox „Rows in each output file“ wird automatisch eine neue Datei erstellt. Die Parameterliste <span style="font-style: italic;">Output format</span> zeigt das Feld welches bei der Verarbeitung in die XML-Datei geschrieben wird.<br />
[attachment=103]<br />
<br />
Leider ist die Komponente tFileOuputXML nicht in der Lage den eingegebenen Wert für den „Row tag“ zu ignorieren. Dieses hat die Folge, dass die Output Dateien eine zusätzliche Hierarchie bekommen werden. Hierfür muss dann ein neues XML-Input Schema definiert werden.<br />
[attachment=104]<br />
<br />
Nach der Ausführung sollten dann 100 neue XML-Dateien in dem angegebenen Verzeichnis vorliegen.<br />
<br />
<br />
<span style="font-weight: bold;">XML-Metadaten tFileInputXML</span><br />
<br />
Um ein XML-Metadaten Eintrag zu erstellen, ist der Vorgang analog wie bei den anderen Komponenten. Rechts-Klick im Metadaten-Repository auf <span style="font-style: italic;">File xml</span> und anschließend <span style="font-style: italic;">Create file xml</span> auswählen.<br />
[attachment=105]<br />
<br />
Einen vernünftigen Namen wählen und im nächsten Fenster dann eine von den neu erstellten XML-Dateien auswählen.<br />
[attachment=106]<br />
<br />
Wie bereits beschrieben haben die XML-Strukturen einen weiteren Eintrag „row_Customer“ bekommen. Dieser muss natürlich im nächsten Fenster für die XPATH-Queries berücksichtigt werden.<br />
<br />
Sollte es bei dieser Darstellung bereits zu Fehlermeldungen kommen oder das nächste Fenster nicht erreicht werden, dann kann durch die Reduzierung des Split-limits bei der XML-Erstellung eine kleinere Datei mit gleichem Aufbau generiert werden.<br />
[attachment=107]<br />
<br />
Mittels einfachen D&amp;D Operation wird dann der XML-Baum in die Einzelteile überführt, welche anschließend weiterverarbeitet werden sollen. Der Wert <span style="font-style: italic;">Loop-Limit</span> sollte direkt auf -1 gestellt werden um die komplette XML-Datei dann auch zu verarbeiten und nicht nach einer bestimmten Anzahl von Entitäten aufzuhören. Der Button Refresh-Preview ist auch mit Vorsicht zu genießen. Gerade wenn man das Mapping erstellt hat, möchte man an dieser Stelle nicht unbedingt einen Abbruch herbeiführen. Es empfiehlt sich durchaus mit kleineren Dateien zu arbeiten!<br />
<br />
Im nächsten Fenster wird dann nur noch das Schema definiert und die Metadaten-Beschreibung kann dann verwendet werden.<br />
<br />
<br />
<span style="font-weight: bold;">Input Prozess / Schritt 1</span><br />
<br />
Für die Prozessmodellierung wird mittels D&amp;D Operation nie neu erstellte Metadaten Definition in einen Prozess gezogen und der Main-Stream an eine Output-Komponente weitergegeben.<br />
[attachment=108]<br />
<br />
<br />
<span style="font-weight: bold;">Input Prozess / Schritt 2 Iteration</span><br />
<br />
Da in dem Prozess nun die komplette gesplittete XML-Datei verarbeitet werden soll, muss als vorgelagerte Komponente ein iteratives Lesen über das verwendete Verzeichnis durchgeführt und sämtliche „passenden“ Dateinamen an den XML_Input_After_Split übergeben werden. Eine Iteration kann durch die Verwendung der Komponente tFileList erstellt werden. Da es sich bei tFileList um eine „rein“ iterierende Komponente handelt, kann auch nur ein Iterations Link mit der nächsten Komponente aufgebaut werden.<br />
[attachment=109]<br />
<br />
Die Konfiguration der tFileList-Komponente geht auf das jeweilige Split-Verzeichnis und als „Filemask“ behilft man sich mi einem „*“. Es ist natürlich auch ein etwas genaueres Muster möglich.<br />
[attachment=110]<br />
<br />
Aus der Variable ((String)globalMap.get("tFileList_1_CURRENT_FILEPATH")) kann nun der aktuelle Dateinamen (inklusive Pfad) entnommen werden. Der Einfachheit werden die Parameter der XML-Input Komponente von Repository auf Build-In gestellt und der die obige Variable mit C&amp;P in das Feld „File name/Stream“ eingefügt.<br />
[attachment=111]<br />
<br />
Nach dem Prozessstart sollten dann alle Dateien verarbeitet werden.<br />
<br />
!Tipp! Iterationen sind die einfachste und billigste Art eine Parallelität zu implementieren. Allerdings funktioniert das Iterieren über XML nur mit den Komponenten aus der Version 3.2.1 noch Fehlerfrei. In neueren Version gibt es Probleme innerhalb der Speierverarbeitung.<br />
<br />
<br />
<span style="font-weight: bold;">Ausblick</span><br />
<br />
Sicherlich gibt es an dem obigen Part noch Verbesserungsmöglichkeiten aber ich denke mit dieser Lösung auch an Personen die als Opfer mit solchen XML-Monstern umgehen müssen. Vielleicht sollte man die Quelle diese Übels, nämlich die Personen die für solche Dateien letztendlich verantwortlich sind, einmal tiefer ins Gewissen reden. Eventuell bringt aber auch eine Diskussion in Richtung Management eine Verbesserung. Denken wir nur an die Zeit die bis jetzt vergeudet wurde um ein solchen Ansatz zu finden und diesen dann auch nachzuvollziehen? Auch wenn ich kein Freund von XML bin, es gibt Anwendungsfälle wo es definitiv Sinn macht Daten als XML Auszutauschen bzw. zu versenden, aber definitiv nicht um eine VBRK/VBRP Tabelle in ein DWH zu überführen. Auch andere ETL-Tools haben hiermit Schwierigkeiten(Stand 2010).]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[E-Mail-Anhänge dynamisch hinzufügen]]></title>
			<link>http://www.talendforum.de/thread-31.html</link>
			<pubDate>Wed, 26 May 2010 16:49:02 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-31.html</guid>
			<description><![CDATA[Hallo zusammen,<br />
<br />
ich habe ein kleines Problem bei dem ich grade nicht weiterkomme. Und zwar geht's um folgendes:<br />
Alle Dateien aus einem Verzeichnis sollen mit einer E-Mail verschickt werden.<br />
Momentan habe ich es so, dass pro Datei eine E-Mail verschickt wird.<br />
<br />
Ich habe ein tFileList, welches mittels iterate an ein tSendMail geht.<br />
Nach dem Versand werden die Daten dann aus dem Verzeichnis verschoben.<br />
Nun kommt es aber vor, dass in dem Verzeichnis unterschiedlich viele Dateien liegen können.<br />
<br />
Gibt es irgendeine Möglichkeit tSendMail die Attachments dynamisch zuzuweisen? Also z.B. an einem Tag sind es 5 und am nächsten Tag 7.<br />
<br />
Ich hoffe ich hab mich nicht so ganz unverständlich ausgedrückt. :-)<br />
<br />
Gruß Marc]]></description>
			<content:encoded><![CDATA[Hallo zusammen,<br />
<br />
ich habe ein kleines Problem bei dem ich grade nicht weiterkomme. Und zwar geht's um folgendes:<br />
Alle Dateien aus einem Verzeichnis sollen mit einer E-Mail verschickt werden.<br />
Momentan habe ich es so, dass pro Datei eine E-Mail verschickt wird.<br />
<br />
Ich habe ein tFileList, welches mittels iterate an ein tSendMail geht.<br />
Nach dem Versand werden die Daten dann aus dem Verzeichnis verschoben.<br />
Nun kommt es aber vor, dass in dem Verzeichnis unterschiedlich viele Dateien liegen können.<br />
<br />
Gibt es irgendeine Möglichkeit tSendMail die Attachments dynamisch zuzuweisen? Also z.B. an einem Tag sind es 5 und am nächsten Tag 7.<br />
<br />
Ich hoffe ich hab mich nicht so ganz unverständlich ausgedrückt. :-)<br />
<br />
Gruß Marc]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Reihenfolge beim Einlesen der Daten]]></title>
			<link>http://www.talendforum.de/thread-30.html</link>
			<pubDate>Wed, 26 May 2010 11:32:26 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-30.html</guid>
			<description><![CDATA[Hallo,<br />
<br />
gibt es eine Möglichkeit bei tMap oder bei den Meta-Daten, die Reihenfolge des Einlesen zu verändern? Also das nicht mit dem ersten Datensatz angefangen wird sondern mit dem letzten???<br />
<br />
lg<br />
alex]]></description>
			<content:encoded><![CDATA[Hallo,<br />
<br />
gibt es eine Möglichkeit bei tMap oder bei den Meta-Daten, die Reihenfolge des Einlesen zu verändern? Also das nicht mit dem ersten Datensatz angefangen wird sondern mit dem letzten???<br />
<br />
lg<br />
alex]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Tables vergleichen]]></title>
			<link>http://www.talendforum.de/thread-29.html</link>
			<pubDate>Wed, 19 May 2010 12:10:04 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-29.html</guid>
			<description><![CDATA[hallo Zusammen,<br />
<br />
ich habe folgendes Problem: <br />
<br />
Table1<br />
<table>ID ExID<br />
1 12<br />
2 15<br />
3 18<br />
4 25<br />
5 30</table>
<br />
Table2<br />
<table>ID1 ID2<br />
10 2<br />
12 18<br />
25 50<br />
28 63</table>
<br />
Es soll jetzt geprüft werden ob die einzelnen Table1.ExID`s (Bsp: row1: 12) in Table2.ID1 enthalten ist. Wenn ja, wie Table2.ID1.row2 (12) -&gt; prüfe ob die korrespondiere Table2.ID2.row2 (18) ebenfalls in Table1.ExID enthalten ist (hier ja - in row3). Wenn ja = schreibe in eine neue Table3 die Table1.ID,Table2.ID1,Table2.ID2 <br />
<br />
Ist das in etwa verständlich? Lässt sich das mit tMap irgendwie abbilden???<br />
<br />
Liebe Grüße<br />
alex<br />
<br />
Update:<br />
Vielleicht etwas allgemeiner: Wie kann ich in talend (am Besten mit tMap) zwei Tables vergleichen. Also das hier sozusagen eine loop gefahren wird, die für jede Table2.ID1 oder ID2-column schaut, ob dieser Wert in in Table1.ExID vorhanden ist.]]></description>
			<content:encoded><![CDATA[hallo Zusammen,<br />
<br />
ich habe folgendes Problem: <br />
<br />
Table1<br />
<table>ID ExID<br />
1 12<br />
2 15<br />
3 18<br />
4 25<br />
5 30</table>
<br />
Table2<br />
<table>ID1 ID2<br />
10 2<br />
12 18<br />
25 50<br />
28 63</table>
<br />
Es soll jetzt geprüft werden ob die einzelnen Table1.ExID`s (Bsp: row1: 12) in Table2.ID1 enthalten ist. Wenn ja, wie Table2.ID1.row2 (12) -&gt; prüfe ob die korrespondiere Table2.ID2.row2 (18) ebenfalls in Table1.ExID enthalten ist (hier ja - in row3). Wenn ja = schreibe in eine neue Table3 die Table1.ID,Table2.ID1,Table2.ID2 <br />
<br />
Ist das in etwa verständlich? Lässt sich das mit tMap irgendwie abbilden???<br />
<br />
Liebe Grüße<br />
alex<br />
<br />
Update:<br />
Vielleicht etwas allgemeiner: Wie kann ich in talend (am Besten mit tMap) zwei Tables vergleichen. Also das hier sozusagen eine loop gefahren wird, die für jede Table2.ID1 oder ID2-column schaut, ob dieser Wert in in Table1.ExID vorhanden ist.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[OnComponentOk vs. OnSubjobOk]]></title>
			<link>http://www.talendforum.de/thread-28.html</link>
			<pubDate>Thu, 06 May 2010 16:03:19 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-28.html</guid>
			<description><![CDATA[Hallo,<br />
<br />
also ich hab länger die Hilfeseiten durchforstet - aber mir will nicht ganz einfallen wann ich jetzt OnSubjob und wann OnComponent benutze ... kann das einer mal möglichst einfach erklären? :-)<br />
<br />
Ich komme darauf weil ich einen Prozess in zwei Unterprozesse gesplittet habe. Bevor ich jetzt mit einem nächsten Prozessschritt (der beide Unterprozesse betrifft) weitermache möchte ich implementieren, dass dieser neue Schritt wartet bis beide Teilprozesse fertig sind ... Verständlich? was benutze ich da? <br />
<br />
Viele Grüße<br />
Alex]]></description>
			<content:encoded><![CDATA[Hallo,<br />
<br />
also ich hab länger die Hilfeseiten durchforstet - aber mir will nicht ganz einfallen wann ich jetzt OnSubjob und wann OnComponent benutze ... kann das einer mal möglichst einfach erklären? :-)<br />
<br />
Ich komme darauf weil ich einen Prozess in zwei Unterprozesse gesplittet habe. Bevor ich jetzt mit einem nächsten Prozessschritt (der beide Unterprozesse betrifft) weitermache möchte ich implementieren, dass dieser neue Schritt wartet bis beide Teilprozesse fertig sind ... Verständlich? was benutze ich da? <br />
<br />
Viele Grüße<br />
Alex]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Verarbeitung großer XML Dateien]]></title>
			<link>http://www.talendforum.de/thread-27.html</link>
			<pubDate>Sun, 02 May 2010 13:04:16 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-27.html</guid>
			<description><![CDATA[Hallo,<br />
<br />
hat jemmand eine Idee wie man etwas größere XML-Dateien mit TOS verarbeiten. Ich bekommen immer einen "Heap-Error". Die Datei hat eine Größe von 500MB.<br />
<br />
Danke<br />
Chris]]></description>
			<content:encoded><![CDATA[Hallo,<br />
<br />
hat jemmand eine Idee wie man etwas größere XML-Dateien mit TOS verarbeiten. Ich bekommen immer einen "Heap-Error". Die Datei hat eine Größe von 500MB.<br />
<br />
Danke<br />
Chris]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Talend Open MDM / Integration Talend Open Studio]]></title>
			<link>http://www.talendforum.de/thread-26.html</link>
			<pubDate>Tue, 27 Apr 2010 19:35:53 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-26.html</guid>
			<description><![CDATA[<span style="font-weight: bold;">Talend Open MDM / Integration Talend Open Studio</span><br />
<br />
Nachdem es im ersten Teil (<a href="http://www.talendforum.de/thread-19.html" target="_blank">Talend Open MDM / Installation, Modellierung, Datenerfassung</a>) um die grundsätzliche Installation und den Aufbau einer kleinen Demo-Applikation gegangen ist, beschäftigt sich dieser Teil um die Einbindung von Open Studio in die definierte MDM Umgebung.<br />
<br />
Open Studio enthält seit der Version 3.2.1 bereits zwei spezielle MDM Komponenten (tMDMInput, tMDMOutput) die für die Einbindung von Open Studio verwendet werden können. Im Kern arbeiten beide Komponenten analog zu den andern t&lt;&gt;Input und t&lt;&gt;Output Komponenten. Während t&lt;&gt;Input ein Lesen ermöglicht, so bietet t&lt;&gt;Output ein Schreiben an. Wenn Sie sich schon gefragt haben sollten wie man bestehende Daten eigentlich in die MDM Oberfläche und anschließend wieder heraus bekommt, dann geschieht dieses genau mit den beiden o.g. Komponenten.<br />
<br />
<br />
<span style="font-weight: bold;">Aus der MDM Umgebung lesen (tMDMInput)</span><br />
Im ersten Teil wurde bereits ein Model (Postleitzahlen) mit den beiden Elementen PLZ und Ort erstellt. Dieses Modell umfasst derzeit einen einzigen Datensatz und dieser Datensatz soll jetzt innerhalb eines Integrationsjobs ausgelesen werden. Hierzu wird die Komponente tMDMInput verwendet.<br />
[attachment=73&#93; <br />
 <br />
Die Komponente verfügt über eine Reihe von unterschiedlichen Parametern, die je nach Verwendungszweck alle relevant sind.<br />
<br />
<span style="font-style: italic;">Schema Type:</span><br />
Wie bei einem normalen Datenzugriff wird auch für MDM ein Definition der Columns benötigt. Allerdings liefert MDM immer nur eine einzige Column zurück. Das notwendige Schema kann somit aus einer einzigen Column (Type String, Object) bestehen und diese Column wird auch für den Parameter „XML Field“ angegeben.<br />
[attachment=74&#93; <br />
 <br />
<span style="font-style: italic;">XML Field</span><br />
Hier wird ein Feld aus dem definierten Schema für die Rückgabewerte angegeben. Die Rückgabe erfolgt hierbei als XML Encoded String.<br />
<br />
<span style="font-style: italic;">URL</span><br />
Angabe der serverseitigen MDM-Url. Bei dieser URL handelt es sich nicht um die Standardadresse, sondern um einen definierten WebService-Zugriffs Port.<br />
<br />
<span style="font-style: italic;">Username / Password</span><br />
Definition des Benutzernamens/-Password mit dem Zugriff erfolgen soll. In dem Beispiel wird die Kombination „user“/“user“ verwendet.<br />
<br />
<span style="font-style: italic;">Universe</span><br />
Hierüber kann eine bestimmte Version abgegeriffen werden. Dieses Feature ist allerdings Bestandteil der kommerziellen Variante und in unserem Fall obsolete.<br />
<br />
<span style="font-style: italic;">Concept</span><br />
Von der Namensdefinition mit Sicherheit etwas ungünstig gewählt, aber hierbei handelt es sich um unsere definierte Entität (PLZ_ORT) und nicht um das Datenmodell! Bitte tunlichst auf Groß- und Kleinschreibung achten.<br />
[attachment=75&#93; <br />
 <br />
<span style="font-style: italic;">Data Cluster</span><br />
Bezeichnet den internen Speicher auf den zugegriffen werden soll.<br />
<br />
<span style="font-style: italic;">Use multiple conditions</span><br />
Durch die Aktivierung dieser Checkbox, kann der Datenzugriff statt über den Primärschlüssel mittels anzugebende XPATH-Queries erfolgen. Hierbei verändert sich die Parameterdarstellung.<br />
<br />
<span style="font-style: italic;">IDS</span><br />
Enthält den Key-Wert für den Werte abgegriffen werden sollen.<br />
<br />
Wenn alle Werte richtig definiert worden sind, dann sollte die Ausgabe sich wie folgt darstellen.<br />
[attachment=76&#93; <br />
[attachment=77&#93;  <br />
 <br />
Wie bereits angesprochen, erfolgt die Rückgabe als XML-Encoded String. Dieser String kann mittels tExtractXMLField noch in eine passendere Struktur überführt werden. Da die Eingabe mit einem festen PK versehen wurde kommt bei der Ausführung immer nur ein einziger Datensatz zurück. Möchte man aber mehrere Daten gelieferte bekommen, so langt eine Aktivierung der „Use multiple conditions“ Checkbox. Sollte bereits eine weitere PLZ erfasst worden sein, so liefert die Ausgabe dann alle Datensätze zurück.<br />
[attachment=78&#93; <br />
 <br />
<br />
<span style="font-weight: bold;">XML String decoden (tExtractXMLField)</span><br />
<br />
Nachdem man den gelieferten String nicht als XML String weiterverarbeiten möchte, benötigt man eine Möglichkeit die gelieferten Informationen direkt zu decodieren. Hierzu wird zwischen „tMDMInput“ und „tLogRow“ noch die Komponente „tExtractXMLField“ platziert. <br />
[attachment=79&#93; <br />
 <br />
Diese Komponente bekommt von tMDMInput einen einzigen String (XML_PLZ_ORT) und muss diese Information anschließend in ein passendes Schema überführen. Dieses Schema muss hierbei manuell umgesetzt werden.<br />
[attachment=80&#93; <br />
 <br />
Unsere Rückgabe soll hier die Spalten PLZ und Ort umfassen. Das Schema muss auf beiden Seiten nicht 1:1 sein, sonder kann wie dem Beispiel abweichen. Nachdem das Schema definiert wurde, gilt es noch das Mapping zwischen den einzelnen Spalten und dem Encoded XML-String umzusetzen. Hierfür sind die Felder „Loop XPath query“ und der „XPath query“ Ausdruck im „Mapping“ auschlaggebend.<br />
[attachment=81&#93; <br />
 <br />
Nach der Ausführung sollte das Ergebnis dann direkt als Rows/Columns vorliegen.<br />
[attachment=82&#93; <br />
 <br />
<br />
<br />
<span style="font-weight: bold;">In die MDM Umgebung schreiben (tMDMOutput)</span><br />
<br />
Bis jetzt wurden Datensätze nur per Hand über die WebOberfläche erfasst. Sicherlich nicht der geeignete Weg wenn man obiges Szenario nutzen möchte um den kompletten deutschen Postleizahlenbestand zu hinterlegen. Die hierfür verwendeten Postleitzahlen/Städte können im Übrigen  unter dem Link <a href="http://www.manfrin-it.com/postleitzahlen/plz.html" target="_blank">http://www.manfrin-it.com/postleitzahlen/plz.html</a> heruntergeladen werden.<br />
Für die Bereitstellung von Daten innerhalb der MDM Umgebung bedient man sich der Komponente „tMDMOutput“. Diese Komponente wird in unserem Beispiel über verschiedene Komponenten an einen tFileInputExcel geknüpft.<br />
[attachment=83&#93; <br />
 <br />
Ähnlich wie bei „tMDMInput“ möchte auch diese Komponente einige Parameter von uns erhalten. <br />
[attachment=84&#93; <br />
 <br />
<span style="font-style: italic;">Schema Type</span><br />
Beschreibt das Schema welches von Der vorhergehenden Komponenten angeliefert wird. Für ein Schreiben wird allerdings nur ein einzige XML Feld benötigt. Dieses Feld enthält dann den kompletten XML Encoded Row-Eintrag.<br />
<br />
<span style="font-style: italic;">XML Field</span><br />
Hier wird ein Feld aus dem definierten Schema für die Eingabewerte angegeben. Die Übergabe erfolgt hierbei als XML Encoded String.<br />
<br />
<span style="font-style: italic;">URL</span><br />
Angabe der serverseitigen MDM-Url. Bei dieser URL handelt es sich nicht um die Standardadresse, sondern um einen definierten Talend WebService-Zugriffs Port.<br />
<br />
<span style="font-style: italic;">Username / Password</span><br />
Definition des Benutzernamens/-Password mit dem das Schreiben erfolgen soll. In dem Beispiel wird die Kombination „user“/“user“ verwendet.<br />
<br />
<span style="font-style: italic;">Universe</span><br />
Hierüber kann eine Versionierung durchgeführt werden. Dieses Feature ist allerdings Bestandteil der kommerziellen Variante und in unserem Fall obsolete.<br />
<br />
<span style="font-style: italic;">Data Model</span><br />
Hierbei handelt es sich um die definierte Entität (PLZ_ORT) die für das Schreiben verwendet werden soll! Bitte tunlichst auf Groß- und Kleinschreibung achten.<br />
<br />
<span style="font-style: italic;">Data Cluster</span><br />
Der interne Speicher in den geschrieben werden soll.<br />
<br />
<span style="font-style: italic;">Is Update</span><br />
Eine Aktivierung entscheidet wie in dem Falle eines bereits enthaltenen Keys umgegangen werden soll. Sollte ein Datensatz bereits vorhanden sein und „Is Update“ wurde aktiviert, dann erfolgt ein Update. Falls der Record noch nicht existent sein sollte, erfolgt automatisch ein Update.<br />
<br />
<span style="font-style: italic;">With Report</span><br />
Hiermit wird die Protokollierung aktiviert. Dieses Protokoll steht innerhalb der MDM-WebUmgebung im Bereich Journal wiederrum zu Verfügung. Eine Aktivierung kostet allerdings auch Performance.<br />
<br />
<span style="font-style: italic;">Die on Error</span><br />
Sollte ein Fehler beim Schreiben entstehen, so kann entschieden werden ob der gesamte Prozess abbricht oder nur ein Fehler geschrieben wird die Row protokolliert und der Job weiterläuft.<br />
<br />
Die Mapping-Komponente ist in diesem Fall zum einen für die Filterung von nicht relevanten Spalten und zum anderen für eine Umbenennung der Felder in die jeweilige Entitäts-Spalte notwendig.<br />
[attachment=85&#93; <br />
 <br />
Wie bereits erwähnt sind die Feldnamen Case-Sensitive zu übergeben.<br />
Da MDM rein auf Basis von XML arbeitet, muss neben der Filterung und Umbenennung noch eine Kodierung der einzelnen Row’s in das jeweilige XML-Format erfolgen. Diese Kodierung erfolgt mittels der tWriteXMLField Komponente. Die nimmt den kompletten Input-Stream und überführt diesen anschließend in ein einziges Feld. Dabei werden die Spaltenname auch direkt bei der XML-Kodierung als Tag deklariert.<br />
[attachment=86&#93; <br />
 <br />
Entscheidend ist hierbei auch, dass der Root-Eintrag „PLZ_ORT“ direkt als Entität verwendet wird. Bei einer Ausgabe der XML Kodierung erhält man an dieser Stelle folgenden Output (tLogRow):<br />
[attachment=87&#93; <br />
 <br />
Im Prinzip 1:1 der Aufbau wie wenn das Lesen über tMDMInput erfolgt.<br />
Die Gesamtausführung kann an dieser Stelle etwas Zeit in Anspruch nehmen. Danach enthält unser MDM aber sämtliche Postleitzahlen innerhalb Deutschland.<br />
[attachment=88&#93;  <br />
<br />
<span style="font-weight: bold;">Ausblick</span><br />
<br />
Sollten Sie bereits eine neuere Talend-Version verwenden, so werden Sie vielleicht feststellen dass der Prozessaufbau und die Einbindung von MDM einfacher geworden sind. Zu dem Zeitpunkt als dieser Artikel angefangen wurde, gab es allerdings noch keine Version 4. Ferner ist die Beschreibung auch eine Hilfe wie mit den einzelnen Verfahren umgegangen werden kann.<br />
<br />
Das nächste How-To wird dann das Thema Prozessausführung/Jobstart über den MDM Server beschreiben.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;">Talend Open MDM / Integration Talend Open Studio</span><br />
<br />
Nachdem es im ersten Teil (<a href="http://www.talendforum.de/thread-19.html" target="_blank">Talend Open MDM / Installation, Modellierung, Datenerfassung</a>) um die grundsätzliche Installation und den Aufbau einer kleinen Demo-Applikation gegangen ist, beschäftigt sich dieser Teil um die Einbindung von Open Studio in die definierte MDM Umgebung.<br />
<br />
Open Studio enthält seit der Version 3.2.1 bereits zwei spezielle MDM Komponenten (tMDMInput, tMDMOutput) die für die Einbindung von Open Studio verwendet werden können. Im Kern arbeiten beide Komponenten analog zu den andern t&lt;&gt;Input und t&lt;&gt;Output Komponenten. Während t&lt;&gt;Input ein Lesen ermöglicht, so bietet t&lt;&gt;Output ein Schreiben an. Wenn Sie sich schon gefragt haben sollten wie man bestehende Daten eigentlich in die MDM Oberfläche und anschließend wieder heraus bekommt, dann geschieht dieses genau mit den beiden o.g. Komponenten.<br />
<br />
<br />
<span style="font-weight: bold;">Aus der MDM Umgebung lesen (tMDMInput)</span><br />
Im ersten Teil wurde bereits ein Model (Postleitzahlen) mit den beiden Elementen PLZ und Ort erstellt. Dieses Modell umfasst derzeit einen einzigen Datensatz und dieser Datensatz soll jetzt innerhalb eines Integrationsjobs ausgelesen werden. Hierzu wird die Komponente tMDMInput verwendet.<br />
[attachment=73] <br />
 <br />
Die Komponente verfügt über eine Reihe von unterschiedlichen Parametern, die je nach Verwendungszweck alle relevant sind.<br />
<br />
<span style="font-style: italic;">Schema Type:</span><br />
Wie bei einem normalen Datenzugriff wird auch für MDM ein Definition der Columns benötigt. Allerdings liefert MDM immer nur eine einzige Column zurück. Das notwendige Schema kann somit aus einer einzigen Column (Type String, Object) bestehen und diese Column wird auch für den Parameter „XML Field“ angegeben.<br />
[attachment=74] <br />
 <br />
<span style="font-style: italic;">XML Field</span><br />
Hier wird ein Feld aus dem definierten Schema für die Rückgabewerte angegeben. Die Rückgabe erfolgt hierbei als XML Encoded String.<br />
<br />
<span style="font-style: italic;">URL</span><br />
Angabe der serverseitigen MDM-Url. Bei dieser URL handelt es sich nicht um die Standardadresse, sondern um einen definierten WebService-Zugriffs Port.<br />
<br />
<span style="font-style: italic;">Username / Password</span><br />
Definition des Benutzernamens/-Password mit dem Zugriff erfolgen soll. In dem Beispiel wird die Kombination „user“/“user“ verwendet.<br />
<br />
<span style="font-style: italic;">Universe</span><br />
Hierüber kann eine bestimmte Version abgegeriffen werden. Dieses Feature ist allerdings Bestandteil der kommerziellen Variante und in unserem Fall obsolete.<br />
<br />
<span style="font-style: italic;">Concept</span><br />
Von der Namensdefinition mit Sicherheit etwas ungünstig gewählt, aber hierbei handelt es sich um unsere definierte Entität (PLZ_ORT) und nicht um das Datenmodell! Bitte tunlichst auf Groß- und Kleinschreibung achten.<br />
[attachment=75] <br />
 <br />
<span style="font-style: italic;">Data Cluster</span><br />
Bezeichnet den internen Speicher auf den zugegriffen werden soll.<br />
<br />
<span style="font-style: italic;">Use multiple conditions</span><br />
Durch die Aktivierung dieser Checkbox, kann der Datenzugriff statt über den Primärschlüssel mittels anzugebende XPATH-Queries erfolgen. Hierbei verändert sich die Parameterdarstellung.<br />
<br />
<span style="font-style: italic;">IDS</span><br />
Enthält den Key-Wert für den Werte abgegriffen werden sollen.<br />
<br />
Wenn alle Werte richtig definiert worden sind, dann sollte die Ausgabe sich wie folgt darstellen.<br />
[attachment=76] <br />
[attachment=77]  <br />
 <br />
Wie bereits angesprochen, erfolgt die Rückgabe als XML-Encoded String. Dieser String kann mittels tExtractXMLField noch in eine passendere Struktur überführt werden. Da die Eingabe mit einem festen PK versehen wurde kommt bei der Ausführung immer nur ein einziger Datensatz zurück. Möchte man aber mehrere Daten gelieferte bekommen, so langt eine Aktivierung der „Use multiple conditions“ Checkbox. Sollte bereits eine weitere PLZ erfasst worden sein, so liefert die Ausgabe dann alle Datensätze zurück.<br />
[attachment=78] <br />
 <br />
<br />
<span style="font-weight: bold;">XML String decoden (tExtractXMLField)</span><br />
<br />
Nachdem man den gelieferten String nicht als XML String weiterverarbeiten möchte, benötigt man eine Möglichkeit die gelieferten Informationen direkt zu decodieren. Hierzu wird zwischen „tMDMInput“ und „tLogRow“ noch die Komponente „tExtractXMLField“ platziert. <br />
[attachment=79] <br />
 <br />
Diese Komponente bekommt von tMDMInput einen einzigen String (XML_PLZ_ORT) und muss diese Information anschließend in ein passendes Schema überführen. Dieses Schema muss hierbei manuell umgesetzt werden.<br />
[attachment=80] <br />
 <br />
Unsere Rückgabe soll hier die Spalten PLZ und Ort umfassen. Das Schema muss auf beiden Seiten nicht 1:1 sein, sonder kann wie dem Beispiel abweichen. Nachdem das Schema definiert wurde, gilt es noch das Mapping zwischen den einzelnen Spalten und dem Encoded XML-String umzusetzen. Hierfür sind die Felder „Loop XPath query“ und der „XPath query“ Ausdruck im „Mapping“ auschlaggebend.<br />
[attachment=81] <br />
 <br />
Nach der Ausführung sollte das Ergebnis dann direkt als Rows/Columns vorliegen.<br />
[attachment=82] <br />
 <br />
<br />
<br />
<span style="font-weight: bold;">In die MDM Umgebung schreiben (tMDMOutput)</span><br />
<br />
Bis jetzt wurden Datensätze nur per Hand über die WebOberfläche erfasst. Sicherlich nicht der geeignete Weg wenn man obiges Szenario nutzen möchte um den kompletten deutschen Postleizahlenbestand zu hinterlegen. Die hierfür verwendeten Postleitzahlen/Städte können im Übrigen  unter dem Link <a href="http://www.manfrin-it.com/postleitzahlen/plz.html" target="_blank">http://www.manfrin-it.com/postleitzahlen/plz.html</a> heruntergeladen werden.<br />
Für die Bereitstellung von Daten innerhalb der MDM Umgebung bedient man sich der Komponente „tMDMOutput“. Diese Komponente wird in unserem Beispiel über verschiedene Komponenten an einen tFileInputExcel geknüpft.<br />
[attachment=83] <br />
 <br />
Ähnlich wie bei „tMDMInput“ möchte auch diese Komponente einige Parameter von uns erhalten. <br />
[attachment=84] <br />
 <br />
<span style="font-style: italic;">Schema Type</span><br />
Beschreibt das Schema welches von Der vorhergehenden Komponenten angeliefert wird. Für ein Schreiben wird allerdings nur ein einzige XML Feld benötigt. Dieses Feld enthält dann den kompletten XML Encoded Row-Eintrag.<br />
<br />
<span style="font-style: italic;">XML Field</span><br />
Hier wird ein Feld aus dem definierten Schema für die Eingabewerte angegeben. Die Übergabe erfolgt hierbei als XML Encoded String.<br />
<br />
<span style="font-style: italic;">URL</span><br />
Angabe der serverseitigen MDM-Url. Bei dieser URL handelt es sich nicht um die Standardadresse, sondern um einen definierten Talend WebService-Zugriffs Port.<br />
<br />
<span style="font-style: italic;">Username / Password</span><br />
Definition des Benutzernamens/-Password mit dem das Schreiben erfolgen soll. In dem Beispiel wird die Kombination „user“/“user“ verwendet.<br />
<br />
<span style="font-style: italic;">Universe</span><br />
Hierüber kann eine Versionierung durchgeführt werden. Dieses Feature ist allerdings Bestandteil der kommerziellen Variante und in unserem Fall obsolete.<br />
<br />
<span style="font-style: italic;">Data Model</span><br />
Hierbei handelt es sich um die definierte Entität (PLZ_ORT) die für das Schreiben verwendet werden soll! Bitte tunlichst auf Groß- und Kleinschreibung achten.<br />
<br />
<span style="font-style: italic;">Data Cluster</span><br />
Der interne Speicher in den geschrieben werden soll.<br />
<br />
<span style="font-style: italic;">Is Update</span><br />
Eine Aktivierung entscheidet wie in dem Falle eines bereits enthaltenen Keys umgegangen werden soll. Sollte ein Datensatz bereits vorhanden sein und „Is Update“ wurde aktiviert, dann erfolgt ein Update. Falls der Record noch nicht existent sein sollte, erfolgt automatisch ein Update.<br />
<br />
<span style="font-style: italic;">With Report</span><br />
Hiermit wird die Protokollierung aktiviert. Dieses Protokoll steht innerhalb der MDM-WebUmgebung im Bereich Journal wiederrum zu Verfügung. Eine Aktivierung kostet allerdings auch Performance.<br />
<br />
<span style="font-style: italic;">Die on Error</span><br />
Sollte ein Fehler beim Schreiben entstehen, so kann entschieden werden ob der gesamte Prozess abbricht oder nur ein Fehler geschrieben wird die Row protokolliert und der Job weiterläuft.<br />
<br />
Die Mapping-Komponente ist in diesem Fall zum einen für die Filterung von nicht relevanten Spalten und zum anderen für eine Umbenennung der Felder in die jeweilige Entitäts-Spalte notwendig.<br />
[attachment=85] <br />
 <br />
Wie bereits erwähnt sind die Feldnamen Case-Sensitive zu übergeben.<br />
Da MDM rein auf Basis von XML arbeitet, muss neben der Filterung und Umbenennung noch eine Kodierung der einzelnen Row’s in das jeweilige XML-Format erfolgen. Diese Kodierung erfolgt mittels der tWriteXMLField Komponente. Die nimmt den kompletten Input-Stream und überführt diesen anschließend in ein einziges Feld. Dabei werden die Spaltenname auch direkt bei der XML-Kodierung als Tag deklariert.<br />
[attachment=86] <br />
 <br />
Entscheidend ist hierbei auch, dass der Root-Eintrag „PLZ_ORT“ direkt als Entität verwendet wird. Bei einer Ausgabe der XML Kodierung erhält man an dieser Stelle folgenden Output (tLogRow):<br />
[attachment=87] <br />
 <br />
Im Prinzip 1:1 der Aufbau wie wenn das Lesen über tMDMInput erfolgt.<br />
Die Gesamtausführung kann an dieser Stelle etwas Zeit in Anspruch nehmen. Danach enthält unser MDM aber sämtliche Postleitzahlen innerhalb Deutschland.<br />
[attachment=88]  <br />
<br />
<span style="font-weight: bold;">Ausblick</span><br />
<br />
Sollten Sie bereits eine neuere Talend-Version verwenden, so werden Sie vielleicht feststellen dass der Prozessaufbau und die Einbindung von MDM einfacher geworden sind. Zu dem Zeitpunkt als dieser Artikel angefangen wurde, gab es allerdings noch keine Version 4. Ferner ist die Beschreibung auch eine Hilfe wie mit den einzelnen Verfahren umgegangen werden kann.<br />
<br />
Das nächste How-To wird dann das Thema Prozessausführung/Jobstart über den MDM Server beschreiben.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Importieren von Daten]]></title>
			<link>http://www.talendforum.de/thread-25.html</link>
			<pubDate>Wed, 14 Apr 2010 11:55:29 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-25.html</guid>
			<description><![CDATA[Hallo Zusammen,<br />
<br />
ich bin Neuling auf dem Gebiet und ich/wir wollen unsere Prozesse gerne durch talend vereinfachen und automatisieren. <br />
<br />
Was ich möchte:<br />
Zuerst einmal möchte ich ein .bz2-Archiv in talend importieren ... dieses soll zudem in regelmäßigen (am Besten automatisiert) Abständen aus dem Internet heruntergeladen werden. Aus dem entpackten Archiv ergeben sich einige csv und xml-Dateien, mit denen talend dann weiterarbeiten soll. <br />
Ist so etwas grundsätzlich möglich? Wenn ja mit welchen Talend-Begriffen sollte ich mich auseinandersetzen?  <br />
<br />
Liebe Grüße &amp; Vielen Dank!<br />
Alex]]></description>
			<content:encoded><![CDATA[Hallo Zusammen,<br />
<br />
ich bin Neuling auf dem Gebiet und ich/wir wollen unsere Prozesse gerne durch talend vereinfachen und automatisieren. <br />
<br />
Was ich möchte:<br />
Zuerst einmal möchte ich ein .bz2-Archiv in talend importieren ... dieses soll zudem in regelmäßigen (am Besten automatisiert) Abständen aus dem Internet heruntergeladen werden. Aus dem entpackten Archiv ergeben sich einige csv und xml-Dateien, mit denen talend dann weiterarbeiten soll. <br />
Ist so etwas grundsätzlich möglich? Wenn ja mit welchen Talend-Begriffen sollte ich mich auseinandersetzen?  <br />
<br />
Liebe Grüße &amp; Vielen Dank!<br />
Alex]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Version 4 verfügbar]]></title>
			<link>http://www.talendforum.de/thread-24.html</link>
			<pubDate>Wed, 07 Apr 2010 13:22:35 +0200</pubDate>
			<guid isPermaLink="false">http://www.talendforum.de/thread-24.html</guid>
			<description><![CDATA[Ab sofort kann die neue Version 4 von TOS/TOP/MDM unter <br />
<a href="http://www.talend.com/download.php" target="_blank">http://www.talend.com/download.php</a><br />
heruntergeladen werden.<br />
<br />
martin]]></description>
			<content:encoded><![CDATA[Ab sofort kann die neue Version 4 von TOS/TOP/MDM unter <br />
<a href="http://www.talend.com/download.php" target="_blank">http://www.talend.com/download.php</a><br />
heruntergeladen werden.<br />
<br />
martin]]></content:encoded>
		</item>
	</channel>
</rss>