• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
^ω^SAp傻X^o^
博客园    首页    新随笔    联系   管理    订阅  订阅
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.

^_^很多人都把资料锁进了note里,以后还怎么百度呢^_^
posted on 2016-03-07 20:25  ^ω^SAP傻X^o^  阅读(7508)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3