Accueil Blog Ajout d'objets DAC personnalisés au Formula Builder

Ajout d'objets DAC personnalisés au Formula Builder

Sharif Ahammad | 31 mars 2022

Ajout d'objets DAC personnalisés au Formula Builder

Introduction

L'éditeur de formules / Constructeur d'expressions dans Acumatica est un outil très utile pour construire des expressions sur les requêtes génériques, les rapports, etc. Il permet aux utilisateurs d'utiliser divers opérateurs (tels que l'arithmétique, la logique, etc.) et fonctions (telles que la conversion, les mathématiques, le texte, etc.) qui aident à construire des résultats riches/complexes requis pour les divers besoins commerciaux des utilisateurs d'Acumatica. Cet article explique comment surcharger ce constructeur de formule par défaut pour ajouter les champs personnalisés créés à travers les personnalisations à ajouter au constructeur de formule pour être inclus dans la sortie d'une IG ou même utiliser ce constructeur de formule sur les nouveaux écrans développés à l'aide des personnalisations.

Approche technique

Acumatica fournit un générateur de formules/expressions très flexible pour construire des expressions avec diverses fonctions intégrées telles que les chaînes de caractères, les fonctions logiques et arithmétiques. De plus, il permet aux utilisateurs d'ajouter des objets d'écran à l'éditeur sous les objets basés sur la sélection des objets DAC dans l'enquête générique ou dans les scénarios d'importation/exportation, ce qui est très bien.

Toutefois, ce billet se concentrera sur l'ajout d'objets DAC personnalisés au constructeur de formules et sur l'utilisation de ces champs personnalisés dans l'éditeur de formules.

Un exemple d'écran est présenté ici à titre de référence :

Ajout d'objets DAC personnalisés à l'outil de création de formules.

Vous trouverez ci-dessous les étapes à suivre pour réaliser ce constructeur d'expressions personnalisées dans Acumatica, qui peut également être publié en tant que personnalisation.

Etape 1 :
Créez deux projets : un projet pour créer le fichier "TESTScreen.cs" et un deuxième projet pour le fichier MyFormulaEditor.cs, le fichier script my_FormulaEditor.js et les contrôles utilisateur.

Création du fichier "TESTScreen.cs" et du deuxième projet pour le fichier MyFormulaEditor.cs.

Etape 2 :
Ajouter le code ci-dessous dans le fichier TestSCreen.cs.


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

Code dans le fichier TestSCreen.cs.

Etape 3 :
Dans le deuxième projet, ajoutez la dernière ligne de code ci-dessous dans le fichier "MYFormulaEditor.cs".

Fichier MYFormulaEditor.cs.

Etape 4 :
Dans le deuxième projet, ajoutez les lignes de code suivantes dans le fichier "my_FormulaEditor.js".


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

 

Etape 5 :
Dans le deuxième fichier du projet "MYFormulaPanel.ascx", ajoutez le nouveau nœud d'arbre mis en évidence ci-dessous.


<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>

 

Etape 6 :
Dans le fichier "MYFormulaPanel.ascx.cs" du deuxième projet, ajoutez les lignes de code suivantes dans les méthodes respectives mentionnées ci-dessous.

a. Déclarer myEmolumentDetailsFields en tant que chaîne de caractères
private string myEmolumentDetailsFields = null ;

b. Dans la méthode public void Initialise(MYFormulaEditor control), ajouter la ligne suivante
myEmolumentDetailsFields = control.EmolumentDetailsFields ;
c. Et dans l'événement protégé void handleContentLoad(object sender, EventArgs e) ajouter la ligne suivante.

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

Etape 7 :
Créer le build et ces deux DLL seront utilisées dans le projet principal comme indiqué ci-dessous.

a) Ces deux fichiers DLL doivent être collés dans le dossier BIN de notre projet. Créez une nouvelle page et le code dans le fichier ASPX comme indiqué ci-dessous.


<%@ 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) Lorsque vous utilisez les contrôles comme dans le code ci-dessous.


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

 

c) Dans le fichier aspx.cs, écrivez le code ci-dessous pour charger le contrôle.


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)
     {
    }
  }

 

Analyse d'une expression de formule :

Avec les étapes ci-dessus, vous obtiendrez votre DAC personnalisé dans l'éditeur d'expressions. Il s'agit maintenant d'analyser la chaîne de la formule pour effectuer les calculs nécessaires à partir de l'expression personnalisée construite dans l'éditeur de formule.


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() + "]";
   }

 

Résumé

J'espère que cet article vous aidera à créer un éditeur de formule personnalisé intégré à vos propres écrans personnalisés et même à remplacer l'éditeur de formule sur les écrans GI, etc.

Auteur du blog

Responsable de la livraison chez Kensium Solutions

Recevez les mises à jour du blog dans votre boîte de réception.