netsuite
Benutzerereignis: Vorher und Nachher Ereignisse senden
Suche…
Syntax
- beforeSubmit (type) // Vor dem Senden 1.0
- beforeSubmit (scriptContext) // Vor dem Senden 2.0
- afterSubmit (type) // Nach dem Senden 1.0
- afterSubmit (scriptContext) // Nach dem Senden 2.0
Parameter
Parameter | Einzelheiten |
---|---|
SuiteScript 2.0 | - |
scriptContext | {Object} |
scriptContext.newRecord | {N/record.Record} Ein Verweis auf den Datensatz, der aus der Datenbank gelesen wird. Wir können es verwenden, um die Feldwerte im Datensatz zu ändern |
scriptContext.oldRecord | {N/record.Record} Eine schreibgeschützte Referenz auf den vorherigen Status des Datensatzes. Wir können es verwenden, um mit den neuen Werten zu vergleichen |
scriptContext.type | {UserEventType} Eine Aufzählung des Typs der {UserEventType} Schreibaktion |
SuiteScript 1.0 | - |
type | {String} Der Typ der auszuführenden Schreibaktion |
Bemerkungen
beforeSubmit
und afterSubmit
Diese beiden Ereignisse werden durch einen Datenbankschreibvorgang für einen Datensatz ausgelöst. Jedes Mal, wenn ein Benutzer, ein Skript, ein CSV-Import oder eine Web-Service-Anforderung versucht, einen Datensatz in die Datenbank zu schreiben, werden die Submit-Ereignisse ausgelöst.
Zeichnen Sie Aktionen auf, die beide Sendereignisse auslösen:
- Erstellen
- Bearbeiten
- Löschen
- XEdit (Inline-Bearbeitung)
- Genehmigen
- Ablehnen
- Stornieren
- Pack
- Schiff
beforeSubmit
Aktionen auf, die vor beforeSubmit
ausgelöst beforeSubmit
:
- Vollständig markieren
- Neu zuweisen (Supportfälle)
- Prognose bearbeiten
afterSubmit
Aktionen auf, die nur afterSubmit
auslösen:
- Dropship
- Spezielle Bestellung
- Auftragspositionen
- Rechnungen bezahlen
Typische Anwendungsfälle für beforeSubmit
- Überprüfen Sie den Datensatz, bevor er an die Datenbank übergeben wird
- Erlaubnis- und Beschränkungsprüfungen
- Letzte Änderungen vor dem Festschreiben der Datenbank
- Updates von externen Systemen abrufen
Typische Anwendungsfälle für afterSubmit
- E-Mail-Benachrichtigung über Datensatzänderungen
- Browserumleitung
- Abhängige Datensätze erstellen / aktualisieren
- Push-Änderungen an externe Systeme
Benutzerereignisse werden nicht verkettet
In Benutzerereignissen geschriebener Code löst keine Benutzerereignisse in anderen Datensätzen aus. Wenn Sie beispielsweise den zugehörigen beforeSubmit
aus dem beforeSubmit
eines Verkaufsauftrags beforeSubmit
die beforeSubmit
des beforeSubmit
nicht ausgelöst .
NetSuite tut dies, um zu verhindern, dass sich Benutzerereignisse in einer Endlosschleife auslösen. Wenn Sie Benutzerereignisse tun müssen , in einer verketteten Sequenz feuern, andere Script - Typen (zB RESTlets, Suitelets, Geplante Skripts) müssen injiziert zwischen den Ereignissen werden.
Event - Handler zurückzukehren void
Der Rückgabetyp der Submit-Ereignishandler ist void
. Daten, die von unserem Event-Handler zurückgegeben werden, haben keine Auswirkungen auf das System. Wir müssen nichts von unserer Handler-Funktion zurückgeben, da wir mit dem zurückgegebenen Wert nichts tun können.
!! VORSICHT !!
Seien Sie sehr vorsichtig, wenn Sie Werte zwischen alten und neuen Datensätzen vergleichen. Leere Felder aus dem alten Datensatz werden als null
, während leere Felder aus dem neuen Datensatz als leerer String zurückgegeben werden. Das bedeutet, dass Sie das Alte nicht einfach mit dem Neuen vergleichen können. Andernfalls erhalten Sie falsch positive Ergebnisse. Jede Logik, die Sie schreiben, muss den Fall behandeln, in dem eine null
und eine leere Zeichenfolge.
Minimal: Eine Nachricht protokollieren
// 1.0, Revealing Module pattern
var myNamespace = myNamespace || {};
myNamespace.example = (function () {
/**
* User Event 1.0 example detailing usage of the Submit events
*
* @appliedtorecord employee
*/
var exports = {};
function beforeSubmit(type) {
nlapiLogExecution("DEBUG", "Before Submit", "action=" + type);
}
function afterSubmit(type) {
nlapiLogExecution("DEBUG", "After Submit", "action=" + type);
}
exports.beforeSubmit = beforeSubmit;
exports.afterSubmit = afterSubmit;
return exports;
})();
// 2.0
define(["N/log"], function (log) {
/**
* User Event 2.0 example showing usage of the Submit events
*
* @NApiVersion 2.x
* @NModuleScope SameAccount
* @NScriptType UserEventScript
* @appliedtorecord employee
*/
var exports = {};
function beforeSubmit(scriptContext) {
log.debug({
"title": "Before Submit",
"details": "action=" + scriptContext.type
});
}
function afterSubmit(scriptContext) {
log.debug({
"title": "After Submit",
"details": "action=" + scriptContext.type
});
}
exports.beforeSubmit = beforeSubmit;
exports.afterSubmit = afterSubmit;
return exports;
});
Vor dem Senden: Überprüfen Sie den Datensatz, bevor er an die Datenbank übergeben wird
In diesem Beispiel möchten wir sicherstellen, dass jeder Mitarbeiter, der als Projektressource gekennzeichnet ist, über geeignete Arbeitskosten verfügt .
// 1.0, Revealing Module pattern
var myNamespace = myNamespace || {};
myNamespace.example = (function () {
/**
* User Event 1.0 example detailing usage of the Submit events
*
* @appliedtorecord employee
*/
var exports = {};
function beforeSubmit(type) {
if (!isEmployeeValid(nlapiGetNewRecord())) {
throw nlapiCreateError("STOIC_ERR_INVALID_DATA", "Employee data is not valid", true);
}
}
function isEmployeeValid(employee) {
return (!isProjectResource(employee) || hasValidLaborCost(employee));
}
function isProjectResource(employee) {
return (employee.getFieldValue("isjobresource") === "T");
}
function hasValidLaborCost(employee) {
var laborCost = parseFloat(employee.getFieldValue("laborcost"));
return (Boolean(laborCost) && (laborCost > 0));
}
exports.beforeSubmit = beforeSubmit;
return exports;
})();
// 2.0
define(["N/error"], function (err) {
var exports = {};
/**
* User Event 2.0 example detailing usage of the Submit events
*
* @NApiVersion 2.x
* @NModuleScope SameAccount
* @NScriptType UserEventScript
* @appliedtorecord employee
*/
function beforeSubmit(scriptContext) {
if (!isEmployeeValid(scriptContext)) {
throw err.create({
"name": "STOIC_ERR_INVALID_DATA",
"message": "Employee data is not valid",
"notifyOff": true
});
}
}
function isEmployeeValid(scriptContext) {
return (!isProjectResource(scriptContext.newRecord) || hasValidLaborCost(scriptContext.newRecord));
}
function isProjectResource(employee) {
return (employee.getValue({"fieldId" : "isjobresource"}));
}
function hasValidLaborCost(employee) {
var laborCost = employee.getValue({"fieldId" : "laborcost"});
return (Boolean(laborCost) && (laborCost > 0));
}
exports.beforeSubmit = beforeSubmit;
return exports;
});
Beachten Sie, dass wir Verweise auf den neuen Datensatz in unsere Validierung übergeben, da uns die alten Werte nicht wichtig sind. es geht uns nur um die Werte, die in die Datenbank geschrieben werden sollen. In 2.0 machen wir das über die scriptContext.newRecord
Referenz, und in 1.0 rufen wir die globale Funktion nlapiGetNewRecord
.
Wenn die übermittelten Daten nicht gültig sind, erstellen wir einen Fehler und geben ihn aus. In einem beforeSubmit
Ereignis, um die Änderungen zu verhindern , dass in die Datenbank geschrieben werden, müssen Ihre Funktion throw
eine Ausnahme. Oft versuchen Entwickler, return false
von ihrer Funktion zurückzukehren, und erwarten, dass dies ausreichend ist, aber das reicht nicht aus. Fehlerobjekte werden in 2.0 mit dem Modul N/error
und in 1.0 mit der globalen Funktion nlapiCreateError
. Wir lösen dann eine Exception aus, indem wir unser erstelltes Fehlerobjekt mit dem Schlüsselwort throw
.
Nach Absenden: Stellen Sie fest, ob ein Feld geändert wurde
Nachdem der Datensatz in der Datenbank gespeichert wurde, möchten wir untersuchen, was in dem Datensatz geändert wurde. Wir führen diese Überprüfung durch, indem wir Werte zwischen den alten und neuen Datensatzinstanzen vergleichen.
// 1.0, Revealing Module pattern
var myNamespace = myNamespace || {};
myNamespace.example = (function () {
/**
* User Event 1.0 example detailing usage of the Submit events
*
* @appliedtorecord employee
*/
var exports = {};
function afterSubmit(type) {
notifySupervisor();
}
function notifySupervisor() {
// Old and New record instances are retrieved from global functions
var employee = nlapiGetNewRecord();
var prevEmployee = nlapiGetOldRecord();
// If Employee Status didn't change, there's nothing to do
if (!didStatusChange(employee, prevEmployee)) {
return;
}
// Otherwise, continue with business logic...
}
function didStatusChange(employee, prevEmployee) {
var status = employee.getFieldValue("employeestatus");
var prevStatus = prevEmployee.getFieldValue("employeestatus");
/* !! Caution !!
* Empty fields from the Old record come back as `null`
* Empty fields from the New record come back as an empty String
* This means you cannot simply compare the old and new
*/
return ((prevStatus || status) && (status !== prevStatus));
}
exports.afterSubmit = afterSubmit;
return exports;
})();
// 2.0
define(["N/runtime"], function (runtime) {
/**
* User Event 2.0 example detailing usage of the Submit events
*
* @NApiVersion 2.x
* @NModuleScope SameAccount
* @NScriptType UserEventScript
* @appliedtorecord employee
*/
var exports = {};
function afterSubmit(scriptContext) {
notifySupervisor(scriptContext);
}
function notifySupervisor(scriptContext) {
// Old and New records are simply properties on scriptContext
var employee = scriptContext.newRecord;
var prevEmployee = scriptContext.oldRecord;
// If Employee Status didn't change, there's nothing to do
if (!didStatusChange(employee, prevEmployee)) {
return;
}
// Otherwise, continue with business logic...
}
function didStatusChange(employee, prevEmployee) {
var status = employee.getValue({"fieldId" : "employeestatus"});
var prevStatus = prevEmployee.getValue({"fieldId" : "employeestatus"});
/* !! Caution !!
* Empty fields from the Old record come back as `null`
* Empty fields from the New record come back as an empty String
* This means you cannot simply compare the old and new
*/
return ((prevStatus || status) && (status !== prevStatus));
}
exports.afterSubmit = afterSubmit;
return exports;
});
Seien Sie sehr vorsichtig, wenn Sie Werte zwischen alten und neuen Datensätzen vergleichen. Leere Felder aus dem alten Datensatz werden als null
, während leere Felder aus dem neuen Datensatz als leerer String zurückgegeben werden. Das bedeutet, dass Sie das Alte nicht einfach mit dem Neuen vergleichen können. Andernfalls erhalten Sie falsch positive Ergebnisse. Jede Logik, die Sie schreiben, muss den Fall behandeln, in dem eine null
und eine leere Zeichenfolge.