Data Effectorの連結機能には、以下に示すいろいろな連結方法があります。これらを組み合わせることで、多種多様な業務要件に対応できます。
CSV形式の入力ジャーナルファイルや入力マスタファイルには、見出し行(項目名)を持たない場合があります。このようなデータだけのファイルも、加工せずにData Effectorで連結できます。見出し行だけのファイルをスキーマ情報ファイルとして別に定義しておけば、データファイルと合わせて処理します。
shunreplaceコマンド利用時は、replace用動作環境ファイルのJnlFileパラメタとMstFileパラメタに、スキーマ情報ファイルを指定します。
C API利用時は、AsisInitReplace関数のJnlFileパラメタとMstFileパラメタに、スキーマ情報ファイルを指定します。
統合コマンド利用時は、統合定義ファイルの処理条件定義部:ReplaceのJnlFileタグとMstFileタグのSchemaFile属性に、スキーマ情報ファイルを指定します。
参照
スキーマ情報ファイルの内容については、“2.1.1 CSV形式の場合”を参照してください。
スキーマ情報ファイルの指定方法については、以下を参照してください。
shunreplaceコマンド利用時は“D.2.1 replace用動作環境ファイル”
C API利用時は“E.2.2 AsisInitReplace”
統合定義ファイル利用時は、“F.6.1 Replace”
入力ジャーナルファイルの項目が、入力マスタファイルの項目と部分一致する場合があります(入力マスタファイルの項目が入力ジャーナルファイルの項目に含まれるなど)。
この場合は、連結条件で入力ジャーナルファイルの項目と入力マスタファイルの項目を部分一致させて連結し、結果をファイルに出力できます。
例として、入力ジャーナルファイルの項目に複数の内容(店舗名)が含まれる場合に、入力マスタファイルの項目とそれぞれ一致させる場合を示します。
入力ジャーナルファイル
"date","detail","trg" "20070528","空調点検","[品川店]" "20070529","空調点検","[横浜店][川崎店]" "20070530","空調点検","[新横浜店]" |
入力マスタファイル
"tenpo","name" "品川店","佐藤" "川崎店","山田" "横浜店","鈴木" "新横浜店","田中" |
連結条件
連結条件式 | {join (Jnl,Mst,$trg = "[" + $tenpo+ "]", "LEFT") } |
リターン式 | { $date 日付, $tenpo 店舗名, $name 担当者, $detail 作業内容 } |
連結結果
"日付","店舗名","担当者","作業内容" "20070528","品川店","佐藤","空調点検" "20070529","横浜店","鈴木","空調点検" "20070529","川崎店","山田","空調点検" "20070530","新横浜店","田中","空調点検" |
参考
入力ジャーナルファイルの日付が“20070529”のレコードは、入力マスタファイルの店舗名“横浜店”と“川崎店”の2つが含まれるため、それぞれに対する連結結果が出力されます。
入力ジャーナルファイルの項目の“新横浜店”と入力マスタファイルの“横浜店”を関連付けないようにするため、Jconditionパラメタに区切りとなる文字“[“および”]”を使用しています。
同一の入力ジャーナルファイルを連結して、別のレコードに存在する値を表示したい場合があります。これをセルフジョイン(自己結合)といいます。
この場合は、1つの入力ファイルをそれぞれ、入力ジャーナルファイルと入力マスタファイルとして定義して結合させます。連結条件には、“完全一致”を使います。
例えば、以下のような入力ジャーナルファイルにおいて、「上司がID表記で、誰か分からないので、名前を表示したい」という要件があったとします。
処理の概要を以下に示します。
図3.4 セルフジョインの概要
例を以下に示します。
入力ジャーナルファイルおよび入力マスタファイル
ID | 氏名 | 部署名 | 上司ID | 生年月日 | 住所 | 備考 |
---|---|---|---|---|---|---|
101010 | 井上 一郎 | 1開発部 | 100001 | 19590101 | 静岡県・・・ | 部長 |
151515 | 林田 高 | 1開発部 | 101010 | 19700515 | 静岡県・・・ | 課長 |
123456 | 田中 刑事 | 1開発部 | 151515 | 19800805 | 静岡県・・・ | |
123657 | 高島 一郎 | 1開発部 | 151515 | 19550708 | 静岡県・・・ |
連結条件
入力項目定義 | { document(Journal){ $JID ID, $J氏名 氏名, $J部署 部署名, $J上司ID 上司ID }, document(Master){ $MID ID, $M氏名 氏名, $M部署 部署名, $M上司ID 上司ID } } |
連結条件式 | { join (Journal,Master,$J上司ID == $MID, "LEFT OUTER") } |
リターン式 | {$JID ID, $J氏名 氏名, $M氏名 上司氏名 } |
連結結果
ID | 氏名 | 上司氏名 |
---|---|---|
101010 | 井上 一郎 | |
151515 | 林田 高 | 井上 一郎 |
123456 | 田中 刑事 | 林田 高 |
123657 | 高島 一郎 | 林田 高 |
入力ジャーナルファイルのデータが2つ以上の項目で一意になる場合があります。
ここでは、2つの項目同士を比較したいので、セパレータとして「|」を使用します。
処理の概要を以下に示します。
図3.5 複数の項目を突き合わせて連結する
例を以下に示します。
入力ジャーナルファイル1
会社ID | 従業員ID | 出張日 | 交通費 |
---|---|---|---|
1011 | A1010 | 20091101 | 7800 |
1011 | A1111 | 20091101 | 3400 |
入力ジャーナルファイル2
会社ID | 従業員ID | 出張日 | 交通費 |
---|---|---|---|
10 | A1010 | 20091101 | 3400 |
10 | A1211 | 20091101 | 23500 |
入力マスタファイル
会社ID | 会社名 | 従業員ID | 氏名 |
---|---|---|---|
1011 | 富士通株式会社 | A1010 | 鈴木孝 |
1011 | 富士通株式会社 | A1111 | 田中孝 |
10 | 富士川電気 | A1010 | 中川仁 |
10 | 富士川電気 | A1211 | 中沢正 |
連結条件
入力項目定義 | { document(Journal){ $J会社ID 会社ID, $J従業員ID 従業員ID, $出張日 出張日, $交通費 交通費 }, document(Master){ $M会社ID 会社ID, $会社名 会社名, $M従業員ID 従業員ID, $氏名 氏名 } } |
連結条件式 | { join (Journal,Master,$J会社ID + "|" + $J従業員ID == $M会社ID + "|" + $M従業員ID, "INNER") } |
リターン式 | {$会社名 会社名, $J従業員ID 従業員ID, $氏名 氏名, $交通費 交通費} |
連結結果
会社名 | 従業員ID | 氏名 | 交通費 |
---|---|---|---|
富士通株式会社 | A1010 | 鈴木孝 | 7800 |
富士通株式会社 | A1111 | 田中孝 | 3400 |
富士川電気 | A1010 | 中川仁 | 3400 |
富士川電気 | A1211 | 中沢正 | 23500 |
注意
以下のように、連結時の結合関係式で項目だけを並べると、データ値がつながり、別の値になってしまいます。必ず、連結キーに含まれない文字(セパレータ)を項目間に指定してください。
図3.6 間違った連結例
入力ジャーナルファイルの繰返しノードを1レコードとしてファイルに出力できます。
例として、/Jnl/Body/Meisaiノードが1レコード中に繰り返し記述されており、/Jnl/Body/Meisaiノード単位に連結結果を出力することを想定します。
入力ジャーナルファイル
入力マスタファイル
連結条件ファイル
InFileType XML ListDef { document(Journal)/Jnl/Body/Meisai{ $Kbn (../../Head/Kbn/text())[1], $Number (../../Head/Number/text())[1], $Code (./Code/text())[1], $Name (./Name/text())[1], $Val (./Value/text())[1] }, document(Master1){ $Kcode /Mst1/code/text(), $Kname /Mst1/name/text() }, document(Master2){ $Ncode /Mst2/code/text(), $Nname /Mst2/name/text() } } OutFileType CSV #リターン式 OutputDef {$Kbn,$Kname,$Number,$Nname,$Code,$Name,$Val} #連結条件式 Jcondition {join (Journal, Master1, $Kbn == $Kcode, "LEFT"), join (Journal, Master2, $Number == $Ncode, "LEFT") } |
以下のように、指定された繰り返し項目数分のレコードを生成します。
連結コマンドの出力例
Data Effectorの連結機能の結合方法には、以下の2つがあります。
入力ジャーナルファイルのデータで、連結条件に一致するデータが入力マスタファイルに存在しない場合、その入力ジャーナルファイルのデータは出力する必要がない場合があります。このような場合、INNER JOIN方式で連結します。この場合、連結条件式の結合型に“INNER”を指定します。
これに対して、連結条件に一致するデータが入力マスタファイルに存在しない場合でも、入力ジャーナルファイルのデータを出力する場合は、LEFT OUTER JOIN方式で連結します。この場合、連結条件式の結合型に“LEFT OUTER”を指定します。
参照
連結条件式の詳細については、“A.3 連結条件式”を参照してください。
例
商品番号と個数が記述された入力ジャーナルファイルと、商品番号に対する単価が記述された入力マスタファイルを連結し、商品についての小計(単価×個数)を計算します。
ここでは、入力マスタファイルに存在するデータだけ出力したいので、INNER JOIN方式で連結します。
入力ジャーナルファイル
"date","No","cnt" "20070603","A03",3 "20070603","A01",24 "20070604","A04",1 "20070605","A01",60 |
入力マスタファイル
"code","gname","valu" "A01","鉛筆","60" "A02","赤鉛筆","100" "A03","消しゴム","80" |
連結条件
ListDef | { document(Journal){ $Jdate date, $Jno No, $Jcnt cnt }, document(Master){ $Mcode code, $Mgname gname, $Mvalu valu } } |
連結条件式 | { join (Jnl, Mst, $Jno == $Mcode ,"INNER") } |
リターン式 | { $Jdate 日付, $Mgname 商品名, $Mvalu 単価, $Jcnt 個数, val($Mvalu) * val($Jcnt) 小計 } |
連結結果
"日付","商品名","単価","個数","小計" "20070603","消しゴム","80","3",240 "20070603","鉛筆","60","24",1440 "20070605","鉛筆","60","60",3600 |
"A04"はマスタファイルに無いため、出力されません。
参考
同じデータをLEFT OUTER JOIN方式で連結した場合、以下の結果になります。
連結条件式 | { join (Jnl, Mst, $Jno == $Mcode ,"INNER") } |
リターン式 | { $Jdate 日付, $Mgname 商品名, $Mvalu 単価, $Jcnt 個数, val($Mvalu) * val($Jcnt) 小計 } |
"日付","商品名","単価","個数","小計" "20070603","消しゴム","80","3",240 "20070603","鉛筆","60","24",1440 "20070604",,,"1", "20070605","鉛筆","60","60",3600 |