程式資訊
- 程式 ID:
HISTORY - 所屬子系統:Other
- 狀態:stable
異動歷程(修改/刪除紀錄還原)¶
功能簡介¶
「異動歷程」是一個通用的單據異動稽核與還原彈窗。任何單據維護畫面(訂單、進貨、傳票、發票…)只要支援此功能,使用者都能從工具列的 異動歷程 按鈕打開它,用來回答兩個問題:
- 這張單據過去被誰、在什麼時間、改成什麼樣子?(每次修改/刪除前的完整快照都會被保留)
- 要不要把單據還原成歷史上的某個版本?(或把先前被刪掉的整張單據救回來)
它不是獨立的選單程式,而是綁在各單據維護程式上的共用工具(ProgramClass.HISTORY)。打開後讀取的是該單據在資料庫異動記錄檔中的歷史快照,因此顯示的欄位會隨「你從哪一張單據打開它」而不同——欄位由系統依該單據的資料表結構自動產生。
資料來源
歷程內容來自系統在每次修改/刪除單據前自動寫入的 XML 快照(透過 DARB_HISTORY1 / DARB_HISTORY2 兩支 SP 讀回)。沒有被異動過的單據查不到任何歷程,屬正常現象。
前置需求¶
- 權限:使用者在該單據程式上必須具備
異動歷程(瀏覽歷程)權限;要執行還原,還需依模式具備對應權限——- 還原本筆的歷史版本 → 需該單據的修改權限。
- 還原其他已刪除的單據 → 需該單據的新增權限。
- 觸發位置:本功能由各單據維護畫面工具列的
異動歷程按鈕開啟(對應HistoryCommand)。若該單據程式未實作歷程功能(未實作IHistory),按下時會提示「沒有歷史功能」;若有實作但無歷程權限(可否查歷史)則提示無權限。
| 資料/前置條件 | 影響 |
|---|---|
| 該單據曾被修改或刪除 | 才會有歷史快照可查;全新、從未異動的單據查無資料 |
| 目前畫面已定位到一張主檔(查本筆時) | 「本筆」模式以目前主檔的 pkid 為查詢鍵;未選任何單會提示請先選一筆 |
| 使用者的單據權限(修改/新增) | 決定能否按 還原,詳見前置需求上方說明 |
| 報價檢視權限(AllowViewPrice) | 無此權限時,歷程中的單價/金額欄位會被遮罩 |
操作步驟¶
步驟① 打開異動歷程¶
- 在單據維護畫面定位到要查的單據(查「本筆」時必須)。
- 按工具列的
異動歷程按鈕,彈出本視窗。
步驟② 選擇查詢模式¶
視窗左上角有兩個單選鈕,預設為本筆刪除或修改資料:
- 選
本筆刪除或修改資料:查目前這張單據自己的修改/刪除歷史快照(不使用日期區間,直接以目前主檔的 pkid 撈)。 - 選
其他刪除資料:查一段期間內其他被整張刪除的單據,用來把刪掉的單救回來。此模式才會用到右側的起訖日期。
日期區間只對「其他刪除資料」有效
起訖日期預設為「今天往前 14 天 ~ 今天」。選「本筆」模式時這兩個日期不參與查詢;選「其他刪除資料」時才會以輸入日期落在此區間內為條件撈出被刪除的單據。
步驟③ 查詢¶
- 設定好模式(與日期)後,按
查詢。 - 結果顯示在下方格線:
- 本筆模式:依該單據層級(主檔/明細)顯示對應的格線,每一列是一次異動前的快照。
- 其他刪除資料模式:上方主檔格線列出被刪除的各張單據,點選某一列,下方明細格線會連動顯示該單的明細快照。
- 查到資料後,
還原按鈕才會啟用。若本筆模式查無任何修改/刪除紀錄,會提示「此筆資料沒有修改或刪除紀錄」。
格線欄位是自動產生的
除了固定的 修改人員、修改日期 兩欄外,其餘欄位由系統依該單據資料表結構自動展開,欄名取自系統的顯示名稱對照(中文)。預設依修改日期由新到舊、再依 pkid 由小到大排序。
步驟④ 還原(選用)¶
- 在要還原的快照列勾選 選擇 欄(核取方塊)。
- 按
還原,系統會把勾選的歷史版本套回單據:- 該 pkid 在目前單據中仍存在 → 以該快照值覆蓋,標記為修改(E)。
- 該 pkid 已不存在(被刪掉的單) → 重新加回為一筆新增(A)。
- 視窗關閉後,回到單據畫面確認還原結果並存檔才會真正寫回資料庫(本視窗只把資料帶回編輯區,不直接落地)。
還原前的勾選規則
- 本筆模式:每個格線最多只能勾選同一個 pkid 的一個版本;勾到同一 pkid 的兩個不同快照會提示「選擇超過一筆資料,無法還原」並擋下。
- 其他刪除資料模式:主檔只能勾選一張要還原的單;勾超過一張會提示「不能選擇超過一筆資料」。
- 兩種模式都至少要勾一筆,否則提示請先選擇一筆資料。
欄位說明¶
查詢條件¶
| 欄位 | 必填 | 說明/格式/預設 |
|---|---|---|
| 本筆刪除或修改資料 | ✔(二選一) | 查目前單據自身的修改/刪除歷程;預設選此項 |
| 其他刪除資料 | ✔(二選一) | 查期間內其他被整張刪除的單據(供救回) |
| 起始日期 ~ 截止日期 | —(僅「其他刪除資料」用) | 比對快照的輸入日期;預設「今天 −14 天 ~ 今天」;截止日內含當天(SP 內部以 < 截止日+1 處理) |
結果格線欄位¶
| 欄位 | 說明 |
|---|---|
| 選擇 | 核取方塊,勾選要還原的列(還原時用) |
| 修改人員 | 該次異動的輸入人員(快照的 輸入人員) |
| 修改日期 | 該次異動的時間(快照的 輸入日期),預設此欄由新到舊排序 |
| (單據各欄位) | 依來源單據資料表自動展開的所有欄位快照(中文欄名),即「當時被改前的值」 |
| pkid | 該單據的內部主鍵,用來判斷還原時要覆蓋既有列或新增回去 |
格線是多層的
視窗最多有四個格線(主檔 + 最多三層明細),實際顯示幾層取決於來源單據是純主檔(A 型)、主+明細(B 型)、或更多層(C/D 型)。在「其他刪除資料」模式下,點選主檔列會連動帶出其下明細快照。
欄位連動與附加功能¶
這一節把「按哪個按鈕/勾哪一欄會發生什麼」全部列出,來源為 HistoryViewModel、History.xaml.cs(格線欄位自動生成與排序)、HistoryService、HistoryRecover 與 HistoryBll 的實際程式碼。
開窗時的預設與版型¶
- 開窗即帶預設日期:起始日 = 今天 −14 天、截止日 = 今天(
HistoryViewModel建構式)。 - 預設模式 = 本筆:
HistoryCondition預設為ThisRecord。 - 依來源單據決定顯示幾層格線:建構時讀來源單據的
FormType——- A 型(純主檔):只顯示一個格線。
- B 型(主+明細):顯示主檔 + 第一層明細。
- C 型:再多顯示一層明細。
- D 型:顯示主檔 + 三層明細。
- 格線欄位自動生成(
History.xaml.cs的DataGrid_AutoGeneratingColumn→InitGrid):XAML 只預先宣告「修改人員/修改日期」兩欄;格線首次產生欄位時,依快照物件Obj的屬性反射逐欄建立,欄名取自DisplayNameService(中文,跳過pkid、選擇)。接著再以程式碼補上 選擇(核取方塊欄)與 pkid 兩個特殊欄,並把欄位順序固定為「選擇 → 修改人員 → 修改日期 →(各資料欄)→ pkid」,最後依「修改日期↓、pkid↑」排序。
查詢 按鈕(QueryCommand → Query)¶
- 系統先記住目前選的模式(
QueryHistoryCondition)。 - 本筆模式:
- 取目前單據主檔第一筆的 pkid;若 pkid > 0,呼叫
DARB_HISTORY1撈該單所有修改/刪除快照。 - 撈不到任何快照 → 提示「此筆資料沒有修改或刪除紀錄」。
- 目前沒有定位到任何主檔(pkid = 0)→ 提示「請先選擇一筆資料」。
- 取目前單據主檔第一筆的 pkid;若 pkid > 0,呼叫
- 其他刪除資料模式:以起訖日期呼叫
DARB_HISTORY2,撈期間內被刪除的其他單據(截止日內部自動 +1 天,含當天)。 - 查到資料後:把回傳的多個 DataTable 還原成各層快照物件(由 XML 還原成 Model),填入主檔/明細格線,並啟用
還原按鈕。 - 價格遮罩:若使用者在該單據沒有
AllowViewPrice報價檢視權限,還原快照時會對單價類欄位套用遮罩(PriceHelper.IsPriceControl),歷程中看不到實際金額。
主檔列選取連動(其他刪除資料模式)¶
- 在「其他刪除資料」模式下,點選主檔格線的某一列,下方各層明細格線會依該列的 pkid 重新對應,帶出該張單的明細快照;該 pkid 沒有對應明細時,明細格線清空。
- 主檔列勾選「選擇」時,系統會記錄「已有勾選」狀態(用來控制其他列的可點性)。
還原 按鈕(RecoveryCommand → Recover)¶
按下後依序檢核,全部通過才把資料帶回單據:
- 權限檢核:本筆模式需修改權限、其他刪除資料模式需新增權限,否則提示「沒有還原權限」。
- 勾選檢核:
- 本筆模式:至少勾一筆;且同一 pkid 不可勾兩個版本(會以「Pkid:N, 選擇超過一筆資料,無法還原」擋下)。
- 其他刪除資料模式:主檔需且僅需勾選一張單(0 筆提示「請先選擇一筆資料」、>1 筆提示「不能選擇超過一筆資料」)。
- 檢核通過後,把選取的歷史快照交回原單據的增刪修流程(
HistoryRecoverDel),並關閉視窗(DialogResult = true)。
還原如何套回單據(HistoryRecover / HistoryService)¶
- 對每一個勾選的快照,依其 pkid 在目前單據資料中比對:
- 找得到同 pkid → 用快照值逐欄覆蓋現有列,標記
增刪修 = E(修改)。 - 找不到(已被刪除) → 在主檔先
Clear再AddNew,把快照值填入新列,標記增刪修 = A(新增)。
- 找得到同 pkid → 用快照值逐欄覆蓋現有列,標記
- 回到單據後:
- 本筆模式 + 有修改權限 → 走修改流程(
Edit),先Renew再套用還原內容;無修改權限則提示不可修改。 - 其他刪除資料模式 + 有新增權限 → 走新增流程(
HistoryRecoverAdd)把整張刪除的單救回;無新增權限則提示。
- 本筆模式 + 有修改權限 → 走修改流程(
- 最終仍需在單據畫面存檔才真正寫入資料庫。
返回 按鈕(ExitCommand)¶
關閉視窗、不做任何還原。
沒有列印/匯出功能
異動歷程目前沒有列印或匯出 Excel 的內建按鈕,僅提供查詢與還原。如需保存歷程內容,可使用格線本身的複製功能(若該格線樣式支援)。
常見問題¶
按 異動歷程 提示「沒有歷史功能」?
代表你目前所在的單據程式沒有實作歷程功能(未實作 IHistory)。並非所有畫面都支援異動歷程,查詢類/報表類畫面通常沒有。
選「本筆刪除或修改資料」卻查不到任何資料?
本筆模式只撈目前這張單據過去的修改/刪除快照。若這張單從建立後沒被改過、也沒被刪過,自然沒有歷程,會提示「此筆資料沒有修改或刪除紀錄」。另外要先在單據畫面定位到一張主檔,否則會提示「請先選擇一筆資料」。
想找被刪掉的整張單,要用哪個模式?日期怎麼設?
用 其他刪除資料 模式,並把起訖日期涵蓋當初刪除的日期(預設只查最近 14 天,刪得較久的要把起始日往前拉)。比對的是快照的輸入(異動)日期,截止日內含當天。
歷程裡的單價/金額是空白或被遮住?
你在該單據沒有報價檢視權限(AllowViewPrice),系統會自動遮罩單價類欄位。請洽系統管理員調整權限設定。
按了 還原 為什麼資料庫沒變?
還原 只把選取的歷史版本帶回單據編輯區,視窗關閉後要在單據畫面確認並存檔才會真正寫回。若關窗後沒存檔,等於沒有還原。
還原 按鈕一直是灰的?
要先按 查詢 並查到資料,還原 才會啟用。查無資料時無法還原。
相關功能¶
需補截圖清單
以下截圖待功能 runtime 驗收後補拍(放 docs/Other/images/):
history-step1.png— 整體版型(左上模式單選鈕+起訖日期、查詢/還原/返回按鈕、下方多層格線)history-step2.png— 「本筆刪除或修改資料」查詢結果(同一張單的多個歷史快照列)history-step3.png— 「其他刪除資料」查詢結果(主檔被刪單列出、點選後連動明細)history-step4.png— 勾選 選擇 欄並按還原的操作示意