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

Effectuer un filtrage sur séquences en fonction d'une variable d'environnement

0000002029     -      18/09/2024

Le module décrit ici montre comment paramétrer Mercator pour effectuer un filtrage sur séquences en fonction d'une variable d'environnement. Dans notre exemple, ceci est basé sur une variable d'environnement nommée num_site qui contient le numéro du site. Ce numéro de site doit être trouvé comme caractère de droite dans le code d'une séquence. (Exemple : le site 1 peut voir les séquences Ach1, Ven1, ...)

La difficulté ici est que l'ensemble de requêtes sont exécutées sur le serveur SQL. Dès lors, les variables locales propres au client Mercator, donc non connues par le serveur SQL, ne peuvent être prises en compte. Pour pallier à cela, il faut utiliser la collection de paramètres SQL globaux : Api.SqlParamsGlobal. Cette collection de paramètres contiendra des paramètres SQL qui seront passés à TOUTES les requêtes SQL exécutées par Mercator. Dès lors, les requêtes de sélection de séquences recevront à ce titre ce(s) paramètre(s) supplémentaire(s) et pourront en tenir compte. Dans notre exemple, nous allons rajouter un paramètre SQL global dont le nom est num_site_global.

Ceci se fait via un customizer exécuté au démarrage de Mercator (customizer Main) dont le code s'établit comme suit :

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorUi;
using System.Reflection;

namespace Main
{
    public class Customizer : MercatorUi.ICustomizers.IExec
    {

        public void Main(MercatorUi.ICustomizers.ExecAction Action)
        {
            if (Action == MercatorUi.ICustomizers.ExecAction.DossierOpen)
            {
                string num_site = System.Environment.GetEnvironmentVariable("num_site");
                if (!string.IsNullOrEmpty(num_site))
                    Api.SqlParamsGlobal.Add(new MercatorSqlParam("@num_site_global", num_site, SqlDbType.Char));
            }
        }
    }
}

Ensuite, il nous suffit de compléter l'option "Autres / Filtre sur séquences", qui doit contenir une clause where valide sur la table des séquences au format SQL. Dans notre exemple, nous pouvons y placer l'expression :

right(rtrim(sequenc.journal),1)=@num_site_global

Veillez à ce que, dans la table OPTIONS, le champ VALEUR soit suffisamment long (dans notre exemple, 48 caractères).

Comme cette option fait référence à des colonnes de la table SEQUENC, elles doivent être préfixées par 

sequenc.



Remarques générales sur l'utilisation des paramètres SQL globaux :

 

Il faut tenir compte du fait que les paramètres SQL globaux sont passés à TOUTES les requêtes de Mercator. En conséquence :

  • Il ne faut pas multiplier inutilement ces paramètres, ce qui pourraient alourdir toutes les requêtes envoyées au serveur SQL
  • Il faut utiliser des noms de paramètres suffisamment long et non triviaux, afin qu'ils ne rentrent pas en conflit avec des noms de paramètres utilisés dans les requêtes standard de Mercator. En cas de conflit de nom, le paramètre global correspondant sera ignoré.
  • Il ne faut pas mettre dans la collection de paramètres plusieurs fois un paramètre de même nom. Le cas échéant, utiliser la méthode Api.SqlParamsGlobal.FindByParamName()
    • qui renvoie null si le paramètre n'existe pas
    • qui renvoie le MercatorSqlParam s'il est trouvé : modifiez alors simplement sa valeur (voir code ci-dessous)

Exemple de code de création / mise à jour d'un paramètre SQL global :

Zoom
MercatorSqlParam mercatorSqlParam = Api.SqlParamsGlobal.FindByParamName("@num_site_global");
if (mercatorSqlParam == null)
    Api.SqlParamsGlobal.Add(new MercatorSqlParam("@num_site_global", num_site, SqlDbType.Char));
else
    mercatorSqlParam.pSql.Value = num_site;