Recherche…


Introduction

Lorsque vous créez des recherches avec Suitescript, vous pouvez fournir comme "filtres" un tableau d'objets filtre ou une expression de filtre. La seconde option est plus lisible et vous offre une option très flexible pour fournir des expressions imbriquées (jusqu'à 3 niveaux) en utilisant non seulement les opérateurs par défaut "AND", mais aussi "OR" et "NOT".

Terme du filtre

Pour comprendre les expressions du filtre, nous devons commencer par Filter Term. C'est un tableau simple de chaînes contenant au moins 3 éléments:

  1. Filtrer (Champ / Champ de jointure / Formule / Résumé)
  2. Opérateur (search.Operator)
  3. Valeurs (valeur de chaîne (ou tableau de valeurs de chaîne), à ​​utiliser comme paramètre de filtre)
 // Simple example:
 ['amount', 'equalto', '0.00']
 
 // When the field is checkbox, use 'T' or 'F'
 ['mainline', 'is', 'T']

 // You can use join fields
 ['customer.companyname', 'contains', 'ltd']

 // summary filter term
 ['sum(amount)', 'notlessthan', '170.50']

 // summary of joined fields
 ['sum(transaction.amount)', 'greatherthan', '1000.00']

 // formula:
 ["formulatext: NVL({fullname},'John')", "contains", "ohn"]

 // and even summary formula refering joined fields:
 ['sum(formulanumeric: {transaction.netamount} + {transaction.taxtotal})', 'greaterthanorequalto','100.00']

 // for selection fields, you may use 'anyof'
 // and put values in array
 ['type','anyof',['CustInvc','VendBill','VendCred']]

 // when using unary operator, like isempty/isnotempty
 // don't forget that the filter term array contains at least 3 elements
 // and put an empty string as third:
 ['email', 'isnotempty', '']

 // you may have more than 3 elements in Filter Term array,
 // when the operator requires more than one value:
 ['grossamount','between','100.00','200.00']

Dans certains champs de sélecteur, vous pouvez utiliser des valeurs spéciales.

 // When filtering the user related fields, you can use:
 // Me (Current user): @CURRENT@
 // My Team (somebody from the team I am leading): @HIERARCHY@
 ['nextapprover','is','@CURRENT@']

 // The same is valid for Subsidiary, Department, Location, etc.
 // @CURRENT@ means MINE (Subsidiary, Department...)
 // @HIERARCHY@ means MINE or DESCENDANTS
 ["subsidiary","is","@HIERARCHY@"]

 // on selection fields you may use @ANY@ and @NONE@
 ['nextapprover','is','@NONE@']

Expression de filtre

L'expression de filtre simple est également un tableau . Il contient un ou plusieurs termes de filtre, associés aux opérateurs - "ET", "OU", "NON". (Les opérateurs sont insensibles à la casse):

[ 
  ['mainline', 'is', 'T'],
  'and', ['type','anyof',['CustInvc','CustCred']],
  'and', 'not', ['amount', 'equalto', '0.00'],
  'or', ['customer.companyname', 'contains', 'ltd']
]

Des expressions de filtre plus complexes peuvent contenir des termes de filtre ET des expressions de filtre imbriquées, associées à des opérateurs. Pas plus de 3 niveaux d'expressions imbriquées sont autorisés:

[ 
  ['mainline', 'is', 'T'],
  'and', ['type','anyof',['CustInvc','CustCred']],
  'and', [ ['customer.companyname', 'contains', 'ltd'],
           'or', ['customer.companyname', 'contains', 'inc']
         ],
  'and', [ ['subsidiary', 'is', 'HQ'],
           'or', ['subsidiary', 'anyof', '@HIERARCHY@']
         ],
  'and', ['trandate', 'notbefore', 'yesterday']
 ]

Et enfin, mettons tout cela dans un exemple SS2.0:

var s = search.create({
    type    : 'transaction',        
    columns : [
               'trandate', 
               'tranid',
               'currency',
               'customer.companyname',
               'customer.country', 
               'amount' 
              ],
    filters : [ 
                ['mainline', 'is', 'T'],
                'and', ['type','anyof',['VendBill','VendCred']],
                'and', [ ['customer.companyname', 'contains', 'ltd'],
                         'or', ['customer.companyname', 'contains', 'inc']
                       ],
                'and', [ ['subsidiary', 'is', 'HQ'],
                         'or', ['subsidiary', 'anyof', '@HIERARCHY@']
                       ],
                'and', ['trandate', 'notbefore', 'yesterday']
              ]
});

Filtrer les expressions contre les objets de filtre

Les expressions de filtre ne peuvent pas inclure d' objets de filtrage. C'est très important. Si vous décidez de former vos filtres avec Filter Expression, vous utilisez un tableau de tableaux de chaînes. La syntaxe suivante est incorrecte :

// WRONG!!!
var f1 = search.createFilter({
            name: 'mainline',
            operator: search.Operator.IS,
            values: 'T'
});

var f2 = search.createFilter({
            name: 'type',
            operator: search.Operator.ANYOF,
            values: ['VendBill','VendCred']
});

// here you will receive an error message
var s = search.create({
    type    : 'transaction',        
    filters : [ f1, 'and', f2 ] // f1,f2 are Filter Objects, instead of string arrays
});

Au lieu de cela, utilisez le bon :

// CORRECT!!!
var f1 = ['mainline', search.Operator.IS, 'T'];

var f2 = ['type', search.Operator.ANYOF, ['VendBill','VendCred'] ];

var s = search.create({
    type    : 'transaction',        
    filters : [ f1, 'and', f2 ]
});

ou, si vous souhaitez conserver l'approche Filtrer les objets, passez un tableau d'objets filtrants et oubliez les opérateurs 'ET', 'OU', 'NON'. Ce sera toujours ET

// correct, but not useful
var f1 = search.createFilter({
            name: 'mainline',
            operator: search.Operator.IS,
            values: 'T'
});

var f2 = search.createFilter({
            name: 'type',
            operator: search.Operator.ANYOF,
            values: ['VendBill','VendCred']
});


var s = search.create({
    type    : 'transaction',        
    filters : [ f1, f2 ] // here you have array of Filter Objects,
                         // filtering only when all of them are TRUE
});

Conseils utiles

  1. Vous trouverez ici la liste des filtres de recherche disponibles pour les fichiers de date:
    https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010842.html
    Vous pouvez les utiliser dans des expressions telles que:
['trandate', 'notbefore', 'daysAgo17']
  1. Voici les opérateurs de recherche:
    https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3005172.html
    Bien sûr, vous pouvez utiliser sérum.Operator enum:
    https://system.netsuite.com/app/help/helpcenter.nl?fid=section_4345782273.html

  2. Voici les types de résumé de recherche:
    https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010474.html

  3. Vous pouvez utiliser l'opérateur ANYOF uniquement sur certains champs de type (Liste / Enregistrement). Si vous voulez l'utiliser contre des champs de texte libre (comme les noms, les courriels, etc.), la seule solution consiste à créer une expression de filtre imbriquée avec des opérateurs 'OU':

[ ['email', 'startswith', '[email protected]'],
  'or', ['email', 'startswith', '[email protected]'], 
  'or', ['email', 'startswith', '[email protected]'], 
  'or', ['email', 'startswith', '[email protected]'] 
]

ou vous pouvez écrire un petit script, en faisant cela à votre place:

function stringFieldAnyOf(fieldId, listOfValues) {    
    var result = [];
    if (listOfValues.length > 0) {
        for (var i = 0; i < listOfValues.length; i++) {
            result.push([fieldId, 'startswith', listOfValues[i]]);
            result.push('or');
        }
        result.pop(); // remove the last 'or'
    }
    return result;
}

// usage: (two more filters added just to illustrate how to combine with other filters)
var custSearch = search.create({
  type: record.Type.CUSTOMER,
  columns: searchColumn,
  filters: [
            ['companyname', 'startswith', 'A'], 
            'and', stringFieldAnyOf('email', ['[email protected]', '[email protected]']),
            'and', ['companyname', 'contains', 'b']
           ]

});
  1. Toujours pas confiant? Vous cherchez une triche? :)
    Créez une recherche enregistrée dans l'interface utilisateur de Netsuite, prenez l'ID de recherche (par exemple, customsearch1234) et log.debug l'expression du filtre:
    var s = search.load('customsearch1234');
    
    log.debug('filterExpression', JSON.stringify(s.filterExpression));


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow