Buscar..


Uso de CacheAttached para reemplazar atributos de DAC en el gráfico

A veces, debe anular uno o más atributos de un campo de clase de acceso a datos (DAC) en particular para una pantalla en particular, sin cambiar el comportamiento existente para otras pantallas.

Reemplazo de todos los atributos

Supongamos que los atributos del campo DAC original se declaran como se muestra a continuación:

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

La forma básica de anular los atributos del campo en el gráfico es declarar un controlador de eventos CacheAttached en el gráfico que sigue la convención estándar para nombrar eventos del gráfico (tenga en cuenta la ausencia del argumento EventArgs). El cuerpo del controlador de eventos no se ejecutará, pero cualquier atributo que coloque en el controlador reemplazará los atributos en el campo DAC correspondiente:

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

Anexando un nuevo atributo al campo DAC

El conjunto de atributos colocado en el controlador CacheAttached redefinirá el conjunto completo de los atributos ubicados en el campo en el DAC. Esto es casi siempre una exageración; observe cómo en el ejemplo anterior, para agregar un solo atributo al campo, tuvo que copiar todas las demás declaraciones de atributos del DAC. Esto conduce a una duplicación de código no deseado, así como a la posibilidad de que DAC y el gráfico se desincronicen. Es muy fácil imaginar una situación cuando alguien cambia la lógica PXDefaultAttribute de, por ejemplo, PXDefaultAttribute en el DAC, pero se olvida de actualizar todos los atributos correspondientes colocados en los controladores de CacheAttached en varios gráficos.

Para solucionar este problema, Acumatica Framework proporciona un atributo especial llamado PXMergeAttributesAttribute . Cuando este atributo se coloca en un controlador CacheAttached , puede reutilizar los atributos existentes definidos en el DAC.

Anexando un atributo utilizando PXMergeAttributesAttribute :

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

En el ejemplo anterior, todo el conjunto de atributos del DAC original se reutilizará, junto con cualquier atributo que haya declarado en el controlador de eventos CacheAttached .

PXMergeAttributesAttribute tiene otros comportamientos de fusión, de acuerdo con los siguientes valores posibles para la propiedad Method:

  • MergeMethod.Replace reemplaza los atributos del DAC completamente (equivalente a la ausencia de PXMergeAttributesAttribute ).
  • MergeMethod.Append agrega los atributos del controlador CacheAttached a los atributos DAC originales.
  • MergeMethod.Merge es similar a Append ; sin embargo, también verifica si hay atributos en conflicto entre los atributos del manejador y los atributos del campo DAC. Si hay un conflicto, el atributo CacheAttached tiene prioridad y el atributo DAC correspondiente se descarta.

Anulando una propiedad única de un atributo

Un escenario de desarrollo de aplicaciones muy común ocurre cuando tiene que redefinir solo una propiedad del atributo de un DAC para una pantalla en particular; considerar la situación cuando se tiene que definir el DisplayName propiedad del PXUIFieldAttribute.

Para ese propósito, puede usar otro atributo especial provisto por Acumatica Framework: PXCustomizeBaseAttributeAttribute . Su constructor acepta tres valores:

  • El tipo del atributo DAC cuya propiedad debe ser anulada
  • El nombre de la propiedad del atributo a anular (use el operador nameof en C # 6.0 para mantener el código)
  • El nuevo valor para la propiedad especificada.

Supongamos que existe un requisito para cambiar el nombre de visualización de la UI de Importe de la Comisión a la Comisión de moneda base para una sola pantalla. El siguiente ejemplo de código muestra cómo implementar el comportamiento deseado.

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

En este ejemplo, PXMergeAttributes garantiza que los atributos DAC originales se conservan, y PXCustomizeBaseAttribute permite que el ingeniero de software anule el nombre de visualización del campo UI para el gráfico en cuestión.

Reemplazo de un atributo con otro atributo

Supongamos que hay un requisito para reemplazar el PXDefaultAttribute PXDBDefaultAttribute de un campo DAC con PXDBDefaultAttribute para una sola pantalla.

Esto se puede lograr de la siguiente manera:

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

Orden de aplicación de los atributos de personalización de atributos

  1. PXCustomizeBaseAttribute
  2. PXRemoveBaseAttribute
  3. PXMergeAttributes


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow