ABAP关于PS模块CJ20N中项目物料的屏幕和字段增强CI_RSADD

网上搜关于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.

最终,增强屏幕才终于跑起来了,数据交互也正常,完成!

ABAP中,可通过以下几种方法判断屏幕字段程序字段的数据类型长度是否匹配: #### 1. 使用数据字典信息查询 可借助数据字典(DDIC)中的信息查询屏幕字段程序字段的数据类型长度。通过系统表`DD03L``DD04L`可获取字段的元数据信息。 ```abap REPORT z_check_field_matching. DATA: lv_screen_field TYPE dd03l-fieldname VALUE 'SCREEN_FIELD_NAME', lv_program_field TYPE dd03l-fieldname VALUE 'PROGRAM_FIELD_NAME', lv_tabname TYPE dd03l-tabname VALUE 'TABLE_NAME', wa_dd03l_screen TYPE dd03l, wa_dd03l_program TYPE dd03l, lv_match TYPE abap_bool. SELECT SINGLE * FROM dd03l INTO wa_dd03l_screen WHERE tabname = lv_tabname AND fieldname = lv_screen_field. SELECT SINGLE * FROM dd03l INTO wa_dd03l_program WHERE tabname = lv_tabname AND fieldname = lv_program_field. IF wa_dd03l_screen-ddlength = wa_dd03l_program-ddlength AND wa_dd03l_screen-ddtype = wa_dd03l_program-ddtype. lv_match = abap_true. ELSE. lv_match = abap_false. ENDIF. WRITE:/ '字段是否匹配:', lv_match. ``` 上述代码通过查询`DD03L`表获取屏幕字段程序字段的数据类型(`ddtype`)长度(`ddlength`),然后比较它们是否一致。 #### 2. 在屏幕处理模块中检查 在屏幕处理模块里,可在字段赋值时进行检查。 ```abap MODULE screen_field_processing OUTPUT. DATA: lv_screen_field TYPE c LENGTH 10, lv_program_field TYPE c LENGTH 10. lv_screen_field = 'ABCDEFGHIJ'. lv_program_field = lv_screen_field. IF strlen( lv_screen_field ) = strlen( lv_program_field ) AND sy-datatype = sy-datatype. WRITE:/ '字段数据类型长度匹配'. ELSE. WRITE:/ '字段数据类型长度不匹配'. ENDIF. ENDMODULE. ``` 此代码在屏幕输出模块中,给屏幕字段程序字段赋值,然后比较它们的长度数据类型。 #### 3. 利用反射机制 ABAP的反射机制可在运行时检查对象的属性方法,也能用于检查字段的数据类型长度。 ```abap REPORT z_check_field_matching_reflection. DATA: lv_screen_field TYPE c LENGTH 10, lv_program_field TYPE c LENGTH 10, lo_ref_screen TYPE REF TO cl_abap_typedescr, lo_ref_program TYPE REF TO cl_abap_typedescr, lv_match TYPE abap_bool. lo_ref_screen ?= cl_abap_typedescr=>describe_by_data( lv_screen_field ). lo_ref_program ?= cl_abap_typedescr=>describe_by_data( lv_program_field ). IF lo_ref_screen->length = lo_ref_program->length AND lo_ref_screen->type_kind = lo_ref_program->type_kind. lv_match = abap_true. ELSE. lv_match = abap_false. ENDIF. WRITE:/ '字段是否匹配:', lv_match. ``` 该代码利用反射机制获取屏幕字段程序字段的类型描述对象,然后比较它们的长度类型种类。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值