今天我們要來解決一個在製作出勤打卡系統時常遇到的問題:如何快速找出今天有哪些人已經打了上班卡,但還沒有打下班卡?這對於人事管理或主管即時掌握同仁狀況非常有用。
有兩個獨立的資料表:一個記錄「上班打卡 (CheckIn)」,另一個記錄「下班打卡 (CheckOut)」。 他希望能有一個列表,只顯示那些「今天有上班打卡,但還沒打下班卡」的人員。
取得今天所有「上班打卡」的人員ID列表。 取得今天所有「下班打卡」的人員ID列表。 將第一個列表減去第二個列表,剩下的就是我們需要的「有上班打卡但未下班打卡」的人員ID。 最後,我們使用這個結果ID列表來篩選我們的人員主資料表。
操作步驟:
People: 儲存所有人員的基本資料,包含 PeopleID (人員ID,Key值) 和 PeopleName (人員姓名)。 CheckIn: 儲存上班打卡紀錄,包含 PeopleID (關聯到 People 表) 和 CheckInDate (打卡日期)。 CheckOut: 儲存下班打卡紀錄,包含 PeopleID (關聯到 People 表) 和 CheckOutDate (打卡日期)。
進入 Slice 設定: 在 AppSheet 編輯器中,到 Data > Slices。 點擊 New Slice。
設定 Slice 基本資料: Slice Name:例如「有上班卡沒下班卡人員」 Source Table:選擇 People (因為我們最終要顯示的是人員列表)。
設定 Row filter condition (列篩選條件): 這就是核心公式所在。請貼上以下公式: 讓我們來解析這個公式: SELECT(CheckIn[PeopleID], [CheckInDate] = TODAY()): 這個部分會從 CheckIn 資料表中選出所有 PeopleID。 篩選條件是 [CheckInDate] = TODAY(),也就是只選取打卡日期為「今天」的紀錄。 結果會是一個今天有上班打卡的人員ID列表 (List)。
SELECT(CheckOut[PeopleID], [CheckOutDate] = TODAY()): 同理,這個部分會從 CheckOut 資料表中選出所有 PeopleID。 篩選條件是 [CheckOutDate] = TODAY(),只選取下班打卡日期為「今天」的紀錄。 結果會是一個今天有下班打卡的人員ID列表 (List)。
- (減號): 這是 AppSheet 中的 List subtraction (列表相減) 運算子。它會從第一個列表中移除所有同時也存在於第二個列表中的項目。 所以,(今日上班打卡人員ID列表) - (今日下班打卡人員ID列表) 的結果,就是那些今天有上班打卡、但還沒有下班打卡的人員ID列表。
IN([PeopleID], ...): [PeopleID] 是指目前 People 資料表 (Slice 的來源資料表) 中每一列的人員ID。 IN() 函數會檢查目前的 [PeopleID] 是否存在於後面經過相減運算後產生的人員ID列表中。 如果存在,則該列人員資料就會顯示在這個 Slice 中。
儲存 Slice 與 App: 點擊 Slice 設定右下角的 Save。 再點擊 AppSheet 編輯器右上角的 Save 按鈕儲存整個 App 的變更。
驗證結果:
當「蔡明和」和「一整天」今天都打了上班卡,但都還沒打下班卡時,這個列表會顯示他們兩人。 如果「蔡明和」打了下班卡,列表中就只會剩下「一整天」。 如果「一整天」也打了下班卡,列表就會變成空的。
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。