Talendのこんな時どうすればいいの？をまとめてみました

#はじめに
この記事は、私がこっそり書いているTalendブログ記事のTipsを、逆引きな感じでまとめたものです。

Talendでジョブを組んでいたんだれど...これどうやって実装するのよ！？
といった悩みから、解決方法を逆引きする用途を想定して書いています。

そこそこ端折っていますので、詳しく知りたい場合などは各シーンごとに貼られているリンク先の記事でも参考にしてみてください。

#csvデータやDB(のテーブル)を扱いたい。
[Qiitaで書いています。](http://qiita.com/hidepy/items/909e1fd689fa9937ae28)

#スキーマ定義(項目)を手で打ってたら日が暮れた...一瞬でスキーマ定義する方法はないの！？

[こちら](http://tasokori.net/webapps/convertTalendXML/)に項目名からTalendで取り込めるXMLに変換してくれるツールがあります。
これを使用して、項目変換⇒Talendのスキーマ編集画面でXMLインポートすれば、ものの数秒で何件のスキーマ定義でも行えます。
![alt](http://tasokori.net/wp/wp-content/uploads/2016/12/talend_convxml03.png)

[参考](http://tasokori.net/%E3%80%90talend%E3%80%91%E6%94%B9%E8%A1%8C%E5%8C%BA%E5%88%87%E3%82%8A%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92talend%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%9E%E5%AE%9A%E7%BE%A9xml%E3%81%AB%E5%A4%89/)


#開発画面の下側に見たいタブ無いんだけど！(JobとかContextsとComponentとか...)
Window-> Show viewと進む
!![qiita_talend01.png](https://qiita-image-store.s3.amazonaws.com/0/145371/f23d6f0f-2ba6-fc08-a2ff-6b42cb8c7172.png)

表示されたShow Viewウインドウで必要なものを選択してOK押下
![qiita_talend02.png](https://qiita-image-store.s3.amazonaws.com/0/145371/165a939c-de28-eb49-dbd5-90c05c93fd45.png)




#tMap内でif文が書けない...
ifで値のセット内容を変えたいんだけどエラーになってしまう...値がxxの時yyをセットする、ってどうやって書けばいいの？
↓
三項演算子(条件演算子)を使います。
`is_hungry ? "yes" : "no"`

#エラーが出たんだけど、どうすればいい？
##コンパイルエラーの場合
1. ジョブデザイナの左下にある「デザイナ」(Designer)タブを「コード」(Code)タブに切り替えて、赤字になっているエラー行を探す。
2. エラー行のコードを見て、エラーを出しているコンポーネントの該当処理を「デザイナ」(Designer)タブに切り替えてから直す

[参考](http://tasokori.net/%e3%80%90talend%e3%80%91%e3%82%b8%e3%83%a7%e3%83%96%e5%ae%9f%e8%a1%8c%e6%99%82%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%ae%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e6%96%b9%e6%b3%95%e3%82%b3%e3%83%b3%e3%83%91/)

##ジョブ実行中エラーの場合
1. エラーを出しているコンポーネントの物理名を知る("tMap_1"などの名称)
2. デバッグ実行(「実行」タブ⇒「デバッグ」(Debug)⇒「Javaデバッグ」(Java Debug))
3. 1.で得たコンポーネント物理名でJavaコードのコンポーネント処理開始行を検索/特定する
4. ブレークポイントを張る. 落ちそうな処理にあたりを付けてブレークポイントをその先もいくつか張っておく
5. エラー落ちした部分を特定する
6. デザイナでエラー落ちした処理を修正する

[参考](http://tasokori.net/%e3%80%90talend%e3%80%91%e3%82%b8%e3%83%a7%e3%83%96%e5%ae%9f%e8%a1%8c%e6%99%82%e3%82%a8%e3%83%a9%e3%83%bc%e3%81%ae%e3%83%87%e3%83%90%e3%83%83%e3%82%b0%e6%96%b9%e6%b3%95%e5%ae%9f%e8%a1%8c%e6%99%82/)


#グローバル変数ってないの？どうやって使うの？

##contextを使用する
ジョブ内で共通のコンテキスト定義は、下のContextsで定義できます。
![alt](http://tasokori.net/wp/wp-content/uploads/2016/09/talend_context1-1024x638.png)

プロジェクト内で共通のコンテキスト定義は、左のリポジトリ⇒Contextsで定義できます。
![alt](http://tasokori.net/wp/wp-content/uploads/2016/09/talend_context4.png)

何れの場合も、context. を付与することでjavaコードや、tMapなどで参照することができます。

##globalMapを使用する

globalMapは、Talendジョブで必ず定義されるグローバルなハッシュオブジェクトです。

###値格納
`globalMap.put(key, val)`

![alt](http://tasokori.net/wp/wp-content/uploads/2016/09/gbl2.png)

###値取り出し
`globalMap.get(key)`

![alt](http://tasokori.net/wp/wp-content/uploads/2016/09/gbl5.png)

[参考](http://tasokori.net/%E3%80%90talend-open-studio%E3%80%91%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%86globalmap%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)

#連番を振りたいんですけど...とあるグループごとに

Talendのsequenceを使う。

`Numeric.sequence(シーケンスを振るグループで共通の文字列, 初期値, 増える幅)`

という感じでパラメータを与えます。

出力結果は下記のような感じです。2カラム目がグループごと(例では1カラム目のIDごと)に連番が振られています。
![alt](http://tasokori.net/wp/wp-content/uploads/2016/09/talend_seq8.png)

[参考](http://tasokori.net/%E3%80%90talend%E3%80%91sequence%E3%81%A7%E9%80%A3%E7%95%AA%E3%82%92%E6%8C%AF%E3%82%8B%E6%96%B9%E6%B3%95%E3%80%82%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%94%E3%81%A8%E3%81%AE%E6%8E%A1%E7%95%AA/)


#何件処理したのかを知りたい。
`(Integer)globalMap.get("tXXXX_N_NB_LINE")`

殆どのコンポーネントは、rowを何件処理したのかを、[globalMapのコンポーネント物理名]_NB_LINE というキーで保持していますので、それを利用します。

[参考](http://tasokori.net/%E3%80%90talend-open-studio%E3%80%91%E5%87%A6%E7%90%86%E4%BB%B6%E6%95%B0%E8%A1%8C%E6%95%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/)

#row(行)をx倍したいんだが。
##1.row-> tFlowToIterate-> tRowGenerator(x行作る)

##2.row-> tJavaFlex(x回ループ)

ストレートに行をx倍する方法は無いようですので、rowをループ系コンポーネントに繋いでx倍します。

![alt](http://tasokori.net/wp/wp-content/uploads/2016/10/talend_xtimes1-1.png)


[参考](http://tasokori.net/%E3%80%90talend%E3%80%91%E8%A1%8Crow%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92x%E5%80%8D%E3%81%AB%E5%A2%97%E3%82%84%E3%81%992%E3%81%A4%E3%81%AE%E6%96%B9%E6%B3%95/)

#SAP(ERPパッケージ)と連携したい...Talendじゃ無理かな？
##SAPから値を取得
tSAPInputコンポーネントで、RFC_READ_TABLEすれば多くのテーブルの値を取得してTalendで扱えます。
![alt](http://tasokori.net/wp/wp-content/uploads/2016/10/talend_sap_04.png)

[参考](http://tasokori.net/%E3%80%90talend%E3%80%91sap%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%97rfc_read_table%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/)

##SAPの関数(BAPI)を呼び出したい
取得側と同じく、tSAPInputコンポーネントでBAPIコールできます。
ただし、伝票起票BAPIなどは入力パラメータがテーブル構造になる場合は、事前にglobalMapにListとしてputしておかないといけません。
![alt](http://tasokori.net/wp/wp-content/uploads/2016/10/talend_bapi6.png)

[参考](http://tasokori.net/%E3%80%90talend%E3%80%91sap%E3%81%AEbapi%E3%82%92%E3%82%B3%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)



#Javaのコードを書きたい部分があるんだけど！

tJava, tJavaRow, tJavaFlex コンポーネントを使用すればok

[参考](http://tasokori.net/%E3%80%90talend-open-studio%E3%80%91tjavatjavarowtjavaflex%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%BE%E3%81%A8%E3%82%81/)


#「This workspace is already in use(ワークスペースが使用中です。同一ワークスペースで複数のStudioは起動出来ません。)」のエラーでTalendが起動できない！
##ケース1. ガチで2重起動しようとしている
これはNGなんで、諦めます。
##ケース2. 確実にTalendは起動していないし、タスクマネージャのプロセスにもいない。のに開けない(Talend起動中にPCフリーズなどで強制終了した場合などに起こりがち)
1. 開けないWorkspaceルートへ
2. workspace/.metadataへ
3. .lockファイルを削除(念のためどこかにコピーしておくと安心)

とすることでワークスペースが解放されます。