Ricerca…


Sintassi

  • beforeSubmit (type) // Before Submit, 1.0
  • beforeSubmit (scriptContext) // Before Submit, 2.0
  • afterSubmit (type) // Dopo Submit, 1.0
  • afterSubmit (scriptContext) // Dopo Submit, 2.0

Parametri

Parametro Dettagli
SuiteScript 2.0 -
scriptContext {Object}
scriptContext.newRecord {N/record.Record} Un riferimento al record letto dal database. Possiamo usarlo per modificare i valori del campo sul record
scriptContext.oldRecord {N/record.Record} Un riferimento di sola lettura allo stato precedente del record. Possiamo usarlo per confrontare con i nuovi valori
scriptContext.type {UserEventType} del tipo di azione di scrittura eseguita
SuiteScript 1.0 -
type {String} Il tipo di azione di scrittura eseguita

Osservazioni

beforeSubmit e afterSubmit

Questi due eventi sono attivati ​​da qualsiasi operazione di scrittura del database su un record. Ogni volta che un utente, uno script, un'importazione CSV o una richiesta di un servizio Web tenta di scrivere un record nel database, gli eventi di invio vengono attivati.

Registra le azioni che attivano entrambi gli eventi di invio:

  • Creare
  • modificare
  • Elimina
  • XEdit (modifica in linea)
  • Approvare
  • Rifiutare
  • Annulla
  • pacco
  • Nave

Registra le azioni che si attivano beforeSubmit Solo beforeSubmit :

  • Segna come completato
  • Riassegna (casi di supporto)
  • Modifica previsione

Registrare azioni che si attivano solo afterSubmit l' afterSubmit :

  • dropship
  • Ordine speciale
  • Ordinare gli articoli
  • Paga le bollette

Casi di utilizzo tipici per beforeSubmit

  • Convalida il record prima che venga eseguito il commit nel database
  • Permessi e controlli di restrizione
  • Modifiche dell'ultimo minuto prima del commit del database
  • Tirare aggiornamenti da sistemi esterni

Casi di utilizzo tipici per afterSubmit

  • Notifica via email delle modifiche ai record
  • Reindirizzamento del browser
  • Crea / aggiorna i record dipendenti
  • Spingere le modifiche ai sistemi esterni

Eventi utente non concatenati

Il codice scritto in Eventi utente non attiverà Eventi utente su altri record. Ad esempio, la modifica del record cliente associato dall'invio beforeSubmit di un record dell'ordine di vendita non attiverà gli eventi di invio del record del cliente.

NetSuite fa questo per evitare che Eventi Utente si innescino a vicenda in un ciclo infinito. Se avete bisogno di utente Eventi di sparare in una sequenza incatenato, dovranno essere iniettato tra gli eventi di altri tipi di script (ad esempio, RESTlets Suitelets, script programmati).

Gli Event Handlers restituiscono il void

Il tipo di ritorno dei gestori eventi Submit è void . Qualsiasi dato restituito dal gestore eventi non ha alcun effetto sul sistema. Non è necessario restituire nulla dalla funzione del gestore poiché non possiamo effettivamente fare nulla con il suo valore restituito.

!! ATTENZIONE !!

Sii molto cauto nel confrontare i valori tra vecchi e nuovi record. I campi vuoti dal vecchio record vengono restituiti come null , mentre i campi vuoti dal nuovo record vengono restituiti come String vuota. Ciò significa che non puoi semplicemente confrontare il vecchio con il nuovo, o otterrai falsi positivi. Qualsiasi logica che scrivi deve gestire il caso in cui uno è null e uno è una stringa vuota appropriatamente.

Minimo: registra un messaggio

// 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;
});

Prima dell'invio: convalida il record prima che venga eseguito il commit nel database

Per questo esempio, vogliamo essere sicuri che ogni Dipendente contrassegnato come risorsa di progetto abbia anche un costo di manodopera appropriato.

// 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;
});

Nota che passiamo i riferimenti al nuovo record nella nostra convalida perché non ci importa quali siano i valori utilizzati; ci occupiamo solo dei valori che stanno per essere scritti nel database. Nel 2.0, lo facciamo tramite il riferimento scriptContext.newRecord e in 1.0 chiamiamo la funzione globale nlapiGetNewRecord .

Quando i dati inviati non sono validi, creiamo e generiamo un errore. In un evento beforeSubmit , per evitare che le modifiche vengano scritte nel database, la tua funzione deve throw un'eccezione. Spesso gli sviluppatori cercano di return false dalla loro funzione, aspettandosi che ciò sia sufficiente, ma ciò non è sufficiente. Gli oggetti di errore vengono creati in 2.0 utilizzando il modulo N/error e in 1.0 utilizzando la funzione globale nlapiCreateError ; quindi solleviamo un'eccezione usando il nostro oggetto errore creato con la parola chiave throw .

Dopo Submit: determina se un campo è stato modificato

Dopo che il record è stato memorizzato nel database, vogliamo controllare cosa è stato modificato nel record. Effettueremo questa ispezione confrontando i valori tra le vecchie e le nuove istanze del record.

// 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;
});

Sii molto cauto nel confrontare i valori tra vecchi e nuovi record. I campi vuoti dal vecchio record vengono restituiti come null , mentre i campi vuoti dal nuovo record vengono restituiti come String vuota. Ciò significa che non puoi semplicemente confrontare il vecchio con il nuovo, o otterrai falsi positivi. Qualsiasi logica che scrivi deve gestire il caso in cui uno è null e uno è una stringa vuota appropriatamente.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow