Note
コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。
この記事では、既定の財務分析コードについて開発者向けの説明を記載します。 ディメンションの発生元、それらをマージするために使用されるアプリケーション プログラミング インターフェイス (API)、およびそれらを使用して台帳ディメンションを作成する方法について説明します。 この記事には、ユーザーインターフェイス (UI)、SQLテーブルクエリ、およびそれらのクエリの出力例が含まれています。 また、API とその使用例についても説明します。
この記事では、デモ データの会社として USMF を使用します。
財務分析コードのコンセプトおよび業務プロセスに対する影響について詳細は 財務分析コード を参照してください。
既定の分析コードを入力する
250 以上のページによって、既定の財務分析コードを入力できます。 分析コードは、ファストタブに値および説明と共に一覧表示されています。 標準デモデータでは、30以上の分析コードを使用できます。 ただし、次の 財務分析コード ファストタブには、次の5つの分析コード、BusinessUnit、課、部門、ItemGroup、プロジェクト のみを表示しています。
分析コード リスト
最初に、ページで指定した現在の会社または会社の台帳に関連付けられているすべてのアクティブな勘定構造の一覧に基づいてディメンションがフィルター処理されます。 次に、システムは、それらの勘定構造のすべてのディメンションと、それらの構造に関連付けられているすべてのアクティブな高度なルールの和集合を取得します。
元帳 ページ
元帳 ページ (一般会計 > 設定 > 元帳) にて、会社の勘定構造を管理できます。
分析コードの数が変動する勘定構造
勘定構造で使用する分析コードの数を決定するには 元帳 ページで グリッド上の 勘定構造の設定 を選択し、列の数を数えます。 以下の図は、3つの分析コードを使用しているの勘定構造と、5つの分析コードを使用する勘定構造を示しています。
3つの分析コードを使っている勘定構造
5つの分析コードを使っている勘定構造
上記の図に示した2つの勘定構造の間には、BusinessUnit、Department、CostCenter, ItemGroup、の4つの固有の分析コードがあります。 これら 4 つの分析コードは、既定の分析コードの一覧に表示されます。 さらに、高度なルールを介してアカウント構造に連係されている高度なルール構造からの分析コードが検証されます。 この例では、高度なルール構造から分析コードを検証した結果、5番目の分析コードがデフォルトの分析コードのリストに追加されています。
以下の図は、プロジェクト分析コードがデフォルト分析コードのリストに組み込むための高度なルールを示しています。
以下の図は、ルール構造を示しています。
Note
MainAccount ディメンションは、既定のディメンションのほとんどのリストには表示されません。 ただし、予算作成は例外となります。 既定のディメンションの一覧に MainAccount ディメンションが明示的に含まれています。
既定の分析コード一覧用API
既定の分析コードコントローラである DimensionDefaultingController は、会社に適切な分析コードを判断するために DimensionCache::getDimensionAttributeSetForLedger() API を使用します。
取込と保存の管理
取込みフォームと分析コードデータのモデル
既定の分析コードを表示するすべてのページでは DimensionDefaultingController コントローラが使用されています。 このコントローラでは、分析コードが自動的に表示され、値を読み込んで保存するので、対話的な操作を行うことができます。 これらの取り込みパターンの詳細については、「Microsoft Dynamics AX 2012 アプリケーション用の勘定科目および財務分析コード フレームワークの実装ホワイト ペーパーを参照してください。
既定の分析コード値の保存
ディメンションに関連付けられている値は、それらのディメンション値を参照するプライマリ テーブルとは別のテーブルに格納します。 たとえば、LedgerJournalTableテーブルには、DimensionAttributeValueSetテーブル内のレコードへの外部キー参照を保持する dimensiondefault 列があります。 このレコードは、表示される一連の値を意味する親レコードです。
それぞれの値は、DimensionAttributeValueSetItem テーブルに独立した行として保存されますが、親レコードの外部キーは同じものとなります。
データは、これらのテーブルを介して直接照会できます。 また、以下の図に示すように DimensionAttributeValueSetItemView を使用してクエリを実行することもできます。
空の値
分析コードのフレームワークは、値が入力された分析コードについてのみ行を保存します。 空の行に対してはデータが保存されません。 したがって、データが保存された後、フレームワークは値を持たない分析コードについて、それがユーザーが削除したものなのか、そもそも値が入っていないものなのかを区別することができません。 空の値を保存するには、空白であることを意味する値を作成する必要があります。 例えば、empty、n/a、<cleared>、または *blank* などの名前を付けます。 ユーザーは、空白の値に対しては入力時にこの値を選択して、これは空白値入力の既定の動作とすることができます。
不変データ
ほとんどのディメンション データと同様に、前に説明したテーブルに挿入するレコードは不変です。 最初に書き込みますが、後で更新したり削除したりすることはありません。 たとえば、ユーザーがプロジェクトIDを分析コードとして追加し、変更を保存したとします。
この場合でも、新しい行が追加された場合でも、SQL クエリは以前と同様の 3 つの行を返します。 新しい値を追加すると、ディメンション フレームワークによって新しい値セット レコードと、前のディメンション セットを変更するのではなく、新しい値セットにリンクされた 4 つの追加の値セット項目レコードが作成されます。
パターンのコピー
このセクションでは、エンティティ間で既定のディメンションをコピーする方法について説明します。
通常、既定のディメンションを他のディメンションの組み合わせとコピーまたはマージして、勘定科目ディメンションを作成します。 各ページまたはプロセスは、ビジネスロジックに基づいて、優先順位を決定します。 一部の既定のディメンションは優先順位が高く、他の既定のディメンションは置き換えられますが、他のディメンションはマージされます。
既定の分析コードを構成する
主勘定の値が未固定か固定かを定義するには、勘定科目構造で使用される各財務分析コードについて、次の手順に従います:
- 一般会計 > 勘定科目表 > 勘定 > 主勘定 に移動します。
- メイン アカウントを選択します。
- 法人のオーバーライド ファストタブで、適切な法人を選択します。
- 既定のディメンションを選択します。
アカウントの既定分析コードの指定
財務ディメンションを 固定として設定した場合、指定した値 (空白値を含む) は転記時にトランザクション値を上書きします。 このルールは、仕訳帳明細行または伝票に入力された値を含むすべてのソースに適用されます。
財務分析コードを [未修正] に設定すると、上書きできる既定値が使用されます。 このルールは、システム内のすべてのデフォルト値 (マスタレコードの値を含む) に適用されます。
Important
固定ディメンションは、ユーザーが別の値を手動で入力した場合でも、転記時に常にディメンション値を上書きします。 伝票に仕訳帳に入力された値とは異なるディメンションが表示される場合、または転記後にディメンションが空白の場合は、主勘定に固定ディメンションが構成されているかどうかを確認します。 予期しない上書きを解決するには、ディメンションを [固定値 ] から [固定なし] に変更するか、既定のディメンションを削除するか、アカウント構造の制約を受け入れた既定値を設定します。
詳細については、主勘定の既定および固定財務ディメンションを参照してください。
コピーとマージ
通常、既定のディメンションを他のディメンションの組み合わせとコピーまたはマージして、勘定科目ディメンションを作成します。 分析コードフレームワークは、既定の動作の優先順位を設定しません。 各ページまたはプロセスは、ビジネスロジックの要件に基づいて、優先順位を決定します。
次の例では、仮定の順序ドキュメントを使用します。 このドキュメントは、品目としてのサービスを含む顧客販売注文であると考えることができます。 または、在庫品目を品目として含む仕入先の発注書であると考えることもできます。 次の図に示すように、処理のさまざまなポイントで既定のディメンションを入力またはオーバーライドできます。
注文ドキュメントの場合は、ビジネスロジックに相当する既定の分析コードが複数用意されています。 ドキュメント ヘッダーには、この例で使用する発注書の場合と同様に、一連の既定のディメンションが含まれる場合があります。 この例では、顧客または仕入先のオーダーには一連の既定の分析コードが存在します。 注文のビジネスロジックによっては、これらのさまざまな既定の分析コードの組み合わせによって優先順位が異なる場合があります。 既定の分析コードの中で優先順位が高いものは、他の既定の分析コードを置き換えることがあります。 また、既定の分析コードがマージされる場合もあります。
既定のディメンションをコピーする
次の図は、特定の仕入先アカウントに入力する既定のディメンションを示しています。
以下の図は、仕入先レコードの既定の分析コード参照に対するSQLクエリを示しています。
以下の図は、作成された既定の分析コードを示しています。
次の図は、この仕入先に対して作成する新しい発注書を示しています。 既定の分析コードがドキュメントヘッダーにコピーされます。
以下の図は、SQLクエリとヘッダレコードへの既定の分析コード参照を示しています。
次の図に示すように、仕入先を選択するとすぐに、仕入先のディメンションによって、発注書ヘッダーに既に存在していたすべてのディメンションが置き換えられます。
したがって、既定のディメンション外部キーをコピーするだけで済みます。 次の図は、仕入先から発注書に既定のディメンションをコピーするために使用するコードを示しています。
次の図は、ユーザーがプロジェクト分析コード値を入力した後のヘッダー分析コードを示しています。
以下のコードは、ヘッダー レコードの既定の分析コード参照に対する SQL クエリを示しています。
SELECT RecID, PURCHID, DEFAULTDIMENSION from PurchTable
WHERE PURCHID = '00000125' and DATAAREAID = 'usmf'
SELECT DA.NAME, DISPLAYVALUE, V.DIMENSIONATTRIBUTEVALUESET,
V.SETITEMRECID
FROM DIMENSIONATTRIBUTEVALUESETITEMVIEW V
JOIN DIMENSIONATTRIBUTE DA ON DA.RECID = V.DIMENSIONATTRIBUTE
WHERE V.DIMENSIONATTRIBUTEVALUESET = 52565466755
以下の図は、作成された既定の分析コードを示しています。
ユーザーが ライン ビューに切り替えて明細行を入力すると、以下の図に示すように、発注書ヘッダーから既定の分析コードがコピーされます。
以下の図は、外部キー参照を行にコピーするために使用されるコードを示しています。 この場合、行はまだ保存されていません。 そのため、既定の分析コードの外部キーは、メモリのテーブルバッファーのみに表示されます。
パターンのマージ
このセクションでは、既定のディメンションがエンティティ間でどのようにマージされるかについて説明します。
既定の分析コードのマージ
次の図では、ユーザーは行の BusinessUnit ディメンションを手動で消去します。 したがって、新しい既定のディメンション外部キーが作成され、発注書ヘッダーが更新されます。
ヘッダーはまだ保存されていないため、更新された外部キーが表示される唯一の場所はメモリ内のテーブル バッファーです。 ただし、次の図に示すように、クエリを実行して新しい既定のディメンションを見つけることができます。
次に、ユーザーが購買注文の明細行に入力する品目を考えてみます。 以下の図は、製品タブでの既定の財務分析コードを示しています。
以下のコードは、データベース内の既定の分析コードに対する SQL クエリを示しています。
以下の図は、クエリの実行結果を示しています。
続いて、購買注文の明細行に品目を入力します。 以下の図は、購買注文の明細行で選択された品目と、その結果の既定の分析コードを示しています。 この場合、発注書ロジックによって既定のディメンション値がマージされます。
以下のコードおよび図は、SQL クエリと購買注文明細行の品目レコードからの既定の分析コードの結果を示しています。
SELECT PURCHID, LINENUMBER, ITEMID, DEFAULTDIMENSION from PURCHLINE where PURCHID = '00000100' AND DATAAREAID = 'USMF'
SELECT DA.NAME, DISPLAYVALUE, V.DIMENSIONATTRIBUTEVALUESET,
V.SETITEMRECID
FROM DIMENSIONATTRIBUTEVALUESETITEMVIEW V
JOIN DIMENSIONATTRIBUTE DA ON DA.RECID = V.DIMENSIONATTRIBUTE
WHERE V.DIMENSIONATTRIBUTEVALUESET = 68719490325
発注書明細行の品目を指定すると、発注書ロジックによって、3 つの異なるソースの既定のディメンションがマージされます。 以下の情報を参照してください
注文ヘッダーの既定のディメンションを注文明細行の既定のディメンションとマージして、 マージされた結果 1 の既定のディメンションを生成します。
アイテム 注文明細行 注文ヘッダー マージの結果 1 Description BusinessUnit この値は、両方のソースで空白です。 CostCenter この値は、両方のソースで空白です。 Department 027 027 注文明細行の値は空白です。 結果として、この値は注文ヘッダーからコピーされます。 ItemGroup この値は、両方のソースで空白です。 プロジェクト 000003 000003 000003 この値は、両方のソースで空白です。 外部キー 6190 *9574 *9574 マージされた後は、注文ヘッダーと同じレコードが使用されます。 アイテムの既定のディメンションはマージされた結果 1の既定のディメンションと合わさり、最終的な注文明細行における既定のディメンションマージされた結果 2を生成します。 以下の表では、マージ処理の際の論理ステップを示しています。 ただし、これらの手順は、実行時に、dimensionフレームワークによって提供されるAPIを使用してマージされます。
アイテム マージの結果 1 アイテム マージの結果 2 Description BusinessUnit この値は、両方のソースで空白です。 CostCenter 008 008 ヘッダー行の結合結果の値が空白です。 結果として、この値は品目からコピーされます。 Department 027 023 027 ヘッダー行の結合結果の値がセットされます。 したがって、その品目はスキップされます。 ItemGroup AudioRM AudioRM ヘッダー行の結合結果の値が空白です。 結果として、この値は品目からコピーされます。 プロジェクト 000003 000003 ヘッダー行の結合結果の値がセットされます。 外部キー *6190 0324 0325 マージ後の結果に対して新しいレコードIDが使用されます。
次の図は、3 つのソースからディメンションをマージするために必要なコードを示しています。
勘定分析コードの作成
このセクションでは、既定のディメンションをマージして新しい台帳ディメンションを作成する方法について説明します。
既定のディメンションでは、後で仕訳帳と会計ディストリビューションの勘定科目の組み合わせを作成するために使用する値が提供されます。 勘定科目の組み合わせは、勘定元とディメンション値からなるセットであり、そのセットに構造と順序が適用されます。 詳細については、 パート 5: 台帳ディメンションを参照してください。
既定の分析コードには、 MainAccount 以外の勘定科目の組み合わせに必要なすべての分析コードが用意されています。 既定のディメンションを既定の勘定と結合することも、別の台帳ディメンションと組み合わせて台帳ディメンションを生成することもできます。
次の図は、発注書明細行から会計配布を行う例を示しています。 注文明細行から 購買 > 財務配分金額 を選択し 勘定配布 ページを開きます。 このページでは、既定の勘定科目の組み合わせである 618900--027-008audiorm-が既に入力されています。
Project、CostCenter、ItemGroup、および Department ディメンションの値は、会計ディストリビューションに入力されます。 さらに、次の図に示すように、転記品目グループの既定の MainAccount 値が、発注書の経費勘定の購買支出として品目に入力されます。 プロジェクトは、ここに該当する勘定構造の一部ではないため、表示されません。
以下の図は、クエリおよびその結果となる既定のアカウントのソースを示しています。
次の図は、発注書明細行の既定のディメンションを品目グループの既定の勘定にマージするために必要なコードを示しています。
マージが完了したら、次の図のクエリに従って、新しい勘定科目の組み合わせを作成します。 この動作は、既定の分析コードが相互にマージされる際の挙動と共通しています。
一般的なAPIのパターン
このセクションでは、最も一般的な既定のパターンに使用する API について説明します。
既定の分析コードAPI
DimensionDefaultFacade クラスと LedgerDimensionDefaultFacade クラスは、既定のシナリオに必要な API を提供します。 LedgerDimensionFacade クラス" には、勘定分析コードで作業するためのメソッドが含まれています。 これらのメソッドは、パフォーマンスのために高度に最適化されています。
既定の分析コード
serviceMergeDefaultDimensions()
serviceMergeDefaultDimensions() API を使用して、既定のディメンションを操作します。 他の 2 ~ 4 つの既定のディメンションから新しい既定のディメンションを作成する必要がある場合は、この API を呼び出します。 4 つ以上の既定のディメンションをマージする必要がある場合は、この API を複数回呼び出します。 前の呼び出しの結果を、後続の各呼び出しの最初のパラメーターとして使用します。 このメソッドは、有効かどうかを確認せずにすべての値をマージします。
例: DimensionDefaultFacade::serviceMergeDefaultDimensions()
public static DimensionDefault serviceMergeDefaultDimensions(
DimensionDefault _value1,
DimensionDefault _value2,
DimensionDefault _value3 = 0,
DimensionDefault _value4 = 0)
serviceReplaceAttributeValue()
serviceReplaceAttributeValue() API を使用して、1 つのディメンション値を 1 つの既定セットから別の既定のセットにコピーします。 指定された値は、ソースセットに既に存在する任意の値に置き換えられます。
例: DimensionDefaultFacade::serviceReplaceAttributeValue()
public static DimensionDefault serviceReplaceAttributeValue(
DimensionDefault _target,
DimensionDefault _source,
RecId _dimensionAttributeId)
serviceMergeValidDefaultDimensions()
マージに現在の台帳に対して有効な値のみを含める場合は、 serviceMergeValidDefaultDimensions() API を使用します。 ServiceMergeDefaultDimensions と同じように動作しますが、有効な値の検証がされます。
例: DimensionDefaultFacade::serviceMergeValidDefaultDimensions()
public static DimensionDefault serviceMergeValidDefaultDimensions(
DimensionDefault _defaultDimension1,
DimensionDefault _defaultDimension2,
DimensionDefault _defaultDimension3 = 0,
DimensionDefault _defaultDimension4 = 0)
勘定分析コード
serviceCreateLedgerDimension()
台帳ディメンションには serviceCreateLedgerDimension() API を使用します。 既定の勘定科目または既存の勘定科目の組み合わせと 0 から 3 つの既定のディメンションから新しい勘定科目の組み合わせを作成する必要がある場合に呼び出します。 3 つ以上の既定のディメンションをマージする必要がある場合は、この API を複数回呼び出します。 この場合、さまざまなソースが、後続の呼び出しの初期パラメーターとして前回の呼び出し結果を受け取ります。 MainAccount ディメンションは、指定した台帳ディメンションからのみ取得します。
例: LedgerDimensionFacade.serviceCreateLedgerDimension()
public static LedgerDimensionAccount serviceCreateLedgerDimension(
RecId _ledgerDimensionId,
DimensionDefault _dimensionDefault1 = 0,
DimensionDefault _dimensionDefault2 = 0,
DimensionDefault _dimensionDefault3 = 0)
{
serviceCreateLedgerDimensionForType()
serviceCreateLedgerDimensionForType() API は serviceCreateLedgerDimension() API に似ています。 ただし、元帳勘定の組み合わせを作成する代わりに、予算勘定や予算計画勘定などの他の元帳ディメンションタイプが作成されます。 LedgerDimensionType パラメーターを使用して、作成する台帳アカウントの種類を指定します。
例: LedgerDimensionFacade.serviceCreateLedgerDimensionForType()
public static LedgerDimensionBase serviceCreateLedgerDimensionForType(
LedgerDimensionType _ledgerDimensionType,
LedgerDimensionBase _ledgerDimensionId,
DimensionDefault _dimensionDefault1 = 0,
DimensionDefault _dimensionDefault2 = 0,
DimensionDefault _dimensionDefault3 = 0)
serviceCreateLedgerDimForDefaultDim()
serviceCreateLedgerDimForDefaultDim() API は、serviceCreateLedgerDimension() API と serviceCreateLedgerDimensionForType() API に似ています。 ただし、既定のディメンションの値を新しい台帳ディメンションに直接コピーしますが、台帳ディメンションのディメンション値は後でマージされます。 (これに対し、前の 2 つの API では、台帳ディメンションの値をコピーし、既定のディメンション値をマージします)。
例: LedgerDimensionFacade::serviceCreateLedgerDimForDefaultDim()
public static LedgerDimensionBase serviceCreateLedgerDimForDefaultDim(
DimensionDefault _defaultDimension,
LedgerDimensionBase _ledgerDimensionId)
serviceLedgerDimensionFromLedgerDims()
serviceLedgerDimensionFromLedgerDims() API は、前の API と似ています。 ただし、新しい台帳ディメンションを構築するためのソースとして、台帳ディメンションのみが使用されます。 主勘定は、最初の台帳ディメンションからのみ取得します。
例: LedgerDimensionFacade::serviceLedgerDimensionFromLedgerDims()
public static LedgerDimensionAccount serviceLedgerDimensionFromLedgerDims(
LedgerDimensionBase _ledgerDimensionId1,
LedgerDimensionBase _ledgerDimensionId2 = 0,
LedgerDimensionBase _ledgerDimensionId3 = 0,
LedgerDimensionBase _ledgerDimensionId4 = 0,
LedgerDimensionBase _ledgerDimensionId5 = 0)
serviceMergeLedgerDimensions()
serviceMergeLedgerDimensions() API は serviceLedgerDimensionFromLedgerDims() API に似ています。 ただし、2 つの台帳ディメンションのみを結合するように最適化されています。
例: LedgerDimensionFacade::serviceMergeLedgerDimensions()
public static LedgerDimensionBase serviceMergeLedgerDimensions(
LedgerDimensionBase _ledgerDimension1,
LedgerDimensionBase _ledgerDimension2,
LedgerDimensionType _ledgerDimensionType = LedgerDimensionType::Account)
serviceCreateLedgerDimFromLedgerDim()
ServiceCreateLedgerDimFromLedgerDim () APIは、過去に転記されたドキュメントから新しい未転記のドキュメントに元帳分析コードをコピーする場合と、現在の勘定構造の設定を確実に使用すように設定したい場合に便利です。 この API を使用すると、転記中に新しい台帳ディメンションが検証されるときに検証エラーを防ぐことができます。
例: LedgerDimensionFacade::serviceCreateLedgerDimFromLedgerDim()
public static LedgerDimensionAccount serviceCreateLedgerDimFromLedgerDim(LedgerDimensionAccount _ledgerDimension)