Inicio Blog Objetos DAC personalizados a la adición del Formula Builder

Objetos DAC personalizados a la adición del Formula Builder

Sharif Ahammad | 31 de marzo de 2022

Añadir objetos DAC personalizados al Formula Builder

Introducción

El Editor de Fórmulas / Constructor de Expresiones en Acumatica es una herramienta muy útil para construir expresiones en Consultas Genéricas, Informes, etc. Permite a los usuarios utilizar varios operadores (como aritmética lógica, etc.) y funciones (como conversión, matemáticas, texto, etc.) que ayudan a crear resultados ricos/complejos requeridos para diversas necesidades empresariales de los usuarios de Acumatica. Este artículo explica cómo anular este constructor de fórmulas predeterminado para agregar los campos personalizados creados a través de personalizaciones que se agregarán al constructor de fórmulas para incluirse en la salida de una IG o incluso utilizar este constructor de fórmulas en las nuevas pantallas desarrolladas utilizando personalizaciones.

Enfoque técnico

Acumatica proporciona un constructor de fórmulas/expresiones muy flexible para construir expresiones con varias funciones incorporadas, como funciones de cadena, lógicas y aritméticas. Y, permite a los usuarios añadir objetos de pantalla al editor bajo los objetos basados en la selección de los objetos DAC en la consulta genérica o en los escenarios de importación/exportación, lo cual es bastante bueno.

Sin embargo, este post se centrará en la adición de objetos DAC personalizados al constructor de fórmulas y el uso de esos campos personalizados en el editor de fórmulas.

Ejemplo de pantalla aquí como referencia:

Añadir objetos DAC personalizados al generador de fórmulas.

A continuación se describen los pasos para lograr este constructor de expresión personalizada en Acumatica y esto puede ser publicado como una personalización también.

Paso 1. Crear dos proyectos
Crear dos proyectos un proyecto para la creación de la "TESTScreen.cs" y 2 º proyecto para MyFormulaEditor.cs archivo, my_FormulaEditor.js archivo de secuencia de comandos y controles de usuario.

Creando el "TESTScreen.cs" y el 2º proyecto para el archivo MyFormulaEditor.cs.

Segundo paso:
Añada el siguiente código en el archivo TestSCreen.cs.


#region Metadata for MYFormulaEditor
   public PXSelect<KNRWEmolumentDetails> EmolumentDetailsData;
#endregion

Código en el archivo TestSCreen.cs.

Paso 3:
En el 2do proyecto agregue la siguiente línea de código en el archivo "MYFormulaEditor.cs".

Archivo MYFormulaEditor.cs.

Paso 4:
En el 2º Proyecto añade las siguientes líneas de código en el fichero "mi_FormulaEditor.js".


// the panel show event handler
   this.EmolumentDetailsFields = __win(this).__myEmolumentDetailsFields.split(",");
// Category select event handler
     case 35: list = this.EmolumentDetailsFields; break;

 

Paso 5:
En el archivo del 2º Proyecto "MYFormulaPanel.ascx", añada el nuevo Nodo Árbol resaltado abajo.


<px:PXTreeNode Expanded="True" Text="Objects">
<ChildNodes>
   <px:PXTreeNode Text="SOOrder" Value="31">
   </px:PXTreeNode>
   <px:PXTreeNode Text="SOLine" Value="32">
   </px:PXTreeNode>
   <px:PXTreeNode Text="InventoryItem" Value="33">
   </px:PXTreeNode>
   <px:PXTreeNode Text="Customer" Value="34">
   </px:PXTreeNode>
   <px:PXTreeNode Text="KNRWEmolumentDetails" Value="35">
   </px:PXTreeNode>
</ChildNodes>
</px:PXTreeNode>

 

Paso 6:
En el fichero "MYFormulaPanel.ascx.cs" del 2º Proyecto, añada las siguientes líneas de código en los respectivos métodos que se mencionan a continuación.

a. Declarar myEmolumentDetailsFields como cadena
private cadena myEmolumentDetailsFields = null;

b. En el método public void Initialise(MYFormulaEditor control) añada la siguiente línea
myEmolumentDetailsFields = control.EmolumentDetailsFields;
c. Y en el evento protected void handleContentLoad(object sender, EventArgs e) añada la siguiente línea.

renderer.RegisterClientScriptBlock(this.GetType(), “__myEmolumentDetailsFields”, string.Format(“window.__myEmolumentDetailsFields = ‘{0}’;”, myEmolumentDetailsFields), true);

Paso 7:
Cree la compilación y estas dos DLL se utilizarán en el proyecto principal como en los pasos siguientes.

a) Estos dos archivos DLL deben ser pegados en la carpeta BIN de nuestro proyecto. Y crear una nueva página y el código en el archivo ASPX como se destaca a continuación.


<%@ Register Assembly="FormulaEditor2.Control" TagPrefix="pxm" 
Namespace="FormulaEditor2.Control" %>
<asp:Content ID="cont1" ContentPlaceHolderID="phDS" runat="Server">
   <px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%" 
PrimaryView="UsrKNRWSalaryComponents" 
TypeName="KN.RW.StaffManagement.KNRWSalaryComponentsMaint">
    <CallbackCommands>
    </CallbackCommands>
   </px:PXDataSource>
</asp:Content>
<asp:Content ID="cont2" ContentPlaceHolderID="phL" runat="Server">
   <script language="javascript" type="text/javascript">
     function ShowPopUp() {
       var ds = px_alls['ds'];
       ds.executeCallback("LinkEmployee");
     };
   </script>
   <style type="text/css">
     .GridRow.ellipsis {
       white-space: normal;
     }
   </style>

 

b) Cuando se utilizan los controles como el siguiente código.


<pxm:MYFormulaEditor ID="edStrCalculationFormula" runat="server" 
DataSourceID="ds" DataField="CalculationFormula" CssClass="dropDown">
<EditorStyle CssClass="editor" />
</pxm:MYFormulaEditor>

 

c) En el archivo aspx.cs escriba el siguiente código para cargar el control.


public partial class Pages_RW200301 : PX.Web.UI.PXPage
  {
     static Pages_RW200301()
     {
AssemblyResourceProvider.MergeAssemblyResourcesIntoWebsite<FormulaEditor2.Control.MYFormulaPanel>();
     }
protected void Page_Load(object sender, EventArgs e)
     {
    }
  }

 

Análisis sintáctico de la expresión Formula:

Con los pasos anteriores obtendrá su DAC personalizado en el constructor de expresiones. Ahora viene el paso de analizar la cadena de fórmula para realizar los cálculos necesarios de la expresión personalizada que se construye en el editor de fórmulas.


Dictionary CalculateValues = new Dictionary<string, decimal>();
string sFormula = osalarycomponents.RowCast<KNRWSalaryComponents>().Where(a => a.ComponentCD == "HRA").ToList()[0].CalculationFormula.ToString();
   odetail.Hra = GetCalculationFormulaval(sFormula);
   CalculateValues.Add(FieldName("Hra"), odetail.Hra ?? 0);

public static decimal GetCalculationFormulaval(string CalculationFormula)
   {
     decimal dReturnval = 0;
     try
     {
       if (CalculationFormula.StartsWith("="))
        {
          string sFormular = CalculationFormula.Replace("=", "");
          string[] math = sFormular.Split(new Char[] { '+', '-', '*', '/' });
          string itemsA = sFormular;
          string itemsB = string.Empty;
          foreach (var itm in math)
          {
            if (!string.IsNullOrEmpty(itm))
             {
               double Amount2 = 0;
               if (!double.TryParse(itm, out Amount2))
               {
                 itemsB = CalculateValues[itm.Trim().Replace('(', ' ').Replace(')', ' ').Trim()].ToString();
                 if (itm.Contains("("))
                    itemsB = "(" + itemsB;
                 if (itm.Contains(")"))
                    itemsB = itemsB + ")";
                 itemsA = itemsA.Replace(itm, itemsB.ToString());
               }
            }
          }
          ExpressionNode _descNode = PMExpressionParser.Parse(new KNRWEmolumentHelper(), itemsA);
          var value = _descNode.Eval(new object());
          if (string.IsNullOrEmpty(value.ToString()))
            dReturnval = 0;
          else
            dReturnval = Convert.ToDecimal(value);
          dReturnval = Math.Round(dReturnval, 2);
        }
      }
      catch (Exception ex)
      {
        ex.ToString();
        return 0;
      }
      return dReturnval;
     }

public static string FieldName(string Field)
   {
     PropertyInfo[] properties = typeof(KNRWEmolumentDetails).GetProperties();
     var GetFieldName = properties.Where(a => a.Name == Field).FirstOrDefault();
     return "[" + GetFieldName.ReflectedType.Name + "." + GetFieldName.Name.ToString() + "]";
   }

 

Resumen

Espero que este artículo le ayude a crear un editor de fórmulas personalizado integrado en sus propias pantallas personalizadas e incluso anular el editor de fórmulas en las pantallas de IG, etc.

Autor del blog

Jefe de Entrega en Kensium Solutions

Reciba las actualizaciones del blog en su bandeja de entrada.