サーチ…


CacheAttachedを使用したグラフのDAC属性の上書き

場合によっては、特定のデータアクセスクラス(DAC)フィールドの1つ以上の属性を、特定の画面に対してのみ変更し、他の画面の既存の動作を変更する必要があります。

すべての属性の置換

元のDACフィールドの属性が次のように宣言されているとします。

public class ARInvoice : IBqlTable
{
    [PXDBDecimal(4)]
    [PXDefault(TypeCode.Decimal, "0.0")]
    [PXUIField(DisplayName = "Commission Amount")]
    public virtual Decimal? CommnAmt 
    { 
        get; 
        set; 
    }
}

グラフのフィールドの属性をオーバーライドする基本的な方法は、グラフイベントに名前を付けるための標準的な規則(EventArgs引数がないことに注意してください)に従って、グラフにCacheAttachedイベントハンドラを宣言することです。イベントハンドラの本体は実行されませんが、あなたは、ハンドラに置く任意の属性は 、対応するDACフィールドの属性を置き換えます:

[PXDBDecimal(4)]
[PXDefault(TypeCode.Decimal, "0.0")]
[PXUIField(DisplayName = "Commission Amount")]
[PXAdditionalAttribute(NecessaryProperty = true)]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }

DACフィールドに新しい属性を追加する

CacheAttachedハンドラに配置された一連の属性は、DACのフィールドに配置された属性のセット全体再定義します 。これは、ほとんどの場合、過度の攻撃です。前の例では、フィールドに単一の属性を追加するために、他のすべての属性宣言をDACからコピーする必要があることに注意してください。これにより、望ましくないコードの重複や、DACとグラフが同期しなくなる可能性があります。誰かがDACのPXDefaultAttributeなどのデフォルトロジックを変更するが、 CacheAttachedハンドラに配置されたすべての対応する属性をさまざまなグラフで更新することを忘れてしまう状況を想像するのは簡単です。

この問題を解決するために、Acumatica FrameworkにはPXMergeAttributesAttributeという特別な属性がPXMergeAttributesAttributeます。この属性をCacheAttachedハンドラに配置すると、DACで定義されている既存の属性を再利用できます。

PXMergeAttributesAttributeを使用して属性をPXMergeAttributesAttribute

[PXMergeAttributes(Method = MergeMethod.Append)]
[PXAdditionalAttribute(NecessaryProperty = true)]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }

上記の例では、元のDACの属性セット全体が再利用され、 CacheAttachedイベントハンドラで宣言した属性が追加されます。

PXMergeAttributesAttributeは、次の可能なMethodプロパティの値に従って、他のマージ動作があります。

  • MergeMethod.Replaceは、DACの属性を完全に置き換えます( PXMergeAttributesAttributeがない場合とPXMergeAttributesAttribute )。
  • MergeMethod.Appendは、 CacheAttachedハンドラの属性を元のDAC属性に追加します。
  • MergeMethod.MergeAppend似ています。ただし、ハンドラ属性とDACフィールド属性の間に競合する属性があるかどうかもチェックされます。競合がある場合、 CacheAttached属性が優先され、対応するDAC属性は破棄されます。

属性の単一のプロパティのオーバーライド

非常に一般的なアプリケーション開発のシナリオは、特定の画面に対してDACの属性のプロパティを1つだけ再定義する必要がある場合に発生します。 PXUIFieldAttributeのDisplayNameプロパティを定義する必要がある状況を検討してください。

:その目的のために、あなたはまだAcumaticaフレームワークが提供する別の特殊な属性を使用することができますPXCustomizeBaseAttributeAttribute 。そのコンストラクタは3つの値を受け取ります:

  • プロパティーをオーバーライドする必要があるDAC属性のタイプ
  • オーバーライドする属性のプロパティの名前(コードのメンテナンス性のためにC#6.0のnameof演算子を使用)
  • 指定されたプロパティの新しい値です。

1つの画面に対してUI表示名をCommission AmountからBase Currency Commissionに変更する必要があるとします。次のコード例は、目的の動作を実装する方法を示しています。

[PXMergeAttributes(Method = MergeMethod.Append)]
[PXCustomizeBaseAttribute(typeof(PXUIFieldAttribute), nameof(PXUIFieldAttribute.DisplayName), "Base Currency Commission")]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }

この例では、 PXMergeAttributesは元のDAC属性が保持されることを保証し、 PXCustomizeBaseAttributeはソフトウェアエンジニアが問題のグラフのUIフィールドの表示名を上書きすることを許可します。

属性を別の属性に置き換える

1つの画面に対してのみ、DACフィールドのPXDefaultAttributePXDBDefaultAttributeに置き換える必要があるとします。

これは、以下の方法で達成することができる。

[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(PXDefaultAttribute))]
[PXDBDefault(typeof(SOShipment.siteID), PersistingCheck = PXPersistingCheck.Nothing)]
protected void SOOrderShipment_SiteID_CacheAttached(PXCache sender) { }

属性をカスタマイズする属性のアプリケーション順

  1. PXCustomizeBaseAttribute
  2. PXRemoveBaseAttribute
  3. PXMergeAttributes


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow