NetSuite(NS)的 Saved Search(SS)不管是在當做報表呈現,還是寫程式都是很重要的功能。不知道有沒有遇過設定 SS 的結果寄送給 User 的時,User 因為資料列太多,在 Email 內文上看得眼花撩亂,反應可不可以增加行序號?此篇要介紹一個 Oracle 的方式: ROWNUM 來解決這個問題。
Table of Contents
ROWNUM 是什麼?
雖然在 NS 原廠的網站上沒有特別說明這個功能,不過有時候 NS 有關 SQL 的問題可以去找看看 Oracle 資料庫的文件。Oracle 的 ROWNUM 是在把結果呈現在畫面上前產生的一個暫時的 Select 資料的順序,它並不是真的存在於資料庫中。在 NS 中,合理推測也是差不多的邏輯。所以這會延伸出,如果 SS 的 Result 太多資料行時,NS 為了要用這個方式產生 Row Number,User 會感受到送出到跑出結果的速度變慢,過程 Run 太久還可能還會跳 Error。
若要更深入研究請參考 Oracle 的官方文件,另外有提及,ROWNUM 與 ORDER BY 一同在 SQL 運用時,可能會有不同的結果。但在 NS 中的 SS 運用相對單純。
在 Saved Search 的報表上加入行序號
假設我們要搜尋特定時間建立的 Sales Order 的 Transaction Line 資料,並且給予行序號,需求結果是序號從小排到大排序呈現:
#1 建立 SS:選擇 Transaction,若不熟如何操作,請參考淺談 2 種報表工具: NetSuite Reporting & NetSuite Saved Search
#2 請使用以下的參數
a. Criteria – Standard
| Filter | Description |
|---|---|
| Type | is Sales Order |
| Main Line | is False |
| Tax Line | is False |
| Date | is within 6/1/2024 and 8/31/2024 (設定區間只是為了減少資料量) |
b. Results
| Sort By |
|---|
| Formula (Numeric) |
| Field | Formula |
|---|---|
| Internal ID | |
| Document Number | |
| Formula (Numeric) | rownum |
| Line ID | |
| … |

#3 Run SS 後,發現有行序號拉!可以跟隔壁欄位的 Line ID 比較,可以看出差異性

以 SuiteScrip2.X 角度解讀此 Saved Search
上述的效果有用 Formula (Numeric)做 Sort By。若 Results 有多個 Formula (Numeric),不確定是用哪個 Formula (Numeric)排序,這時可用 Chrome Extension 的 SS 工具(記得 SS 要先存檔),查看 Script,便可清楚地看出 Sort By Formula (Numeric)是指哪欄位。
目前以我們的測試結果,會以 Results 頁面排序最先(上面)的 Formula (Numeric)欄位來做 Sort By 基礎。像此篇的例子,Sort by 是用我們要的 Row Number 的欄位。另外,也不是所有 Formula (Numeric)都可以排序,若不行,在報表執行時系統會報錯。
const salesOrderSearchFilters: SavedSearchFilters = [
['type', 'anyof', 'SalesOrd'],
'AND',
['mainline', 'is', 'F'],
'AND',
['taxline', 'is', 'F'],
'AND',
['trandate', 'within', '6/1/2024', '8/31/2024'],
];
const salesOrderSearchColTranDate = search.createColumn({ name: 'trandate' });
const salesOrderSearchColType = search.createColumn({ name: 'type' });
const salesOrderSearchColTranId = search.createColumn({ name: 'tranid' });
const salesOrderSearchColRownum = search.createColumn({ name: 'formulanumeric', formula: 'rownum', sort: search.Sort.ASC });
const salesOrderSearchColLineId = search.createColumn({ name: 'line' });
const salesOrderSearch = search.create({
type: 'salesorder',
filters: salesOrderSearchFilters,
columns: [
salesOrderSearchColTranDate,
salesOrderSearchColType,
salesOrderSearchColTranId,
salesOrderSearchColRownum,
salesOrderSearchColLineId,
],
});
結語
若 NS 的 SS 想要做出行序號的效果,可以使用 Oracle 的 ROWNUM Pseudocolumn。若想要做排序,也可以去參考 RANK() OVER(),例如: RANK() OVER(ORDER BY {line.id} ASC),效果會有點不同。 RANK() OVER() 的使用方式請參考此篇:
專注於系統客製化、系統維運與系統優化領域的團隊。致力於讓使用者系統變好用!
NetSuite Record Export 已在Google Chrome Web Store上架,歡迎任何反饋。
合作: info@inzaghi-corp.com
