作者孫小亮
MIR7預制發票時要輸入多個發票号,非常多非常多,甚至多達100多個發票代碼+發票号碼。咋存?
我的第一反應是抓狂的,實作肯定是可以的,但做起來肯定很麻煩,一天肯定搞不定了。但需求已經改變不了了,就做吧。
怎麼做呢?下面隻講思路。
代碼結構比較複雜,不好粘貼上來。且授人以魚不如授人以漁。
1:确定需求,使用者希望在儲存預制發票的時候,将“憑證、年度、發票代碼、發票号碼”存到一個Z表裡。
2:既然需要存Z表,我們一般就要在增強螢幕裡,提供資料維護的界面。資料維護的界面應該包括什麼功能呢?
2.1:資料讀取,從Z表裡讀取資料
2.2:資料維護,提供TableControl或者ALV維護表格資料
2.3:資料儲存,将表格資料儲存到Z表中。
對于2.1,存在的問題是,如果我們把它寫到增強螢幕(假設為9001)的PBO中,則會每次都從DB中讀取資料,這顯然是不合适的。
對于2.3,存在的問題是:
1) 如果把它寫到9001的PAI中,通過對SY-UCOMM的檢查,實作表格資料儲存到Z表的邏輯,也是不合适的。因為儲存的時候除了手工儲存外,還可能包含退出螢幕時“提示是否儲存,然後選擇是”的儲存。
2) 憑證編号還沒有生成,想儲存到資料庫也儲存不了。
這時候需要我們提高對螢幕程式設計的認識。一般對于标準事務代碼的增強螢幕,要保持一個原則:即在PBO和PAI裡,隻對程式内表進行操作,盡量不做資料庫互動。
那麼2.1的問題如何解決呢?這裡提供幾個思路:
思路1:看有沒有增強點,SMOD的也好,BADI的也好
思路2:通過SAT/SE30執行MIR7,看一下這個過程中用到過的函數名,看有沒有适合隐式增強的函數并進行隐式增強,将資料從DB中取出。
2.3的問題如何解決呢?2.3存在兩個子問題,一是增強代碼的位置,二是憑證編号生成較晚。
對于第一個子問題,還是上面兩個思路,即:找增強,找函數。
對于第二個子問題,這個需要加深對标準事務儲存資料邏輯的了解。
1)标準事務儲存資料時,一般都是将資料送出到更新程序中,在更新程序中對資料統一進行儲存的
2)MEMORY ID是無法将資料從目前程序傳遞到更新程序的。是以需要其他方式将資料送出到更新程序中
3)SHARED BUFFER是跨會話程序和更新程序的,但是對于同一個事務代碼不同的會話程序和更新程序,SHARED BUFFER的ID如何區分和對應呢?這個方案好像也不行
4)CALL FUNCTION 'XX' IN UPDATE TASK是可以将資料送出到更新程序的。
結合上面的思路,我整理了一個思維導圖。
接下來就是設計程式結構了,在此不在贅述了。
整個需求從開始編寫到完整實作(包括嚴謹的自測完成),隻用了半天時間,比我預想的快了很多。
最後結果如下圖: