明天系統上線,數據一團糟,沒人提BUG,無聊ING....
今天說說SAP開發常用的DIALOG吧
一般單獨的DIALOG程序可以直接建成函數組,功能組,普通報表程序。
基本都是統一的樣式,主程序中INCLUDE一系列子程序,一般包含:TOP(數據定義)、PBO(屏幕輸出前的處理)、PAI(屏幕事件以及邏輯管理)、FRM(FORM包)
輸出樣式一般是:TC表,普通結構字段等。。。
一般的字段邏輯都在邏輯流的PAI中,像是:MOUDLE xxx ON INPUT/REQUEST。。。
1、上面的INPUT參數:只要MOUDLE對應的chain字段有值就會執行。上面的REQUEST參數:只有在MOUDLE中的chain中有值變更才執行。這兩者有很大的區別,前者很耗時,后者很嚴謹。根據需求選擇用。
2、LOOP AT TC:這個可以簡易的理解為電子顯像管或者刷牆,從上到下,從左到右,依次輸出TABLE行內容。TC對應的屏幕控制(隱藏字段,不可編輯等)必須在PBO的LOOP前或中才能起效;數據處理在LOOP中或者后才能起效(之前MODIFY亦可)
3、屏幕事件接收OK_CODE必須及時清空,滾動滑輪等一系列其他事件會繼續觸發之前的OK_CODE事件。尤其是生成單據,更新數據!
4、TC中添加行,更新行號 1)任意位置,這種情況一般是在PBO的LOOP前循環一遍更新序號,對效率稍有影響。
2)追加空行,修改自動生成的insert_row l_line = l_selline - <tc>-top_line + 1.
INSERT INITIAL LINE INTO <table> INDEX l_selline.(可在此時直接用作為行號計算基數)
5、屏幕控制:一般可以在STATUS中,或者后。按鈕控制單獨用EXCLUDING;普通字段是否可編輯,可見等,screen-input,INVISIBLE&LENGTH
下面貼幾個例子:
先把邏輯流的代碼貼出來。
PROCESS BEFORE OUTPUT. *&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TC_9000' MODULE TC_9000_CHANGE_TC_ATTR. *&SPWIZARD: MODULE TC_9000_CHANGE_COL_ATTR. LOOP AT GT_ZCRMT0060 INTO GW_ZCRMT0060 WITH CONTROL TC_9000 CURSOR TC_9000-CURRENT_LINE. MODULE TC_9000_GET_LINES. *&SPWIZARD: MODULE TC_9000_CHANGE_FIELD_ATTR ENDLOOP. MODULE status_9000. * PROCESS AFTER INPUT. *&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TC_9000' LOOP AT GT_ZCRMT0060. FIELD GW_ZCRMT0060-SALES_ORG MODULE ZGET_TEXT ON REQUEST."這是做關聯帶出的,輸入SALES_ORG帶出TEXT描述。 CHAIN. FIELD GW_ZCRMT0060-SALES_ORG. FIELD GW_ZCRMT0060-COMPONENT_NAME. FIELD GW_ZCRMT0060-ALV. FIELD GW_ZCRMT0060-FIELD. FIELD GW_ZCRMT0060-VISIABLE. * FIELD GW_ZCRMT0060-TEXT. FIELD GW_ZCRMT0060-POSIT. MODULE TC_9000_MODIFY ON CHAIN-REQUEST. endchain. FIELD GW_ZCRMT0060-SEL MODULE TC_9000_MARK ON REQUEST. ENDLOOP. MODULE TC_9000_USER_COMMAND. *&SPWIZARD: MODULE TC_9000_CHANGE_TC_ATTR. *&SPWIZARD: MODULE TC_9000_CHANGE_COL_ATTR. MODULE user_command_9000.
1.自動生成的DIALOG默認是輸入數據保存不到內表的,因為SAP生成的代碼有個小BUG。
*&SPWIZARD: INPUT MODULE FOR TC 'TC_9000'. DO NOT CHANGE THIS LINE! *&SPWIZARD: MODIFY TABLE MODULE tc_9000_modify INPUT. MODIFY gt_zcrmt0060 FROM gw_zcrmt0060 INDEX tc_9000-current_line. IF sy-subrc <> 0. APPEND gw_zcrmt0060 TO gt_zcrmt0060. ENDIF. ENDMODULE.
這是PAI的MODIFY行數據,默認這里是只有個MODIFY的,但是在最初空內表的情況下,是MODIFY不成功的,所以需要在后面加個判斷,不成功的時候append進內表。
2.TC中字段控制:改的標准的MODULE,這是在TC的PBO的LOOP中的MODULE,這里是對TC行做屏幕控制的,如果是非TC的,需要在LOOP外,或者最開始的時候做控制。
下面的代碼就是設置TEXT不可編輯
*&SPWIZARD: OUTPUT MODULE FOR TC 'TC_9000'. DO NOT CHANGE THIS LINE! *&SPWIZARD: GET LINES OF TABLECONTROL MODULE tc_9000_get_lines OUTPUT. g_tc_9000_lines = sy-loopc. IF gw_zcrmt0060-sales_org = 'O 50000178'. LOOP AT SCREEN. IF screen-name = 'GW_ZCRMT0060-TEXT'. screen-input = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF. ENDMODULE.
注意*:屏幕控制有很多需要注意的地方在LOOP結束后,TC的屬性固定,所以屏幕控制一般都是在TCloop前和LOOP時。
3.輸入數據帶出相關字段的值:
這種邏輯流處理的需要在PAI里控制,接受數據並更新內表。
常規操作有兩種:1,在此字段所在CHAIN的前面,這時候可以直接用關聯字段帶出需要帶出的字段,但是需要注釋PAI中后面所有的字段使用。上面的屏幕邏輯流中就是注釋了FIELD GW_ZCRMT0060-TEXT.
因為在走FIELD GW_ZCRMT0060-TEXT.的時候用的是界面的值,這時候不管你跟新內表或者是跟新工作區,都沒效果的。注釋了該字段,PAI就不處理這個字段的值了。
2,不注釋需要帶出的字段,在CHAIN后面加MODULE,這時候需要單獨更新內表的值,需要自己寫MODIFY。
4.內表數據跟新問題:
自建的程序一般都會有序號啥的,或者其他一些需要排序,或者一些計算,內表處理等。內表數據在邏輯流處理完就會更新到內表,所以在做DIALOG的內表處理時,為了不影響到屏幕輸出和顯示,一般是在PAI結束,或者在PBO開始前這兩個位置加。
TC的標准按鈕,上翻頁,下翻頁,下一條,上一條,增加行,刪除行等。。。代碼都是完全通用的,所以在自動生成的時候沒有帶出一些按鈕的,也不用在意,從別的程序復制過來就行,直接使用的。但是記住按鈕的事件名字一定要按TC_NAME_事件名格式。
這個內表處理的就不給實例代碼了,就是loop modify的東西。
5.