(這裡說的ABAP報表是用來區分BW報表的。)
說說報表的開發思路吧,通過最近的學習,個人還是有一些想法的。
報表的自主開發設計主要邏輯都是依託於選擇螢幕上欄位,也就是提供給使用者讓他們得到自己想要結果的選擇條件途徑。其中最重要的就是必選欄位,因為必選欄位是取數邏輯的精華所在,他可以很巧妙的限制很多非必要的情況出現,減少代碼開發人員的開發量,還能讓使用者最直接最快捷的得到與實際業務相關的展現結果。
對於一個報表程式的代碼編寫,一般都會有幾個INCLUDE.(X代表任意自訂字母)
REPORT ZXXXXXX.
INCLUDE ZXXXX_INIT.
INCLUDE ZXXXX_F01.
INCLUDE ZXXXX_block.
很多都是個人習慣吧,但是有一些習慣,能夠讓其他人在讀你寫的程式或者修改的時候,很快捷,有規律可循。
INCLUDE ZXXXXX_BlOCK。
裡面有無非就是以下幾個部分
INITIALIZATION.(初始化。在所有以下事件塊運行之前啟動並執行,只運行一次的事件塊)
AT SELECTTION-SCREEN OUTPUT.(PBO事件塊)
AT SELECTION-SCREEN ON VALUE-REQUEST FOR 選擇螢幕欄位名稱。(自訂搜尋協助事件塊)
AT SELECTION-SCREEN.(PAI事件塊)
START-OF-SELECTION.(程式運行事件塊)
PS(我的個人見解):SAP中的程式還是有很多類型的.尤其是類報表程式,有可執行程式(REPORT 開頭)還有MODULE POOL(PROGARM 開頭)2種形式.
那麼他們什麼區別呢?有教材解釋SAP的ABAP開發屬於事件驅動開發。這和VB很類似。但是恰恰是這句話,很精華的解釋了SAP程式的必然結構。對於事件驅動,那麼,SAP程式就需要是由一個個事件去觸發才能夠執行的程式,當我們使用SE38去建立1類型的可執行性程式(EPORT 開頭)這樣的程式,我們可以直接調試,我們會發現,這個程式是按照我所寫的以上事件塊的順序去依次執行的。它的事件塊的順序是指定好的。所以我們能夠F8,去運行。我們去建立MODULE POOL就不能去執行,因為它需要用TCODE的去指定運行入口,一般都會在MODULE POOL 裡面建立 SCREEN . 在一個SCREEN裡 就會有兩個事件塊,就是PBO 和PAI.我們使用多個大量的螢幕,或者使用TABLECONTROL控制項,再或是使用子螢幕範圍控制項嵌套各種SUBSCREEN(子螢幕),其中都是需要PAI 和 PBO 相互聯絡的,一個螢幕的PAI中,必然後會有一個CALL SCREEN 或者CALL SUBSCREEN ... INCLUDIG....命令去調用另一個螢幕或者子螢幕,然後另一個螢幕先運行PBO,有螢幕上的操作,就執行被操作螢幕的PAI。個人感覺正式這種靈活的編寫方式,導致了這種類型(MODULE POOL)的程式不能直接F8,編譯器無法擷取程式從哪裡開始,而TCODE就會指定從哪個螢幕開始。
我的前輩們,一般都習慣使用以下的習慣。
1、 INCLUDE ZXXXX_INIT.
進如程式的第一個INCLUDE。
PS(個人見解):INCLUDE 是什嗎?(CR:就是產生的請求號,也可以理解為一個程式的代碼版本,所有的SAP程式都是在D系統(DEVELOPMENT SYSTEM)然後傳到Q(測試)系統由顧問進行測試,又不干擾生產系統的程式運行,最後再傳到P(生產)系統,覆蓋原來的代碼,變成修改後代碼邏輯)恩,我感覺它是一種封裝起來的思想。我研究一下,它單獨產生CR,而和它的主程式沒有任何關聯。這也是必然的,因為INCLUDE是一個全域全系統的聲明,一旦你取了一個名字,那麼其他人也能夠引用使用,這就導致它的修改CR是單獨產生的。
這裡定義各種只有在本程式裡面生效的結構,例如TYPES定義類型。只有使用TYPES定義的類型後,我們才能使用DATA ..TYPE (我們TYPES的類型) 。使用DATA來定義結構,我們只能用LIKE來定義和他類似的結構DATA ... LIKE (DATA的結構)。
再然後就是SELECT-SCREEN 的相關定義了。
2、習慣使用PERFROM來封裝代碼,取有意義的名字,然後把所有的FORM都丟進
INCLUDE ZXXXX_F01中。
3、在START-OF-SELECTION中,我們一般都會寫以下幾個PERFORM,
PREFORM SUB_GET_DATA.(取數邏輯)
PERFORM SUB_DATA_PROCESS. (處理取出來的資料,按照想要的格式展現)
PERFORM SUB_BUILD_ALV. (建立ALV顯示格式)
PERFORM SUB_SHOW_ALV.(調用ALV函數)
到此為止,一個報表程式的架構就出來了。當然,其中在注意使用一下宏等小地方,來節省代碼的行數。
儘可能實現代碼的複用。注意在FORM裡定義的變數在離開FORM後,就會被系統釋放掉,回收記憶體空間。
尤其注意的就是再優秀的報表開發中,BC414中的LUW概念(資料庫的更新復原,如果多個螢幕的操作會導致操資料庫語句隱式的COMMIT ,導致背離NOTHING OR ALL 的原則,無法做到資料的全部復原,還有使用PERORM ... ON COMMIT等方式可以是暫時制止隱式DB COMMIT),與標準程式使用的資料庫表互鎖(審批程式)(SAP的鎖概念,是很有意思的。) (再就是解釋BDC其中DB COMMIT選項的妙用,會跳過類似COMMIT的控制項繼續錄屏,而不會終止當前錄屏操作。)(BC414中還很全面的解釋了 SAP工作的架構,以及一些Server Load Balancer的初級概念)等等。
SAP程式最佳化,是BC490的範疇,最近比較忙,還沒有去研究,BC414是基礎。
SAP報表程式只是我們瞭解SAP的一種直觀手段,不是所有ABAPER工作的全部。
自己也總結了些在MM SD模組遇到的資料表與業務之間的聯絡。