明天系统上线,数据一团糟,没人提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.
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/18635.html