acumatica
Mecanismos de personalización
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 dePXMergeAttributesAttribute
). -
MergeMethod.Append
agrega los atributos del controladorCacheAttached
a los atributos DAC originales. -
MergeMethod.Merge
es similar aAppend
; 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 atributoCacheAttached
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
-
PXCustomizeBaseAttribute
-
PXRemoveBaseAttribute
-
PXMergeAttributes