netsuite
Поиск скриптов с помощью выражений фильтра
Поиск…
Вступление
Когда вы создаете поиск с помощью приложения «Искрокс», вы можете предоставить в качестве «фильтров» либо массив объектов «Фильтр», либо выражение фильтра. Второй вариант более читабельен и дает вам очень гибкий вариант для предоставления вложенных выражений (до 3 уровней) с использованием не только операторов по умолчанию «И», но и «ИЛИ» и «НЕ».
Период фильтрации
Чтобы понять выражения фильтра, мы должны начать с Filter Term. Это простой массив строк , содержащий не менее 3 элементов:
- Фильтр (поле / поле ввода / формула / сводка)
- Оператор (search.Operator)
- Значения (строковое значение (или массив строковых значений), которые будут использоваться в качестве параметра фильтра)
// 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']
В некоторых полях выбора вы можете использовать специальные значения.
// 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@']
Выражение фильтра
Простое выражение фильтра также является массивом . Он содержит один или несколько фильтрующих терминов в сочетании с операторами - «И», «ИЛИ», «НЕ». (Операторы нечувствительны к регистру):
[
['mainline', 'is', 'T'],
'and', ['type','anyof',['CustInvc','CustCred']],
'and', 'not', ['amount', 'equalto', '0.00'],
'or', ['customer.companyname', 'contains', 'ltd']
]
Более сложные выражения фильтра могут содержать условия фильтра И вложенные выражения фильтра в сочетании с операторами. Допускается не более 3 уровней вложенных выражений:
[
['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']
]
И, наконец, давайте поместим все это в образец 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']
]
});
Выражения фильтра против объектов фильтра
Выражения фильтра не могут включать объекты фильтра. Это очень важно. Если вы решили создать свои фильтры с помощью фильтра Expression, вы используете массив массивов строк. Неправильный следующий синтаксис:
// 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
});
Вместо этого используйте правильную :
// 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 ]
});
или если вы хотите придерживаться подхода «Объекты фильтра», передать массив объектов фильтра и забыть об операторах «И», «ИЛИ», «НЕ». Это всегда будет И
// 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
});
Полезные советы
- Здесь вы можете найти список доступных значений фильтра поиска для фидов даты:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010842.html
Их можно использовать в выражениях типа:
['trandate', 'notbefore', 'daysAgo17']
Вот операторы поиска:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3005172.html
Конечно, вы можете использовать serach.Operator перечисление:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_4345782273.htmlНиже приведены типы резюме поиска:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010474.htmlВы можете использовать оператор ANYOF только для полей типа select (List / Record). Если вы хотите использовать его для полей свободного текста (например, имена, электронные письма и т. Д.), Единственный способ - создать вложенное выражение фильтра с операторами «OR»:
[ ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]']
]
или вы можете написать небольшой скрипт, делая это вместо вас:
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']
]
});
- Все еще не уверен? Ищете чит? :)
Создайте сохраненный поиск в пользовательском интерфейсе Netsuite, возьмите идентификатор поиска (скажем: customsearch1234) и log.debug выражение фильтра:
var s = search.load('customsearch1234');
log.debug('filterExpression', JSON.stringify(s.filterExpression));