Dans un écran de la gestion commerciale, afficher une expression reprenant des informations de la ligne active du LinesEditor

0000003237     -      24/06/2026

Mercator 11.0 ou ultérieur permet d'afficher dans une expression des informations provenant de colonnes du LinesEditor, sur la ligne active. Ceci concerne 

  • les ventes
  • les achats
  • les transferts de dépôts 
  • les inventaires

Pour cela, l'expression doit utiliser la méthode CurrentRowCellValue existant dans les écrans de type

  • BillingForm
  • TransferForm
  • InventoryForm

Cette méthode requiert un paramètre de type string qui permet d'identifier la colonne dans le LinesEditor, via une de ces propriétés :

  • Source
  • SourceReadOnly
  • Formula

Il est donc nécessaire que ces colonnes existent dans le LinesEditor. La méthode CurrentRowCellValue ne fait que reprendre la valeur en cours d'affichage. Si ce système est mis en place parce que le nombre de colonnes est important et que cela nuit à la lisibilité de l'écran, il est parfaitement possible de réduire la largeur de ces colonnes afin de les rendre invisibles.

Cette méthode renvoie toujours une chaîne de caractères, même si la colonne utilisée est de type numérique. Dans ce cas, c'est la valeur numérique formattée selon les propriétés de la colonne qui est rendue.

Il n'est pas nécessaire d'indiquer un ou plusieurs ID dans la propriété RefreshedBy. Mercator rafraîchit automatiquement cette expression lors du changement de cellule dans le LinesEditor et lors du recalcul de l'écran.

Le nombre d'expressions utilisant la méthode CurrentRowCellValue n'est pas limité.

 

⚠️ Cette méthode est appelée à de très nombreux moments : il est dès lors déconseillé d'y placer du code qui accède à la base de données (xLookup, Zselect, ...)


Ci-dessous un exemple de code pour un document de vente, qui reprend respectivement :

  • 3 colonnes standards : id_article, pu et q
  • 1 colonne ReadOnly : DISPO.DISPO
  • 1 colonne Formula : q * 2
  • la clé 3 de l'article, qui ne correspond à aucune colonne du LinesEditor, mais qui est déterminé par 
    • l'identifiant de l'article, trouvé par billingForm.CurrentRowCellValue("id_article")
    • la collection BillingEngine.StockRecords, dans laquelle on trouve l'élément souhaité via l'identifiant de l'article déterminé ci-dessus
Zoom
namespace MercatorUi.MovableControls.ExpressionsCodes
{
    public static class Script
    {
        public static String Evaluate(MercatorUi.MovableControls.MovableExpression currentExpression)
        {
            // enter your customized code here

            MercatorUi.Forms.Billing.BillingForm billingForm = (MercatorUi.Forms.Billing.BillingForm)currentExpression.Form;

            return "Article = " + billingForm.CurrentRowCellValue("id_article")
                + " | PU = " + billingForm.CurrentRowCellValue("pu")
                + " | Q = " + billingForm.CurrentRowCellValue("q")
                + " | Dispo = " + billingForm.CurrentRowCellValue("DISPO.DISPO")
                + " | Q * 2 = " + billingForm.CurrentRowCellValue("q * 2")
                + " | CLE = " + (billingForm.CurrentRowCellValue("id_article") != "" ? billingForm.BillingEngine.StockRecords[billingForm.CurrentRowCellValue("id_article")]?.S_CLE3 ?? "" : "");
        }
    }
}

 

L'affichage de cette expression se présentera comme ceci : 


L'exemple ci-dessous montre comment exploiter ce concept pour montrer une photo associée à l'article. Cet exemple outrepasse la recommandation formulée ci-dessus, indiquant de ne pas placer du code qui accède à la base de données. Ceci est toutefois raisonnable car 

  • la logique du code fait que la photo ne se rafraîchit que si l'article change (pas si on change de cellule dans une même ligne),
  • le coût d'un réel stockage des photos à la ligne serait exorbitant.

Cet exemple requiert le placement d'une PictureBox, via le paramétrage d'écran, à proximité de l'expression. Cette PictureBox ne doit être liée à aucune source.

Dans le code ci-dessous, il ne faut garder qu'une seule ligne pictureBox =, en fonction de la présence ou non de plusieurs PictureBoxes dans cet écran. Si la seconde ligne est maintenue, il faut adapter la valeur de l'ID de la PictureBox à utiliser.

⚠️ Veillez à ce que la taille des photos soit raisonnable, au risque de grever les performances de l'écran d'encodage.

Zoom
// <CompileWithRoslyn />

namespace MercatorUi.MovableControls.ExpressionsCodes
{
    public static class Script
    {
        public static String Evaluate(MercatorUi.MovableControls.MovableExpression currentExpression)
        {
            // enter your customized code here

            MercatorUi.Forms.Billing.BillingForm billingForm = (MercatorUi.Forms.Billing.BillingForm)currentExpression.Form;
            MercatorUi.MovableControls.MovablePictureBox pictureBox = billingForm.MovableControls.Values.OfType<MercatorUi.MovableControls.MovablePictureBox>().FirstOrDefault();
            MercatorUi.MovableControls.MovablePictureBox pictureBox = (MercatorUi.MovableControls.MovablePictureBox)billingForm.MovableControls["AXJXLR1474"];
            if (pictureBox == null)
                return "PictureBox not found!";

            string id_article = billingForm.CurrentRowCellValue("id_article");
            if (!string.IsNullOrWhiteSpace(id_article) && (pictureBox.TagString != id_article))
            {
                object ox = MercatorController.xFunctions.xLookUp("STOCK", "S_ID", id_article, "S_IMGBIN");
                if ((ox is byte[] bb) && (bb.Length > 0))
                {
                    pictureBox.Image = Api.BytesToImage(bb);
                    if ((pictureBox.Image.Width <= pictureBox.Width) && (pictureBox.Image.Height <= pictureBox.Height))
                        pictureBox.SizeMode = PictureBoxSizeMode.CenterImage;
                    else
                        pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
                }
                else
                {
                    pictureBox.Image = null;
                }
                pictureBox.TagString = id_article;
            }
            return "Photo article = " + id_article;
        }
    }
}


Cookies fonctionnels : Cookies nécessaires à l'utilisation du site et cookies de préférence. Ils ne contiennent aucune donnée à caractère personnel. (En savoir plus)

Cookies statistiques : Captation de statistiques liées aux comportements des internautes. (En savoir plus)

Cookies marketing : Pour effectuer le suivi des visiteurs au travers des sites web, à des fins publicitaires. (En savoir plus)