netsuite
사용자 이벤트 : 전송 이벤트 전후
수색…
통사론
- 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 false
를 return 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 인 경우를 처리 할 필요가 있습니다.