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     -      31/05/2013

Le module décrit ici montre comment paramétrer Mercator Aruba 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 nom_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 (par rapport au même paramétrage en mode legacy) 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 Aruba. 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 (Aruba)", 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(journal),1)=@num_site_global

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



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 Aruba. 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 Aruba. 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)
  • Les requêtes de Mercator Legacy n'exploitent pas ces paramètres globaux.

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;