Buscar..


Introducción

Cuando crea búsquedas con Suitescript, puede proporcionar como "filtros" una matriz de objetos de filtro o expresión de filtro. La segunda opción es más legible y le brinda una opción muy flexible para proporcionar expresiones anidadas (hasta 3 niveles) utilizando no solo los operadores "AND" predeterminados, sino también los operadores "OR" y "NOT".

Término de filtro

Para entender las expresiones de filtro, deberíamos comenzar con Filter Term. Esta es una simple serie de cadenas , que contiene al menos 3 elementos:

  1. Filtro (Campo / Campo de unión / Fórmula / Resumen)
  2. Operador (search.Operator)
  3. Valores (valor de cadena (o matriz de valores de cadena), para usar como parámetro de filtro)
 // 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']

En algunos campos de selección, puede utilizar valores especiales.

 // 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@']

Expresión de filtro

La expresión de filtro simple es también una matriz . Contiene uno o más términos de filtro, combinados con los operadores: 'AND', 'OR', 'NOT'. (Los operadores no distinguen entre mayúsculas y minúsculas):

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

Las expresiones de filtro más complejas, podrían contener términos de filtro Y expresiones de filtro anidadas, combinadas con operadores. No se permiten más de 3 niveles de expresiones anidadas:

[ 
  ['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']
 ]

Y finalmente, pongamos todo esto en conjunto en una muestra 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']
              ]
});

Expresiones de filtro vs Objetos de filtro

Las expresiones de filtro no pueden incluir objetos de filtro. Esto es muy importante. Si decide formar sus filtros con Expresión de filtro, utiliza una matriz de matrices de cadenas. La siguiente sintaxis es incorrecta :

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

En su lugar, utilice el correcto :

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

o si desea mantener el enfoque de Objetos de filtro, pase una serie de objetos de filtro y olvídese de los operadores 'AND', 'OR', 'NOT'. Siempre sera y

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

Consejos útiles

  1. Aquí puede encontrar la lista de valores de filtro de búsqueda disponibles para los datos de fecha:
    https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010842.html
    Estos se pueden usar en expresiones como:
['trandate', 'notbefore', 'daysAgo17']
  1. Aquí están los operadores de búsqueda:
    https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3005172.html
    Por supuesto que puede utilizar serach.Operator enum:
    https://system.netsuite.com/app/help/helpcenter.nl?fid=section_4345782273.html

  2. Aquí están los tipos de resumen de búsqueda:
    https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010474.html

  3. Puede usar el operador ANYOF solo en campos de tipo de selección (Lista / Registro). Si desea usarlo en campos de texto libre (como nombres, correos electrónicos, etc.), la única forma es crear una Expresión de filtro anidada con operadores 'OR':

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

o puedes escribir un pequeño script, haciendo esto en lugar de ti:

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. ¿Todavía no estás seguro? Buscando una trampa? :)
    Cree una búsqueda guardada en la interfaz de usuario de Netsuite, tome el ID de búsqueda (digamos: customsearch1234) y log.debug la expresión de filtro:
    var s = search.load('customsearch1234');
    
    log.debug('filterExpression', JSON.stringify(s.filterExpression));


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow