Saved Search 新增 1 欄 ROWNUM 呈現報表的行序號

NetSuite(NS)的 Saved Search(SS)不管是在當做報表呈現,還是寫程式都是很重要的功能。不知道有沒有遇過設定 SS 的結果寄送給 User 的時,User 因為資料列太多,在 Email 內文上看得眼花撩亂,反應可不可以增加行序號?此篇要介紹一個 Oracle 的方式: 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

FilterDescription
Typeis Sales Order
Main Lineis False
Tax Lineis False
Dateis within 6/1/2024 and 8/31/2024 (設定區間只是為了減少資料量)

b. Results

Sort By
Formula (Numeric)
FieldFormula
Internal ID 
Document Number 
Formula (Numeric)rownum
Line ID 
 

Inzaghi, 英薩吉, NetSuite基本介紹, row number, rownum, Saved Search

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

Inzaghi, 英薩吉, NetSuite基本介紹, row number, rownum, Saved Search

以 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() 的使用方式請參考此篇:

若你有什麼想分享,歡迎跟我們交流。
分享英薩吉的這篇內容
返回頂端