网上搜关于CJ20N的屏幕增强,基本都是关于项目定义(CI_PROJ)、项目WBS(CI_PRPS)、项目网络活动工序(CI_AFVU)的字段与屏幕增强,几乎没有关于项目物料(CI_RSADD)的字段屏幕增强,我在这里做一个分享。
主要逻辑:实现badi增强,并自建一个函数组后创建屏幕,在badi里面调用该函数组里的屏幕进行数据交互。
文章目录
一、实现效果图

二、扩展增强结构CI_RSADD并激活


三、实现badi:BADI_MAT_CUST_SCR
1、创建badi实施
SE18根据BADI_MAT_CUST_SCR创建badi增强实施:ZIM_BADI_MAT_CUST_SCR
及实施类:ZBADI_MAT_CUST_SCR


2、实现方法get_screen_details和get_cust_feilds

METHOD if_mat_customer_scr~get_screen_details.
DATA: lv_display TYPE char1,
gs_rsadd TYPE ci_rsadd.
FIELD-SYMBOLS <lfs_zmemo> TYPE resbd-zmemo.
FIELD-SYMBOLS <lfs_aktyp> TYPE rc27s-aktyp.
ASSIGN ('(SAPLCOMD)RESBD-ZMEMO') TO <lfs_zmemo>.
ASSIGN ('(SAPLCOMD)RC27S-AKTYP') TO <lfs_aktyp>.
prg_name = 'SAPLZPS_FGP_001'.
scr_num = '9000'.
gs_rsadd-zmemo = <lfs_zmemo>.
IF <lfs_aktyp> = 'A'.
lv_display = 'X'.
ENDIF.
CALL FUNCTION 'ZPS_ENH_001'
EXPORTING
i_rsadd = gs_rsadd
i_display = lv_display.
ENDMETHOD.

method IF_MAT_CUSTOMER_SCR~GET_CUST_FEILDS.
FIELD-SYMBOLS <LFS_ZMEMO> TYPE CI_RSADD-ZMEMO.
ASSIGN ('(SAPLZPS_FGP_001)CI_RSADD-ZMEMO') TO <LFS_ZMEMO>.
IM_CI_RSADD-ZMEMO = <LFS_ZMEMO>.
endmethod.
四、自定义函数组并添加屏幕及屏幕逻辑
1、定义函数组ZPS_FGP_001并创建函数ZPS_ENH_001

FUNCTION ZPS_ENH_001 .
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(I_RSADD) TYPE CI_RSADD
*" REFERENCE(I_DISPLAY) TYPE CHAR1
*"----------------------------------------------------------------------
CI_RSADD = I_RSADD.
GV_DISPLAY = I_DISPLAY.
ENDFUNCTION.

FUNCTION-POOL ZPS_FGP_001. "MESSAGE-ID ..
* INCLUDE LZPS_FGP_001D... " Local class definition
TABLES:CI_RSADD.
DATA: GV_DISPLAY TYPE char1.
FIELD-SYMBOLS <lfs_zmemo> TYPE resbd-zmemo.
2、用增强结构CI_RSADD画9000屏幕

至此,增强功能已基本实现完成。
五、问题
虽然badi及屏幕已实现,但不知什么原因我的增强badi进不去,导致调用的增强屏幕程序及屏幕号无法传入,系统直接dump

经查阅,说是要激活PS初代增强包OPS_PS_CI_1
路径:事务码SFW5 -> 通过CRTL+F输入OPS_PS_CI_1快速定位

双击进入查看该增强包,显示已激活,但外层灯泡图标又是灰色,不知为何,按理说灯泡需要闪烁状态才表示激活状态
,激活后badi增强还是进不去,只能一步步调试看是哪里出现问题了,最后发现在功能组COMD屏幕8002处会调用客户增强屏幕,这里我的传入值为空,没有办法只能做个隐式增强,直接插入代码把我的程序及屏幕赋值进去


屏幕程序及屏幕号传入了,交互数据也需要和系统进行交互,在屏幕PBO和PAI里直接与系统进行交互

PBO里把系统值赋值给增强屏幕值

*----------------------------------------------------------------------*
***INCLUDE LZPS_FGP_001O01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
ASSIGN ('(SAPLCOMD)RESBD-ZMEMO') TO <lfs_zmemo>.
ci_rsadd-zmemo = <lfs_zmemo>.
IF GV_DISPLAY = 'X'.
LOOP AT SCREEN.
screen-input = '0'.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
ENDMODULE.
PAI里把屏幕值回传给系统

*----------------------------------------------------------------------*
***INCLUDE LZPS_FGP_001I01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
ASSIGN ('(SAPLCOMD)RESBD-ZMEMO') TO <lfs_zmemo>.
<lfs_zmemo> = ci_rsadd-zmemo.
ENDMODULE.
最终,增强屏幕才终于跑起来了,数据交互也正常,完成!
2482

被折叠的 条评论
为什么被折叠?



