수색…


통사론

  • beforeSubmit (type) // 제출하기 전에, 1.0
  • beforeSubmit (scriptContext) // 제출하기 전에, 2.0
  • afterSubmit (type) // 제출 후, 1.0
  • afterSubmit (scriptContext) // 제출 후, 2.0

매개 변수

매개 변수 세부
SuiteScript 2.0 -
scriptContext {Object}
scriptContext.newRecord {N/record.Record} 데이터베이스에서 읽는 레코드에 대한 참조. 레코드의 필드 값을 수정하는 데 사용할 수 있습니다.
scriptContext.oldRecord {N/record.Record} 레코드의 이전 상태에 대한 읽기 전용 참조. 새 값과 비교하는 데 사용할 수 있습니다.
scriptContext.type {UserEventType} 수행중인 쓰기 작업 유형의 열거 형
SuiteScript 1.0 -
type {String} 수행 할 쓰기 작업의 유형

비고

beforeSubmit afterSubmit

이 두 이벤트는 레코드에 대한 데이터베이스 쓰기 조작에 의해 트리거됩니다. 사용자, 스크립트, CSV 가져 오기 또는 웹 서비스 요청이 데이터베이스에 레코드를 쓰려고 할 때마다 Submit 이벤트가 시작됩니다.

두 가지 제출 이벤트를 트리거 하는 조치를 기록하십시오.

  • 몹시 떠들어 대다
  • 편집하다
  • 지우다
  • XEdit (인라인 편집)
  • 승인하다
  • 받지 않다
  • 취소

이전에 트리거하는 작업 기록하기 만 beforeSubmit :

  • 마크 완료
  • 재 할당 (지원 사례)
  • 예측 수정

afterSubmit 만 트리거하는 작업 기록하기 :

  • Dropship
  • 특별 주문
  • 주문 항목
  • 청구서를 지불

beforeSubmit 대한 일반적인 사용 사례

  • 데이터베이스에 커밋되기 전에 레코드 유효성 검사
  • 허가 및 제한 확인
  • 데이터베이스 커밋 전 마지막 순간의 변경 사항
  • 외부 시스템에서 업데이트 가져 오기

afterSubmit 대한 일반적인 사용 사례

  • 기록 변경 사항에 대한 전자 메일 알림
  • 브라우저 리디렉션
  • 종속 레코드 생성 / 업데이트
  • 외부 시스템에 변경 사항 적용

사용자 이벤트 가 연결되지 않음

사용자 이벤트로 작성된 코드는 다른 이벤트에서 사용자 이벤트를 트리거하지 않습니다. 예를 들어, 판매 주문 레코드의 beforeSubmit 에서 연관된 고객 레코드를 수정 beforeSubmit 고객 레코드의 제출 이벤트가 트리거되지 않습니다 .

NetSuite는 사용자 이벤트가 무한 루프에서 서로를 유발하지 않도록이 작업을 수행합니다. 연속 된 순서로 실행하기 위해 사용자 이벤트 필요하면 다른 스크립트 유형 (예 : RESTlets, Suitelets, Scheduled Scripts)을 이벤트 사이에 삽입해야합니다.

이벤트 처리기가 void 반환합니다.

제출 이벤트 핸들러의 리턴 유형은 void 입니다. 이벤트 처리기에서 반환 된 데이터는 시스템에 아무런 영향을 미치지 않습니다. 반환 값으로는 실제로 아무것도 할 수 없으므로 핸들러 함수에서 아무 것도 반환 할 필요가 없습니다.

!! !! 주의 !!

이전 레코드와 새 레코드 사이의 값을 비교할 때는 매우 신중해야합니다. 이전 레코드의 빈 필드는 null 로 반환되고 레코드의 빈 필드는 빈 문자열로 반환됩니다. 즉, 이전 버전과 새 버전을 쉽게 비교할 수 없거나 오탐 (False Positive)이 발생합니다. 기입하는 논리는, 1가 null , 1이 하늘의 String 인 경우를 처리 할 필요가 있습니다.

최소 : 메시지 기록

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

제출 전 : 데이터베이스에 커밋되기 전에 레코드 유효성 검사

이 예를 들어, 우리는 Project Resource 로 표시된 직원이 적절한 노동 비용을 정의했는지 확인하고자합니다.

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

레코드에 대한 참조는 유효성 검사에 포함됩니다. 왜냐하면 값이 어땠는지 상관하지 않기 때문입니다. 우리는 단지 데이터베이스에 기록 될 값에만 관심이 있습니다. 2.0에서는 scriptContext.newRecord 참조를 통해이를 수행하고 1.0에서는 전역 함수 nlapiGetNewRecord 호출합니다.

제출 된 데이터가 유효하지 않으면 오류가 발생합니다. beforeSubmit 이벤트에서 변경 사항이 데이터베이스에 기록되지 않도록하려면 함수가 Exception을 throw 해야합니다. 개발자는 종종 함수에서 return falsereturn false 하여 충분하다고 예상하지만 충분하지 않습니다. 오류 객체는 N/error 모듈을 사용하여 2.0에서 작성되고 전역 nlapiCreateError 함수를 사용하여 1.0에서 nlapiCreateError 됩니다. 그런 다음 throw 키워드를 사용하여 작성한 오류 객체를 사용하여 예외를 발생시킵니다.

제출 후 : 필드가 변경되었는지 확인

레코드가 데이터베이스에 저장되면 레코드에서 변경된 내용을 검사하려고합니다. 이 검사는 이전 레코드 인스턴스와 새 레코드 인스턴스 사이의 값을 비교하여 수행합니다.

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

이전 레코드와 새 레코드 사이의 값을 비교할 때는 매우 신중해야합니다. 이전 레코드의 빈 필드는 null 로 반환되고 레코드의 빈 필드는 빈 문자열로 반환됩니다. 즉, 이전 버전과 새 버전을 쉽게 비교할 수 없거나 오탐 (False Positive)이 발생합니다. 기입하는 논리는, 1가 null , 1이 하늘의 String 인 경우를 처리 할 필요가 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow