說明 N/Record 的 isDynamic 參數與 2 種 Mode

若你是開發人員一定對在使用 N/Record Module 的 isDynamic 這個參數不陌生。但這個參數實質怎麼使用、何時使用,是否都清楚呢?若你沒有看過這個參數,也是正常的,因為這個參數在程式中不用特別定義,系統會給預設值 。這篇分享 Dynamic Mode 與 Standard Mode 使用的時機與使用方式。

使用 Record 的新增、複製、 record.load 與 record.transform 等,都可以使用 isDynamic 參數,例如以下的程式碼。因為 isDynamic 為非必要參數,若你沒有特別定義 isDynamic,則系統會預設 false(若是 false 是 Standard Mode,若是 true 則是 Dynamic Mode )。

var objRecord = record.transform({
    fromType: record.Type.CUSTOMER,
    fromId: 205,
    toType: record.Type.SALES_ORDER,
    isDynamic: true
});

討論使用 N/record Module 修改 record 的 2 種方法 有提到 Dynamic Mode,可以把它想像成系統在執行的動作會跟使用者操作的時候看到的畫面一模一樣,資料的 sourcing 與計算等動作會直接執行,所以若沒有按照操作順序給欄位值,就可能會造成寫入資料錯誤。按照上述的邏輯,若值有錯誤會馬上檢查出來,不需要等到 record.save (submit) 這個動作執行。

Standard Mode 則是不會在賦予欄位值時就馬上執行資料 Sourcing 或計算,而是等到 record.save 動作時才開始檢查前面的值是否有誤。

所以從上述的說明邏輯可以推斷,在程式的寫法與應用上不盡相同。

另外,N/currentRecord Module 必定是 Dynamic Mode,這個 Module 只能用在 Client Script 這種 Script Type。(Client Script 可以想像成就是控制使用者使用畫面的動作的程式,若把前面的邏輯想通後,不難聯想這種關係的!)

兩種 Mode 程式上撰寫方式

再來我們要介紹 Script 的寫法, 有些 Method 只能在特定的 Mode 中執行,例如 Record.CommitLine 只會在 Dynamic Mode 出現。以下用兩種 Mode 來表達 Purchase Order to Vendor Bill Transform。若想要知道哪些 Method 用在哪種 Mode 才對,建議直接看原廠的文件判斷。

Dynamic Mode

// Dynamic Mode
var purchaseOrderId = '98765';
var vendorBillRec = record.transform({
    fromType: 'purchaseorder',
    fromId: purchaseOrderId,
    toType: 'vendorbill',
    isDynamic: true // Dynamic Mode
});
vendorBillRec.setValue({
    fieldId: 'tranid',
    value: 'test1'
});
var vendorBillLineCount = vendorBillRec.getLineCount({
    sublistId: 'item'
});
for (var i = 0; i < vendorBillLineCount; i++) {
    vendorBillRec.selectLine({
        sublistId: 'item',
        line: i
    });
    vendorBillRec.setCurrentSublistValue({
        sublistId: 'item',
        fieldId: 'department',
        value: 2, 
        ignoreFieldChange: true
    });
    vendorBillRec.commitLine({
        sublistId: 'item'
    });
}
var vendorBillId = vendorBillRec.save();
log.debug('Vendor Bill Created Successfully', 'Vendor Bill ID: ' + vendorBillId);

說明:selectLine、setCurrentSublistValue、commitLine 這三個 Method 只能用在 Dynamic Mode。

Standard Mode

// Standard Mode
var purchaseOrderId = '98765';
var vendorBillRec = record.transform({
    fromType: 'purchaseorder',
    fromId: purchaseOrderId,
    toType: 'vendorbill',
    isDynamic: false // Standard Mode
});
vendorBillRec.setValue({
    fieldId: 'tranid',
    value: 'test1'
});
var vendorBillLineCount = vendorBillRec.getLineCount({
    sublistId: 'item'
});
for (var i = 0; i < vendorBillLineCount; i++) {
    vendorBillRec.setSublistValue({
        sublistId: 'item',
        fieldId: 'department',
        line: i,
        value: 2
    });
}
var vendorBillId = vendorBillRec.save();
log.debug('Vendor Bill Created Successfully', 'Vendor Bill ID: ' + vendorBillId);

說明:setSublistValue 就是一個很典型只能用在 Standard Mode 的 Method。

 

該如何選用

  • 若要做簡易且大批量的資料處理,例如新增、修改:Standard Mode(省去原本畫面上的某些動作,執行效率較好)
  • 若要用畫面欄位即時算出來的數字或資料再做後續資料處理:Dynamic Mode

結論

Inzaghi, 英薩吉, NetSuite基本介紹, 修改record, N/record, isDynamic, transform

此篇介紹 isDynamic 這個參數,與 Standard and Dynamic Mode 的相關細節。若要掌握這功能,只要了解基本觀念、Script Type、Method,再加上用途,就可以判斷是要用哪一種 Mode 較恰當。若資料本身不多,使用哪一種就沒有太大差別。重點在於資料大量,或有些資料需要靠 Sourcing 再利用等,這個就要事先考量這些在設計。

歡迎與我們交流!

分享英薩吉的這篇內容
返回頂端