Data Effectorの連結機能には、以下に示すいろいろな連結方法があります。これらを組み合わせることで、多種多様な業務要件に対応できます。
ジャーナルデータを大量のマスタデータと連結する場合、マシンのメモリを大量に使用してしまい、他のプロセスの動作に影響が出てしまうことがあります。連結機能で使用するメモリ量と作業ディレクトリ(一時ファイル)を設定することで、大量データの連結処理ができます。
メモリ量を指定することで、指定した一定のメモリ量の範囲で連結機能が動作します。
さらに、指定したメモリ量を超えると、自動的に一時ファイル使用に切り替わります。
これを、連結機能の一時ファイル処理と呼びます。
shunreplaceコマンド利用時は、replace用動作環境ファイルのWorkFolderパラメタと連結条件ファイルのMemorySizeパラメタを指定します。
C API 利用時は、AsisSetEnvReplace関数のWorkFolderパラメタとMemorySizeパラメタを指定します。
統合コマンド利用時は、統合定義ファイルの処理条件定義部:ReplaceのWorkFolderタグとMemoryタグで指定します。
参照
指定書式の詳細については、“リファレンス集”の以下を参照してください。
shunreplaceコマンド利用時は “ replace用動作環境ファイル”および“連結条件ファイル”
C API利用時は “AsisSetEnvReplace”
統合定義ファイル利用時は、“処理条件定義部:Replace”
CSV形式の入力ジャーナルファイルや入力マスタファイルには、見出し行(項目名)を持たない場合があります。このようなデータだけのファイルも、加工せずにData Effectorで連結できます。見出し行だけのファイルをスキーマ情報ファイルとして別に定義しておけば、データファイルと合わせて処理します。
shunreplaceコマンド利用時は、replace用動作環境ファイルのJnlFileパラメタとMstFileパラメタに、スキーマ情報ファイルを指定します。
C API利用時は、AsisInitReplace関数のJnlFileパラメタとMstFileパラメタに、スキーマ情報ファイルを指定します。
統合コマンド利用時は、統合定義ファイルの処理条件定義部:ReplaceのJnlFileタグとMstFileタグのSchemaFile属性に、スキーマ情報ファイルを指定します。
参照
スキーマ情報ファイルの内容については、“2.1.1 CSV形式の場合”を参照してください。
スキーマ情報ファイルの指定方法については、“リファレンス集”の以下を参照してください。
shunreplaceコマンド利用時は “ replace用動作環境ファイル”
C API利用時は “AsisInitReplace”
統合定義ファイル利用時は、 “処理条件定義部:Replace”
入力ジャーナルファイルの項目が、入力マスタファイルの項目と部分一致する場合があります(入力マスタファイルの項目が入力ジャーナルファイルの項目に含まれるなど)。
この場合は、連結条件で入力ジャーナルファイルの項目と入力マスタファイルの項目を部分一致させて連結し、結果をファイルに出力できます。
例として、入力ジャーナルファイルの項目に複数の内容(店舗名)が含まれる場合に、入力マスタファイルの項目とそれぞれ一致させる場合を示します。
入力ジャーナルファイル
"date","detail","trg" "20070528","空調点検","[品川店]" "20070529","空調点検","[横浜店][川崎店]" "20070530","空調点検","[新横浜店]" |
入力マスタファイル
"tenpo","name" "品川店","佐藤" "川崎店","山田" "横浜店","鈴木" "新横浜店","田中" |
連結条件
連結条件式 (Jcondition) | {join (Jnl,Mst,$trg = "[" + $tenpo+ "]", "LEFT OUTER") } |
リターン式 (OutputDef) | { $date 日付, $tenpo 店舗名, $name 担当者, $detail 作業内容 } |
連結結果
"日付","店舗名","担当者","作業内容" "20070528","品川店","佐藤","空調点検" "20070529","横浜店","鈴木","空調点検" "20070529","川崎店","山田","空調点検" "20070530","新横浜店","田中","空調点検" |
参考
入力ジャーナルファイルの日付が“20070529”のレコードは、入力マスタファイルの店舗名“横浜店”と“川崎店”の2つが含まれるため、それぞれに対する連結結果が出力されます。
入力ジャーナルファイルの項目の“新横浜店”と入力マスタファイルの“横浜店”を関連付けないようにするため、Jconditionパラメタに区切りとなる文字“[“および”]”を使用しています。
同一の入力ジャーナルファイルを連結して、別のレコードに存在する値を表示したい場合があります。これをセルフジョイン(自己結合)といいます。
この場合は、1つの入力ファイルをそれぞれ、入力ジャーナルファイルと入力マスタファイルとして定義して結合させます。連結条件には、“完全一致”を使います。
例えば、以下のような入力ジャーナルファイルにおいて、「上司がID表記で、誰か分からないので、名前を表示したい」という要件があったとします。
処理の概要を以下に示します。
図3.3 セルフジョインの概要
例を以下に示します。
入力ジャーナルファイルおよび入力マスタファイル
"ID","氏名","部署名","上司ID","生年月日","住所","備考" "101010","井上 一郎","1開発部","100001","19590101","静岡県・・・","部長" "151515","林田 高","1開発部","101010","19700515","静岡県・・・","課長" "123456","田中 刑事","1開発部","151515","19800805","静岡県・・・", "123657","高島 一郎","1開発部","151515","19550708","静岡県・・・", |
連結条件
入力項目定義 (ListDef) | { document(Journal){ $JID ID, $J氏名 氏名, $J部署 部署名, $J上司ID 上司ID }, document(Master){ $MID ID, $M氏名 氏名, $M部署 部署名, $M上司ID 上司ID } } |
連結条件式 (Jcondition) | { join (Journal,Master,$J上司ID == $MID, "LEFT OUTER") } |
リターン式 (OutputDef) | {$JID ID, $J氏名 氏名, $M氏名 上司氏名 } |
連結結果
ID | 氏名 | 上司氏名 |
---|---|---|
101010 | 井上 一郎 | |
151515 | 林田 高 | 井上 一郎 |
123456 | 田中 刑事 | 林田 高 |
123657 | 高島 一郎 | 林田 高 |
「空」がわかりやすいように、表形式にしています。
入力ジャーナルファイルのデータが2つ以上の項目で一意になる場合があります。
ここでは、2つの数値項目同士を比較したいので、セパレータとして「|」を使用します。
処理の概要を以下に示します。
ポイント
図3.4 複数の項目を突き合わせて連結する
例を以下に示します。
入力ジャーナルファイル1
"会社ID","従業員ID","出張日","交通費" "1011","A1010","20091101","7800" "1011","A1111","20091101","3400" |
入力ジャーナルファイル2
"会社ID","従業員ID","出張日","交通費" "101","1A1010","20091101","3400" "101","1A1211","20091101","23500" |
入力マスタファイル
"会社ID","会社名","従業員ID","氏名" "1011","AA株式会社","A1010","井上一郎" "1011","AA株式会社","A1111","高島一郎" "101","XX産業","1A1010","中川二郎" "101","XX産業","1A1211","中沢二郎" |
連結条件
入力項目定義 (ListDef) | { document(Journal){ $J会社ID 会社ID, $J従業員ID 従業員ID, $出張日 出張日, $交通費 交通費 }, document(Master){ $M会社ID 会社ID, $会社名 会社名, $M従業員ID 従業員ID, $氏名 氏名 } } |
連結条件式 (Jcondition) | { join (Journal,Master, concat($J会社ID;"|";$J従業員ID) == concat($M会社ID;"|";$M従業員ID), "INNER") } |
リターン式 (OutputDef) | {$会社名 会社名, $J従業員ID 従業員ID, $氏名 氏名, $交通費 交通費} |
連結結果
"会社名","従業員ID","氏名","交通費" "AA株式会社","A1010","井上一郎","7800" "AA株式会社","A1111","高島一郎","3400" "XX産業","1A1010","中川二郎","3400" "XX産業","1A1211","中沢二郎","23500" |
注意
以下のように、連結時の結合関係式で項目だけを並べると、データ値がつながり、別の値になってしまいます。必ず、連結キーに含まれない文字(セパレータ)を項目間に指定してください。
図3.5 間違った連結例
入力ジャーナルファイル
<Jnl> <Head> <Kbn>01</Kbn> <Number>1000</Number> </Head> <Body> <Meisai> <Code>AAA</Code> <Name>ブロックA</Name> <Value>1000</Value> </Meisai> </Body> <Tail> <Total>3000</Total> <Biko>備考:稟議番号 第4023号</Biko> </Tail> </Jnl> |
入力マスタファイル
<Mst1> <code>01</code> <name>設備</name> </Mst1> |
<Mst2> <code>1000</code> <name>第1開発部</name> </Mst2> |
連結条件ファイル
入力項目定義 (ListDef) | { document(Journal){ $Kbn /Jnl/Head/Kbn/text(), $Number /Jnl/Head/Number/text(), $Code /Jnl/Body/Meisai/Code/text(), $Name /Jnl/Body/Meisai/Name/text(), $Val /Jnl/Body/Meisai/Value/text() }, document(Master1){ $Kcode /Mst1/code/text(), $Kname /Mst1/name/text() }, document(Master2){ $Ncode /Mst2/code/text(), $Nname /Mst2/name/text() } } | |
連結条件式 (Jcondition) | {join (Journal, Master1, $Kbn == $Kcode, "LEFT OUTER"), join (Journal, Master2, $Number == $Ncode, "LEFT OUTER") } | |
リターン式 (OutputDef) | 出力形式 | {"HEAD{<?xml version="1.0" encoding="Shift-Jis" ?>\n<Jnl>} DATA{ <Body> <Kbn>%1%</Kbn> <Kname>%7%</Kname> <Number>%2%</Number> <Code>%3%</Code> <Name>%4%</Name> <Value>%5%</Value> </Body>\n} TAIL{</Jnl>}" |
リターン項目 | $Kbn,$Number,$Code,$Name,$Val,$Kcode,$Kname,$Ncode,$Nname} |
連結コマンドの出力例
<?xml version="1.0" encoding="Shift-Jis" ?> <Jnl> <Body> <Kbn>01</Kbn> <Kname>設備</Kname> <Number>1000</Number> <Code>AAA</Code> <Name>ブロックA</Name> <Value>1000</Value> </Body> </Jnl> |
ポイント
参照
出力形式とリターン項目の詳細については、“リファレンス集”の“連結機能のリターン式”を参照してください。
項目指定子と項目番号の詳細については、“リファレンス集”の“連結機能のリターン式”の“出力形式の構成要素”を参照してください。
入力ジャーナルファイルの繰返しノードを1レコードとしてファイルに出力できます。
例として、/Jnl/Body/Meisaiノードが1レコード中に繰り返し記述されており、/Jnl/Body/Meisaiノード単位に連結結果を出力することを想定します。繰返し項目のあるXMLを連結する場合、連結条件ファイルのListDefパラメタでは、レコードノード指定を使って定義します。
入力ジャーナルファイル
<Jnl> <Head> <Kbn>01</Kbn> <Number>1000</Number> </Head> <Body> <Meisai> <Code>AAA</Code> <Name>ブロックA</Name> <Value>1000</Value> </Meisai> <Meisai> <Code>BBB</Code> <Name>ブロックB</Name> <Value>1200</Value> </Meisai> <Meisai> <Code>CCC</Code> <Name>ブロックC</Name> <Value>800</Value> </Meisai> </Body> <Tail> <Total>3000</Total> <Biko>備考:稟議番号 第4023号</Biko> </Tail> </Jnl> |
入力マスタファイル
<Mst1> <code>01</code> <name>設備</name> </Mst1> |
<Mst2> <code>1000</code> <name>第1開発部</name> </Mst2> |
連結条件
入力項目定義 (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() } } |
連結条件式 (Jcondition) | {join (Journal, Master1, $Kbn == $Kcode, "LEFT OUTER"), join (Journal, Master2, $Number == $Ncode, "LEFT OUTER") } |
リターン式 (OutputDef) | { "HEAD{<?xml version="1.0" encoding="Shift-Jis" ?>\n<Jnl>\n} DATA{ <Body> <型番>%1%</型番> <型名>%7%</型名> <番号>%2%</番号> <コード>%3%</コード> <製品名>%4%</製品名> <価格>%5%</価格> </Body>\n} TAIL{</Jnl>}" $Kbn,$Number,$Code,$Name,$Val,$Kcode,$Kname,$Ncode,$Nname} |
ポイント
連結コマンドの出力例
以下のように、指定された繰返し項目数分のレコードを生成します。
<?xml version="1.0" encoding="Shift-Jis" ?> <Jnl> <Body> <型番>01</型番> <型名>設備</型名> <番号>1000</番号> <コード>AAA</コード> <製品名>ブロックA</製品名> <価格>1000</価格> </Body> <Body> <型番>01</型番> <型名>設備</型名> <番号>1000</番号> <コード>BBB</コード> <製品名>ブロックB</製品名> <価格>1200</価格> </Body> <Body> <型番>01</型番> <型名>設備</型名> <番号>1000</番号> <コード>CCC</コード> <製品名>ブロックC</製品名> <価格>800</価格> </Body> </Jnl> |
参照
レコードノード指定の詳細については、“リファレンス集”の“連結条件式”を参照してください。
入力ジャーナルファイルのデータで、連結条件に一致するデータが入力マスタファイルに存在しない場合、その入力ジャーナルファイルのデータは出力する必要がない場合があります。このような場合、INNER JOIN方式で連結します。この場合、連結条件式の結合型に“INNER”を指定します。
これに対して、連結条件に一致するデータが入力マスタファイルに存在しない場合でも、入力ジャーナルファイルのデータを出力するときは、LEFT OUTER JOIN方式で連結します。この場合、連結条件式の結合型に“LEFT OUTER”を指定します。
参照
連結条件式の詳細については、“リファレンス集”の“連結条件式”を参照してください。
例
商品番号と個数が記述された入力ジャーナルファイルと、商品番号に対する単価が記述された入力マスタファイルを連結し、商品についての小計(単価×個数)を計算します。
ここでは、入力マスタファイルに存在するデータだけ出力したいので、INNER JOIN方式で連結します。
入力ジャーナルファイル
"日付","番号","個数" "20100603","A03",3 "20100603","A01",24 "20100604","A04",1 "20100605","A01",60 |
入力マスタファイル
"コード","商品名","価格" "A01","鉛筆","60" "A02","赤鉛筆","100" "A03","消しゴム","80" |
連結条件
入力項目定義 (ListDef) | { document(Journal){ $Jdate 日付, $Jno 番号, $Jcnt 個数 }, document(Master){ $Mcode コード, $Mgname 商品名, $Mvalu 価格 } } |
連結条件式 (Jcondition) | { join (Journal, Master, $Jno == $Mcode ,"INNER") } |
リターン式 (OutputDef) | { $Jdate 日付, $Mgname 商品名, $Mvalu 単価, $Jcnt 個数, val($Mvalu) * val($Jcnt) 小計 } |
連結結果
"日付","商品名","単価","個数","小計" "20100603","消しゴム","80","3",240 "20100603","鉛筆","60","24",1440 "20100605","鉛筆","60","60",3600 |
"A04"は入力マスタファイルに無いため、出力されません。
ポイント
同じ条件で、さらにreplace用動作環境ファイルのExceptRecordFolderパラメタを指定すると、未連結のジャーナルレコードが出力されます。例を以下に示します。
連結条件式 (Jcondition) | { join (Jnl, Mst, $Jno == $Mcode ,"INNER") } |
リターン式 (OutputDef) | { $Jdate 日付, $Mgname 商品名, $Mvalu 単価, $Jcnt 個数, val($Mvalu) * val($Jcnt) 小計 } |
replace用動作環境ファイル | # 入力ジャーナルファイル JnlFile Journal "..\data\in.csv" # 出力ファイル OutFile "..\result\out.csv" ・・・ # 未連結のジャーナルレコード ExceptRecordFolder "..\exp1" |
\result\out.csv
"日付","商品名","単価","個数","小計" "20100603","消しゴム","80","3",240 "20100603","鉛筆","60","24",1440 "20100605","鉛筆","60","60",3600 |
\exp1\exp1_in.csv
"日付","番号","個数" "20100604","A04",1 |
コマンドの実行例は、“7.3 別のマスタで続けて連結する例”を参照してください。
連結条件に一致するデータが入力マスタファイルに存在しない場合、かつ入力マスタファイルのデータが入力ジャーナルファイルのデータに存在しない場合でも、すべてのデータを出力するときは、FULL OUTER JOIN方式で連結します。この場合、連結条件式の結合型に“FULL OUTER”を指定します。
例
商品番号と個数が記述された入力ジャーナルファイルと、商品番号に対する単価が記述された入力マスタファイルを連結し、商品についての小計(単価×個数)を計算します。
入力ジャーナルファイル
"日付","番号","個数" "20100603","A03",3 "20100603","A01",24 "20100604","A04",1 "20100605","A01",60 |
入力マスタファイル1
"コード","商品名","価格" "A01","鉛筆","60" "A02","赤鉛筆","100" "A03","消しゴム","80" |
入力マスタファイル2
"ID","在庫" "A01","7000" "A02","1000" "A03","2500" "A05","100" |
連結条件
入力項目定義 (ListDef) | { document(Journal){ $J日付 日付, $J番号 番号, $J個数 個数 }, document(Master1){ $Mコード コード, $M商品名 商品名, $M価格 価格 }, document(Master2){ $Mid ID, $M在庫 在庫 } } |
連結条件式 (Jcondition) | { join (Journal,Master1,$J番号 == $Mコード, "FULL OUTER"), join (Journal,Master2,$J番号 == $Mid, "FULL OUTER") } |
リターン式 (OutputDef) | {$J日付 日付, $M商品名 商品名, $M価格 単価, $J個数 個数, val($M価格) * val($J個数) 小計, $M在庫 在庫} |
連結結果
"日付","商品名","単価","個数","小計","在庫" "20100603","消しゴム","80","3",240,"2500" "20100603","鉛筆","60","24",1440,"7000" "20100604",,,"1",, ・・・(注1) "20100605","鉛筆","60","60",3600,"7000" ,"赤鉛筆","100",,, ・・・(注2) ,,,,,"1000" ・・・(注3) ,,,,,"100" ・・・(注3) |
注1) 未連結のジャーナルレコードをリターン式に合わせて出力しています。
注2) 入力マスタファイル1の未連結のマスタレコードを、リターン式に合わせて出力しています。
注3) 入力マスタファイル2の未連結のマスタレコードをリターン式に合わせて出力しています。
連結機能における仮想項目定義の述語関数としてis_joined関数を指定することで、結合できたかを確認し、処理を変えることができます。
出力レコードに、指定されたファイル略称(J略称,またはM略称)のレコードが含まれているかどうかを判定し、含まれている場合は真を、含まれていない場合は偽を返します。
is_joined関数は連結機能の仮想項目に指定できます。
例
入力ジャーナルファイルと入力マスタファイルが結合できたかどうかを表すフラグを出力します。
"key", "value" |
"mkey", "mname" |
連結条件式 | { |
連結条件ファイル | { } |
リターン式 | { |
key | name | value | フラグ |
---|---|---|---|
1001 | 東京 | 100 | 1 |
1002 | 神奈川 | 200 | 1 |
1004 | 400 | 0 |
「空」がわかりやすいように、表形式にしています。
ジャーナルファイルと入力マスタファイルが結合できたかどうかを表すフラグを出力します。
"key", "value" |
"mkey", "mname" |
連結条件式 | { |
連結条件ファイル | { |
リターン式 | { |
key | name | value | フラグ |
---|---|---|---|
1001 | 東京 | 100 | 1 |
1002 | 神奈川 | 200 | 1 |
1004 | 400 | 0 | |
1003 | 静岡 | 0 |
「空」がわかりやすいように、表形式にしています。
入力ジャーナルファイルと入力マスタファイルが結合できなかった場合、デフォルト値を使うこともできます。
"種別", "品名", "価格", "個数" |
"m種別", "m種別名", "m消費税率" |
連結条件式 | { |
連結条件ファイル | { } |
リターン式 | { |
"種別名", "品名", "消費税率", "小計" |