程式資訊
- 程式 ID:
GSTKBAS_1 - 所屬子系統:C.總務管理
- 狀態:stable
總務倉庫關帳(Warehouse Closing Book)¶
功能簡介¶
「總務倉庫關帳」是總務(C 模組)的倉庫月結關帳作業視窗(程式 ProgramClass GSTKBAS_1,視窗標題 Warehouse Closing book):輸入要結算的關帳日期後,系統先對該月份跑成本稽核,通過後列出可關帳的倉庫,由使用者勾選欲關帳的倉庫並執行月結。關帳完成後,被勾選倉庫的關帳日期會被寫回,倉庫即進入下一個開帳月份。
本視窗不是從主選單獨立開啟,而是由 G倉庫表(GSPLACE) 工具列的延伸功能叫出——它是 GSPLACE 倉庫主檔維護的關帳搭檔。倉管/總務人員在維護完倉庫資料後,於月底以此視窗統一對倉庫執行關帳。
與庫存模組倉庫關帳的關係
庫存模組(H)也有一支幾乎相同的「倉庫關帳」視窗(程式 STKBAS_1,位於 庫存模組)。本頁的 GSTKBAS_1 是總務模組自己的關帳程式,擁有獨立的 ProgramClass,資料來源走總務的倉庫檢視表 Twork_gen_vw_gstkbas,兩者各自獨立、不要混為同一支。
視窗存放位置的小提醒
本視窗的 XAML(TsERP/C.GeneralAffair/Gstkbas_1.xaml)雖然實體放在 C.GeneralAffair 資料夾,其 x:Class 命名空間卻是 TsERP.H.Inventory(歷史遺留)。這只是程式碼組織細節,不影響使用;本頁仍屬總務模組。
前置需求¶
- 權限:開啟本視窗需具備 G倉庫表(GSPLACE) 的瀏覽與修改權限——本視窗由 GSPLACE 的延伸功能開啟,授權檢查由 GSPLACE 端負責(關帳上傳所用的
UploadPrgClass也是GSPLACE)。 - 基礎資料:關帳能否進行,取決於下列資料的維護與計算狀態——
| 資料 | 影響的結果 |
|---|---|
| 倉庫主檔(G倉庫表 GSPLACE) | Master 清單列出可關帳的倉庫;其開帳月份決定可關帳區間 |
| 成本計算與成本稽核(K 成本管理) | 關帳前的稽核項目 K-020-003/004/005 必須全部 OK,否則擋下查詢、無法關帳 |
系統檢查項定義(檢視表 Twork_sys_vw_checkm) |
左側 Check Item 清單與各項說明來源(撈 SystemCheckItemNo like 'K-020%' 再篩三項) |
預存程序 DARB_TUR_GSTKBAS(須在 proc_param 登錄) |
查詢倉庫與鎖定清單;未部署/未登錄時查詢失敗 |
操作步驟¶
本視窗有兩個頁籤:Closing Book(關帳作業)與 Locked Source(被鎖定中的倉庫清單)。主要流程都在 Closing Book 頁完成。

步驟① 開啟關帳視窗¶
- 從主選單開啟 C.總務 → G倉庫表(GSPLACE)。
- 點選工具列的延伸功能鈕(對應
GsplaceViewModel.ExtendedFunction1),系統開啟 Warehouse Closing book 視窗。
步驟② 輸入關帳日期並查詢¶
- 在上方的 Closing Date(關帳日期) 輸入要結算的日期。預設帶入今天(
DateTimeWrapper.TodayYYYYMMDD());系統取其前 7 碼(yyyy/MM)作為關帳月份。 -
按
查詢(QueryButton)。系統會:- 先跑成本稽核:抓
K-020系列檢查項,篩出 K-020-003/004/005 三項,對關帳月份逐項執行檢查,結果列在左側Check Item清單。 - 稽核全部通過(每項
Output為OK)才繼續;任一項未過會跳「資料不正確」並中止查詢。 - 呼叫 SP
DARB_TUR_GSTKBAS取回兩組資料:被他人鎖定編輯中的倉庫(填入Locked Source頁)與可關帳的倉庫(填入Master)。
稽核未過無法關帳
若該月成本還不能結算,按
查詢會直接跳「資料不正確」並停在原畫面,Master不會有任何倉庫。請先到 成本管理 完成該月成本計算與檢查,待 K-020-003/004/005 全部OK後再回來查詢。 - 先跑成本稽核:抓

步驟③ 勾選欲關帳的倉庫¶
- 在右側
Master格線勾選每列的 Select 核取方塊;或用畫面下方的批次按鈕:All:全部勾選(把每列 選擇 設為Y)。None:全部取消(把每列 選擇 設為N)。
- Warehouse(隸屬倉庫)/Open Date(開帳月份)/Book Closing Date(關帳日期) 三欄為唯讀,僅供確認倉庫代號、開帳月與目前關帳日。

建議用 All/None 批次按鈕設定勾選
All/None 兩顆按鈕由 ViewModel 直接把每列的 選擇 欄改成 Y/N,最為可靠。逐列核取方塊請參見 欄位連動與附加功能 的說明。
步驟④ 執行關帳(存檔)¶
- 確認勾選無誤後,按畫面右下角的
儲存(SqlEditTurn)執行關帳轉檔。 - 存檔前系統會檢核關帳日期不可空白、且至少勾選一筆倉庫,否則擋下並提示。
- 關帳成功後,被勾選倉庫的 關帳日期 即被寫入;回到 GSPLACE 主畫面時會自動重新整理(
DataNavigateHelper.Renew),倉庫的開帳月份/關帳日期反映最新結果。
Locked Source 頁籤
Locked Source 頁列出「正被其他使用者編輯鎖定中」的倉庫,並在頁籤標題上顯示鎖定筆數(LockedCount,0 筆時不顯示數字)。這些倉庫此刻不能由你關帳,須等對方釋放鎖定。此頁純供檢視,只有離開鈕,無關帳操作。

欄位說明¶
查詢條件¶
| 欄位 | 必填 | 說明/格式/預設 |
|---|---|---|
| Closing Date(關帳日期) | 是 | 短日期格式(MaskInfo="ShortDate");預設今天。系統取前 7 碼當關帳月份,並於存檔時把完整日期寫回各勾選倉庫的關帳日期 |
Master(可關帳倉庫清單)¶
| 欄位 | 可編輯 | 說明 |
|---|---|---|
| Select(選擇) | ✔ | 核取方塊;勾選=Y、取消=N。只有 選擇=Y 的倉庫會被關帳 |
| Warehouse(隸屬倉庫) | — | 倉庫代號,唯讀 |
| Open Date(開帳月份) | — | 該倉庫目前的開帳月份,唯讀 |
| Book Closing Date(關帳日期) | — | 該倉庫目前的關帳日期,唯讀;關帳後更新 |
Master 與 Source 欄位對照
Master 各列其實是 Gstkbas_1TmpPoco(繼承 Twork_gen_vw_gstkbasSource),底層中文屬性包含 隸屬倉庫/倉庫說明/開帳月份/關帳日期/送貨地點/倉庫分類碼/倉同儲/備註/成本順序/顯示順序/可用 等,但本視窗只顯示倉庫代號、開帳月份、關帳日期三個欄位供關帳確認。
顯示欄位的英文綁定與中文屬性不一致
Master 與 Locked Source 的 Warehouse/Open Date/Book Closing Date 三欄在 XAML 綁定的是 Warehouse/OpenDate/BookClosingDate 這幾個英文路徑,但列物件 Gstkbas_1TmpPoco 只有對應的中文屬性(隸屬倉庫/開帳月份/關帳日期),並沒有同名英文屬性。因此實際執行時這三欄可能顯示空白,屬於與 Select 核取方塊相同類型的綁定/屬性不一致狀況(待 runtime 驗收)。判斷可否關帳請以勾選與下方稽核結果為準。
Check Item(成本稽核結果,左側清單)¶
| 欄位 | 說明 |
|---|---|
| Check Item(SystemCheckItemNo) | 檢查項代號,本視窗只取 K-020-003/004/005 |
| Description | 檢查項說明 |
| Output | 檢查結果;OK 表示通過。任一項非 OK 即無法關帳(IsOK 判定 Output == "OK") |
| Detail(下方子格線) | 點選某檢查項列,下方自動顯示該項的明細 DataTable(不通過時的問題清單) |
Locked Source(被鎖定倉庫,第二頁籤)¶
| 欄位 | 說明 |
|---|---|
| Editing User(修改人員) | 正在編輯鎖定該倉庫的使用者(屬性 EditingUser,對應 SP 回傳中文欄「修改人員」) |
| Warehouse/Open Date/Book Closing Date | 倉庫代號、開帳月份、關帳日期,皆唯讀(同上方警告,三欄為英文綁定,runtime 可能空白) |
欄位連動與附加功能¶
這一節把「輸入某欄位/按某按鈕後,系統會做什麼」逐條列出,全部依實際程式碼整理。
開窗即帶入今天¶
視窗建立時(Gstkbas_1ViewModel 建構式),Closing Date 自動帶入今天的日期(ClosingDate = DateTimeWrapper.TodayYYYYMMDD()),可直接改成要結算的月份所屬的任一天。
按「查詢」會做兩件事¶
按 查詢(QueryCommand → QueryExecute)時,系統先清空 LockedSource/Master,再依序:
- 先跑成本稽核(
CheckQuantity→AuditBeforeCalculateSqlBll.CanCalculateCost):- 以關帳日期前 7 碼(
yyyy/MM)為月份,從檢視表Twork_sys_vw_checkm取出所有SystemCheckItemNo like 'K-020%'的檢查項,再篩出 K-020-003/004/005 三項。 - 對每一項呼叫對應的稽核 SP(
TWORK_CHECK_<項目編號>),把回傳的明細塞進該項的Detail、把檢查結果字串塞進Output。 - 只要任一項
Output不是OK(Checkms.Any(x => !x.IsOK)),整體判定為不可關帳,回傳失敗。 - 失敗時跳出「資料不正確」訊息(
MessageEnum.DataIsIncorrect)並return,不會去查倉庫清單;但Check Item清單仍會顯示各項結果供你判讀是哪一項沒過。
- 以關帳日期前 7 碼(
- 再查倉庫(
SqlEditTurnViewModel.TransferQuery→Gstkbas_1Bll.SpecialAdeQuery):- 呼叫 SP
DARB_TUR_GSTKBAS(查詢條件固定1=1),結果第 1 個資料集為被鎖定中的倉庫(含修改人員)填入LockedSource;第 2 個資料集為可關帳的倉庫填入Master(Tmp)。 - 若查詢取不到可用資料(例如倉庫全被鎖定、
SpecialAdeQuery回傳 false),仍會把第 1 個資料集的鎖定清單帶出來顯示在Locked Source頁。
- 呼叫 SP
為何 SP 名是 DARB 而不是 TWORK
程式註解明確記載:本視窗改接 VFP 原版 SP DARB_TUR_GSTKBAS(回傳 gstkbas.* 加鎖定表的修改人員),舊名 TWORK_TUR_GSTKBAS 的物件在資料庫已不存在。若查詢報「找不到預存程序」,多半是 DARB_TUR_GSTKBAS 尚未部署或未在 proc_param 登錄(見常見問題)。
All/None 批次勾選¶
- 按
All(SelectAllCommand→SelectAllExecute):把Master每一列的 選擇 設為Y。 - 按
None(UnselectAllCommand→UnselectAllExecute):把每一列的 選擇 設為N。
Master 逐列核取方塊的注意事項
Master 格線的 Select 核取方塊在 XAML 是綁定 SysIsChosen 欄;但本視窗的列物件(Gstkbas_1TmpPoco)只有 選擇 屬性、沒有 SysIsChosen 屬性,而存檔判斷與寫回(HaveData/SetUpdateSource)也只看 選擇。因此最可靠的勾選方式是用畫面下方的 All/None 按鈕(它們直接寫 選擇)。若逐列勾選核取方塊後按 儲存 卻被提示「請選擇一筆資料」,請改用 All 全選或再次確認,這屬於核取方塊綁定與儲存欄位不一致的已知狀況。
按「儲存」的關帳檢核與寫回¶
按 儲存(SqlEditTurn)執行關帳時,存檔前驗證(Gstkbas_1Bll.AllowSave)依序:
- 關帳日期不可空白(
CheckClosingDate)——空白時以 GSPLACE 程式的翻譯文字組出「請輸入關帳日期」提示。 - 至少勾選一筆倉庫(
HaveData)——若沒有任何一列 選擇=Y,提示「請選擇一筆資料」(MessageEnum.PleaseSelectOneRecord)並擋存。 - 驗證通過後整理上傳資料(
SetUpdateSource):只取 選擇=Y的倉庫,對每筆寫入關帳日期(關帳日期 = ClosingDate)、把增刪修標記設為E(修改),再以這批資料對Twork_gen_vw_gstkbas執行上傳關帳。
查詢/存檔期間鎖住關帳日期與離開鈕¶
查詢或關帳轉檔進行中,SqlEditTurnViewModel.SetControl 事件會切換 BtnExitIsEnabled(SqlEditTurnViewModel_SetControl),暫時把關帳日期輸入框設為唯讀、並鎖住離開鈕,避免作業中途被中斷;作業結束後恢復。
與 GSPLACE 主畫面的連動¶
本視窗由 G倉庫表(GSPLACE) 的延伸功能(GsplaceViewModel.ExtendedFunction1)以 WindowHelper().OpenWindow(WindowName.Gstkbas_1) 開啟;關帳視窗關閉後若有存檔,GSPLACE 主畫面會自動 DataNavigateHelper.Renew 重新整理,讓倉庫的開帳月份/關帳日期立即反映剛剛的關帳結果。
沒有列印/報表
本視窗為純關帳作業視窗,未實作列印、報表、匯出或簽核功能;操作集中在查詢與勾選關帳兩件事。
常見問題¶
按「查詢」就跳「資料不正確」,倉庫清單一片空白?
這是成本稽核(K-020-003/004/005)未全部通過所致——表示該關帳月份的成本還不能結算。請看左側 Check Item 清單哪幾項的 Output 不是 OK,點該列看下方 Detail 找出問題資料,到 成本管理 完成成本計算與檢查後再回來查詢。
按「儲存」提示「請選擇一筆資料」?
存檔前會檢查至少要勾選一個倉庫(選擇=Y)。最可靠的做法是按畫面下方的 All 全選(或 None 後再按 All),再按 儲存。逐列勾選 Select 核取方塊若無法生效,請參見欄位連動與附加功能中關於核取方塊綁定的說明。
想關帳的倉庫不在 Master 清單,卻出現在 Locked Source?
該倉庫正被其他使用者編輯鎖定中,目前不能由你關帳。請等對方完成並釋放鎖定後重新 查詢;Locked Source 會顯示是哪位 Editing User(修改人員) 鎖住的,頁籤標題也會顯示鎖定筆數。
查詢報「找不到預存程序」或完全查不到任何倉庫?
本視窗走 SP DARB_TUR_GSTKBAS(VFP 原版)。若該 SP 尚未部署或未在 proc_param 登錄,查詢會失敗。請確認資料庫已建立 DARB_TUR_GSTKBAS 並完成 proc_param 登錄(部署腳本未跑時,總務倉庫關帳查詢/轉檔會失敗)。
關帳日期要填哪一天?是填到月底還是隨便一天?
成本稽核只取關帳日期的前 7 碼(yyyy/MM)當作關帳月份,因此填該月份的任一天皆可;但存檔時會把你填的完整日期寫回各勾選倉庫的關帳日期欄,建議填當次關帳的實際作業日。
為什麼這支視窗不能從主選單直接開?
GSTKBAS_1 設計為 GSPLACE(G倉庫表) 的延伸功能視窗,授權與主檔資料都掛在 GSPLACE 上。請先開 GSPLACE,再從工具列的延伸功能進入關帳視窗。
相關功能¶
需補截圖清單
以下截圖待功能 runtime 驗收後補拍(放 docs/C-GeneralAffair/images/):
gstkbas_1-step1.png— 從 GSPLACE 延伸功能開啟關帳視窗的入口gstkbas_1-step2.png— Closing Book 頁全貌(關帳日期 + Check Item 清單 + Master 倉庫清單)gstkbas_1-step3.png— Master 勾選與 All/None 批次按鈕gstkbas_1-step4.png— Locked Source 頁籤(被鎖定倉庫與鎖定筆數)