netsuite
Wyszukiwanie skryptowe za pomocą wyrażeń filtrujących
Szukaj…
Wprowadzenie
Podczas tworzenia wyszukiwania za pomocą Suitescript możesz podać jako „filtry” albo tablicę obiektów Filter, albo wyrażenie filtru. Druga opcja jest bardziej czytelna i daje bardzo elastyczną opcję zapewniania zagnieżdżonych wyrażeń (do 3 poziomów) przy użyciu nie tylko domyślnych operatorów „ORAZ”, ale także „LUB” i „NIE”.
Filtruj termin
Aby zrozumieć wyrażenia filtru, powinniśmy zacząć od Terminu filtru. To jest prosta tablica ciągów znaków , zawierająca co najmniej 3 elementy:
- Filtruj (Pole / Połącz pole / Formuła / Podsumowanie)
- Operator (search.Operator)
- Wartości (wartość ciągu (lub tablica wartości ciągu), do zastosowania jako parametr filtru)
// 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']
W niektórych polach wyboru można używać specjalnych wartości.
// 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@']
Filtruj wyrażenie
Proste wyrażenie filtrujące jest również tablicą . Zawiera jeden lub więcej terminów filtrujących w połączeniu z operatorami - „AND”, „OR”, „NOT”. (Operatorzy nie rozróżniają wielkości liter):
[
['mainline', 'is', 'T'],
'and', ['type','anyof',['CustInvc','CustCred']],
'and', 'not', ['amount', 'equalto', '0.00'],
'or', ['customer.companyname', 'contains', 'ltd']
]
Bardziej złożone wyrażenia filtrów, mogą zawierać terminy filtrów ORAZ zagnieżdżone wyrażenia filtrów, w połączeniu z operatorami. Dopuszczalne są nie więcej niż 3 poziomy zagnieżdżonych wyrażeń:
[
['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']
]
Na koniec umieśćmy to wszystko w próbce 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']
]
});
Filtruj wyrażenia a Filtruj obiekty
Wyrażenia filtrujące nie mogą zawierać obiektów filtrujących. To jest bardzo ważne. Jeśli zdecydujesz się utworzyć filtry za pomocą wyrażenia filtru, użyjesz tablicy tablic ciągów. Następująca składnia jest niepoprawna :
// 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
});
Zamiast tego użyj poprawnego :
// 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 ]
});
lub jeśli chcesz zachować podejście Filtruj obiekty, przekaż tablicę obiektów filtrów i zapomnij o operatorach „ORAZ”, „LUB”, „NIE”. Zawsze będzie 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
});
Przydatne wskazówki
- Tutaj możesz znaleźć listę dostępnych wartości filtrów wyszukiwania dla plików dat:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010842.html
Można ich używać w wyrażeniach takich jak:
['trandate', 'notbefore', 'daysAgo17']
Oto operatory wyszukiwania:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3005172.html
Oczywiście możesz użyć wyliczenia serach.Operator :
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_4345782273.htmlOto typy podsumowania wyszukiwania:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010474.htmlMożesz użyć DOWOLNEGO operatora tylko w wybranych polach typu (Lista / Rekord). Jeśli chcesz używać go do pól tekstowych (takich jak nazwiska, e-maile itp.), Jedynym sposobem jest utworzenie zagnieżdżonego wyrażenia filtru za pomocą operatorów „LUB”:
[ ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]']
]
lub możesz napisać mały skrypt, robiąc to zamiast ciebie:
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']
]
});
- Nadal nie jesteś pewien? Szukasz oszukiwać? :)
Utwórz zapisane wyszukiwanie w interfejsie Netsuite, weź identyfikator wyszukiwania (powiedzmy: customsearch1234) i zaloguj się. Debuguj wyrażenie filtru:
var s = search.load('customsearch1234');
log.debug('filterExpression', JSON.stringify(s.filterExpression));