インポート処理のしくみ(フル機能版)

設計者

概要

インポート処理では、インポートデータを取り込む前に、対象領域のデータがクリアされます。すなわちインポート処理の全体は以下のようになります:

  1. インポート先の画面上で、インポート対象領域に含まれるセルの値をクリアする。

  2. インポート元ファイルのデータを取り込んで画面のデータに反映する。

上記 2 のステップで画面に表示されているデータは変更されますが、その変更はデータベースに保存されたわけではありません。保存するには通常のデータ変更時と同様、入力内容を 保存する ボタンを押下する必要があります。

各ステップでの処理の詳細を以下で御説明します。

インポート対象領域のクリア

最初のステップでは、フォームで作成される画面上で、インポート対象領域に含まれるセルの値がクリアされます。対象は以下の条件に合致したセルです:

  • インポート先の画面上で、入力可能なセルであること(画面上に現に表示されているセルに限定されません。縦軸上の選択ボックスで項目を選択すれば表示され、入力可能となるセルも含みます)。

  • インポート仕様の対象元帳欄で指定された「対象元帳」のセルであること。ただし、対象元帳欄で対象が指定されていない場合は、当該フォームでデータ入力可能なすべての元帳のセルが対象となります。

インポート元ファイルからのデータ取り込み

二番目のステップでは、インポート元ファイルから取り込んだ 1 行のデータをもとにコード変換やコードの結合を行い、インポート対象元帳で使用されているディメンションにラベルによって対応付けられたフィールドの値(変換後値)をキーとする元帳セルに値を書き込む(あるいは読み飛ばす)処理を、インポート元ファイルのすべての行について繰り返します。ただし、インポート対象ファイルの先頭にインポート対象としたくない行が含まれている場合、インポート仕様の「ヘッダ読み飛ばし行数」にその行数を指定して読み飛ばすことが出来ます。

インポート仕様において複数の値フィールドが指定されている場合、各行について、かつ、値フィールドそれぞれについて上記処理を繰り返します(各値フィールドの値を別々の元帳セルに書き込むための設定方法について、後述する「値フィールドが複数ある場合の留意事項」をご参照ください)。

なお、データ取り込み処理は、行の並び順及び 1 行内での値フィールドの並び順に実行されます。元帳セルが数値属性である場合、同一元帳セルに対する書き込み値は累積され、非数値セルである場合、最後に書き込まれた値が有効になります。 以下では、例を用いて 1 行・1 値フィールド分の処理の内容をご説明します:

設例

(1)インポートデータのレイアウトと内容

事業部・部門・勘定科目別の月別費用発生額データをインポートすると想定します。キーフィールドとして、年度・月・事業部・部門・勘定科目が並び、そのあとに値フィールドである「金額」があります。処理の解説で使用するデータを以下に示します:

(年度) (月) (事業部) (部門) (勘定科目)  (金額)
2016, 05 10,  111-22, 12345,  1000

※ 以下では、「金額」はデータ取得元フィールドとして定義されていないものとして説明します。すなち金額は「 暗黙の値フィールド 」となります。金額を明示的に値フィールドとして定義しても下記の説明の本質に違いはありません(金額フィールドがデータ取得元フィールドのひとつになるだけです)。

(2)インポート先元帳

インポート先元帳のラベルは "EXPENSE" です。この元帳を構成するディメンションごとに、インポート時のメンバラベル設定要件を以下に示します:

勘定科目(#ACCOUNT

インポートデータの「勘定科目」("12345")をそのままメンバラベルとします。

増減科目(#CHANGE

インポートデータのコードとは関係なく、固定値 "#NONE" を設定します。

会計年度(#FY

インポートデータの「年度」の値("2008" など)をそのままメンバラベルとします。

相対期間

インポートデータの「月」と対応しますが、月が "04" なら "M1", "05" なら "M2" といった具合に変換が必要です。

シナリオ

インポートデータのコードとは関係なく、固定値 "ACTUAL" を設定します。

表示形式(#VIEW

インポートデータのコードとは関係なく、固定値 "PER" を設定します。

事業部門 (DIV_DEPT

インポートデータの「事業部」に「部門」の上 3 桁をつなぎ、頭に "D" を付けます("D10111" など)

設例にもとづく処理の解説

Step 1. データ取得元フィールドへの値セット

インポートデータを 1 件読み込むと、まず、インポート仕様で定義された「データ取得元フィールド」に、インポートデータの各キーフィールドの値がセットされます。なお、各フィールドには「変換前値」と「変換後値」という2つの値を持つエリアがあり、このとき値が設定されるのは、「変換前値」の方です。

importing step1

フィールドラベルの付け方についてご説明しておきます。
「変換後値」がそのまま、対象元帳で使用されているディメンションのメンバラベルとなるフィールド については、そのディメンションのラベルをフィールドラベルとしてください。この例でいえば、年度(#FY)、相対期間(#PERIOD)、勘定科目(#ACCOUNT)がそれにあたります。

それ以外のフィールドについてはディメンションラベルとは異なるフィールドラベルを付けてください。この例では、事業部(DIV)と部門(DEPT)がそうです。

Step 2. コード変換(データ取得元フィールドでの)

次のステップでは、データ取得元フィールド各々の「変換前値」に対して変換テーブルが適用され、「変換後値」が求められます。変換テーブルが指定されていないフィールドでは、変換前値がそのまま変換後値となります。

importing step2

この例では、フィールド #PERIODDEPT について、変換テーブル TBL_PERTBL_DEPT がそれぞれ適用されています。それぞれの内容は以下のとおりです:

期間変換テーブル(TBL_PER

04->M1, 05->M2, …, 01->M10 … といった具合に、月と期間ラベルの組を 12 件登録しています("04->M1" とは、変換前コードが "04"、変換先コードが "M1" の行を意味します)。

部門変換テーブル(TBL_DEPT

変換ルールが 1 行だけ登録されています。変換前コードは "???*"、変換先コードは "???" です。これで、変換前コードの上 3 桁を切り出すことができます。 変換テーブルの項 の「ワイルドカード」および「変換ルールの指定例」も合わせてご参照ください。

Step 3. 算出フィールドの「変換前値」の算出

Step 2 までの処理ではディメンション #SCENARIO, #VIEW, #CHANGE および DIV_DEPT に関するメンバラベルが決定されません。そこで、インポート仕様ではこれらのディメンションラベルを付した「算出フィールド」を設けておき、メンバラベルを決定できるようにします。

それぞれのフィールドの「算出式」の欄に適切な式を設定しておくとその式に従って、各フィールドの「変換前値」が求められます。

importing step3

算出フィールドの変換前値は、上図の #SCENARO, #VIEW, #CHANGE のように固定値として設定しておくこともできますし、DIV_DEPT フィールドのように他のフィールドの値から算出することもできます。

上図でフィールド DIV_DEPT に指定された式 DIV & DEPT はフィールド DIVDEPT変換後値 を結合することを意味しています。式で参照されるのは必ず 変換後値 である点にご留意下さい。

Step 4. コード変換(算出フィールドでの)

さらに算出フィールドの変換前値に変換テーブルが適用され、「変換後値」が求められます。変換テーブルが指定されていないフィールドでは、変換前値がそのまま変換後値となります。この処理は、対象が算出フィールドである点以外は、Step 2 とまったく同じです。

この例では、フィールド DIV_DEPT について、変換テーブル TBL_DIVDEP が適用されています。この変換テーブルの内容は以下のとおりです:

  • 事業部門変換テーブル(TBL_DIVDEP) ・・・ 変換ルールが 1 行だけ登録されています。変換前コードは *、変換先コードは D* です。これで、変換前コードの頭に D を付した値が変換後コードとなります。

importing step4

この例では、算出式で他の算出フィールドを参照しているフィールドがないので、これですべてのフィールドの「変換後値」欄が埋まりました。他の算出フィールドを参照する算出フィールドがある場合には、すべてのフィールドについて「変換後値」欄が埋まるまで、Step 3 と Step 4 が繰り返されます。なお、算出フィールド間の循環参照を引き起こすような式は許されません(フォーム登録時にエラーチェックされます)。

Step 5. セルへの書き込み
importing step5

Step 4 までで、すべてのフィールドの「変換後値」欄が埋まりました。最後のステップとして、対象元帳のディメンションと同じラベルをもつフィールドの「変換後値」をメンバラベルとみなして、対象元帳(インポート仕様で指定)のセル値を、値フィールドの変換後で更新します。

同じメンバラベルのセルに対して複数のインポートデータがある場合、金額・数値は加算され、非数値属性のセルでは最後の値で書き換えられます。

インポート処理ログ

上述したインポート処理の過程は処理ログとしてファイルに出力されます。ファイル名は自動的に付されます。処理ログには、全フィールドの変換前値・変換後値、金額、に加えて、後述する例外処理の内容を示すメッセージなどが含まれます。

詳細は文書「 インポート処理ログ 」をご参照ください。

例外処理

例外処理には、意図した例外処理と意図しない例外処理(エラー)があります。いずれの場合もデータはセルに書き込まれません。

(1)意図した例外処理

算出式の計算結果、あるいは、変換テーブルでの変換結果が #IGNORE という値(文字列)になると、その行のその値フィールドのデータは読みとばされ、元帳への書き込み対象外となります。 変換テーブルの説明 もご参照ください。

(2)意図しない例外処理(エラー処理)

コード変換誤り、対象元帳のディメンションと同じラベルをもつフィールドの値がメンバラベルとして不適切、インポート範囲外のデータが(読み飛ばし対象とならずに)含まれているといった場合です。

上記の2つの例外処理のうち、「意図した例外処理」が優先されます。すなわち、意図した例外処理によって読み飛ばし対象とされた行は、コード変換誤り等、意図しない例外処理の条件に合致したとしてもエラーとなりません。

いずれの場合にも、インポート処理ログに、メッセージと、例外の重大度を表すコード(#SEVERITY)が表示されます。上記(1)の場合、#SEVERITY の値は INFO となり、(2)の場合は重大度に応じて WARNING または ERROR となります。

値フィールドが複数ある場合の留意事項

値フィールドが複数あるデータを取り込む場合、通常は、それらすべての値フィールドの値を単一の元帳セルに書き込んで累積するのではなく、別々の元帳セルに書き込みたいと思われます。

  • 月別に値フィールドを設け、各フィールドの値を別々の月(相対期間)をキーとする元帳セルに書き込みたい。

  • 売上数量と売上金額という、2つの値フィールドを設け、それぞれに対応する勘定科目をキーとする元帳セルにそれぞれのフィールドの値を書き込みたい。

このような要件に対応するために、値フィールドに対して「値フィールドキー」を指定できる仕組みになっています。例えば月別の値フィールドを設けた場合には、各値フィールドの「値フィールドキー」欄に、M1 , M2 … といった相対期間のラベルを設定しておきます。それとともに、相対期間ディメンションと同じラベル(#PERIOD)を持つ算出フィールドを設け、その算出式欄に「@field_key」と記述します。

@field_key 関数は、その時々の処理対象である値フィールドの値フィールドキーを取得するための関数です。データ取り込み処理は、前述のとおり、行の並び順及び1行内での値フィールドの並び順に実行され、算出式の評価もその都度行われます。したがって(値フィールドキー M1 が指定された)1 番目の値フィールドの処理時には、@field_key は "M1" を返し、2 番目の値フィールドの処理時には "M2" を返します。

売上数量と売上金額を取り込みたいケースにも同様に対応できます。売上数量と売上金額、それぞれの値フィールドの「値フィールドキー」欄に、売上数量と売上金額を区別するための勘定科目ラベルを指定しておくとともに、勘定科目ディメンションと同じラベル(#ACCOUNT)を持つ算出フィールドの算出式欄に「@field_key」と記述します。

値フィールドごとに、複数の値フィールドキーを指定することもできます。例えば、月別の予算と見通を横並びで保持しているデータを取り込みたい場合には、各金額欄の値フィールドキー欄に「BUDGET, M1」「FORCAST, M2」というように、シナリオラベルと相対期間ラベルをカンマで区切って記述します。一方で、導出フィールドであるシナリオ欄の算出式には @field_key(1) と記述すれば、カンマで区切られた一番目の項目、すなわち、 BUDGETFORCAST が設定されます。同様に、相対期間欄の算出式には @field_key(2) と記述しておけば、二番目の値フィールドキーすなわち "M1" や "M2" が設定されます。なお、引数なしの @field_key 及び @field_key() は、@field_key(1) の省略形です。

値フィールドに対する変換テーブル指定

値フィールドに対して変換テーブルを指定することも可能です。値が金額や数量の場合にはコード変換を行う意味はありませんが(加工が必要なら算出式を利用できます)、列挙型勘定科目にコード値を取り込むような場合には、変換テーブルを用いることで、変換後の値を当該列挙型勘定科目の値として取り込むことができます。