ページの先頭行へ戻る
Interstage Data Effector 導入・運用ガイド
Interstage

3.3.2 いろいろなデータ連結方法

Data Effectorの連結機能には、以下に示すいろいろな連結方法があります。これらを組み合わせることで、多種多様な業務要件に対応できます。

3.3.2.1 見出し行(項目名)のないCSVファイルを扱う場合

CSV形式の入力ジャーナルファイルや入力マスタファイルには、見出し行(項目名)を持たない場合があります。このようなデータだけのファイルも、加工せずにData Effectorで連結できます。見出し行だけのファイルをスキーマ情報ファイルとして別に定義しておけば、データファイルと合わせて処理します。

shunreplaceコマンド利用時は、replace用動作環境ファイルのJnlFileパラメタとMstFileパラメタに、スキーマ情報ファイルを指定します。
C API利用時は、AsisInitReplace関数のJnlFileパラメタとMstFileパラメタに、スキーマ情報ファイルを指定します。
統合コマンド利用時は、統合定義ファイルの処理条件定義部:ReplaceのJnlFileタグとMstFileタグのSchemaFile属性に、スキーマ情報ファイルを指定します。

参照

スキーマ情報ファイルの内容については、“2.1.1 CSV形式の場合”を参照してください。

スキーマ情報ファイルの指定方法については、以下を参照してください。


3.3.2.2 部分一致項目を連結する場合

入力ジャーナルファイルの項目が、入力マスタファイルの項目と部分一致する場合があります(入力マスタファイルの項目が入力ジャーナルファイルの項目に含まれるなど)。
この場合は、連結条件で入力ジャーナルファイルの項目と入力マスタファイルの項目を部分一致させて連結し、結果をファイルに出力できます。
例として、入力ジャーナルファイルの項目に複数の内容(店舗名)が含まれる場合に、入力マスタファイルの項目とそれぞれ一致させる場合を示します。


入力ジャーナルファイル

"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パラメタに区切りとなる文字“[“および”]”を使用しています。


3.3.2.3 同じジャーナルファイル同士を連結する

同一の入力ジャーナルファイルを連結して、別のレコードに存在する値を表示したい場合があります。これをセルフジョイン(自己結合)といいます。
この場合は、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

高島 一郎

林田 高


3.3.2.4 複数の項目を突き合わせて連結する場合

入力ジャーナルファイルのデータが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 間違った連結例



3.3.2.5 繰返し項目のあるXML文書を連結する場合

入力ジャーナルファイルの繰返しノードを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")
}

以下のように、指定された繰り返し項目数分のレコードを生成します。


連結コマンドの出力例


3.3.2.6 入力マスタファイルに合致したジャーナルデータだけを出力する場合

Data Effectorの連結機能の結合方法には、以下の2つがあります。

INNER JOIN方式

入力ジャーナルファイルのデータが、入力マスタファイルに存在しない場合、そのデータを出力しない。

LEFT OUTER JOIN方式

入力ジャーナルファイルのデータが、入力マスタファイルに存在しない場合、そのデータは空で出力する。

入力ジャーナルファイルのデータで、連結条件に一致するデータが入力マスタファイルに存在しない場合、その入力ジャーナルファイルのデータは出力する必要がない場合があります。このような場合、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