会计凭证 FB02/03 屏幕增强实现显示/修改的转换

948 阅读4分钟

背景

因为 FICO 模块增强了 CodingBlock 字段,这个 9999 子屏幕的自定义字段在 FB01 是支持修改的,但是在 FB02/FB03 事务码都是没法直接修改的,因此应财务用户要求,对屏幕增强修改功能

类似会计分配和文本一样,是空白区域,而不是灰色区域:

image.png

实现方式

最直观的方法就是通过增强屏幕,然后写代码去控制 PBO。以往的做法,可能在代码中用 sy-tcode 去控制是显示和修改,但是标准程序是有个 显示/修改 的切换,即使是 FB03 先进行查看,也能通过如下图的按钮切换到修改模式:

在这里插入图片描述
因此在这种场景下,如果只通过 Tcode 去控制,会不符合用户的常用使用习惯,达不到要求。

因此需要 Debug 研究标准代码,看点击这个按钮的时候做了哪些变化。

很快就定位到这段:

image.png

然后发现这个显示/修改状态是通过 t020-akty 来转换的。然后去看了这个表的内容,确实是 FI/AM 业务控制逻辑,可以看一下关于 FB01/02/03 事务码的内容:

image.png

从中可以看出,AKTYP 分别的值对应:

  • H:creation 创建
  • V:modification 修改
  • A:display 显示

因此,我们很好理解,获取当前屏幕的 aktyp 的值,如果不是 ‘A’,就需要将屏幕更改为可以输入的类型。将屏幕的 screen-input 设置为 1,然后 MODIFY SCREEN

在自定义屏幕 9999 中,中插入这样一段代码:

PROCESS BEFORE OUTPUT.
  MODULE INIT_9999.
*{   INSERT                                           
    MODULE FRM_MODIFY_SCREEN. " 支持显示/修改的切换
*}   INSERT
*
PROCESS AFTER INPUT.
  CHAIN.
      FIELD COBL-ZZTEST01.
      FIELD COBL-ZZSCTG
      FIELD COBL-ZZSCTG2.
    MODULE CHECK_FLAG ON CHAIN-REQUEST.
  ENDCHAIN.

然后在 FRM_MODIFY_SCREEN 中写下如下代码:

MODULE frm_modify_screen OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'
*    IF sy-tcode = 'FB02'. " 因FB03也能进入修改状态,因此不能仅仅用事务码判断
  FIELD-SYMBOLS: <lfs_t020> LIKE t020,
                 <fs_aktyp> TYPE t020-aktyp.
  ASSIGN ('(SAPMF05L)T020') TO <lfs_t020>.
  CHECK <lfs_t020> IS ASSIGNED.
  ASSIGN COMPONENT 'AKTYP' OF STRUCTURE <lfs_t020> TO <fs_aktyp>.
  IF <fs_aktyp> IS ASSIGNED.
    DATA(lv_aktyp) = <fs_aktyp>.
  ENDIF.

  IF lv_aktyp IS INITIAL.
    ASSIGN ('(SAPMF05A)T020') TO <lfs_t020>.
    CHECK <lfs_t020> IS ASSIGNED.
    ASSIGN COMPONENT 'AKTYP' OF STRUCTURE <lfs_t020> TO <fs_aktyp>.
    IF <fs_aktyp> IS ASSIGNED.
      lv_aktyp = <fs_aktyp>.
    ENDIF.
  ENDIF.

  IF lv_aktyp IS INITIAL.
    ASSIGN ('(SAPLF040)T020') TO <lfs_t020>.
    CHECK <lfs_t020> IS ASSIGNED.
    ASSIGN COMPONENT 'AKTYP' OF STRUCTURE <lfs_t020> TO <fs_aktyp>.
    IF <fs_aktyp> IS ASSIGNED.
      lv_aktyp = <fs_aktyp>.
    ENDIF.
  ENDIF.

  IF lv_aktyp IS NOT INITIAL AND lv_aktyp <> 'A'.
    LOOP AT SCREEN.
      IF screen-name+0(7) = 'COBL-ZZ'.
        screen-input = 1.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDMODULE.

增强成功的效果图如下:

image.png

自定义字段全部支持修改,也能在 FB02/03 中自由切换,到此,完美实现用户要求!

鼓掌👏撒花★,°:.☆( ̄▽ ̄)/$: .°★ 。

其他使用到 AKTYP 的表

同理,销售订单/采购订单/物料 等对应的屏幕也能这样操作,下面是使用到 AKTYP 字段的表格,找到你需要的表格,试试吧~

List of Tables using AKTYP Field
TableNote
AT185Treasury: Starting Values for Subsequent Screen Control
OIGSHTD Shipment History
T020FI/AM Transaction Control
T063Screen Control: Inventory Management
T066Screen Selection, Invoice Verification
T078SAction Type Screen Selection for G/L Acct Master Data
T130MTransaction control parameters: material master maintenance
T138BMaterial master screen sequence control
T148MTransaction control parameters: special stocks
T168Screen Control, Purchasing
T180Screen Sequence Control: Transaction Default Values
T185FScreen Control: Function Codes
T342Control of Screen Sequence in WM
T342TAssignment of Title Bar to PF Status
T370AActivity Category for PM Lists
T401MTransaction control paramters: MRP profiles
T440BControl table for creating MRP record
T441MForecast transaction control
T450PTransaction control for maintaining ind. requirements
TC62Sequence of detail screens when processing header externally
TJ180Initial Values of Transaction in IS-M
TK180Default Values per Transaction (Screen Sequence Control)
TKSB0Transaction control CO
TTABSTables with Special Maintenance
/BEV3/CH180Screen Sequence Control: Transaction Default Values

附录:通过配置实现相同效果

在我自定义完成同样效果的时候,发现有个博客通过配置也能实现 CodingBlock 的修改功能,同样复制到此处,感谢 Jane.liu

问题描述

在SAP ERP项目中,Coding Block常用于财务会计凭证增加客户自定义字段,现需要FB02修改已过帐会计凭证上的客户自定义字段。

操作步骤

Coding Block实现步骤可以参照SAP Coding Block维护客户化字段_abap codingblock-CSDN博客

设置Coding Block字段可编辑参照如下步骤:

1)SPRO后台设置允许修改,如下图所示:

2)SM31在TCOBX维护屏幕的更改属性:

2.1)首先,确认程序和屏幕名:

2.2)更新屏幕字段的状态组,允许可修改:

以上,满足FB02可修改自定义字段: