Una de las sesiones más valoradas de nuestra Virtual DevCon fue la de Sergey Marenich sobre trucos y consejos avanzados del framework. Hizo un trabajo magistral exponiendo una serie de actividades muy útiles que un desarrollador de nuestra plataforma puede hacer para ser más eficiente y productivo, así como algunas buenas prácticas de codificación. Dado que cada persona aprende y se beneficia de una variedad de modalidades, pensamos que sería bueno compartir la sabiduría de Sergey también por escrito. Distribuiré el contenido en pequeñas porciones a lo largo de las próximas entradas del blog.
La semana pasada, me centré en Configurar tus herramientas y Desactivar la compilación de sitios web. Hoy, dedicaré tiempo a explorar los Consejos de Mejores Prácticas de Programación de Sergey : Automatizando cálculos usando el Atributo PXFormula para simplificar tu código - Tip # 6.
A modo de repaso, a continuación figuran los consejos que vamos a tratar en esta serie. Y como recordatorio, me estoy saltando Encontrar más información a través de las comunidades (Consejo 3), ya que he cubierto este tema en un post anterior. Además, he cubierto el Tip 5, Depuración del código de Acumatica en un post anterior.
Consejo 1 - Configuración de su instancia de Acumatica
Consejo 2 - Configuración de las herramientas
Consejo 3 - Encontrar más información a través de las comunidades
Consejo 4 - Desactivar la compilación de sitios web
Consejo 5 - Depuración del código de Acumatica
Consejo 6 - Autocalcular con fórmulas
Consejo 7 - Minimizar la duplicación
Consejo 8 - Ventajas de utilizar eventos
Consejo 9 - Reutilización de consultas BQL
Consejo 10 - Modificación de selectores
Consejo 11 - Campos de diferentes vistas
El primer conjunto de consejos de programación que debe aprovechar al codificar es el uso de fórmulas para simplificar el código. Con el uso del Atributo PXFormula, puede utilizar un campo del mismo registro de datos o conjuntos en una expresión de agregación para calcular un campo de registro de datos padre a partir de campos de registro de datos hijo. Estos cálculos se realizan en tiempo de ejecución. El Framework utiliza mucho los atributos y, por lo tanto, abordamos la programación de una manera muy declarativa. Al colocar los atributos en los lugares adecuados, se simplifican las tareas de programación y se reducen las líneas de código que hay que escribir. En pocas palabras: menos código, menos errores.
Atributo Validar fórmula
Un ejemplo fácil de ilustrar es el atributo Validate formula que lanza el evento FieldVerifying para el campo al que se adjunta el atributo PXFormula una vez que el campo especificado cambia.
Código de ejemplo:
//Validate
[PXFormula(typeof(Validate))]
public virtual void Batch_Date_CacheAttached(PXCache sender) { }
El atributo Validar fórmula eleva la validación del campo automáticamente cuando se cambia el campo actual en el que se adjunta la fórmula.
Otro ejemplo:
//Validate
[PXFormula(typeof(Validate<ContractItem.maxQty, ContractItem.minQty>))]
Para más referencias y ejemplos, consulte la Referencia API de la Guía del desarrollador de AcumaticaFramework .
El constructor padre y el parámetro actual
Recuerde que puede colocar un atributo en cualquier campo del DAC hijo. El objetivo principal del atributo es realizar una eliminación en cascada de los registros hijos una vez que se elimina un registro de datos padre. Normalmente, la consulta incluye una cláusula Where para que los campos clave del padre sean iguales a los campos clave del hijo. En este caso, los valores de los campos clave del registro de datos hijo se especifican mediante el parámetro Actual.
Utilizar métodos estáticos para recuperar datos padre o registros de datos hijo específicos, u obtener y establecer algunos parámetros de atributos. Una vez añadido el atributo PXParent a algún campo DAC, se puede utilizar el atributo PXFormula para definir cálculos de conjuntos para campos de registros de datos padre a partir de campos de registros de datos hijo.
El atributo PXParent obtiene el valor del campo del registro de datos principal definido por PXParentAttribute que reside en el CAD actual. Inicializa una nueva instancia que define el registro de datos padre utilizando la consulta BQL proporcionada.
Por ejemplo:
//Parent
PXParent(typeof(Select<INRegister,
Where<INRegister.docType, Equal<Current>
And<INRegister.refNbr, Equal<Current>>>>))]
[PXFormula(typeof(Parent))]
public virtual void INTran_OrigModule_CacheAttached(PXCache sender) { }
Para el parámetro Actual, el siguiente ejemplo especifica una consulta para seleccionar el registro de datos Documento padre para un registro de datos DocTransacción hijo dado.
//Current
[PXParent(typeof(Select<Document,
Where<Document.docNbr, Equal<Current>,
And<Document.docType, Equal<Current>>>>))]
public virtual string DocNbr {get; set;}
Esto le proporciona acceso a la clase de acceso a datos (DAC) que no es su DAC actual. El uso del parámetro actual con el atributoFormulaAttribute le permite encontrar la caché y utilizar el tipo de documento o el número de referencia.
El código siguiente lo ilustra muy bien:
//Current
PXFormula(typeof(Switch>,
And<ARAdjust.adjgRefNbr, Equal<Current>>>,
ERActivity.classIcon>,
EPActivity.classIcon>))]
protected virtual void ARAdjust_ClassIcon_CacheAttached(PXCache sender) { }
En lugar de usar el Evento FieldUpdated o algún otro evento, puedes usar el atributo formula en este caso.
Para obtener más información, consulte la sección Referencia de API de la Guía del desarrollador de Acumatica Framework .
Parámetro IsTableEmpty
Para determinar si una tabla está vacía, puede utilizar el parámetro IsTableEmpty con PXFormula devuelve true si la tabla DB correspondiente al DAC especificado no contiene registros.
//IsTableEmpty
PXFormula(typeof (Swich, Equal>, True,
Case<Where<APRegister.requestApproval, Equal>, False>>, True>
))]
public virtual void APRegister_ContApprove_CacheAttached(PXCache sender) { }
El parámetro selector
Cuando se utiliza el Parámetro Selector con el Atributo Formula, se puede seleccionar el registro relacionado. En el DAC APVendorPrice, seleccione el InventoryID a través del selector y a través del campo InventoryItem any. En lugar de utilizar FieldUpdating o RowUpdating, y escribir el código para obtener los datos relacionados en la clase de acceso a datos, puede utilizar fórmulas.
He aquí un código sencillo que ilustra este punto:
//Selector
PXFormula(typeof(Selector<APVendorPrice.inventoryID, InventoryItem.purchaseUnit>))]
public virtual void APVendorPrice_UOM_CacheAttached(PXCache sender) { }
}
}
Estos ejemplos, que utilizan atributos y parámetros de fórmulas, ilustran formas en las que puedes agilizar y simplificar tu código. La próxima vez, continuaré explorando el tema de las mejores prácticas de programación de Sergey y discutiré las formas en las que puedes minimizar la duplicación en tu código usando nuestro Framework.