務(wù)重新活過來)
采購人員在系統(tǒng)里取消了一張仍需履行的采購訂單,幾分鐘后,倉庫發(fā)現(xiàn)收貨計劃已經(jīng)看不到了。業(yè)務(wù)同事說,趕緊把訂單恢復(fù)。開發(fā)人員聽到的卻是另一組問題,取消動作有沒有提交,訂單是被標記為取消,還是相關(guān)業(yè)務(wù)對象真的被刪除,后續(xù)有沒有產(chǎn)生收貨、發(fā)票或其他憑證,系統(tǒng)還能從哪里找到取消前的狀態(tài)。這很像趙靈兒施展還魂咒時要面對的局面。屏幕上同樣是一個倒下的角色,背后的原因卻可能完全不同。ABAP 沒有名為還魂咒的語句,也不存在對任意已提交業(yè)務(wù)數(shù)據(jù)通用的一鍵復(fù)活功能。不過,圍繞事務(wù)回滾、業(yè)務(wù)撤銷、草稿保存、變更追蹤、數(shù)據(jù)備份與重建,確實可以設(shè)計出相當接近還魂咒效果的恢復(fù)能力。要把這個類比講準確,關(guān)鍵是弄清楚業(yè)務(wù)對象究竟在哪一刻失去了可用狀態(tài)。在我們的系統(tǒng)里,一張單據(jù)看起來消失,并不總是數(shù)據(jù)庫記錄沒了。它可能仍在數(shù)據(jù)庫中,只是狀態(tài)變?yōu)橐讶∠蚨粦?yīng)用列表的默認篩選條件排除。它也可能處于尚未保存的草稿里,另一位同事看到的是舊的正式版本。還有一種更棘手的情況,單據(jù)本身仍在,但其關(guān)聯(lián)憑證、庫存數(shù)量與對外發(fā)送的消息已經(jīng)發(fā)生變化。此時把一個字段改回原值,畫面或許恢復(fù)了,業(yè)務(wù)卻未必恢復(fù)了??梢园堰€魂咒理解為一項有前提的業(yè)務(wù)恢復(fù)操作。施術(shù)前得辨明對象、損傷范圍、可用記錄和恢復(fù)代價;施術(shù)時要遵守業(yè)務(wù)規(guī)則;施術(shù)后還要檢查關(guān)聯(lián)對象是否一致。ABAP 能參與每一步,但每一步使用的機制并不相同。最接近即時還魂的能力,是尚未提交時的事務(wù)回滾。傳統(tǒng) ABAP 程序執(zhí)行若干數(shù)據(jù)庫修改,業(yè)務(wù)校驗在提交前發(fā)現(xiàn)問題,就可以使用ROLLBACK WORK放棄當前事務(wù)范圍內(nèi)的修改。已經(jīng)通過COMMIT WORK完成的事務(wù),不能在過了幾個小時后靠補寫一條ROLLBACK WORK