netsuite
필터 식을 사용한 스크립트 스크립팅
수색…
소개
Suitescript를 사용하여 검색을 만들 때 Filter 개체 배열 또는 필터 식 중 하나를 "필터"로 제공 할 수 있습니다. 두 번째 옵션은 더 읽기 쉽고 기본 "AND"뿐만 아니라 "OR"및 "NOT"연산자를 사용하여 중첩 된 표현식 (최대 3 레벨)을 제공하는 매우 유연한 옵션을 제공합니다.
용어 필터링
필터 식을 이해하려면 필터 용어로 시작해야합니다. 이것은 최소한 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@']
필터 식
간단한 필터 표현도 배열 입니다. 연산자에 'AND', 'OR', 'NOT'을 조합하여 하나 이상의 필터 용어를 포함합니다. 연산자는 대소 문자를 구분하지 않습니다.
[
['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']
]
});
필터 식 대 필터 개체
필터 식은 필터 개체를 포함 할 수 없습니다 . 이건 매우 중요합니다. 필터 표현식을 사용하여 필터를 구성하려는 경우 문자열 배열 배열을 사용합니다. 다음 구문이 잘못되었습니다 .
// 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 ]
});
또는 필터 객체 접근 방식을 유지하려면 필터 객체 배열을 전달하고 연산자 'AND', 'OR', 'NOT'을 잊어 버리십시오. 항상 AND 일 것입니다.
// 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 enum을 사용할 수 있습니다 :
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 연산자를 사용할 수 있습니다. 자유 텍스트 필드 (예 : 이름, 전자 메일 등)에 대해이 필터를 사용하려면 '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 UI에서 저장된 검색을 만들고 검색 ID (customsearch1234라고 말하면됩니다) 및 필터 식 log.debug를 가져옵니다.
var s = search.load('customsearch1234');
log.debug('filterExpression', JSON.stringify(s.filterExpression));