ABAP之DIALOG


明天系統上線,數據一團糟,沒人提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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM