程式資訊
- 程式 ID:
GSPLACE - 所屬子系統:C.總務管理
- 狀態:stable
倉庫資料維護(Warehouse / Bin)¶
功能簡介¶
「倉庫資料維護」用來建立與維護倉庫主檔,以及每座倉庫底下的倉儲(Bin,又稱倉位/儲位)明細。它是庫存體系的最底層主檔——後續所有採購暫收(暫收單)、入出庫申請(入出庫申請單)、領退料、生產領料與盤點,都必須指到一個既存的「倉庫+倉儲」位置,因此倉管或總務人員在啟用庫存流程前,要先在這裡把倉庫與倉儲建好。
本表單包含三個區塊:
- 倉庫主檔(上方):一座倉庫一筆,主鍵為隸屬倉庫代號。
- 倉儲(Bin)明細(左下表格):該倉庫底下的儲位清單。
- 現有數量查詢(右下表格):唯讀,按
Quantity Query後列出該倉庫各儲位目前的庫存批號與數量。
倉庫 vs 倉儲
「倉庫」是上層位置(例如「成品倉」),「倉儲(Bin)」是倉庫內再細分的儲位(例如「A 區第 1 排」)。若倉庫不需要再細分,可開啟倉同儲讓系統自動建立一筆與倉庫同代號的倉儲(見欄位連動與附加功能)。
前置需求¶
- 權限:C.總務 →
C-110 倉庫資料維護的新增/修改/刪除/瀏覽權限。 - 基礎資料/參數:本表單是基礎主檔,依賴項目不多,但下列資料會影響欄位的查詢、存檔與後續流程——
| 資料 | 影響什麼 |
|---|---|
| 倉庫分類設定 | 倉庫分類碼所對應的分類意義(用於成本歸屬與報表分群) |
系統參數 _prgpar 3023/3026 |
存檔時自動建立的虛擬倉(進料/出貨)代號來源(見欄位連動與附加功能) |
| 成本/盤點作業設定 | 開帳月份、關帳日期由關帳流程寫入,非手動維護 |
| 既有庫存交易 | Quantity Query 的現有數量來源(無交易則查不到數量) |
操作步驟¶
倉庫主檔屬於標準「主檔+明細」維護表單,沿用系統共用工具列的新增/修改/刪除/存檔/查詢/前後筆移動按鈕。
新增倉庫¶
- 按工具列
新增,系統自動帶入預設值:可用=是、倉庫分類碼=0。 - 在隸屬倉庫輸入倉庫代號(主鍵,最長 10 碼,不可重複)。
- 填寫倉庫說明。
- 設定倉同儲(必填,
是/否),並視需要調整可用、倉庫分類碼、成本順序、顯示順序、送貨地點、備註。 - 在左下倉儲(Bin)明細表格按 Enter 或新增列,逐筆輸入倉儲代號、倉儲說明、備註。
- 按工具列
存檔。存檔時系統會檢核必填欄位,並視倉同儲設定自動補上虛擬倉或同代號倉儲(見欄位連動與附加功能)。
用倉同儲省去建倉儲
若這座倉庫不需要再細分儲位,把倉同儲設為是,系統會自動在明細補一筆與倉庫同代號的倉儲,不必手動敲。詳見欄位連動與附加功能。
修改 / 刪除¶
- 用工具列的查詢或前後筆移動找到要維護的倉庫。
- 按
修改後調整欄位或增刪倉儲明細,再存檔。 - 要刪除整筆倉庫時按
刪除。
刪除倉儲明細的限制
倉儲明細列在倉儲代號為空白時才會被視為「待刪除/空列」,存檔時自動標記刪除(程式 NeedDeleteFunction 與 HandleDataBeforeEndEdit)。已有庫存或已被單據引用的倉庫/倉儲,建議改用可用=否停用,而非直接刪除,以免影響歷史單據。
查詢現有數量¶
- 把游標停在要查的倉庫主檔上(須先有一筆有效倉庫)。
- 按主檔區右側的
Quantity Query按鈕。 - 右下表格列出該倉庫各儲位目前的倉儲代號/品號/途程序號/工程代號/批號別/批號/現有數量/現有金額/設立說明。
現有數量查詢為唯讀
這區只是把該倉庫的即時庫存攤開檢視,無法在此編輯或調整數量;數量調整請走盤點或入出庫流程。Quantity Query 在表單處於唯讀(瀏覽)狀態時才可用;切換到其他倉庫(移動記錄)時,查詢結果會自動清空,需重新按一次 Quantity Query。
倉庫關帳(其他功能)¶
工具列的其他功能1會開啟倉庫關帳(Warehouse Closing Book)視窗,供批次執行月關帳。關帳完成後會回寫倉庫主檔的關帳日期並重新整理本表單資料。詳見欄位連動與附加功能。
欄位說明¶
倉庫主檔¶
| 欄位 | 必填 | 說明/格式/預設 |
|---|---|---|
| 隸屬倉庫 | ✔ | 主鍵,倉庫代號,最長 10 碼,不可重複 |
| 倉庫說明 | — | 倉庫名稱/描述,最長 40 字 |
| 可用 | — | 是/否下拉;新增時預設是(值 1)。停用後仍保留歷史單據關聯 |
| 倉同儲 | ✔ | 是/否下拉;必填。設為是時自動建立同代號倉儲、設為否時存檔自動補虛擬倉(見下節) |
| 倉庫分類碼 | — | 數值(byte),新增時預設 0;用於分類分群 |
| 成本順序 | — | 最長 2 碼(補零顯示);成本計算排序 |
| 顯示順序 | — | 最長 2 碼(補零顯示);清單顯示排序 |
| 送貨地點 | — | 倉庫對應的送貨地址,最長 80 字 |
| 備註 | — | 最長 80 字 |
| 開帳月份 | 系統 | 唯讀,由關帳/開帳流程寫入(格式 YYYY/MM) |
| 關帳日期 | 系統 | 唯讀,由倉庫關帳流程寫入 |
可用欄位的顯示注意
可用在資料庫是 0/1(byte),畫面用是/否下拉呈現。若舊資料的值不是 0 或 1,下拉可能顯示空白——這是已知的型別對應限制,新增資料一律會正確帶入。
倉儲(Bin)明細¶
| 欄位 | 必填 | 說明 |
|---|---|---|
| 倉儲代號 | ✔ | 儲位代號,最長 10 碼;空白列會被當成空列略過不存(存檔時標記刪除) |
| 倉儲說明 | — | 儲位名稱,最長 40 字 |
| 備註 | — | 最長 40 字;系統自動建立的虛擬倉此欄會填 Virtual |
隸屬倉庫由系統回填
倉儲明細的隸屬倉庫不需手動填——存檔前系統(HandleDataBeforeEndEdit)會把目前主檔的隸屬倉庫代號統一寫到每一筆明細上。
現有數量查詢(唯讀)¶
| 欄位 | 說明 |
|---|---|
| 倉儲代號 | 庫存所在儲位 |
| 品號 | 庫存品號 |
| 途程序號/工程代號 | 製程在製品的途程與工程定位 |
| 批號別/批號 | 庫存批號分類與批號 |
| 現有數量/現有金額 | 該批目前在庫的數量與金額 |
| 設立說明 | 該庫存批的設立/來源說明 |
欄位連動與附加功能¶
這一節整理「輸入某欄位/按某按鈕後系統會做什麼」,全部來自實際程式碼。
新增時的預設值¶
當你按新增,系統(AfterAddNew)會自動:
- 把可用設為
1(即是)。 - 把倉庫分類碼設為
0。
其餘欄位皆為空白,需自行填寫。
倉同儲=是 → 自動建立同代號倉儲¶
當你把主檔的倉同儲改為是(值 Y),系統(ReceiveWeakEvent 監聽倉同儲變更)會即時處理倉儲明細:
- 若明細中還沒有與倉庫同代號的倉儲:
- 明細為空時,新增一筆倉儲代號=隸屬倉庫的倉儲。
- 明細已有第一筆時,把第一筆的倉儲代號改成倉庫代號,並依其狀態標記為新增(A)或修改(E)。
- 若明細中已存在同代號倉儲,則不重複建立。
這讓「不細分儲位」的倉庫不必手動敲一筆倉儲。此連動只在編輯狀態(新增/修改)下作用,純瀏覽時不會觸發。
倉同儲改回否不會自動刪倉儲
把倉同儲設為是會即時補一筆同代號倉儲,但再改回否不會自動把那筆倉儲刪掉;如不需要,請在明細手動移除(清空倉儲代號該列即視為空列略過)。
倉同儲=否 → 存檔時自動補進料/出貨虛擬倉¶
當倉同儲為否(非 Y)並按下存檔時,系統(GsplaceSave.HandleDataBeforeEndEdit)會自動為這座倉庫補上兩筆虛擬倉,供入庫與出貨流程使用:
- 進料虛擬倉:若明細中沒有任何倉儲代號含
_prgpar3023(暫收/閃電倉代號)者,新增一筆,代號=3023值-隸屬倉庫,備註填Virtual。 - 出貨虛擬倉:若明細中沒有任何倉儲代號含
_prgpar3026(出貨倉代號)者,新增一筆,代號=3026值-隸屬倉庫,備註填Virtual。
同時,存檔前系統會把主檔的隸屬倉庫寫進每一筆明細,並把倉儲代號空白的列標記為刪除(D)。
為什麼存完倉儲多了兩筆 Virtual?
這兩筆 Virtual 倉儲是採購暫收與出貨流程必備的落點,由系統依參數自動補齊,不需手動建立,也請勿任意刪除。倉同儲=是的倉庫因為已有同代號倉儲承接,不會再補虛擬倉。
存檔檢核(AllowSave)¶
按存檔時,系統(GsplaceSave.AllowSave)依序檢核,任何一項不過就擋下並提示:
- 隸屬倉庫不可空白。
- 倉同儲不可空白(必須選
是或否)。 - 倉同儲=
否時:扣除已標記刪除的列後,至少要有一筆填了倉儲代號的明細。 - 倉同儲=
是時:明細中必須有一筆倉儲代號等於隸屬倉庫(即同代號倉儲),否則不允許存檔。
Quantity Query(現有數量查詢)¶
按 Quantity Query 按鈕(QuantityQueryCommand → QuantityQueryExecute)時,系統會:
- 取目前主檔的隸屬倉庫代號。
- 呼叫
GsplaceBll.GetQuantity,以查詢別=2執行 SPDARB_TUR_GSPLACE,條件為「隸屬倉庫=該倉庫」。 - 把回傳結果灌進右下的虛擬化表格(
TsVirtualGridViewModel)顯示。
此查詢欄位(品號、批號、現有數量等)皆對應 SP 回傳的中文欄名,唯讀檢視用。移動到其他倉庫(AfterMoverRecord)時,查詢結果會被清空,需重新查詢。
為什麼有時查不到數量
Quantity Query 只反映實際庫存交易累積出的在庫量。剛建好、還沒有任何進出料的倉庫不會有任何資料列,屬正常現象。
其他功能1 → 倉庫關帳¶
工具列的其他功能1(ExtendedFunction1)會:
- 開啟
Gstkbas_1(倉庫關帳)視窗,供批次執行倉庫月關帳。 - 視窗關閉後若有變更,重新整理(
Renew)本表單資料,使主檔的關帳日期等系統欄位反映最新狀態。
開帳導入(規劃中,尚未提供)
VFP 舊版另有一支「開帳導入」功能(執行 DARB_LOG_GINVSTK_RECOUNT 重算庫存,含放行碼控管),用於期初庫存建立。新版 C# 尚未移植這支功能;目前其他功能1對應的是上述的批次「關帳」,而非「開帳導入」。需要期初開帳時請循其他作業處理。
常見問題¶
倉儲(Bin)明細輸了卻沒存進去?
倉儲明細列只有在倉儲代號有填值時才會被儲存;倉儲代號空白的列會被系統視為空列、存檔時自動標記刪除(NeedDeleteFunction / HandleDataBeforeEndEdit)。請確認每一筆要保留的倉儲都至少填了倉儲代號。
把倉同儲改成「是」後,倉儲清單多了一筆我沒建的資料?
這是正常的自動連動。倉同儲=是時系統會即時補一筆與倉庫同代號的倉儲,讓不細分儲位的倉庫直接可用。若不需要這筆,把它的倉儲代號清空即可(清空後該列視為空列不會存檔)。詳見欄位連動與附加功能。
倉同儲設「否」存檔後,倉儲多了兩筆 Virtual 的資料?
這是設計行為。倉同儲=否的倉庫存檔時,系統會依參數 _prgpar 3023/3026 自動補一筆進料虛擬倉與一筆出貨虛擬倉(備註 Virtual),供採購暫收與出貨流程落點。請勿刪除,否則相關入出庫流程會找不到目的倉儲。詳見欄位連動與附加功能。
按存檔被擋下來,提示要輸入欄位?
存檔有四道檢核:(1)隸屬倉庫必填;(2)倉同儲必填(要選是或否);(3)倉同儲=否時至少要有一筆填了倉儲代號的明細;(4)倉同儲=是時明細必須有一筆倉儲代號等於隸屬倉庫。依提示補齊缺的欄位即可。
可用欄位的下拉顯示空白?
可用在資料庫存的是 0/1 數值,畫面以是/否下拉呈現。極少數舊資料若值不是 0 或 1,下拉會顯示空白;重新選一次是或否存檔即可校正。新增的資料一律會正確帶入。
按了 Quantity Query 卻沒有任何資料?
請先確認:(1) 游標停在一筆有效的倉庫主檔上;(2) 該倉庫確實已有庫存交易。新建、尚無任何進出料的倉庫沒有在庫批號,查詢結果為空屬正常。切到別的倉庫後也要重新按一次查詢。
開帳月份/關帳日期可以手動改嗎?
不行。這兩個欄位是唯讀的系統欄位,由關帳作業(其他功能1 的倉庫關帳)寫入,請勿在本表單手動填寫。
要刪除一座已經有庫存的倉庫,系統擋住了怎麼辦?
已被庫存或單據引用的倉庫不建議直接刪除。請改把可用設為否停用,既能讓它不再被新單據選用,又保留歷史單據的關聯完整。
相關功能¶
需補截圖清單
以下截圖待功能 runtime 驗收後補拍(放 docs/C-GeneralAffair/images/):
gsplace-step1.png— 倉庫主檔+倉儲明細整體畫面(建議含一筆已建好的倉庫與多筆倉儲)gsplace-step2.png— 倉同儲=是 觸發自動建立同代號倉儲的明細狀態gsplace-step3.png— 倉同儲=否 存檔後自動補進料/出貨兩筆 Virtual 虛擬倉gsplace-step4.png— 按下 Quantity Query 後右下現有數量查詢表格