Поиск…


Использование CacheAttached для переопределения атрибутов DAC на графике

Иногда вам необходимо переопределить один или несколько атрибутов определенного поля Data Access Class (DAC) только для определенного экрана, не изменяя существующее поведение для других экранов.

Замена всех атрибутов

Предположим, что исходные атрибуты поля ЦАП объявлены как показано ниже:

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

Основной способ переопределить атрибуты поля в графе - объявить CacheAttached события CacheAttached в графе, который следует за стандартным соглашением для присвоения имен графическим событиям (обратите внимание на отсутствие аргумента EventArgs). Тело обработчика события не будет выполнено, но любые атрибуты, которые вы помещаете в обработчик, заменит атрибуты соответствующего поля ЦАП:

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

Добавление нового атрибута в поле ЦАП

Набор атрибутов, помещенных в обработчик CacheAttached, переопределит весь набор атрибутов, помещенных в поле в ЦАП. Это почти всегда избыточно; обратите внимание, как в предыдущем примере, чтобы добавить только один атрибут в поле, вам пришлось скопировать все другие объявления атрибутов из ЦАП. Это приводит к нежелательному дублированию кода, а также к возможности синхронизации ЦАП и графика. Очень легко представить себе ситуацию, когда кто-то изменяет логику дефолта, например, PXDefaultAttribute в ЦАП, но забывает обновлять все соответствующие атрибуты, размещенные в обработчиках CacheAttached на разных графиках.

Чтобы исправить эту проблему, Acumatica Framework предоставляет специальный атрибут PXMergeAttributesAttribute . Когда этот атрибут помещается в обработчик CacheAttached , вы можете повторно использовать существующие атрибуты, определенные в ЦАП.

Добавление атрибута с использованием атрибута PXMergeAttributesAttribute :

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

В приведенном выше примере весь набор атрибутов из исходного ЦАП будет использоваться повторно, добавленный любыми атрибутами, которые вы CacheAttached обработчике событий CacheAttached .

PXMergeAttributesAttribute имеет другое поведение слияния в соответствии со следующими возможными значениями свойства Method:

  • MergeMethod.Replace заменяет атрибуты ЦАП (что эквивалентно отсутствию PXMergeAttributesAttribute ).
  • MergeMethod.Append добавляет атрибуты из обработчика CacheAttached к исходным атрибутам DAC.
  • MergeMethod.Merge похож на Append ; однако он также проверяет наличие конфликтующих атрибутов между атрибутами обработчика и атрибутами поля ЦАП. Если есть конфликт, атрибут CacheAttached имеет приоритет, и соответствующий атрибут DAC отбрасывается.

Переопределение одного свойства атрибута

Очень распространенный сценарий разработки приложений возникает, когда вам нужно переопределить только одно свойство атрибута ЦАП для определенного экрана; рассмотрите ситуацию, когда вам нужно определить свойство DisplayName для PXUIFieldAttribute.

Для этой цели вы можете использовать еще один специальный атрибут, предоставляемый Acumatica Framework: PXCustomizeBaseAttributeAttribute . Его конструктор принимает три значения:

  • Тип атрибута DAC, свойство которого необходимо переопределить
  • Имя свойства атрибута для переопределения (используйте оператор nameof в C # 6.0 для nameof обслуживания кода)
  • Новое значение для указанного свойства.

Предположим, что существует требование изменить отображаемое имя пользовательского интерфейса из суммы комиссии в базовую валютную комиссию только для одного экрана. Следующий пример кода демонстрирует, как реализовать желаемое поведение.

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

В этом примере PXMergeAttributes обеспечивает сохранение исходных атрибутов DAC, а PXCustomizeBaseAttribute позволяет разработчику программного обеспечения переопределять отображаемое имя поля интерфейса для рассматриваемого графика.

Замена атрибута другим атрибутом

Предположим, что существует требование заменить PXDefaultAttribute поля DAC на PXDefaultAttribute PXDBDefaultAttribute для одного экрана.

Это может быть достигнуто следующим образом:

[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