zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    数据结构.队列
    数据结构.栈
    数据结构.线性表(2)——链式表
    新标日初级:12(小李比森年轻)
    数据结构.线性表(1)——顺序表
    新标日初级:11(小野喜欢歌曲)
    新标日初级:10(京都的红叶很有名)
    crawlSpider
    爬虫如何将数据保存到mongodb数据库中
    爬虫如何将数据保存到mysql数据库
  • 原文地址:https://www.cnblogs.com/sapSB/p/5251779.html
Copyright © 2011-2022 走看看