netsuite
Skriptsuche mit Filterausdrücken
Suche…
Einführung
Wenn Sie Suchvorgänge mit Suitescript erstellen, können Sie entweder ein Array von Filterobjekten oder einen Filterausdruck als "Filter" angeben. Die zweite Option ist besser lesbar und bietet Ihnen eine sehr flexible Möglichkeit, verschachtelte Ausdrücke (bis zu 3 Ebenen) bereitzustellen, die nicht nur die Standardoperatoren "AND", sondern auch "OR" und "NOT" verwenden.
Filterbegriff
Um die Filterausdrücke zu verstehen, sollten wir mit Filterbegriff beginnen. Dies ist ein einfaches String-Array , das mindestens 3 Elemente enthält:
- Filter (Feld / Verbindungsfeld / Formel / Zusammenfassung)
- Operator (search.Operator)
- Werte (Stringwert (oder Array von Stringwerten), die als Filterparameter verwendet werden)
// 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 einigen Auswahlfeldern können Sie spezielle Werte verwenden.
// 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@']
Ausdruck filtern
Ein einfacher Filterausdruck ist auch ein Array . Es enthält einen oder mehrere Filterausdrücke in Kombination mit Operatoren - 'AND', 'OR', 'NOT'. (Operatoren unterscheiden nicht zwischen Groß- und Kleinschreibung):
[
['mainline', 'is', 'T'],
'and', ['type','anyof',['CustInvc','CustCred']],
'and', 'not', ['amount', 'equalto', '0.00'],
'or', ['customer.companyname', 'contains', 'ltd']
]
Komplexere Filterausdrücke können Filterausdrücke UND verschachtelte Filterausdrücke enthalten, die mit Operatoren kombiniert werden. Es sind nicht mehr als 3 Ebenen verschachtelter Ausdrücke zulässig:
[
['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']
]
Und schließlich fügen wir das alles in einem SS2.0-Beispiel zusammen:
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']
]
});
Filterausdrücke gegen Filterobjekte
Filterausdrücke können keine Filterobjekte enthalten. Dies ist sehr wichtig. Wenn Sie Ihre Filter mit Filterausdruck erstellen möchten, verwenden Sie ein Array von String-Arrays. Die folgende Syntax ist falsch :
// 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
});
Verwenden Sie stattdessen das richtige :
// 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 ]
});
oder, wenn Sie den Ansatz "Filterobjekte" beibehalten möchten, übergeben Sie ein Array von Filterobjekten und vergessen Sie die Operatoren AND, OR oder NOT. Es wird immer UND sein
// 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
});
Nützliche Hinweise
- Hier finden Sie die Liste der verfügbaren Suchfilterwerte für Datumsangaben:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010842.html
Diese können Sie in Ausdrücken wie verwenden:
['trandate', 'notbefore', 'daysAgo17']
Hier sind die Suchoperatoren:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3005172.html
Natürlich können Sie serach.Operator enum verwenden:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_4345782273.htmlHier sind die Suchzusammenfassungstypen:
https://system.netsuite.com/app/help/helpcenter.nl?fid=section_N3010474.htmlSie können den Operator ANYOF nur für ausgewählte Typfelder (Liste / Datensatz) verwenden. Wenn Sie es für Freitextfelder (wie Namen, E-Mails usw.) verwenden möchten, können Sie nur einen verschachtelten Filterausdruck mit 'ODER'-Operatoren erstellen:
[ ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]'],
'or', ['email', 'startswith', '[email protected]']
]
oder Sie können ein kleines Skript schreiben, indem Sie dies anstelle von Ihnen tun:
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']
]
});
- Immer noch nicht zuversichtlich? Auf der Suche nach einem Betrüger? :)
Erstellen Sie eine gespeicherte Suche in der Netsuite-Benutzeroberfläche, nehmen Sie die Such-ID (sagen wir: customearch1234) und log.debug den Filterausdruck:
var s = search.load('customsearch1234');
log.debug('filterExpression', JSON.stringify(s.filterExpression));