acumatica
カスタマイズメカニズム
サーチ…
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.Merge
はAppend
似ています。ただし、ハンドラ属性と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フィールドのPXDefaultAttribute
をPXDBDefaultAttribute
に置き換える必要があるとします。
これは、以下の方法で達成することができる。
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(PXDefaultAttribute))]
[PXDBDefault(typeof(SOShipment.siteID), PersistingCheck = PXPersistingCheck.Nothing)]
protected void SOOrderShipment_SiteID_CacheAttached(PXCache sender) { }
属性をカスタマイズする属性のアプリケーション順
-
PXCustomizeBaseAttribute
-
PXRemoveBaseAttribute
-
PXMergeAttributes