** (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的 。
所以,如果对上述屏幕按照以下步骤操作时,代码实现中就存在比较大的问题。
1. 在抬头部分输入日期、备注等字段,不回车;
2. 在行项目中输入相应内容后,点“调拨”按钮。
由于“调拨”按钮不会触发屏幕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-repidTABLES dynp_fields = lt_dynp_fieldslines = lt_linesEXCEPTIONS dynpro_not_found = 1 OTHERS = 2.
LOOP AT lt_dynp_fields ASSIGNING FIELD-SYMBOL(<ls_dynp_fields>) WHERE fldname <> ''. APPEND VALUE #( fieldname = <ls_dynp_fields>-dynpro_fld ) TO lt_dynpread. ENDLOOP.
CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-repid dynumb = sy-dynnrTABLES dynpfields = lt_dynpreadEXCEPTIONS OTHERS = 1.IF sy-subrc = 0.LOOP AT lt_dynpread ASSIGNING FIELD-SYMBOL(<ls_dynpread>). ASSIGN (<ls_dynpread>-fieldname) TO FIELD-SYMBOL(<lv_value>).IF sy-subrc = 0. <lv_value> = <ls_dynpread>-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同号)** ****
**如果喜欢,谢谢转发。**