netsuite
Skriptsökningar med filteruttryck
Sök…
Introduktion
När du skapar sökningar med Suitescript, kan du tillhandahålla som "filter" antingen filterobjekt eller filteruttryck. Det andra alternativet är mer läsbart och ger dig ett mycket flexibelt alternativ att tillhandahålla kapslade uttryck (upp till 3 nivåer) med inte bara standard "OCH", utan också "ELLER" och "INTE" operatörer.
Filtrera term
För att förstå filteruttryck bör vi börja med filtertermin. Detta är en enkel samling strängar , som innehåller minst tre element:
- Filter (Fält / Gå med fält / Formel / sammanfattning)
- Operator (search.Operator)
- Värden (strängvärde (eller matris med strängvärden), som ska användas som filterparameter)
// 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']
I vissa valfält kan du använda specialvärden.
// 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@']
Filtrera uttryck
Enkelt filteruttryck är också en matris . Det innehåller ett eller flera filtertermer, kombinerat med operatörer - 'OCH', 'ELLER', 'INTE'. (Operatörer är okänsliga för versaler):
[
['mainline', 'is', 'T'],
'and', ['type','anyof',['CustInvc','CustCred']],
'and', 'not', ['amount', 'equalto', '0.00'],
'or', ['customer.companyname', 'contains', 'ltd']
]
Mer komplexa filteruttryck kan innehålla filtertermer OCH kapslade filteruttryck i kombination med operatörer. Högst 3 nivåer av kapslade uttryck är tillåtna:
[
['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']
]
Och slutligen, låt oss lägga allt detta helt och hållet i ett SS2.0-prov:
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']
]
});
Filtrera uttryck kontra filterobjekt
Filteruttryck kan inte inkludera filterobjekt. Det här är väldigt viktigt. Om du bestämmer dig för att bilda dina filter med filteruttryck använder du en rad strängmatriser. Följande syntax är fel :
// 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
});
Använd istället rätt :
// 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 ]
});
eller om du vill hålla med tillvägagångssätt för filterobjekt, passera en rad filterobjekt och glöm operatörernas 'OCH', 'ELLER', 'INTE'. Det kommer alltid att vara OCH
// 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
});
Användbara tips
- Här kan du hitta listan över tillgängliga sökfiltervärden för datumfilm:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010842.html
Dessa kan du använda i uttryck som:
['trandate', 'notbefore', 'daysAgo17']
Här är sökoperatörerna:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3005172.html
Naturligtvis kan du använda serach.Operator enum:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_4345782273.htmlHär är sököversiktstyperna:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010474.htmlDu kan endast använda ANYOF-operatören i utvalda typfält (Lista / post). Om du vill använda det mot fria textfält (som namn, e-post osv.) Är det enda sättet att skapa ett kapslat filteruttryck med 'ELLER' -operatörer:
[ ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]']
]
eller så kan du skriva ett litet manus och göra det istället för dig:
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']
]
});
- Fortfarande inte säker? Letar du efter ett fusk? :)
Skapa en sparad sökning i Netsuite-gränssnittet, ta sök-ID (låt oss säga: toldundersökning1234) och logga.debugga filteruttrycket:
var s = search.load('customsearch1234');
log.debug('filterExpression', JSON.stringify(s.filterExpression));