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.输入数据带出相关字段的值:

ABAP之DIALOG详解编程语言

 这种逻辑流处理的需要在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.

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/18635.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论