netsuite
Scripting-zoekopdrachten met filteruitdrukkingen
Zoeken…
Invoering
Wanneer u zoekopdrachten met Suitescript maakt, kunt u elke reeks filterobjecten of filterexpressie als "filters" opgeven. De tweede optie is beter leesbaar en geeft u een zeer flexibele optie om geneste expressies (tot 3 niveaus) te bieden met niet alleen de standaard "AND", maar ook "OF" en "NOT" operatoren.
Filterterm
Om de filteruitdrukkingen te begrijpen, moeten we beginnen met filterterm. Dit is een eenvoudige reeks strings die minstens 3 elementen bevat:
- Filter (Veld / Deelnameveld / Formule / Samenvatting)
- Operator (zoekoperator)
- Waarden (tekenreekswaarde (of reeks tekenreekswaarden), te gebruiken als 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']
In sommige selectievelden kunt u speciale waarden gebruiken.
// 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@']
Filteruitdrukking
Eenvoudige filterexpressie is ook een array . Het bevat een of meer filtertermen, gecombineerd met operatoren - 'AND', 'OR', 'NOT'. (Operators zijn niet hoofdlettergevoelig):
[
['mainline', 'is', 'T'],
'and', ['type','anyof',['CustInvc','CustCred']],
'and', 'not', ['amount', 'equalto', '0.00'],
'or', ['customer.companyname', 'contains', 'ltd']
]
Complexere filteruitdrukkingen kunnen filtertermen EN geneste filteruitdrukkingen bevatten, gecombineerd met operatoren. Er zijn niet meer dan 3 niveaus van geneste uitdrukkingen toegestaan:
[
['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']
]
En ten slotte, laten we dit allemaal in een SS2.0-voorbeeld stoppen:
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']
]
});
Filteruitdrukkingen versus filterobjecten
Filteruitdrukkingen mogen geen filterobjecten bevatten . Dit is erg belangrijk. Als u besluit uw filters te vormen met Filterexpressie, gebruikt u een reeks tekenreeksmatrices. De volgende syntaxis is onjuist :
// 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
});
Gebruik in plaats daarvan het juiste :
// 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 ]
});
of als u de filterobjectbenadering wilt behouden, een reeks filterobjecten wilt doorgeven en de operatoren 'AND', 'OR', 'NOT' wilt vergeten. Het zal altijd EN zijn
// 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
});
Handige tips
- Hier vindt u de lijst met beschikbare zoekfilterwaarden voor gearchiveerde datums:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010842.html
Deze kunt u gebruiken in uitdrukkingen zoals:
['trandate', 'notbefore', 'daysAgo17']
Dit zijn de zoekoperators:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3005172.html
Natuurlijk kunt u serach gebruiken. Operator enum:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_4345782273.htmlDit zijn de typen zoeksamenvattingen:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010474.htmlU kunt de ANYOF-operator alleen gebruiken op geselecteerde typevelden (Lijst / Record). Als u het wilt gebruiken tegen vrije tekstvelden (zoals namen, e-mails, enz.), Is de enige manier om een geneste filterexpressie met 'OF'-operatoren te maken:
[ ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]']
]
of je kunt een klein script schrijven, doe dit in plaats van jou:
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']
]
});
- Nog steeds niet zeker? Op zoek naar een cheat? :)
Maak een opgeslagen zoekopdracht in de Netsuite UI, neem de zoek-ID (laten we zeggen: customsearch1234) en log.debug de filterexpressie:
var s = search.load('customsearch1234');
log.debug('filterExpression', JSON.stringify(s.filterExpression));