メンバのインポート・エクスポート

設計者 管理者

メンバのインポート

Excel シートやテキストファイルに登録されたデータをもとに、ディメンションのメンバを、一括して追加あるいは更新することができます。この機能を「メンバのインポート機能」と呼びます。

この機能では、メンバのラベルや名称だけでなく、プロパティ値やツリー構造(親子関係)も取り込むことが可能です。

操作手順:

設計モードと管理モード

メンバのインポートには「設計モード」「管理モード」の二つがあります。[マネージャ] の「ディメンション(設計)パネル」から実行する場合は前者、「ディメンション(維持管理)パネル」から実行する場合は後者となります。両者の違いは以下の通りです:

設計モード

設計者権限 で設定可能なすべてのメンバ設定情報をインポート可能です。これには以下が含まれます。

  • テンプレートメンバ・ユーザ定義メンバに関する全情報

  • システム予約メンバの、ユーザ定義プロパティ値

管理モード

管理者権限 で設定可能な情報、すなわち、ユーザ定義メンバに関する設定情報のみインポートすることができます。

インポートできるファイルの形式

インポートには、テキストファイルからのデータインポートと、クリップボードからのインポートの二通りの方法があります:

テキストファイルからのインポート

テキストファイルから設定内容をインポートします。ファイル中は、各項目がカンマで区切られた「CSV 形式(カンマ区切り形式)」です。

クリップボードからのインポート

Excel のシートから、設定内容の記述された範囲をクリップボードにコピーし、それを、ディメンション編集画面にインポートします。シート上では各項目をそれぞれひとつの列に記述します。

いずれでもインポートデータの項目やフォーマットは同じですので、以下では、インポートできるファイルの形式をご説明します。分かりにくいと感じられた場合、既存のディメンションのメンバをエクスポートしてみて下さい。エクスポートされたファイルは(下記規則に従っているので)そのままインポートすることができます。

記法に関する一般的規則

インポートするファイルは、CSV 形式(カンマ区切り形式)でなければなりません。ファイル形式は Excel で容易に編集できるよう、配慮されています(Excel で開いて編集し、保存することができます―ただし、ファイルのエンコーディングをシフト JIS とした場合に限ります)。

改行文字としては LF(ラインフィード文字), CR(キャリッジリターン文字)いずれも使えます。LF と CR が連続している場合(LF + CR, CR + LF)は、2つでひとつの改行とみなされます。

各フィールドの値は、半角のカンマ , で区切って並べてください。カンマの前後の空白は無視されます。各フィールドの値を二重引用符で括ってもかまいません(値にカンマが含まれる場合、値の全体をかならず二重引用符で囲んでください)。二重引用符で囲まれた文字列中の改行文字は、(CSV ファイルの)行の区切りとみなされません。また各フィールドの値である文字列にふたつの連続した二重引用符が含まれる場合、ひとつの二重引用符に置換して読み込まれます。

メンバ名称以外については、大文字・小文字は区別されません。

インポートファイルに適用する エンコーディング は、UTF-8 とシフト JIS いずれかを選択可能です。インポート前に、ファイルに使用されているエンコーディングを、[マネージャ] 画面で選択しておいて下さい。

行の並びに関する規則

ファイル中、最初に「ヘッダ行」が 1 行あり、その後に「明細行」が任意の行数続く形式です。ヘッダ行は、明細行における各フィールドの意味を指示するための行です。明細行は、各々が、ひとつのメンバに対する追加・更新の内容を表します。ファイル中の任意の位置に、空行を置くことができます。空行は、単に無視されます。

ヘッダ行と明細行の並べ方に関する規則は以下の通りです。

  1. ファイル中の(空行以外の)最初の行は、ヘッダ行でなければなりません。

  2. ヘッダ行の後に、「明細行」を任意の行数置くことができます。それらの明細行のフィールドの並べ方は、直前のヘッダ行で指示した通りとしなければなりません。

  3. ひとつのファイルの中で、ヘッダ行は、複数回現れてもかまいません。

  4. 各明細行は、ひとつのメンバに関する追加・更新の内容を表します。ひとつのメンバに対して複数の明細行を用いてもかまいません。その場合、それらの明細行は、ファイル中での並び順の通りに処理されます。

以上の規則を活用すれば、ひとつのメンバに関する追加・更新の全内容を一行で指示するといった使い方の他に、最初に全メンバのラベルと名称を登録し、次に全メンバの親子関係をまとめて登録する、というように作業の種類別にファイルの内容を区切ることもできます。

ヘッダ行の内容に関する規則

ヘッダ行は、下表の各フィールドからなります。

フィールド名 必須 フィールド数 フィールド位置 指定内容(フィールド記号)

コマンド

1個

必ず第1フィールド

固定値 「ADD_OR_UPDATE_MEMBER」または
UPDATE_MEMBER

レコードタイプ

1個

必ず第2フィールド

固定値 「HDR

ラベル

1個

任意

固定値 「LABEL

新ラベル

1個

任意

固定値 「NEW_LABEL

名称

定義されている各「 言語 」につき 1 個

任意

固定値 「NAME:」+ロケール
例)

NAME:ja

日本語名称

NAME:en

英語名称

子メンバ除去指示

1個

任意

固定値 「REMOVE_CHILDREN

プロパティ値

任意個

任意

固定値「P:」+プロパティラベル。

例1)メンバタイププロパティの場合
P:#MEMBER_TYPE

例2)使用区分プロパティの場合
P:#ACTIVE

親メンバ追加指示

1個

任意

固定値 「PARENT

ルート登録指示

1個

任意

固定値 「IS_ROOT

コマンドは、このヘッダ行に続く明細行が、メンバの追加または更新に関する指示であることを表します。

コマンドが「ADD_OR_UPDATE_MEMBER」であるとき

メンバが存在すれば更新、存在しなければ追加します。

コマンドが「UPDATE_MEMBER」であるとき

メンバが存在すれば更新、存在しなければエラーとして報告します(メンバは追加されません)。

レコードタイプ「HDR」は、この行がヘッダ行であることを表します。

新ラベルフィールドは、メンバのラベルを変更したいときに設けます。

名称フィールドは、固定値「NAME」の後に、「ロケール」 すなわち "ja" "en" などを、半角コロン : で結び付けて示します。コロンの前後に空白を置かないで下さい。ロケールは大文字でもかまいません。 プロパティ値フィールドは、固定値「P」後に、プロパティラベルを、半角コロン : で結び付けて示します。コロンの前後に空白を置かない点は、名称フィールドと同じです。

この表で「子メンバ除去指示」「親メンバ追加指示」「ルート登録指示」の三つのフィールドは、ラベル・名称・プロパティ値とは異なり、メンバの属性を設定するものではなく、ツリー構造をうまく構成するための指示を記述するためのフィールドです。これらにはそれぞれ固定値のフィールド記号を付与します。これらのフィールドの使用方法については、下記「明細行の内容に関する規則」をご覧ください。

フィールドのうち、常に必要なのは、コマンド・レコードタイプ・ラベルの三つです。それ以外は必要に応じて設けることも省略することもできます。

コマンド・レコードタイプ以外のフィールドの並び順は任意ですが、ラベル以外のフィールドについては、並べた順に処理されます。この点については、下記「フィールドの並び順に関する補足説明」もご覧下さい・

明細行の内容に関する規則

明細行では、ヘッダ行で指定された各フィールドに、それぞれ適切な値が指定されます。従って、各明細行は直前のヘッダ行と同じ数だけのフィールドを持っていなければなりません。また、ヘッダ行と明細行のフィールドは並び順通りに対応付けられます。明細行の各フィールドに対する指定値は下表の通りです。

フィールド名 指定内容(フィールド値)

コマンド

ヘッダのコマンド欄と同じ値。

レコードタイプ

固定値 「DTL

この行が明細行であることを示します。

ラベル

各行が追加・更新する対象メンバのラベル。

このラベルを持つメンバがディメンション内に存在すれば、この明細行の指示に従ってそのメンバが更新されます。

一方、該当メンバが無ければ、そのメンバがまずディメンションに追加されます。次に、更新の場合と同様、この明細行の指示に従ってそのメンバの内容が設定されます。

新ラベル

対象メンバに付与する新しいラベル。ラベルを変更する必要が無い時にはブランクとしておいても構いません。

「新ラベル」フィールドを用いてメンバのラベルを変更した場合、以降の行の「親メンバ追加指示」フィールドでそのメンバを指定するには、新ラベルを用いなければならないので注意して下さい。

一般的には、「新ラベル」フィールドと「親メンバ追加指示」フィールドは併用しないことをお勧めします。

名称

対象メンバの各国語名称。
(フィールド記号が NAME:ja なら、日本語名称、NAME:en なら英語名称、等)

子メンバ除去指示

対象メンバの子メンバを除去したい場合、TRUE。以外の場合、FALSE。

※子メンバは、対象メンバの配下から除去されるだけです。子メンバ自体が削除されるわけではありません。

プロパティ値

対象メンバのプロパティ値

例1)メンバタイププロパティの場合
TEMPLATE, UDEF など

例2)使用区分プロパティの場合
TRUE または FALSE

親メンバ追加指示

対象メンバの親メンバとして追加したいメンバのラベル。親メンバの追加が不要であれば空白とします。

※ ここで指定されたメンバが、すでに、対象メンバの親メンバであれば、何もしません(ひとつの親メンバの配下に対象メンバが重複登録されることはありません)。

ルート登録指示

対象メンバをルートメンバとしたい場合: TRUE
ルートから除去したい場合: FALSE
ルートへの追加も除去も行わない場合:空白

※ TRUE が指定された場合、対象メンバがすでにルートメンバであれば何もしません(対象メンバがルートに重複登録されることはありません)。また FALSE が指定された場合、対象メンバがルートメンバでなければ何もしません。

フィールドの並び順に関する補足説明

コマンド・レコードタイプ・ラベル以外のフィールドは、並べた順に処理されます。このため、注意しないと、意図した結果が得られないことがあります。典型的なケースは、「リーフ区分/#LEAF」プロパティの設定と、子メンバ除去指示を同時に行いたい場合です。

メンバ X が、現在、子メンバを持っているとして、インポートファイルが以下のように記述されていたとしましょう。

  ADD_OR_UPDATE_MEMBER , HDR , LABEL , P:#LEAF,   REMOVE_CHILDREN ・・・

  ADD_OR_UPDATE_MEMBER , DTL , X , TRUE , TRUE・・・

この意図は、メンバ X から子メンバを除去してリーフメンバとすることですが、上記データはエラーとなります。なぜかというと、上記のフィールドの並び順では、まずメンバ X のリーフ区分値を TRUE とし、次に子メンバを除去しようとしていますが、子メンバを持ったまま、リーフ区分値を TRUE に変更することは許されないからです。

この場合、インポートファイルでのフィールド並び順を以下のように修正すれば、うまく処理されます。

  ADD_OR_UPDATE_MEMBER , HDR , LABEL , REMOVE_CHILDREN, P:#LEAF ・・・

  ADD_OR_UPDATE_MEMBER , DTL , X , TRUE , TRUE・・・

同様のことは、複数のプロパティ間でも起きえます。例えば勘定科目ディメンションの「貸借区分/#DRCR」プロパティは、「データタイプ/#DATA_TYPE」プロパティ値が、「フロー/FLOW」「バランス/BALANCE」の場合にしか設定できません。したがって、P:#DATA_TYPE フィールドは、P:#DRCR フィールドより左に置くことが適切です。なお、ディメンション画面で表示されるプロパティの並び順通りにフィールドを並べれば、こうしたプロパティ間の依存関係に関する問題は起きません。

「親メンバ追加指示」に関する補足説明

fusion_place のディメンションでは、各メンバは複数のメンバツリーに属することが可能です。したがって、各メンバは複数の親メンバを持つことができます。メンバを複数の親メンバの下に登録したい場合、そのメンバに関する明細行を、親メンバの数だけ設けて下さい。

例えば、子メンバ(ラベル:C)を、親メンバ A(ラベル:P1)と親メンバ B(ラベル:P2)の子としたい場合、インポートファイル中に、以下のように、子メンバ C に関する明細行を2行記述して下さい。

  ADD_OR_UPDATE_MEMBER , HDR , LABEL , PARENT ・・・

  ADD_OR_UPDATE_MEMBER , DTL , P1 , , ・・・

  ADD_OR_UPDATE_MEMBER , DTL , P2 , , ・・・

  ADD_OR_UPDATE_MEMBER , DTL , C , *P1* , ・・・

  ADD_OR_UPDATE_MEMBER , DTL , C , *P2* , ・・・
新規メンバを追加する場合に関する補足説明

上の表の説明にあるように、指定されたラベルを持つメンバがディメンションに存在しなければ、そのメンバが追加されます。ただし、それは、そのメンバが自動的にルートメンバとなることを意味しません。また、いずれかのメンバの子メンバとなることも意味しません。

追加と同時にそのメンバをルートメンバとしたい場合には、「ルート登録指示」フィールドで「TRUE」と指定して下さい。また、いずれかのメンバの子メンバとしたい場合には、「親メンバ追加指示」フィールドに親メンバのラベルを指定して下さい。

メンバのエクスポート

既存ディメンションの全メンバの設定内容およびメンバツリー構造を、上述したメンバインポート用のファイル形式で、出力することができます。(カスタムディメンションの場合、)このファイルを、別の空のディメンションにインポートすれば、元のディメンションの内容がそっくり再現されます(※)。

※ もとのディメンションに「 ユーザ定義プロパティ 」がある場合には、インポート先のディメンションでも、同じ内容でユーザ定義プロパティを事前に設けておく必要があります。

エクスポートファイルの エンコーディング は、UTF-8 とシフト JIS いずれかを選択可能です。エクスポート前に、適用したいエンコーディングを、[マネージャ] 画面で選択しておいて下さい。

ファイルに出力する代りに、同じ内容のデータをクリップボードにエクスポートして、クリップボードから Excel シートに貼り付けることもできます。この場合も、シートで編集したデータを、クリップボード経由でディメンションにインポートすることができます。

操作手順:

メンバのエクスポートに関する留意点

(1)異なるルートメンバ配下のメンバツリーに同一メンバが存在する場合

このような場合、エクスポートファイル中に、そのメンバに関する行が複数回出現することになります。このようなデータをインポートすると前から順に処理されます。従って、あるメンバに関する行でメンバ名称やプロパティ値を変更しても、そのあとに出現する、同じメンバに関する行のメンバ名称やプロパティ値で上書きされるので、ご注意ください。

「親メンバ追加指示」フィールドは上記の例外で、同一メンバに関する複数の行で、別の親メンバのラベルが指定されていれば、それらすべての子メンバとして登録されます。

(2)「ツリーに含まれないメンバ」のエクスポート

エクスポート処理では、まずルートメンバを順にみて、それ自身及びその配下のメンバを親優先並びで出力し、続いて、「ツリーに含まれないメンバ」を前から順にみて、それ自身及び配下のメンバを同じく親優先並びで出力します。ツリーに含まれないメンバ欄には、いずれのルートメンバ配下のメンバツリーにも含まれないメンバが表示されますが、エクスポートされる時にはその子孫メンバも含めてエクスポートされるのでご注意ください(※)。

※ メンバがツリーから除外されたからと云って、配下の親子関係は切断されない、ということがポイントです。これは意図的にそのようにしています。メンバツリー上でメンバをカットするそのメンバは一時的に「ツリーに含まれないメンバ」となることがありますが、その後、そのメンバをメンバツリーのどこかに貼り付けた時には、配下のメンバも含めて貼り付けられるべきだからです。