Filteren op basis van sequenties in functie van een omgevingsvariabele

0000002029     -      03-03-2021

De hier beschreven module laat zien hoe u Mercator moet parametreren om te kunnen filteren op basis van sequenties in functie van een omgevingsvariabele. In ons voorbeeld baseren we ons op een omgevingsvariabele genaamd nom_site, die het nummer van de site bevat. Dit sitenummer moet als rechterteken voorkomen in de code van een sequentie (bijvoorbeeld: de site 1 kan de sequenties Ach1, Ven1 ... omvatten).

De moeilijkheid in dit geval is dat alle opdrachten worden uitgevoerd op de SQL-server. Bijgevolg kan geen rekening worden gehouden met de eigen lokale variabelen van de Mercator-client, die dus niet gekend zijn door de SQL-server. Om dit te verhelpen, moet gebruik worden gemaakt van de reeks globale SQL-parameters: Api.SqlParamsGlobal. Deze parameterreeks zal SQL-parameters omvatten die ingevoerd zullen worden voor ALLE SQL-opdrachten die door Mercator worden uitgevoerd. De opdrachten voor sequentieselectie zullen daartoe dan ook deze bijkomende parameter(s) krijgen en er rekening mee kunnen houden. In ons voorbeeld gaan we een globale SQL-opdracht genaamd num_site_global toevoegen.

Dat gebeurt via een customizer die bij de opstart van Mercator wordt uitgevoerd (customizer Main) en waarvan de code er als volgt uitziet:

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

Vervolgens hoeven we nog enkel de optie "Overige / Filter op sequenties" in te vullen, die een geldige 'where'-clausule op de sequentietabel moet omvatten in formaat SQL. In ons voorbeeld kunnen we daarin de volgende formule plaatsen:

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

Let erop dat het veld WAARDE in de tabel OPTIONS voldoende lang is (in ons voorbeeld: 40 tekens).



Algemene opmerkingen over het gebruik van de globale SQL-parameters

 

U moet rekening houden met het feit dat de globale SQL-parameters worden ingevoerd in ALLE opdrachten van Mercator. Bijgevolg:

  • mag u deze parameters niet onnodig vermenigvuldigen, wat alle opdrachten die naar de SQL-server worden verzonden, zwaarder zou kunnen maken;
  • parameternamen gebruiken die voldoende lang en niet alledaags zijn, zodat ze geen conflict creëren met de parameternamen die gebruikt worden in de standaardopdrachten van Mercator. In geval van een naamconflict zal de overeenstemmende globale parameter worden genegeerd;
  • mag u in de parameterreeks niet meermaals een parameter met dezelfde naam plaatsen. Gebruik in dat geval de methode Api.SqlParamsGlobal.FindByParamName(), die:
    • null vermeldt indien de parameter niet bestaat;
    • de eventueel gevonden MercatorSqlParam vermeldt: wijzig dan gewoon de waarde ervan (zie onderstaande code).

Voorbeeldcode voor de creatie / update van een globale SQL-parameter

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;