RÉSOLU Appliquer un filtre "contient" sur une dimension via du JS
-
Bonjour,
Aurait-il une solution pour appliquer un filtre de type "contient" sur une dimension via du JS ?
exemple:
- une dimension "type de produit"
sur cette dimension voudrais appliquer un filtre contient "Pomme" a l'arriver sur la page en passant pas du JS. existe-il une fonction qui permet de faire un filtre type "contient" ?
Jeremy perret
Clauger -
Bonjour,
Il existe la fonction FilterOperandMatch qui doit être utilisée à la place de FilterOperand
La liste des paramètres ressemble beaucoup à filterOperand : function(dim, h, l, values, operators)
values est un tableau de valeurs, et operators un tableau des opérateurs
Voici la liste des opérateurs
var OP_ISNOTNULL = 0;
var OP_ISNULL = 1;
var OP_EQUAL = 2;
var OP_CONTAIN = 3;
var OP_NOTCONTAIN = 4;
var OP_NOTEQUAL = 5;
var OP_MATCHREGEXP = 6;
var OP_CONTAINWORD = 7;
var OP_NOTCONTAINWORD = 8;
var OP_SUP = 9;
var OP_INF = 10;
var OP_SUPEQUAL = 11;
var OP_INFEQUAL = 12;
var OP_STARTSWITH = 13;
var OP_ENDSWITH = 14;
var OP_ISIN = 15;
var OP_ISNOTIN = 16;
Il faut donc passer le chiffre correspondant à l'opérateur vouluIci la valeur 3 pour le paramètre operators devrait convenir
Cordialement
Johnny
-
Bonjour,
Il existe la fonction FilterOperandMatch qui doit être utilisée à la place de FilterOperand
La liste des paramètres ressemble beaucoup à filterOperand : function(dim, h, l, values, operators)
values est un tableau de valeurs, et operators un tableau des opérateurs
Voici la liste des opérateurs
var OP_ISNOTNULL = 0;
var OP_ISNULL = 1;
var OP_EQUAL = 2;
var OP_CONTAIN = 3;
var OP_NOTCONTAIN = 4;
var OP_NOTEQUAL = 5;
var OP_MATCHREGEXP = 6;
var OP_CONTAINWORD = 7;
var OP_NOTCONTAINWORD = 8;
var OP_SUP = 9;
var OP_INF = 10;
var OP_SUPEQUAL = 11;
var OP_INFEQUAL = 12;
var OP_STARTSWITH = 13;
var OP_ENDSWITH = 14;
var OP_ISIN = 15;
var OP_ISNOTIN = 16;
Il faut donc passer le chiffre correspondant à l'opérateur vouluIci la valeur 3 pour le paramètre operators devrait convenir
Cordialement
Johnny
-
@Olivier-Le-Boulch
Bonjour,
Ci-dessous une proposition de script Live Security pour répondre à votre besoin.
Je vous le mets dans un fichier : Live_Security_contient.js/* START CONFIG */ var securedDims = {}; securedDims["lab5"] = "Direction" ; /*Séparer par un | pour ajouter d'autres membres Ex: "Direction | Administration" */ /* Ajouter ici les autres dimensions sur lequel du live security doit s’appliquer */ /* securedDims["DIMENSION_NAME_2"] = getUserAttribute("USER_PARAM_2"); */ /* END CONFIG */ /* MODIFY THE SCRIPT BELOW WITH CAUTION */ var sLogPrefix = "[LIVE_SECURITY] [live-sec-thread-" + Math.floor(Math.random()*16777215).toString(16) + "]"; /* 16777215 is FFFFFF in decimal */ for (var dimId in securedDims) { var dim = selection.dm.objName[dimId]; Packages.com.digdash.utils.MessageStack.getInstance().addDebug(sLogPrefix + "Ce qu'il y a dans dim: " + dim.id); var persoVal = securedDims[dimId]; //Packages.com.digdash.utils.MessageStack.getInstance().addDebug(sLogPrefix + "Applying user filters on: " + dimId + ", persoVal:" + persoVal); if (dim) { if (persoVal == null || persoVal.length == 0) { // user must no see any value var persoValuesTab = ["-noval-"]; var filt = new FilterSelection(dim, -1, -1, [], persoValuesTab); selection.setFilter(filt); //Packages.com.digdash.utils.MessageStack.getInstance().addDebug(sLogPrefix + " Filters (members) on " + dimId + ": [" + persoValuesTab + "]"); } else if (persoVal && persoVal != ".*") { //user is limited to some value(s) var persoValuesTab = persoVal.split("|"); Packages.com.digdash.utils.MessageStack.getInstance().addDebug(sLogPrefix + " Applying user filters on " + dimId + ": [" + persoValuesTab[0] + "]"); //var dim_2 = selection.dm.getDimensionById("lab5"); var members = dim.members; var filterToSet = []; for(var i=0;i<persoValuesTab.length;i++){ Packages.com.digdash.utils.MessageStack.getInstance().addDebug(sLogPrefix + " Applying user filters on " + dimId + ": [" + members.length + "]"); for(var j=0;j<members.length;j++){ Packages.com.digdash.utils.MessageStack.getInstance().addDebug(sLogPrefix + " Applying user filters on " + dimId + ": [" + persoValuesTab[i] + "]"); if(members[j].indexOf(persoValuesTab[i]) != -1){ filterToSet.push(members[j]); Packages.com.digdash.utils.MessageStack.getInstance().addDebug(sLogPrefix + " Applying user filters on " + dimId + ": [" + members[j] + "]"); } } } var exFilter = selection.filterByDimName[dimId]; if (!exFilter) { //there is no exisitng filter on that dimension => create a new one var filt = new FilterSelection(dim, -1, -1, [], filterToSet); selection.setFilter(filt); //Packages.com.digdash.utils.MessageStack.getInstance().addDebug(sLogPrefix + " Resolved filters (members) on " + dimId + ": [" + persoValuesTab + "]"); } else { //there is already a filter on that dimension => merge (intersect) into a new one var filt = new FilterSelection(dim, -1, -1, [], filterToSet); filt.recalcIds(); exFilter.recalcIds(); exFilter = mergeFilters(exFilter, filt); selection.setFilter(exFilter); //Packages.com.digdash.utils.MessageStack.getInstance().addDebug(sLogPrefix + " Resolved filters (origIds) on " + dimId + ": [" + exFilter.origIds + "]"); } } else // perso value is .* { // do nothing, user can see everything //Packages.com.digdash.utils.MessageStack.getInstance().addDebug(sLogPrefix + " Resolved filters on " + dimId + ": All (.*)"); } } else { //Packages.com.digdash.utils.MessageStack.getInstance().addError(sLogPrefix + " Dimension " + dimId + "not found"); } }
Cordialement,
-
@johnny-nguyen
Bonjour,
Je me permets de rebondir sur ce sujet: je souhaite faire à peu près la même chose dans une fonction "Live Security" dont voici le code (Pour restreindre l'affichage des données sur un périmètre Direction):var direction =getUserAttribute('Direction');
var libDim = "lab5"; // Libellé de la dimensionif (direction != null && direction != '') {
//création d'un tableau contenant le pays
var tabDirection = direction.split(',');
//récupération de la dimension labo
var dim = selection.dm.getDimensionById(libDim);
//création du filtre
var filt = new FilterSelection(dim, -1, -1, [], tabDirection);
//application du filtre
selection.setFilter(filt);}
Je souhaiterais filtrer les données avec tout ce qui "commence par" la valeur Direction.
Est-il possible de le faire en utilisant la fonction FilterOperandMatch? (Avec l'option OPT_START_WITH je suppose) Si oui est-il possible d'avoir un exemple de code ?Merci
-
@olivier-le-boulch
Bonjour,
Il n'est pas possible d'utiliser cette fonction dans ce contexte. -
@Brenda Parfait merci beaucoup!
Et en plus ça peut fonctionner sur plusieurs variables utilisateur
Pour ma part, j'ai juste modifié la ligne suivante pour avoir la condition "commence par" plutôt que "contient"if(members[j].indexOf(persoValuesTab[i]) != -1){
remplacé par
if(members[j].indexOf(persoValuesTab[i]) == 0){
-
Bonjour Olivier,
Ravie de vous avoir aidéPouvez-vous marquer le sujet en "Résolu" svp ?
Merci.
-
@brenda je ne sais pas passer un sujet à "Résolu"
Pourriez-vous m'indiquer comment faire?
-
Bonjour Olivier,
Vous pouvez cliquer sur les trois petits points et choisir l'option:
Merci.
-
@brenda Malheureusement je n'ai pas d'option "Résolu" ou équivalent...