Saturday, March 17, 2018

撈資料與呈現的心得

這次的案例主要是, 人員有分總局跟分局,
分局要看分局所轄駐點全部的資料, 確定都有填報, 所以不管有沒有資料都要顯示.
總局要看全部分局所轄駐點, 但只要顯示有填報的資料.

在資料撈取的結構上, 切成 分局代號 , 駐點代號 , 項目 , 期別 ; 撈取的功能分成 明細 , 單項加總 ; 另外有一項功能是查詢最後修改的紀錄, 也用來判斷如果沒有修改記錄, 就不用再查明細跟加總.

資料結構上, 一個分局有多個駐點, 所以先依登入帳號屬於總局或分局, 撈取的駐點清單就加上條件(若是分局人員, 只撈取分局所轄駐點), 這樣雖然清單都是"駐點", 明細數量卻不同, 而主要程式結構就不變.

撈取駐點後, 依期別撈取所有已填寫的資料, 產生一個"實際填寫的項目(A)"陣列.
再來則是從項目清單與駐點清單, 產生一個"應該要有的項目(B)"陣列.

最後要轉成網頁畫面時, 再依登入人員決定要顯示的項目:
如果是分局, 就把整個"應該要有的項目"都呈現出來, 如果項目已經有填寫, 再顯示填寫的項目. (概念是B left join A)
而總局只需要已經填寫的項目, 所以是以實際填寫的項目, 把顯示的名稱撈出來. (概念是 A join B)

這樣整個程式大架構不變, 只有在物件導向的類別(class)加上參數, 撈取的資料就不同, 而顯示時, 也只要小幅度的判斷要顯示的部分, 其他部分都是讓迴圈自己跑.

而且這樣可以避免一種狀況, 就是有些寫法會先產生應有的項目, 再去資料庫指定要搜尋項目的值, 但這樣如果未填寫的部分, 因為資料不存在時, SQL 會將所有填寫明細表搜尋一次才確定為 NULL , 而花較久的時間.