netsuite
Zdarzenie użytkownika: przed i po Prześlij zdarzenia
Szukaj…
Składnia
- beforeSubmit (type) // Before Submit, 1.0
- beforeSubmit (scriptContext) // Przed przesłaniem, 2.0
- afterSubmit (type) // After Submit, 1.0
- afterSubmit (scriptContext) // Po przesłaniu, 2.0
Parametry
Parametr | Detale |
---|---|
SuiteScript 2.0 | - |
scriptContext | {Object} |
scriptContext.newRecord | {N/record.Record} Odwołanie do rekordu odczytywanego z bazy danych. Możemy go użyć do modyfikacji wartości pól w rekordzie |
scriptContext.oldRecord | {N/record.Record} Odniesienie tylko do odczytu do poprzedniego stanu rekordu. Możemy go użyć do porównania z nowymi wartościami |
scriptContext.type | {UserEventType} Wyliczenie typu wykonywanej akcji zapisu |
SuiteScript 1.0 | - |
type | {String} Rodzaj wykonywanej akcji zapisu |
Uwagi
beforeSubmit
i afterSubmit
Te dwa zdarzenia są wyzwalane przez dowolną operację zapisu bazy danych na rekordzie. Za każdym razem, gdy użytkownik, skrypt, import CSV lub żądanie usługi internetowej próbuje zapisać rekord w bazie danych, zdarzenia Prześlij zostają uruchomione.
Rejestruj działania, które wyzwalają oba zdarzenia Prześlij:
- Stwórz
- Edytować
- Usunąć
- XEdit (edycja bezpośrednia)
- Zatwierdzać
- Odrzucać
- Anuluj
- Pakiet
- Statek
Rekord działania, które wyzwalają beforeSubmit
tylko:
- Oznacz jako ukończone
- Zmiana przypisania (przypadki wsparcia)
- Edytuj prognozę
Rejestruj działania, które są wyzwalane tylko po afterSubmit
:
- Dropship
- Specjalne zamówienie
- Zamawiać rzeczy
- Rachunki
Typowe przypadki użycia dla beforeSubmit
- Sprawdź poprawność rekordu, zanim zostanie on zatwierdzony w bazie danych
- Kontrola uprawnień i ograniczeń
- Zmiany w ostatniej chwili przed zatwierdzeniem bazy danych
- Pobierz aktualizacje z systemów zewnętrznych
Typowe przypadki użycia dla funkcji afterSubmit
- Powiadomienie e-mail o zmianach w zapisach
- Przekierowanie przeglądarki
- Twórz / aktualizuj rekordy zależne
- Przekaż zmiany do systemów zewnętrznych
Zdarzenia użytkownika nie są łączone
Kod zapisany w Zdarzeniach użytkownika nie wywoła żadnych zdarzeń użytkownika w innych rekordach. Na przykład modyfikacja powiązanego rekordu klienta z przed beforeSubmit
rekordu zamówienia sprzedaży nie wyzwoli zdarzeń przesłania rekordu klienta.
NetSuite robi to, aby zdarzenia użytkownika nie wyzwalały się nawzajem w nieskończonej pętli. Jeśli musisz zdarzenia użytkownika do pożaru w przykuty sekwencji, inne typy skryptów (np RESTlets, Suitelets, zaplanowane scenariusze), będą musiały być wstrzykiwane pomiędzy wydarzeniami.
Procedury obsługi zdarzeń zwracają void
Typ zwracany przez procedury obsługi zdarzeń Prześlij jest void
. Wszelkie dane zwrócone przez nasz moduł obsługi zdarzeń nie mają wpływu na system. Nie musimy zwracać niczego z naszej funkcji modułu obsługi, ponieważ nie możemy nic zrobić z jej zwróconą wartością.
!! UWAGA !!
Zachowaj ostrożność podczas porównywania wartości między starymi i nowymi rekordami. Puste pola ze starego rekordu są zwracane jako null
, a puste pola z nowego rekordu są zwracane jako pusty Ciąg. Oznacza to, że nie możesz po prostu porównać starego z nowym, bo dostaniesz fałszywe alarmy. Każda logika, którą napiszesz, musi odpowiednio obsłużyć przypadek, w którym jeden jest null
a drugi pusty.
Minimalna: zaloguj wiadomość
// 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;
});
Przed przesłaniem: Sprawdź poprawność rekordu, zanim zostanie on zatwierdzony w bazie danych
W tym przykładzie chcemy się upewnić, że każdy pracownik oznaczony jako zasób projektu ma również zdefiniowany odpowiedni koszt pracy .
// 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;
});
Zauważ, że przekazujemy odniesienia do nowego rekordu do naszej walidacji, ponieważ nie dbamy o to, jakie były kiedyś wartości; zajmujemy się tylko wartościami, które mają zostać zapisane w bazie danych. W 2.0 robimy to za pomocą odwołania scriptContext.newRecord
, aw 1.0 wywołujemy funkcję globalną nlapiGetNewRecord
.
Gdy przesyłane dane są nieprawidłowe, tworzymy i zgłaszamy błąd. W beforeSubmit
imprezy, w celu uniknięcia zmiany mają być zapisywane w bazie danych, czynność musi throw
wyjątek. Często programiści próbują return false
z funkcji, oczekując, że to wystarczy, ale to nie wystarczy. Obiekty błędów są tworzone w 2.0 za pomocą modułu N/error
, aw 1.0 za pomocą globalnej funkcji nlapiCreateError
; następnie zgłaszamy wyjątek, używając naszego utworzonego obiektu błędu za pomocą słowa kluczowego throw
.
Po przesłaniu: określ, czy pole zostało zmienione
Po zapisaniu rekordu w bazie danych chcemy sprawdzić, co zostało w nim zmienione. Przeprowadzimy tę kontrolę, porównując wartości między starymi i nowymi instancjami rekordów.
// 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;
});
Zachowaj ostrożność podczas porównywania wartości między starymi i nowymi rekordami. Puste pola ze starego rekordu są zwracane jako null
, a puste pola z nowego rekordu są zwracane jako pusty Ciąg. Oznacza to, że nie możesz po prostu porównać starego z nowym, bo dostaniesz fałszywe alarmy. Każda logika, którą napiszesz, musi odpowiednio obsłużyć przypadek, w którym jeden jest null
a drugi pusty.