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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow