Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Dans LinesEditor, placer une expression calculée (formule)

0000002165     -      21/04/2017

Dans l'objet LinesEditor (grille de saisie) des écrans "documents de la gestion commerciale" ou "écritures comptables", il est très simple d'ajouter une expression calculée.

Cela se fait par le paramétrage standard des colonnes, en précisant simplement une information supplémentaire dans la propriété Formula. On peut y saisir une formule selon la syntaxe C#. A cet endroit, on dispose de toutes les variables correspondant aux colonnes de la table des lignes (noms en minuscules), du billingEngine/bookingEngine ainsi que de la cellule qui se recalcule (variable cell).

Une colonne calculée peut être stockée dans la table. Pour cela, il suffit de mettre à la fois une formule et une source.

Astuce : en faisant une erreur dans la formule, lors de l’affichage des résultats de compilation, il est possible de voir le script C# tel qu’il sera stocké dans l’assembly.

Voici un exemple de formule pour l’affichage du nom de client de livraison à la ligne :

MercatorController.xFunctions.xNom("CLI", id_cli_liv)

Remarque importante :

Cette formule n’est pas dans la philosophie "client-server". En effet, lors de chaque "repaint" de chaque cellule, cette fonction va être appelée et va donc solliciter une connexion vers le serveur SQL. Il faut donc proscrire ou limiter drastiquement l’usage de toutes les fonctions non client-server :

  • xLookup
  • xNom
  • xUser
  • xDev
  • xRep
  • xGamEnum
  • xGamTyp

L’utilisation cohérente des formules devrait donc logiquement se limiter à des calculs entre champs disponibles en local.

Si réellement, il est nécessaire de consulter des données présentes sur le serveur SQL (explication donnée ici par rapport à l'exemple du nom client de livraison à la ligne), alors il faut un peu sophistiquer la formule pour, par exemple, mettre en cache les dernières valeurs lues. Dans la formule ci-dessous, on met en cache les 20 derniers résultats de la fonction xNom. Notez que dans la syntaxe ci-dessous, la dernière accolade fermante est manquante. C’est bien normal, puisqu’elle sera ajoutée par Mercator.

xNomWithCache(id_cli_liv);
}

private static MercatorController.SmartDictionary<string, string> dicoCache = new MercatorController.SmartDictionary<string, string>("cacheXnom");

private static string xNomWithCache(string id_cli_liv)
{
    if (dicoCache.ContainsKey(id_cli_liv))
    {
        return dicoCache[id_cli_liv];
    }
    else
    {
        if (dicoCache.Count >= 20)
            dicoCache.RemoveFirst();
        string ret = MercatorController.xFunctions.xNom("CLI", id_cli_liv);
        dicoCache.Add(id_cli_liv, ret);
        return ret;
    }