跳轉到

程式資訊

  • 程式 IDHISTORY
  • 所屬子系統:Other
  • 狀態:stable

異動歷程(修改/刪除紀錄還原)

功能簡介

「異動歷程」是一個通用的單據異動稽核與還原彈窗。任何單據維護畫面(訂單、進貨、傳票、發票…)只要支援此功能,使用者都能從工具列的 異動歷程 按鈕打開它,用來回答兩個問題:

  1. 這張單據過去被誰、在什麼時間、改成什麼樣子?(每次修改/刪除前的完整快照都會被保留)
  2. 要不要把單據還原成歷史上的某個版本?(或把先前被刪掉的整張單據救回來)

它不是獨立的選單程式,而是綁在各單據維護程式上的共用工具(ProgramClass.HISTORY)。打開後讀取的是該單據在資料庫異動記錄檔中的歷史快照,因此顯示的欄位會隨「你從哪一張單據打開它」而不同——欄位由系統依該單據的資料表結構自動產生。

資料來源

歷程內容來自系統在每次修改/刪除單據前自動寫入的 XML 快照(透過 DARB_HISTORY1 / DARB_HISTORY2 兩支 SP 讀回)。沒有被異動過的單據查不到任何歷程,屬正常現象。

前置需求

  • 權限:使用者在該單據程式上必須具備 異動歷程(瀏覽歷程)權限;要執行還原,還需依模式具備對應權限——
    • 還原本筆的歷史版本 → 需該單據的修改權限。
    • 還原其他已刪除的單據 → 需該單據的新增權限。
  • 觸發位置:本功能由各單據維護畫面工具列的 異動歷程 按鈕開啟(對應 HistoryCommand)。若該單據程式未實作歷程功能(未實作 IHistory),按下時會提示「沒有歷史功能」;若有實作但無歷程權限(可否查歷史)則提示無權限。
資料/前置條件 影響
該單據曾被修改或刪除 才會有歷史快照可查;全新、從未異動的單據查無資料
目前畫面已定位到一張主檔(查本筆時) 「本筆」模式以目前主檔的 pkid 為查詢鍵;未選任何單會提示請先選一筆
使用者的單據權限(修改/新增) 決定能否按 還原,詳見前置需求上方說明
報價檢視權限(AllowViewPrice) 無此權限時,歷程中的單價/金額欄位會被遮罩

操作步驟

步驟① 打開異動歷程

  1. 在單據維護畫面定位到要查的單據(查「本筆」時必須)。
  2. 按工具列的 異動歷程 按鈕,彈出本視窗。

步驟② 選擇查詢模式

視窗左上角有兩個單選鈕,預設為本筆刪除或修改資料

  1. 本筆刪除或修改資料:查目前這張單據自己的修改/刪除歷史快照(不使用日期區間,直接以目前主檔的 pkid 撈)。
  2. 其他刪除資料:查一段期間內其他被整張刪除的單據,用來把刪掉的單救回來。此模式才會用到右側的起訖日期

日期區間只對「其他刪除資料」有效

起訖日期預設為「今天往前 14 天 ~ 今天」。選「本筆」模式時這兩個日期不參與查詢;選「其他刪除資料」時才會以輸入日期落在此區間內為條件撈出被刪除的單據。

步驟③ 查詢

  1. 設定好模式(與日期)後,按 查詢
  2. 結果顯示在下方格線:
    • 本筆模式:依該單據層級(主檔/明細)顯示對應的格線,每一列是一次異動前的快照。
    • 其他刪除資料模式:上方主檔格線列出被刪除的各張單據,點選某一列,下方明細格線會連動顯示該單的明細快照。
  3. 查到資料後,還原 按鈕才會啟用。若本筆模式查無任何修改/刪除紀錄,會提示「此筆資料沒有修改或刪除紀錄」。

格線欄位是自動產生的

除了固定的 修改人員修改日期 兩欄外,其餘欄位由系統依該單據資料表結構自動展開,欄名取自系統的顯示名稱對照(中文)。預設依修改日期由新到舊、再依 pkid 由小到大排序。

步驟④ 還原(選用)

  1. 在要還原的快照列勾選 選擇 欄(核取方塊)。
  2. 還原,系統會把勾選的歷史版本套回單據:
    • 該 pkid 在目前單據中仍存在 → 以該快照值覆蓋,標記為修改(E)
    • 該 pkid 已不存在(被刪掉的單) → 重新加回為一筆新增(A)
  3. 視窗關閉後,回到單據畫面確認還原結果並存檔才會真正寫回資料庫(本視窗只把資料帶回編輯區,不直接落地)。

還原前的勾選規則

  • 本筆模式:每個格線最多只能勾選同一個 pkid 的一個版本;勾到同一 pkid 的兩個不同快照會提示「選擇超過一筆資料,無法還原」並擋下。
  • 其他刪除資料模式:主檔只能勾選一張要還原的單;勾超過一張會提示「不能選擇超過一筆資料」。
  • 兩種模式都至少要勾一筆,否則提示請先選擇一筆資料。

欄位說明

查詢條件

欄位 必填 說明/格式/預設
本筆刪除或修改資料 ✔(二選一) 查目前單據自身的修改/刪除歷程;預設選此項
其他刪除資料 ✔(二選一) 查期間內其他被整張刪除的單據(供救回)
起始日期 ~ 截止日期 —(僅「其他刪除資料」用) 比對快照的輸入日期;預設「今天 −14 天 ~ 今天」;截止日內含當天(SP 內部以 < 截止日+1 處理)

結果格線欄位

欄位 說明
選擇 核取方塊,勾選要還原的列(還原時用)
修改人員 該次異動的輸入人員(快照的 輸入人員
修改日期 該次異動的時間(快照的 輸入日期),預設此欄由新到舊排序
(單據各欄位) 依來源單據資料表自動展開的所有欄位快照(中文欄名),即「當時被改前的值」
pkid 該單據的內部主鍵,用來判斷還原時要覆蓋既有列或新增回去

格線是多層的

視窗最多有四個格線(主檔 + 最多三層明細),實際顯示幾層取決於來源單據是純主檔(A 型)、主+明細(B 型)、或更多層(C/D 型)。在「其他刪除資料」模式下,點選主檔列會連動帶出其下明細快照。

欄位連動與附加功能

這一節把「按哪個按鈕/勾哪一欄會發生什麼」全部列出,來源為 HistoryViewModelHistory.xaml.cs(格線欄位自動生成與排序)、HistoryServiceHistoryRecoverHistoryBll 的實際程式碼。

開窗時的預設與版型

  • 開窗即帶預設日期:起始日 = 今天 −14 天、截止日 = 今天(HistoryViewModel 建構式)。
  • 預設模式 = 本筆HistoryCondition 預設為 ThisRecord
  • 依來源單據決定顯示幾層格線:建構時讀來源單據的 FormType——
    • A 型(純主檔):只顯示一個格線。
    • B 型(主+明細):顯示主檔 + 第一層明細。
    • C 型:再多顯示一層明細。
    • D 型:顯示主檔 + 三層明細。
  • 格線欄位自動生成History.xaml.csDataGrid_AutoGeneratingColumnInitGrid):XAML 只預先宣告「修改人員/修改日期」兩欄;格線首次產生欄位時,依快照物件 Obj 的屬性反射逐欄建立,欄名取自 DisplayNameService(中文,跳過 pkid選擇)。接著再以程式碼補上 選擇(核取方塊欄)與 pkid 兩個特殊欄,並把欄位順序固定為「選擇 → 修改人員 → 修改日期 →(各資料欄)→ pkid」,最後依「修改日期↓、pkid↑」排序。

查詢 按鈕(QueryCommand → Query)

  • 系統先記住目前選的模式(QueryHistoryCondition)。
  • 本筆模式
    • 取目前單據主檔第一筆的 pkid;若 pkid > 0,呼叫 DARB_HISTORY1 撈該單所有修改/刪除快照。
    • 撈不到任何快照 → 提示「此筆資料沒有修改或刪除紀錄」。
    • 目前沒有定位到任何主檔(pkid = 0)→ 提示「請先選擇一筆資料」。
  • 其他刪除資料模式:以起訖日期呼叫 DARB_HISTORY2,撈期間內被刪除的其他單據(截止日內部自動 +1 天,含當天)。
  • 查到資料後:把回傳的多個 DataTable 還原成各層快照物件(由 XML 還原成 Model),填入主檔/明細格線,並啟用 還原 按鈕
  • 價格遮罩:若使用者在該單據沒有 AllowViewPrice 報價檢視權限,還原快照時會對單價類欄位套用遮罩(PriceHelper.IsPriceControl),歷程中看不到實際金額。

主檔列選取連動(其他刪除資料模式)

  • 在「其他刪除資料」模式下,點選主檔格線的某一列,下方各層明細格線會依該列的 pkid 重新對應,帶出該張單的明細快照;該 pkid 沒有對應明細時,明細格線清空。
  • 主檔列勾選「選擇」時,系統會記錄「已有勾選」狀態(用來控制其他列的可點性)。

還原 按鈕(RecoveryCommand → Recover)

按下後依序檢核,全部通過才把資料帶回單據:

  1. 權限檢核:本筆模式需修改權限、其他刪除資料模式需新增權限,否則提示「沒有還原權限」。
  2. 勾選檢核
    • 本筆模式:至少勾一筆;且同一 pkid 不可勾兩個版本(會以「Pkid:N, 選擇超過一筆資料,無法還原」擋下)。
    • 其他刪除資料模式:主檔需且僅需勾選一張單(0 筆提示「請先選擇一筆資料」、>1 筆提示「不能選擇超過一筆資料」)。
  3. 檢核通過後,把選取的歷史快照交回原單據的增刪修流程(HistoryRecoverDel),並關閉視窗(DialogResult = true)。

還原如何套回單據(HistoryRecover / HistoryService)

  • 對每一個勾選的快照,依其 pkid 在目前單據資料中比對:
    • 找得到同 pkid → 用快照值逐欄覆蓋現有列,標記 增刪修 = E(修改)。
    • 找不到(已被刪除) → 在主檔先 ClearAddNew,把快照值填入新列,標記 增刪修 = A(新增)。
  • 回到單據後:
    • 本筆模式 + 有修改權限 → 走修改流程(Edit),先 Renew 再套用還原內容;無修改權限則提示不可修改。
    • 其他刪除資料模式 + 有新增權限 → 走新增流程(HistoryRecoverAdd)把整張刪除的單救回;無新增權限則提示。
  • 最終仍需在單據畫面存檔才真正寫入資料庫。

返回 按鈕(ExitCommand)

關閉視窗、不做任何還原。

沒有列印/匯出功能

異動歷程目前沒有列印或匯出 Excel 的內建按鈕,僅提供查詢與還原。如需保存歷程內容,可使用格線本身的複製功能(若該格線樣式支援)。

常見問題

異動歷程 提示「沒有歷史功能」?

代表你目前所在的單據程式沒有實作歷程功能(未實作 IHistory)。並非所有畫面都支援異動歷程,查詢類/報表類畫面通常沒有。

選「本筆刪除或修改資料」卻查不到任何資料?

本筆模式只撈目前這張單據過去的修改/刪除快照。若這張單從建立後沒被改過、也沒被刪過,自然沒有歷程,會提示「此筆資料沒有修改或刪除紀錄」。另外要先在單據畫面定位到一張主檔,否則會提示「請先選擇一筆資料」。

想找被刪掉的整張單,要用哪個模式?日期怎麼設?

其他刪除資料 模式,並把起訖日期涵蓋當初刪除的日期(預設只查最近 14 天,刪得較久的要把起始日往前拉)。比對的是快照的輸入(異動)日期,截止日內含當天。

歷程裡的單價/金額是空白或被遮住?

你在該單據沒有報價檢視權限(AllowViewPrice),系統會自動遮罩單價類欄位。請洽系統管理員調整權限設定

按了 還原 為什麼資料庫沒變?

還原 只把選取的歷史版本帶回單據編輯區,視窗關閉後要在單據畫面確認並存檔才會真正寫回。若關窗後沒存檔,等於沒有還原。

還原 按鈕一直是灰的?

要先按 查詢 並查到資料,還原 才會啟用。查無資料時無法還原。

相關功能


需補截圖清單

以下截圖待功能 runtime 驗收後補拍(放 docs/Other/images/):

  1. history-step1.png — 整體版型(左上模式單選鈕+起訖日期、查詢還原返回 按鈕、下方多層格線)
  2. history-step2.png — 「本筆刪除或修改資料」查詢結果(同一張單的多個歷史快照列)
  3. history-step3.png — 「其他刪除資料」查詢結果(主檔被刪單列出、點選後連動明細)
  4. history-step4.png — 勾選 選擇 欄並按 還原 的操作示意