SAP FI 基于科目的字段状态,在配置的时候有两个事务码: OBC4 基于字段状态组来设置,OB41 基于过账码来设置,两者共同作用来确定凭证输入的时候字段是否为必须输入,是否为隐藏。有些场景,可能需要通过编程获取会计科目的字段状态,比如自开发一支程序来输入会计凭证。本篇博文介绍 SAP 对字段状态的存储机制,提供通过 ABAP 代码来获取字段状态码的方法。
我们先看看界面 OBC4 的设置:
OBC4 界面设置的结果存储在 T004F 表中,但并不是以直观的方式来存储。不妨看一下:
以 G001 为例,FAUS1 字段是由三种符号组成的字符串。其机制是每一个字符都表示某个字段的字段状态控制符, + 号表示强制输入,- 号表示字段隐藏,. 号表示可选的(optional),各位置是什么字段存储在 TMODU 表中。在 TMODU 表中, FAUNA (field name)字段的值为 SKB1-FAUS1 表示属于会计科目的字段状态配置, MODIF 字段表示字段的位置。比如 Assignemnt (ZOUNR) 字段来说,总账科目类型对应的位置为 1:
FELDN 字段究竟对应界面上什么字段呢? TMODP 表存储了相应位置对应的文本:
OB41 界面的设置存储在表 TBSL 中,结构不同,但机制相同:
SAP 提供了 FI_FIELD_SELECTION_DETERMINE
函数 可以获取基于 OBC4 和 OB41 配置的结果,但返回值仍然是 T004F 表的字符串,需要解析。
为了方便使用,我编写了基于该函数获取字段状态的代码。出于演示目的,写的比较简单:
*&---------------------------------------------------------------------*
*& Report Z_READ_FIELDSTATUS
*%
*& developed by Stone Wang
*&---------------------------------------------------------------------*
REPORT z_read_fieldstatus.
DATA: lv_fieldstatus TYPE string.
DATA: lt_tmodu LIKE STANDARD TABLE OF tmodu, "tmodu存储字段在配置中的位置信息
ls_tmodu LIKE LINE OF lt_tmodu.
DATA: lv_fstag TYPE t004f-fstag, " field status group
lv_faus1 TYPE t004f-faus1, "存储字段状态的信息
lt_xsako LIKE TABLE OF xsako WITH HEADER LINE. "G/L account information
PARAMETERS: lv_bukrs LIKE skb1-bukrs, " company code
lv_saknr LIKE skb1-saknr, " account number
lv_bsch1 LIKE tbsl-bschl, " posting key
lv_feldn LIKE tmodu-feldn. " field name
START-OF-SELECTION.
" 读取tmodu表,获取字段在字段状态组中的位置
SELECT modif feldn FROM tmodu INTO CORRESPONDING FIELDS OF TABLE lt_tmodu
WHERE fauna EQ 'SKB1-FAUS1' " Name of the Field Selection Definition
AND koart EQ 'S'. " account type
" 基于公司代码和科目获取field status group
CALL FUNCTION 'FI_GL_ACCOUNT_DATA'
EXPORTING
i_bukrs = lv_bukrs
i_saknr = lv_saknr
IMPORTING
e_sako = lt_xsako.
lv_fstag = lt_xsako-fstag.
CALL FUNCTION 'FI_FIELD_SELECTION_DETERMINE'
EXPORTING
i_bschl = lv_bsch1 " posting key
i_bukrs = lv_bukrs " company code
i_saknr = lv_saknr " account number
i_fstag = lv_fstag " field status group
IMPORTING
e_faus1 = lv_faus1.
CLEAR ls_tmodu.
READ TABLE lt_tmodu INTO ls_tmodu WITH KEY feldn = lv_feldn.
DATA: position TYPE i.
position = ls_tmodu-modif - 1.
lv_fieldstatus = lv_faus1+position(1).
IF lv_fieldstatus EQ '.'.
WRITE 'optional'.
ELSEIF lv_fieldstatus EQ '-'.
WRITE 'hide'.
ELSEIF lv_fieldstatus EQ '+'.
WRITE 'required'.
ENDIF.