Sök…


Syntax

  • beforeSubmit (typ) // Before Submit, 1.0
  • beforeSubmit (scriptContext) // Before Submit, 2.0
  • afterSubmit (typ) // After Submit, 1.0
  • afterSubmit (scriptContext) // After Submit, 2.0

parametrar

Parameter detaljer
SuiteScript 2.0 -
scriptContext {Object}
scriptContext.newRecord {N/record.Record} En referens till posten som läses från databasen. Vi kan använda den för att ändra fältvärdena på posten
scriptContext.oldRecord {N/record.Record} En skrivskyddad referens till {N/record.Record} tidigare tillstånd. Vi kan använda den för att jämföra med de nya värdena
scriptContext.type {UserEventType} En uppräkning av typen av skrivhandling som utförs
SuiteScript 1.0 -
type {String} Typ av skrivhandling som utförs

Anmärkningar

beforeSubmit och efter afterSubmit

Dessa två händelser utlöses av valfri databasskrivning på en post. Varje gång en användare, ett skript, en CSV-import eller en webbtjänstförfrågan försöker skriva en post till databasen, skickas skicka-händelserna.

Spela in åtgärder som utlöser båda Skicka händelser:

  • Skapa
  • Redigera
  • Radera
  • XEdit (inline redigering)
  • Godkänna
  • Avvisa
  • Annullera
  • Packa
  • Fartyg

Spela in åtgärder som beforeSubmit bara:

  • Markera komplett
  • Tilldela om igen (supportfall)
  • Redigera prognos

Spela in åtgärder som utlöser endast afterSubmit :

  • Dropship
  • Specialbeställning
  • Beställ artiklar
  • Betala räkningar

Typiska användningsfall för beforeSubmit

  • Validera posten innan den har åtagit sig till databasen
  • Tillstånd och begränsningskontroller
  • Förändringar i sista minuten innan databasåtgärder
  • Dra uppdateringar från externa system

Typiska användningsfall för afterSubmit

  • E-postmeddelande om poständringar
  • Webbläsarens omdirigering
  • Skapa / uppdatera beroende poster
  • Tryck på ändringar till externa system

Användarhändelser kedjer inte

Kod skriven i användarhändelser kommer inte att utlösa några användarhändelser i andra poster. Att till exempel ändra den tillhörande kundposten från beforeSubmit av en försäljningsorderpost kommer inte att utlösa beforeSubmit .

NetSuite gör detta för att undvika att användarhändelser utlöser varandra i en oändlig slinga. Om du behöver användarhändelser till brand i en Chained sekvens kommer andra typer script (t.ex. RESTlets, Suitelets, schemalagda skript) måste sprutas in mellan händelserna.

Eventhanterare återkommer void

Returtypen för hanterare skicka händelse är void . All information som returneras från vår händelsehanterare har ingen effekt på systemet. Vi behöver inte returnera någonting från vår hanterarfunktion eftersom vi faktiskt inte kan göra något med dess returnerade värde.

!! VARNING !!

Var mycket försiktig när du jämför värden mellan gamla och nya poster. Tomma fält från den gamla posten returneras som null , medan tomma fält från den nya posten returneras som en tom sträng. Detta innebär att du inte bara kan jämföra det gamla med det nya, eller att du får falska positiver. All logik du skriver måste hantera fallet där en är null och en är en tom sträng på lämpligt sätt.

Minimal: Logga in ett meddelande

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

Innan du skickar in: Validera posten innan den har åtagit sig till databasen

För detta exempel vill vi se till att alla anställda som är markerade som en projektresurs också har en lämplig arbetskraftskostnad definierad.

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

Observera att vi skickar referenser till den nya posten i vår validering eftersom vi inte bryr oss om vilka värden som brukade vara; vi är bara upptagna med de värden som ska skrivas till databasen. I 2.0 gör vi det via scriptContext.newRecord referensen, och i 1.0 kallar vi den globala funktionen nlapiGetNewRecord .

När de uppgifter som skickas inte är giltiga skapar vi ett fel. I ett beforeSubmit måste din funktion throw ett undantag för att förhindra att ändringarna skrivs till databasen. Ofta försöker utvecklare att return false från sin funktion och förväntar sig att det räcker, men det räcker inte. Felobjekt skapas i 2.0 med hjälp av N/error modulen och i 1.0 med den globala nlapiCreateError funktionen; sedan höjer vi ett undantag med vårt skapade felobjekt med nyckelordet throw .

Efter skicka: Bestäm om ett fält har ändrats

När posten har lagrats i databasen vill vi undersöka vad som har ändrats i posten. Vi gör denna inspektion genom att jämföra värden mellan gamla och nya inspelningsinstanser.

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

Var mycket försiktig när du jämför värden mellan gamla och nya poster. Tomma fält från den gamla posten returneras som null , medan tomma fält från den nya posten returneras som en tom sträng. Detta innebär att du inte bara kan jämföra det gamla med det nya, eller att du får falska positiver. All logik du skriver måste hantera fallet där en är null och en är en tom sträng på lämpligt sätt.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow