加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2023-06-05 16:33:19)
标签:

abap

alv

cds

liumeng

sap

分类: 报错及解决办法
ABAP知识:请不要这样设计OO-ALV

(1/5)问题描述

下图,是一个调拨功能的操作界面,分为抬头部分和ALV行项目部分。

抬头部分:输入移动类型、日期、备注等信息;

行项目部分:输入行项目信息。

ABAP知识:请不要这样设计OO-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() WHERE fldname <> ''. APPEND VALUE #( fieldname = -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(). 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)总结

  1. 按钮位置的设计应该合理

  2. 分享一段自动读取屏幕所有变量的代码给大家用







我的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同号)


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有