程式資訊
- 程式 ID:
ZPERMIT - 所屬子系統:A.系統資料
- 狀態:stable
放行碼資料檢視¶
功能簡介¶
「放行碼資料檢視」用來檢視系統在多人同時作業時自動產生的放行碼(PassNumber)紀錄。放行碼是 TsERP 的並行鎖定(record lock)機制:當某位使用者開啟一張單據準備修改或轉單時,系統會在 Zpermit 資料表寫入一筆放行碼,標明「哪一張資料表(資料表名稱)的哪一筆資料(pkid)目前正被誰(輸入人員)佔用」。其他使用者要動同一筆資料時,程式會先查放行碼,若發現已被佔用就擋下並提示「○○○ 正在轉單,請稍後再試」。
本表單供系統管理員檢視這些鎖定紀錄,用來排查「為什麼某張單據一直打不開」「是誰卡住了」。畫面上的欄位全部唯讀,本程式不提供新增與修改(見前置需求);要實際釋放(刪除)卡住的放行碼,請改用 刪除放行碼(DeletePassNumber)功能。
放行碼 vs 權限設定
放行碼(ZPERMIT)是並行鎖定紀錄,與「使用者程式權限」無關。要設定使用者/群組對各程式的存取權限,請改用 使用者權限設定,本頁不處理權限矩陣。
前置需求¶
- 權限:A.系統管理 →
A-140 放行碼資料檢視的瀏覽權限。本程式在系統內被刻意設定為不可新增、不可修改(ProgramPermissionSetting將 ZPERMIT 設為ProgramAllowAdd=false、ProgramAllowEdit=false),因此工具列的新增、儲存動作對本表單無效;僅保留查詢與刪除。 - 基礎資料:放行碼是系統在使用者操作其他單據時自動寫入的,不需要事先維護任何主檔。
| 資料 | 影響的結果 |
|---|---|
| 其他單據的開啟/轉單動作 | 系統自動產生/清除對應的放行碼,本表單只是讀取結果 |
| 使用者帳號(輸入人員) | 決定每一筆放行碼掛在誰名下;刪除放行碼只列出登入者自己的放行碼 |
操作步驟¶
放行碼資料檢視是一張唯讀檢視表,操作以查詢為主:
- 從主選單開啟
A-140 放行碼資料檢視。 - 按工具列的
查詢,系統載入目前Zpermit資料表中的放行碼紀錄。 - 在筆數間切換(上一筆/下一筆)逐筆檢視,畫面顯示該筆放行碼的:
- 放行碼:系統流水編號。
- 資料表名稱:被鎖定資料所屬的資料表(View 名稱)。
- pkid:被鎖定資料的主鍵編號。
- 輸入人員:目前佔用該筆資料的使用者。
- 確認是誰、卡在哪一張表後,若需要強制釋放鎖定,請改開 刪除放行碼 進行刪除。
注意
本表單所有欄位皆為 唯讀(IsReadOnly),無法在此直接編輯放行碼內容;它的定位是「看」而不是「改」。實際的鎖定與解除動作分別由各單據程式(自動加鎖)與刪除放行碼功能(手動解鎖)負責。
欄位說明¶
下列欄位皆來自 twork_sys_vw_zpermit 這個 View,全部唯讀顯示:
| 欄位 | 必填 | 說明/格式/預設 |
|---|---|---|
| 放行碼 | — | 整數流水號(對應欄位 PassNumber)。系統產生鎖定時自動編號,唯讀。 |
| 資料表名稱 | — | 被鎖定資料所屬的資料表/View 名稱(對應 TableName,長度 50)。例如轉開立 AR 發票時會是 ticka_m 對應的 View 名稱。唯讀。 |
| pkid | — | 被鎖定那筆資料的主鍵編號(來自共用基底欄位)。唯讀。 |
| 輸入人員 | — | 產生此放行碼、目前佔用該筆資料的使用者帳號(OneWay 綁定,唯讀)。 |
Source 還有兩個未顯示欄位
後端 Source(Twork_sys_vw_zpermitSource)另含 放行pkid(Passpkid) 與 dataevent(資料事件) 兩個欄位,這兩個欄位在本檢視畫面上沒有對應控件、不會顯示。完整含這兩欄的列表畫面是在 刪除放行碼 功能中呈現。
欄位連動與附加功能¶
放行碼資料檢視本身沒有輸入欄位,因此「連動」主要發生在它如何被其他程式產生與消費,以及與刪除放行碼的搭配。以下都是程式碼中真實存在的行為:
-
放行碼由其他單據自動產生/消費(並行鎖定):當使用者在其他程式對某筆資料加鎖時,系統以「資料表名稱+放行pkid+資料事件(dataevent)」為內容寫入一筆放行碼,並自動帶入:
- 輸入日期=當天;
- 輸入地點=目前電腦的機器名稱(
Environment.MachineName); - 輸入人員=目前登入使用者。
本檢視表讀到的就是這些自動產生的內容。
-
其他程式會「查放行碼」來擋並行:例如應收發票轉單(
Ticka_arBll.CheckNoUserInEdit)在轉單前,會以資料表名稱 = ticka_m 對應 View查Zpermit。當你在本檢視看到某筆放行碼,代表那張資料目前對其他使用者是鎖定的——對方嘗試動同一筆時,系統會顯示「○○○ 正在轉單,請稍後再試」(○○○ 即該筆的 輸入人員)。換言之,本表單看到的每一列,都對應到別人此刻打不開的一筆單據。 -
不可新增/不可修改:因
ProgramPermissionSetting對 ZPERMIT 設定了ProgramAllowAdd=false、ProgramAllowEdit=false,工具列即使按下新增或儲存也不會對放行碼資料生效。要清除放行碼只能走刪除路徑。 -
可刪除(釋放鎖定):刪除檢核
ZpermitDelete.CheckDataCanDelete一律回傳允許(true),不附加任何擋刪條件。因此放行碼可被刪除以強制釋放鎖定。實務上請優先使用 刪除放行碼 功能(DeletePassNumber)來刪,它會:- 以目前登入者(
輸入人員 = 登入帳號)為條件,只列出你自己名下的放行碼; - 提供
全選切換每一列的 選擇 旗標(Y/空白); - 按
刪除時,把所有 選擇=Y的列依 pkid 對Zpermit資料表執行刪除,釋放對應鎖定後關閉視窗。
- 以目前登入者(
小技巧
若某使用者異常離線(例如直接關機)導致放行碼沒被正常清掉,會出現「明明沒人在用、卻一直顯示有人在轉單」的情況。此時可在本表單先確認該筆放行碼的 資料表名稱 與 輸入人員,再由該使用者本人登入後用 刪除放行碼 清除,即可解鎖。
尚未提供的延伸功能
本檢視表目前不含查詢條件面板、列印、匯出或轉傳票等延伸動作;程式碼中沒有對應實作。若未來需要,屬規劃中項目。
常見問題¶
為什麼按了新增/儲存都沒反應?
這是設計如此。放行碼是系統自動維護的鎖定紀錄,本程式被設定為不可新增、不可修改(ProgramAllowAdd=false、ProgramAllowEdit=false),所有欄位也都是唯讀。你只能查詢檢視,要清除放行碼請改用 刪除放行碼。
某張單據一直顯示「○○○ 正在轉單,請稍後再試」打不開,怎麼查?
那代表該資料目前被放行碼鎖定。請開本表單查詢,找出 資料表名稱 對應到該單據、且 輸入人員 就是訊息中那位使用者的放行碼。確認後,由該使用者登入用 刪除放行碼 刪除其名下的放行碼,即可解鎖。
在本檢視看到放行碼,卻不能在這裡刪除?
本表單定位為「檢視」。雖然放行碼在資料層允許刪除(CheckDataCanDelete 永遠回傳允許),但實際清除動作集中在 刪除放行碼 功能執行,那裡會以登入者為條件列出你自己的放行碼並批次刪除,避免誤刪他人鎖定。
刪除放行碼只列出我自己的,刪不到別人的鎖定?
是的。刪除放行碼功能以 輸入人員 = 目前登入帳號 篩選,只顯示並允許清除你自己名下的放行碼。若卡住的是別人的鎖定,需請該使用者本人登入後自行清除(或由系統管理員以該帳號處理)。
放行碼的「資料表名稱」「pkid」是什麼意思?
資料表名稱 是被鎖定資料所屬的資料表/View 名稱,pkid 是該筆資料的主鍵編號。兩者合起來精準指出「目前被鎖住的是哪一張表的哪一筆」,是排查鎖定來源的關鍵。
相關功能¶
- 刪除放行碼(DeletePassNumber) — 以登入者為條件批次釋放放行碼鎖定。
- 稽核紀錄 — 單據異動的稽核軌跡,與放行碼的並行鎖定互補。
- 應收帳款(AR/AP) — 轉單時會檢查放行碼以擋並行。
- 發票管理 — 開立/轉單時的放行碼鎖定來源之一。
需補截圖清單
以下截圖待功能 runtime 驗收後補拍(放 docs/A-System/images/):
zpermit-step1.png— 放行碼資料檢視主畫面(含放行碼/資料表名稱/pkid/輸入人員四個唯讀欄位)zpermit-step2.png— 查詢後顯示一筆鎖定紀錄的範例