セグメント化されたエントリ コントロールの移行のガイダンス

この記事では、セグメント化されたエントリ コントロールを Microsoft Dynamics AX 2012 のパターンから Microsoft Dynamics AX の新しいパターンに移行するプロセスについて説明します。

新しい設計の目標は、コントロールの実装をカプセル化し、コントロールをサポートするクラスとやり取りするフォームを必要としないことです。 したがって、Microsoft Dynamics AX で、 すべてのフォームは、セグメント化されたエントリ コントロール インスタンスのアプリケーション プログラミング インターフェイス (API) とのみ対話する必要があります。それらは、コントローラー クラス (LedgerDimensionAccountControllerDimensionDynamicAccountController など) と直接対話してはなりません。 コントローラー上で以前に操作または呼び出された任意のプロパティは、コントロール上で呼び出される必要があります。

メモ :

  • 一部の API は、コントローラーとコントロールで命名方法が違います。 次のテーブルにこれらの API の一覧を示します。

    コントローラ メソッド (旧) コントロール メソッド (新)
    parmDate parmControlDate
    parmFilterLedgerPostingType parmPostingType
    parmDimensionAccountStorageUsage parmDimensionAccountStorageUsageType
    • 以前: controller.parmDate(systemDateGet())
    • 以後: LedgerAccount.parmControlDate(systemDateGet());

    この例では、コントローラー>LedgerDimensionAccountController インスタンスと LedgerAccount> 新規セグメント化エントリ コントロールのインスタンス。

  • コントロールやデータ フィールドでオーバーライドされたメソッドでは、コード アップグレード ルールが、コントローラーのメソッドの呼び出しを、特定のコントローラーを使用していた各コントロール インスタンスのメソッドの呼び出しに置き換えます。

    • 以前:

      Public void jumpRef()
      {
          ledgerDimensionDefaultAccountcontroller.jumpRef();
      }
      
    • 以後:

      Public void jumpRef()
      {
          segmentedEntryControl1.jumpRef();
          segmentedEntryControl2.jumpRef();
      }
      

    これらの変更は、他の場所に移動する必要があるコードをコピーして貼り付ける方が簡単になるように行われています (例: loadSegments() およびその他の類似メソッドの一部のインスタンス)。 メソッドを削除するかどうか決定するときは、この変更を無視することができます。 決定内容は、メソッドにカスタム ロジックにあるかどうかによって異なります。

  • コードのアップグレード スクリプトは、コントローラーがメソッド内でインスタンス化されるケースを処理しません。 このような場合は、手動で移行する必要があります。

  • Microsoft Dynamics AX 2012 の MRU 機能は、Dynamics AX で削除されました。置き換えの予定はありません。

  • parmTaxCode が削除されました。 交換はありません。

プロパティ

セグメント化エントリコントロールのカスタム プロパティは、コントローラーの下にあります。 次のスクリーン ショットは、例を示します。

セグメント化されたエントリ コントロールのカスタム プロパティ。

すべてのプロパティがすべての コントローラー クラス タイプに適用されるわけではありません。 選択したコントローラー クラスに適用されないプロパティは無効になります。 次のテーブルは、それぞれのプロパティに関する詳細を示します。

プロパティ 有効な値 用途
勘定タイプ フィールド データ ソースからのフィールド。 使用されるアカウントの種類を決定します。 通常、複数セグメントの勘定科目から、Cust、Vend、Bank、Project などの他のックアップ テーブルの単一セグメント値への仕訳入力に使用されます。
コントローラー クラス 6 つのコントローラー クラスのうちの 1 つです。 たとえば LedgerDimensionDefaultAccountController です。 セグメント化されたエントリ コントロールの動作およびパターンを決定します。 このプロパティの詳細については以下で説明します。
財務勘定を含む NoYes 財務勘定である主勘定が有効であるかどうかを決定します。
勘定合計を含む NoYes タイプが "合計" の主勘定が有効であるかどうかを判断します。
既定の勘定です。 TrueFalse 動的アカウントで、アカウントが既定または完全アカウントであるべきかどうかを決定します。
主勘定セグメントのロック NoYes 主勘定セグメントがロックされているかどうかをコントロールします。 通常は仕訳帳や構成に基づく配分に使用されます。
転記タイプ LedgerPostingType 列挙の値。 主勘定が検証され、そのアカウントで使用される転記タイプが許可されているかどうかを確認されます。
手動入力のブロック状態の検証 NoYes 分析コードの「手動入力のブロック」ステータスを優先するかどうかを決定します。

コントローラー クラス プロパティ

次のテーブルは、それぞれのコントローラーに関する詳細を示します。

コントローラー 詳細情報
BudgetLedgerDimension このコントローラーは、セグメント化された入力コントロールのデータ入力の予算に基づくサポートを提供します。 このコント ローラーを使用するときは、勘定構造をセグメント化エントリ コントロールに提供する必要があります。
BudgetPlanningLedgerDimension このコントローラーは、セグメント化された入力コントロールのデータ入力の予算計画に基づくサポートを提供します。 このコント ローラーを使用するときは、勘定構造をセグメント化エントリ コントロールに提供する必要があります。
DimensionDynamicAccount このコントローラーは、セグメント化された入力コントロールの複数のアカウント タイプのサポートを提供します。
LedgerDimensionAccountAlias このコントローラーは、セグメント化された入力コントロールのアカウント エイリアスのサポートを提供します。
LedgerDimensionAccount このコントローラーは、セグメント化された入力コントロールの複数のセグメントのデータ入力のサポートを提供します。
LedgerDimensionDefaultAccount このコントローラーは、セグメント化された入力コントロールの既定のアカウントのサポートを提供します。

移行ステップ

ステップ1

AX 2012

SegmentedEntry は任意のコントロールの横にあるタイプとして表示され、SegmentedEntryControl と変更します。

SegmentedEntry コントロール タイプ。

Dynamics AX

簡単な方法は古いコントロールの名前に「_old」を追加し、新しいコントロール (コントロールの元の名前がある必要があります) を付け加え、すべての設定を移行した後、古いコントロールを削除します。

メモ

コントロールを参照するテストおよび他のコードが破損しないようにするには、新しいコントロールが古いコントロールと同じ名前であることを確認します。 新しいコントロールを追加するには、セグメント化されたエントリ コントロールを含む親コントロールを右クリックしてから、新規>SegmentedEntryControl を選択します。

新しい SegmentedEntryControl。

次のスクリーンショットは、新しいコントロールの外観を示しています。

リストの新しいコントロール。

ステップ2

AX 2012

jumpRef() コントロール/フィールド メソッドをオーバーライドします。

public void jumpRef()
{
    ledgerDimensionDefaultAccountController.jumpRef();
}

Dynamics AX

他の機能が含まれなくなった場合は jumpRef() メソッドを完全に削除します。 その他のカスタム jumpRef 機能がある場合は、それをそのままにします。 ただし、jumpRef がコントロールによって自動的に処理されます。

ステップ 3

AX 2012

loadAutoCompleteData() コントロール メソッドをオーバーライドします。

public void loadAutoCompleteData(LoadAutoCompleteDataEventArgs _e)
{
    ledgerDimensionDefaultAccountController.loadAutoCompleteData(_e);
    super(_e);
}

Dynamics AX

loadAutoCompleteData() メソッドを削除します。

ステップ 4

AX 2012

loadSegments() コントロール メソッドをオーバーライドします。

public void loadSegments()
{
    super();
    ledgerDimensionDefaultAccountController.loadSegments();
    ledgerDimensionDefaultAccountController.parmControl(this);
}

Dynamics AX

loadSegments() メソッドが、コントローラーの loadSegments() および parmControl() メソッドを呼ぶ以外に何もしない場合は、それを削除します。 ただし、parmControl() 呼び出しに渡される SEC コントロール インスタンスをメモしておきます。 呼び出されていたメソッドは、そのインスタンスで呼び出される必要があります。

ステップ 5

AX 2012

loadSegments() コントロール メソッドをオーバーライドします。

public void loadSegments()
{
    super();
    dimAccountController.parmControl(this);
    dimAccountController.parmJournalName(ledgerJournalTable.JournalName);
    dimAccountController.parmCurrency(ledgerJournalTrans.CurrencyCode);
    dimAccountController.parmDataAreaId(ledgerJournalTrans.Company ? ledgerJournalTrans.Company : curext());
    dimAccountController.parmDate(ledgerJournalTrans.TransDate);
    dimAccountController.parmTaxCode(ledgerJournalTrans.TaxCode);

    dimAccountController.loadSegments();
}

Dynamics AX

loadSegments() メソッドがコントローラーでのパラメーターを設定するために使用された場合、パラメーター メソッドへの呼び出しは、パラメーター メソッドのソースを変更することができるすべての場所に移動する必要があります。 ほとんどの場合、これらの場所は対応するデータ フィールドの modified() メソッドおよび/またはデータ ソースの active() メソッドです。 たとえば、loadSegments() の移行したコードの一部は、左側で上書きをし、次のようになります。

dimAccountController.parmControl(this) -> No longer needed.

parmControl() 呼び出しに渡される SEC コントロール インスタンスをメモしておきます。 コントローラー上で呼び出されていたメソッドは、そのインスタンスで呼び出される必要があります。

dimAccountController.parmJournalName(ledgerJournalTable.JournalName) ->
LedgerJournalTable data source,
JournalName field,
public void modified()
{
    .parmJournalName(ledgerJournalTable.JournalName);
}

LedgerJournalTable データ ソース

    public void active()
    {
        .parmJournalName(ledgerJournalTable.JournalName);
    }

メモ

loadSegments() メソッドからすべてのコードを削除したら、そのメソッドを削除できます。

ステップ 6

AX 2012

loadSegments() コントロール メソッドをオーバーライドします。 場合によっては、loadSegments() メソッドは、テーブル バッファを使用してコントローラーでパラメーターを設定することがありますが、そのテーブル バッファはフォーム上のデータ ソースではありません。 たとえば、LedgerJournalTransDaily フォームでは、loadSegments() の元の実装は次のようになります。

public void loadSegments()
{
    super();

    dimAccountController.parmControl(this);
    dimAccountController.parmJournalName(ledgerJournalTable.JournalName);
    dimAccountController.parmCurrency(ledgerJournalTrans.CurrencyCode);
    dimAccountController.parmDataAreaId(ledgerJournalTrans.Company ? ledgerJournalTrans.Company : curext());
    dimAccountController.parmDate(ledgerJournalTrans.TransDate);
    dimAccountController.parmTaxCode(ledgerJournalTrans.TaxCode);

    dimAccountController.loadSegments();

    currentMainAccountId = dimAccountController.getValue(DimensionAttribute::getMainAccountDimensionAttribute());
}

JournalName プロパティは、ledgerJournalTable バッファから設定されますが、LedgerJournalTable テーブルはフォームのデータ ソースではないことに注意してください。

Dynamics AX

このような場合、そのコードをデータ ソースの active() メソッド、またはデータ フィールドの modified() メソッドに移動できません。 代わりに、テーブル バッファが設定されている場所を特定する必要があります。 たとえば、LedgerJournalTransDaily フォームの元の実装では、ledgerJournalTable バッファはフォームの initLedger() メソッドで設定されました。 parmJournalName() に渡される値は、バッファが initLedger() メソッドで再割り当てされる場合のみ変更できることを明らかにする必要があります。 したがって、バッファを割り当てた後、コードを initLedger() メソッドに移動する必要があります。 また、一般的なガイドラインに従って、コントロールインスタンスに対して parmJournalName() メソッドが呼び出されます。

void initLedger()
{
    TransDate   dateFrom   = dateNull();
    TransDate   dateTo     = systemDateGet();

    if (element.args().dataset() == tableNum(LedgerJournalTable))
    {
        ledgerJournalTable = element.args().record();
        LedgerJournalTrans_AccountNum.parmJournalName(ledgerJournalTable.JournalName);
        LedgerJournalTrans_AccountNum1.parmJournalName(ledgerJournalTable.JournalName);
        GridOffsetAccount.parmJournalName(ledgerJournalTable.JournalName);
        LedgerJournalTrans_OffsetAccount1.parmJournalName(ledgerJournalTable.JournalName);
        ...
    }
    ...
}

ステップ 7

AX 2012

segmentValueChanged() コントロール メソッドをオーバーライドします。

public void segmentValueChanged(SegmentValueChangedEventArgs _e)
{
    super(_e);
    ledgerDimensionDefaultAccountController.segmentValueChanged(_e);
}

Dynamics AX

segmentValueChanged() を実装した場合に、コントローラー上で super()segmentValueChanged() メソッドを呼び出す以外何も起こらない場合は、メソッドを削除することができます。

ステップ 8

AX 2012

segmentValueChanged() コントロール メソッドをオーバーライドします。

public void segmentValueChanged(SegmentValueChangedEventArgs _e)
{
    super(_e);

    dimOffsetAccountController.segmentValueChanged(_e);
    currentOffsetMainAccountId = ledgerJournalEngine.onOffsetAccountSegmentChanged(dimOffsetAccountController, currentOffsetMainAccountId, ledgerJournalTrans);
}

Dynamics AX

segmentValueChanged() の実装に追加のロジックがある場合、次に示すように、メソッドを onSegmentChanged() メソッドに置き換える必要があります。

public void onSegmentChanged(DimensionControlSegment _segment)
{
    currentOffsetMainAccountId = ledgerJournalEngine.onOffsetAccountSegmentChanged(this, currentOffsetMainAccountId, ledgerJournalTrans);
}

メモ :

  • onSegmentChanged() メソッドを追加するには、次の手順を実行します。
    1. メソッドを追加するには、セグメント化されたエントリコントロールを展開します。
    2. メソッド ノードをクリックしてから、上書き>onSegmentChanged を選択します。
  • 新しいメソッドは、super() またはコントロールまたはコントローラーのいずれかの他のメソッドを呼び出す必要はありません。

ステップ 9

AX 2012

validate() コントロール メソッドをオーバーライドします。

public boolean validate()
{
    boolean isValid;
    isValid = super();
    isValid = ledgerDimensionDefaultAccountController.validate() && isValid;

    return isValid;
}

Dynamics AX

追加の検証がある場合以外は、validate() メソッドを削除します。 super() 呼び出しは、このコードが行っていたすべてのことを行います。 したがって、保持している新しいコードのみを残しておいてください。

ステップ 10

AX 2012

lookup() コントロール メソッドをオーバーライドします。

public void lookup()
{
    switch (emplParameters_RU.BankCloseACType)
    {
    case LedgerJournalACType::Bank:
        BankAccountTable::lookupBankAccount(this);
        break;
    case LedgerJournalACType::Cust:
        CustTable::lookupCustomer(this);
        break;
    case LedgerJournalACType::FixedAssets:
        AssetTable::lookupAccountNum(this);
        break;
    case LedgerJournalACType::Ledger:
        super();
        break;
    case LedgerJournalACType::Project:
        ProjTable::lookupProjId(this, emplParameters_RU);
        break;
    case LedgerJournalACType::Vend:
        VendTable::lookupVendor(this);
        break;
    default:
        super();
        break;
    }
}

Dynamics AX

lookup() メソッドをそのままにします。

ステップ 11

AX 2012

lookupReference() コントロール メソッドをオーバーライドします。

public Common lookupReference()
{
    Common ret;
    ret = super();
    return ret;
}

Dynamics AX

lookupReference() メソッドが既定の実装を使用している場合、それを削除することができます。

ステップ 12

AX 2012

modified() コントロール メソッドをオーバーライドします。

public boolean modified()
{
    boolean ret;

    ret = super();

    if (tmpCurrencyLedgerGainLossAccount.LedgerDimension)
    {
        tmpCurrencyLedgerGainLossAccount.AccountName =
        MainAccount::getLocalizedNameByMainAccountId(
        DimensionStorage::getMainAccountNumFromLedgerDimension(
        tmpCurrencyLedgerGainLossAccount.LedgerDimension), ledger.ChartOfAccounts);
    }
    else
    {
        tmpCurrencyLedgerGainLossAccount.AccountName = '';
    }

    return ret;
}

Dynamics AX

modified() メソッドをそのままにします。

ステップ 13

AX 2012

gotFocus() コントロール メソッドをオーバーライドします。

void gotFocus()
{
    super();
    if (ledgerJournalTable.FixedOffsetAccount)
    {
        ledgerJournalTrans_OffsetAccount.allowEdit(ledgerJournalTrans.OffsetAccountType == LedgerJournalACType::Ledger);
    }
    else if (!ledgerJournalTrans_OffsetAccount.allowEdit())
    {
        ledgerJournalTrans_OffsetAccount.allowEdit(true);
    }
}

Dynamics AX

このアプローチは、loadSegments() メソッドのアプローチに似ています。 parm メソッドのソースが変更できるすべての場所にコードを移動する必要があります。 ほとんどの場合、これらの場所は対応するデータ フィールドの modified() メソッドおよび/またはデータ ソースの active() メソッドです。 たとえば、上記のコードでは、移行したコードはこのようになります。

LedgerJournalTable data source,
FixedOffsetAccount field
public void modified()
{
    if (ledgerJournalTable.FixedOffsetAccount)
    {
        ledgerJournalTrans_OffsetAccount.allowEdit(ledgerJournalTrans.OffsetAccountType == LedgerJournalACType::Ledger);
    }
    else if (!ledgerJournalTrans_OffsetAccount.allowEdit())
    {
        ledgerJournalTrans_OffsetAccount.allowEdit(true);
    }
}

LedgerJournalTrans data source,
OffsetAccountType field
public void modified()
{
    if (ledgerJournalTable.FixedOffsetAccount)
    {
        ledgerJournalTrans_OffsetAccount.allowEdit(ledgerJournalTrans.OffsetAccountType == LedgerJournalACType::Ledger);
    }
        else if (!ledgerJournalTrans_OffsetAccount.allowEdit())
    {
        ledgerJournalTrans_OffsetAccount.allowEdit(true);
    }
}

LedgerJournalTrans data source:
public void active()
{
    if (ledgerJournalTable.FixedOffsetAccount)
    {
        ledgerJournalTrans_OffsetAccount.allowEdit(ledgerJournalTrans.OffsetAccountType == LedgerJournalACType::Ledger);
    }
    else if (!ledgerJournalTrans_OffsetAccount.allowEdit())
    {
        ledgerJournalTrans_OffsetAccount.allowEdit(true);
    }
}

LedgerJournalTable data source:
public void active()
{
    if (ledgerJournalTable.FixedOffsetAccount)
    {
        ledgerJournalTrans_OffsetAccount.allowEdit(ledgerJournalTrans.OffsetAccountType == LedgerJournalACType::Ledger);
    }
    else if (!ledgerJournalTrans_OffsetAccount.allowEdit())
    {
        ledgerJournalTrans_OffsetAccount.allowEdit(true);
    }
}

メモ

gotFocus() メソッドからすべてのコードを削除したら、そのメソッドを削除できます。

ステップ 14

AX 2012

フォーム init() メソッド:

ledgerDimensionDefaultAccountController = LedgerDimensionDefaultAccountController::construct(vendParameters_ds, fieldStr(VendParameters, ClearingLedgerDimension));

Dynamics AX

コントロールで以下のプロパティを設定します。

  • データ ソース
  • 参照フィールド
  • コントローラー クラス

コントローラー クラスを設定します。

参照フィールドを設定します。

メモ

コントロールが機能するには、コントローラクラスが必要です。 したがって、Controller Class プロパティが設定されていないと、ランタイム エラーがスローされます。

ステップ 15

AX 2012

ledgerDimensionAccountController.setValues(ledgerJournalTrans.DefaultDimension, false);

Dynamics AX

分析コードの指定子のマップを作成してから、セグメント化されたエントリコントロールの setDimensionSpecifiers メソッドに送信する必要があります。

Map defaultDimensionSpecifiers = LedgerDimensionDefaultingEngine::getDefaultDimensionSpecifiers(ledgerJournalTable.DefaultDimension);

TmpLedgerJournalSplitLines_LedgerAccount.setDimensionSpecifiers(defaultDimensionSpecifiers, false);

メモ

分析コードの指定子のマップに何かを追加してからコントロールに送ることができます。 新しいマップをここで作成することもできます。 (同様のロジックに関しては、LedgerJournalEngine クラス内の onSegmentChangedForPrimaryAccount メソッドを参照してください。)

ステップ 16

AX 2012

parmControl() メソッド呼び出し:(これらは通常、フォームの init() メソッドまたはコントロールで上書きされたメソッドのうちの 1 つに存在します。)

ledgerDimensionDefaultAccountController.parmControl(clearingAccount);

Dynamics AX

必要がなくなったため、このコード行を削除します。 ただし、最初にどのコントローラーがどのコントロールで使用されるかを記録します。 たとえば、この場合、ledgerDimensionDefaultAccountController が ClearingAccount SEC で使用されています。 マッピングは、コントロールでコントローラー オブジェクトのメソッド呼び出しを対応するメソッド呼び出しに置き換える場合、およびデザイン時にプロパティを設定する場合に必要です。

ステップ 17

AX 2012

フォーム init() メソッド:

ledgerDimensionDefaultAccountController.parmFilterLedgerPostingType(LedgerPostingType::VendSettlement);

Dynamics AX

これは、コントロールの転記タイププロパティです。 PostingType プロパティを設定する必要があるコントロールは、parmControl() 呼び出しを見て派生したマッピングの詳細から判別できます。

転記タイプ プロパティ。

これらのプロパティは、コントロール インスタンスで parm メソッドを介してコードで設定することもできます。 次に例を示します。

ClearingAccount.parmPostingType(LedgerPostingType::VendSettlement);

ステップ 18

AX 2012

元帳分析コードのデータ ソース フィールドで resolveReference() をオーバーライドします。

resolveReference メソッド。

Dynamics AX

不要になったので、このコードを削除してください。 コントロールこれを自動的に処理します。

ステップ 19

AX 2012

フォームは、parm メソッドを通じてコントローラーのプロパティを設定します。

Dynamics AX

一般に、コントローラー クラスに以前設定されていたプロパティをコントロールに直接設定する必要があります。 このプロパティを設定する必要があるコントロールは、parmControl() 呼び出しを見て派生したマッピングの詳細から判断できます。 また、セグメント化エントリ コントロールの場合、Microsoft Visual Studio のプロパティ ダイアログ ボックスで使用できるプロパティは、コントロール インスタンスで対応する parm メソッドを使用して、コードで設定することもできます。

ステップ 20

AX 2012

フォームは、コントロールの currentSegmentIndex() メソッドを使用します。

dimOffetAssetController. getDimensionAttributeByControlIndex(currentSegmentIndex);

Dynamics AX

一般に、コントローラー クラスに以前設定されていたプロパティをコントロールに直接設定する必要があります。 このプロパティを設定する必要があるコントロールは、parmControl() 呼び出しを見て派生したマッピングの詳細から判断できます。 また、セグメント化エントリ コントロールの場合、Visual Studio のプロパティ ダイアログ ボックスで使用できるプロパティは、コントロール インスタンスで対応する parm メソッドを使用して、コードで設定することもできます。

ステップ 21

AX 2012

このフォームは、コントローラー オブジェクトのメソッドを呼び出します。 次に例を示します。

dimOffetAssetController. getDimensionAttributeByControlIndex(currentSegmentIndex);

Dynamics AX

コントローラー上のすべてのメソッド呼び出しはコントロール上のメソッド呼び出しに置き換える必要があります。 この例では、代わりにコントロールで getDimensionAttributeByControlIndex() メソッドを使用します。

segmentedEntryControl. getDimensionAttributeByControlIndex();

ステップ 22

AX 2012

DimensionDynamicAccountController で、勘定タイプはコンストラクターを通して指定されます。

DimensionDynamicAccountController::construct(ledgerJournalTrans_ds, fieldStr(LedgerJournalTrans, LedgerDimension), fieldStr(LedgerJournalTrans, AccountType));

Dynamics AX

この機能を実装するには、2 つのメソッドがあります。 これらのメソッドは相互に排他的なため、状況に応じてそれらのメソッドのうち 1 つのみを使用してください。

  • セグメント化されたエントリーコントロールについては、プロパティダイアログ ボックスで、勘定タイプ フィールドプロパティを勘定タイプを提供するデータ ソース フィールドに設定します。 これが推奨されるメソッドです。

    メモ

    super() 呼び出しが、口座タイプ フィールド プロパティにバインドされているフィールドの modified() メソッドから削除されている場合、このメソッドは機能しません。 LedgerJournalTransDaily などのいくつかの仕訳帳フォームで、この問題が確認されました。 このような場合、super() コールバックを modified() メソッドに追加するか、2 つ目のメソッドを使用します。

  • コントロールで parmAccountTypeEnumValue() メソッドを呼び出すことにより、勘定タイプを手動で設定します。 次に例を示します。

    LedgerJournalTrans_AccountNum.parmAccountTypeEnumValue(enum2int(ledgerJournalTrans.AccountType));
    

    メモ

    parmAccountTypeEnumValue() への呼び出しは、勘定タイプを提供するフィールドの、データソースの active() メソッド、および modified() メソッドの両方に入力する必要があります。

ステップ 23

AX 2012

フォームには定義されている変数があります。

LedgerDimensionDefaultAccountController ledgerDimensionDefaultAccountController;

Dynamics AX

コントローラーが必要なくなったため、これを削除します。

ステップ 24

AX 2012

parmCurrentLedgerCOA() メソッド呼び出し:(これらは通常、フォームの init() メソッドまたはコントロールで上書きされたメソッドのうちの 1 つに存在します。)

ledgerDimensionDefaultAccountController.parmCurrentLedgerCOA(LedgerCOA::current());

Dynamics AX

ほとんどの場合に必要がなくなったため、このコード行を削除します。 この線を削除する前に、LedgerCOA 値がその情報から派生するため、データ領域 ID がパラメーターとしてコントローラーに正しく渡されていることを確認してください。 データ領域 ID が渡されない場合は、parmCurrentLedgerCOA()parmDataAreaId() で交換し、通常は curext() または会社のアカウント管理のために範囲を制御する別のテーブル フィールドである適切な SelectableDataArea 値を渡します。 フォームにデータ領域のコンテキストはありませんが、現在の LedgerCOA 値のみがある場合、既定のアカウント コント ローラーだけで動作する必要があります。 企業には無関係ですが、特定の勘定科目表 (COA) (MainAccount および Allocations など) にスコープされているフォームがいくつかあります。 そのような場合、parmCurrentLedgerCOA が、既定のアカウント コントローラー タイプ セットを持つセグメント化エントリ コントロール インスタンスで呼び出される必要があります。

ステップ 25

AX 2012

parmIncludeFinancialAccounts(NoYes) メソッド呼び出し:

LedgerDimensionDefaultAccountController.parmIncludeFinancialAccounts(NoYes::Yes);

Dynamics AX

このコード行は不要になり、セグメント化されたエントリコントロールのプロパティを使用して直接設定する必要があります。

メモ

フレームワークのバグのため、これを明示的に設定しないと、以前の動作では、構築中に暗黙的に はい が割り当てられていましたが、勘定分析コードの既定のアカウント コントローラーに いいえ が割り当てられます。 この操作は、プロパティとして手動で設定する必要があります。 または、ダイアログクラスへの、parm メソッドがまだ明示的に呼び出されるはずです。

ステップ 26

AX 2012

セグメント化エントリ コントロールのアカウントタイプを提供するデータフィールドの 変更済み メソッドのコードは、コントロールが動的アカウントコントロールとして使用されている場合、このようになります。

public void modified()
{
    super();

    // Lock the main account segment if "Fixed offset account" is selected in Journal Names
    if (ledgerJournalTable.OffsetAccountType == LedgerJournalACType::Ledger)
    {
        controller.parmLockMainAccountSegment(ledgerJournalTable.FixedOffsetAccount);
    }
}

Dynamics AX

このデータ フィールドの modified メソッドは、参照 フィールドとして セグメント化されたエントリ コントロールにバインドされた勘定分析コード フィールドをクリアしなければならなくなりました。 たとえば、セグメント化されたエントリコントロールの名前が OffsetAccount である場合、このコントロールの参照フィールド プロパティが LedgerDimension に設定され、上記のコード内の変更メソッドが次のように変更される必要があります。

public void modified()
{
    super();

    OffsetAccount.LedgerDimension = 0;

    // Lock the main account segment if "Fixed offset account" is selected in Journal Names
    if (ledgerJournalTable.OffsetAccountType == LedgerJournalACType::Ledger)
    {
        OffsetAccount.parmLockMainAccountSegment(ledgerJournalTable.FixedOffsetAccount);
    }
}

追加の明細行は、勘定タイプが変更されたときにコントロールをクリアするために必要です。

ステップ 27

AX 2012

コントローラーで parmAccountStructure() メソッドを呼び出すことができます。

fromBudgetPlanningLedgerDimensionController.parmAccountStructureId(accountStructureIdLocal);

Dynamics AX

このメソッドは 2 つの異なるメソッドで置き換えられます。 また、新しいメソッドの目的は、古いメソッドの逆です: 古いメソッドは検証を無効にしましたが、新しいメソッドはそれを有効にします。 したがって、コードを移行するときは、新しいメソッドの Boolean パラメーターを逆にする必要があります。 たとえば、上記のコードでメソッドの呼び出しについては、新しいメソッドはこのようになります。

ToBudgetTransactionLine_LedgerDimension.parmDoValueActiveDatesValidation(false);

ToBudgetTransactionLine_LedgerDimension.parmDoValueSuspendedValidation(false);

ステップ 28

AX 2012

以下のコントローラーで parmAccountStructure() メソッドを呼び出すことができます。

fromBudgetPlanningLedgerDimensionController.parmAccountStructureId(accountStructureIdLocal);

Dynamics AX

parmAccountStructureId() メソッドは、コントロール上に存在しません。 代わりに、個別の getAccountStructure() および setAccountStructure() メソッドがあります。 したがって、parmAccountStructureId() 呼び出しは、parm メソッドがどのように使用されていたかに応じて、get メソッドまたは set メソッドで置き換えられる必要があります。 たとえば、上記のコードで parm メソッドはセッターとして呼び出されたので、呼び出しは設定メソッドへの呼び出しによって置換される必要があります。

ToBudgetPlanningTransactionLine_LedgerDimension.setAccountStructureId(accountStructureIdLocal);

ステップ 29

AX 2012

parmSkipSuspendedAndActiveDateValidation:

Dynamics AX

このメソッドは 2 つの異なるメソッドで置き換えられます。 また、新しいメソッドの目的は、古いメソッドの逆です: 古いメソッドは検証を無効にしましたが、新しいメソッドはそれを有効にします。 したがって、コードを移行するときは、新しいメソッドの Boolean パラメーターを逆にする必要があります。 たとえば、上記のコードでメソッドの呼び出しについては、新しいメソッドはこのようになります。

ToBudgetTransactionLine_LedgerDimension.parmDoValueActiveDatesValidation(false);

ToBudgetTransactionLine_LedgerDimension.parmDoValueSuspendedValidation(false);

ステップ 30

AX 2012

通常は loadSegments() メソッド内でコントローラーの loadFromId メソッドを呼び出します。

ledgerDimensionDefaultAccountControllerResourceIssueOffset.loadFromId(wrkCtrTable.ResourceIssueOffsetLedgerDimension);

Dynamics AX

このメソッドは推奨されておらず、使用しないでください。 このメソッドに対するすべての呼び出しを削除する必要があります。

ダイアログ上のセグメント化エントリ コントロールの移行

ダイアログ上の新しいセグメント化されたエントリ コントロールの取得パターンは Dynamics AX で変更されています。 コントローラー クラス API とのやり取りではなく、SegmentedEntryControlBuild クラスとやり取りしてダイアログと SEC をリンクする必要があります。 このセクションでは、異なるコントローラー タイプのダイアログで SEC を使用するためのコード パターンを示します。

メモ

Dynamics AX ではヘルプ テキストが不要になるため、ダイアログ フィールドにヘルプ テキストを設定する必要はありません。

  • 動的アカウント:

    • 以前:

      // Creating the dialog field for the SEC
      dialogDynamicAccountType = _dialog.addFieldValue(enumStr(LedgerJournalACTypeForPaymProposal), defaultOffsetAccountType, "@SYS115164", "@SYS115165");
      dialogDynamicAccount = _dialog.addFieldValue(extendedTypeStr(LedgerDimensionBase), defaultOffsetLedgerDimension, "@SYS115166", "@SYS115167");
      dimensionDynamicAccountController = DimensionDynamicAccountController::constructForDialog(dialogDynamicAccount, dialogDynamicAccountType, enumStr(LedgerJournalACTypeForPaymProposal));
                  dimensionDynamicAccountController.parmIsDefaultAccount(true);
      
      public void dialogPostRun(DialogRunBase _dialog)
      {
      …
      
      dialogDynamicAccountType.registerOverrideMethod('modified', 'accountType_Modified', this);
      
      ...
      }
      
      private boolean accountType_Modified(FormComboBoxControl _formComboBoxControl)
      {
          boolean valueWasModified;
      
          valueWasModified = _formComboBoxControl.modified();
          if (valueWasModified)
          {
              dialogDynamicAccount.value(0);
          }
      
          return valueWasModified;
      }
      
    • 以後:

      // Creating the dialog field for the SEC
      protected Object dialog()
      {
      ...        
      
      // Create the account type dialog field
      dialogDynamicAccountType = _dialog.addFieldValue(enumStr(LedgerJournalACTypeForPaymProposal), defaultOffsetAccountType, "@SYS115164", "@SYS115165");
      // Create the SEC dialog field
      dialogDynamicAccount = SegmentedEntryControlBuild::addToDialog(dialog, classstr(DimensionDynamicAccountControl), extendedTypeStr(LedgerDimensionBase), "@SYS115166", defaultOffsetLedgerDimension);
      
      // Provide account type information for the SEC field
      SegmentedEntryControlBuild::initDialogFieldAccountType(dialogDynamicAccount, enumStr(LedgerJournalACTypeForPaymProposal) , defaultOffsetAccountType);
      // Set additional parameters on the SEC dialog field
      SegmentedEntryControlBuild segmentedEntryControlBuild = dialogDynamicAccount.control(); 
      segmentedEntryControlBuild.parmIsDefaultAccount(true);
      
      …
      }
      
      // Override for modified method of the Account type checkbox to update the SEC when account type is changed
      public int accountType_selectionChange(FormComboBoxControl _formComboBoxControl)
      {
      SegmentedEntryControl secDDAC = dialogDynamicAccount.control();
      accountType = _formComboBoxControl.selection();
      
      // This is the backing variable used to pack the account specified via the SEC
      ledgerDimensionDynamicAccount = 0; 
      // Clear the SEC value
      secDDAC.clearReference();                     
      
      // Specify the new account type to the SEC; this is an additional step needed for the AX SEC
      secDDAC.parmAccountTypeEnumValue(enum2int(accountType));
      
      return true;
      }
      
      // Set default account type based on value read from SysLastValue
      public void dialogPostRun(DialogRunBase _dialog)
      {
      …
      // Default any previously saved account type info
      secDDAC = dialogDynamicAccount.control();
      secDDAC.parmAccountTypeEnumValue(enum2int(accountType));
      ….
      }
      
  • 勘定科目:

    • 以前:

      dialogFeeLedgerDimension = dialog.addFieldValue(extendedtypestr(LedgerDimensionAccount),feeLedgerDimension,"@SYS119703", "@SYS85534");
      ledgerDimensionAccountController = LedgerDimensionAccountController::constructForDialog(dialogFeeLedgerDimension);
      
    • 以後:

      DialogField dialogLedgerAccount = SegmentedEntryControlBuild::addToDialog(dialog, classstr(LedgerDimensionAccountControl), extendedTypeStr(LedgerDimensionAccount), "@SYS119703", feeLedgerDimension);
      
  • 既定の勘定:

    • 以前:

      dialogInterCompanyLedgerDimension = dialog.addFieldValue(extendedTypeStr(LedgerDimensionDefaultAccount),interCompanyLedgerDimension, "@SYS21687", "@SYS85534");
      ledgerDimensionDefaultAccountController = LedgerDimensionDefaultAccountController::constructForDialog(dialogInterCompanyLedgerDimension);
      
    • 以後:

      DialogField dialogDefaultAccount = SegmentedEntryControlBuild::addToDialog(dialog, classstr(LedgerDimensionDefaultAccountControl), extendedTypeStr(LedgerDimensionDefaultAccount), "@SYS21687", interCompanyLedgerDimension);
      
  • 予算:

    • 以前: 既存のプログラム ソース コード内でダイアログ シナリオの予算計画コントローラー (BudgetLedgerDimensionController) の取り込みは見つかりませんでした。

    • 以後:

      DialogField dialogBudget = SegmentedEntryControlBuild::addToDialog(dialog, classstr(BudgetLedgerDimensionControl), extendedTypeStr(LedgerDimensionBudget), 'Budget', ledgerDimensionBudget);
      

    メモ :

    • 新しい API を使用すると、ダイアログ フィールドを設定しているときに、ラベル (前述の例では 予算) を指定できます。
    • コントロールのデフォルト値は、ledgerDimensionBudget 変数で指定します。
    • 予算 コントローラーを用いて、使用する勘定構造を指定する必要があります。 Dialog クラスは、ユーザーが勘定構造を選択し (SEC の外部で)、選択した勘定構造を SEC で設定する方法を実装する必要があります。
  • 予算計画:

    • 以前: 既存のプログラム ソース コード内でダイアログ シナリオの予算計画コントローラー (BudgetPlanningLedgerDimensionController) の取り込みは見つかりませんでした。

    • 以後:

      DialogField dialogBudgetPlanning = SegmentedEntryControlBuild::addToDialog(dialog, classstr(BudgetPlanningLedgerDimensionControl), extendedTypeStr(LedgerDimensionBudgetPlanning), 'Budget planning', ledgerDimensionBudgetPlanning);
      

    メモ :

    • 新しい API を使用すると、ダイアログ フィールドを設定しているときに、ラベル (前述の例では 予算計画) を指定できます。
    • コントロールのデフォルト値は、ledgerDimensionBudgetPlanning 変数で指定します。
    • 予算計画 コントローラーを用いて、使用する勘定構造を指定する必要があります。 Dialog クラスは、ユーザーが勘定構造を選択し (SEC の外部で)、選択した勘定構造を SEC で設定する方法を実装する必要があります。

追加リソース

ダイアログのセグメント化されたエントリ コントロールのサポート

セグメント化されたエントリ コントロールのデザイン時メタデータ

セグメント化されたエントリ コントロールの Parm メソッド

セグメント化されたエントリ コントロールの移行