ABAP知识:请不要这样设计OO-ALV

标签:
abapalvcdsliumengsap |
分类: 报错及解决办法 |

(1/5)问题描述
如下图,是一个调拨功能的操作界面,分为抬头部分和ALV行项目部分。
抬头部分:输入移动类型、日期、备注等信息;
行项目部分:输入行项目信息。
“调拨”按钮,大家可以看一下,它被设计在ALV工具栏上了,这样会带来很大的后期维护问题。
(2/5)问题分析
首先理解一下Dynpro和OO对象的关系。
Dynpro上包含基本的Dynpro元素(按钮、下拉框、复选框、文本框、TableControl等等)和容器元素。
Dynpro是不能直接绘制OO对象的,它只能留出一个容器(CONTAINER)来,我们通过代码在这个Container的基础上创建OO对象,比如ALV、TREE等等。
当我们点击Dynpro上的按钮、下拉框等触发事件的时候,Dynpro会触发PAI,PAI执行成功后会触发PBO。
但当我们点击OO对象里的按钮(ALV工具栏的按钮、菜单,或ALV行项目中的按钮)时,默认是不会触发屏幕PAI的。
所以,如果对上述屏幕按照以下步骤操作时,代码实现中就存在比较大的问题。
-
在抬头部分输入日期、备注等字段,不回车;
-
在行项目中输入相应内容后,点“调拨”按钮。
由于“调拨”按钮不会触发屏幕PAI,所以Dynpro中的日期、备注等字段的值尚未更新到程序变量中,这时候如果把这些空值赋值给BAPI并执行,得到的结果就出问题了。
(3/5)解决方案
“调拨”这个按钮,它就只应该负责对ALV数据的操作,而不建议它越过ALV去操作或读取ALV的上一层屏幕的数据。这个按钮,可以移动到抬头的“查询”按钮右侧,问题就迎刃而解了。
你可能会说,我们可以通过函数DYNP_VALUES_READ去读取屏幕的值呀,这根本不算多大的事。可这样做的确会带来相当高的运维复杂度——如果后期运维人员不了解程序设计结构,在屏幕抬头部分上新增了输入框,而不知道应该通过函数DYNP_VALUES_READ去读取屏幕值的话,就要花很多的时间在这个糟心的设计上了。
那我们是不是可以写一个通用的Form,自动读取屏幕上所有变量的值呢?可以,但是否应该自动更新程序中响应变量的值,要根据情况使用。代码附上:
FORM frm_read_dynpro_values .
DATA: lt_dynpread TYPE TABLE OF dynpread,
lt_dynp_fields TYPE TABLE OF rsdcf,
lt_lines TYPE TABLE OF tline.
CALL FUNCTION 'DYNPRO_FIELD_GET'
EXPORTING
dynpro = CONV tstc-dypno( sy-dynnr )
program = sy-repid
TABLES
dynp_fields = lt_dynp_fields
lines = lt_lines
EXCEPTIONS
dynpro_not_found = 1
OTHERS = 2.
LOOP AT lt_dynp_fields ASSIGNING FIELD-SYMBOL() WHERE fldname <> ''.
APPEND VALUE #( fieldname = -dynpro_fld ) TO lt_dynpread.
ENDLOOP.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
TABLES
dynpfields = lt_dynpread
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
LOOP AT lt_dynpread ASSIGNING FIELD-SYMBOL().
ASSIGN (-fieldname) TO FIELD-SYMBOL().
IF sy-subrc = 0.
= -fieldvalue.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
(4/5)知识拓展
你可能又会问,如果我们不这样设计ALV了,这段代码还有其他用武之地吗?
嗯,还是有的。比如你可以在屏幕逻辑流的Process On Value-Request中使用,屏幕上点F4操作时,也并没有触发屏幕PAI,屏幕上显示的内容也还未更新到程序变量中,所以这段代码就可以用上了。
(5/5)总结
-
按钮位置的设计应该合理
-
分享一段自动读取屏幕所有变量的代码给大家用
我的SE38插件工具箱——视频介绍:
https://www.bilibili.com/video/BV1hP4y1N7Qz/
联系286503700获取
ABAP文章汇总:
https://mp.weixin.qq.com/s/djmMeM0qfDxPPwxbjuJABA
Excel文章汇总:
https://mp.weixin.qq.com/s/NwJ0SzIrn9hVmaCMo-UYyA
网盘永久链接:
https://mp.weixin.qq.com/s/f_WwKZdwM-vPEstTjjz_eQ
关注公众号,点下方菜单打开上面的链接,更方便哦。
笔者微信:286503700(QQ同号)