如何通过ABAP获取会计科目的字段状态?

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.

参考

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ABAP语言中,你可以使用循环来逐个访问字符串中的每个字符。以下是一些常用的方法来循环字符串: 1. 使用循环语句和字符串函数: ``` DATA: lv_string TYPE string VALUE 'Hello World'. DATA: lv_length TYPE i, lv_index TYPE i. lv_length = STRLEN( lv_string ). DO lv_length TIMES. lv_index = sy-index. WRITE lv_string+lv_index(1). ENDDO. ``` 在这个例子中,我们使用了DO循环来迭代字符串的长度次数。在每次循环中,我们使用WRITE语句和字符串截取操作符(+)来访问字符串中的每个字符。 2. 使用字符串表: ``` DATA: lt_chars TYPE TABLE OF c. SPLIT 'Hello World' AT space INTO TABLE lt_chars. LOOP AT lt_chars INTO DATA(lv_char). WRITE lv_char. ENDLOOP. ``` 在这个例子中,我们使用SPLIT函数将字符串拆分为一个字符表。然后,使用LOOP AT循环逐个访问字符表中的每个字符。 3. 使用正则表达式: ``` DATA: lv_string TYPE string VALUE 'Hello World'. DATA: lv_match TYPE string. FIND REGEX '([a-zA-Z])' IN lv_string IGNORING CASE MATCH OFFSET DATA(lv_offset). WHILE sy-subrc = 0. lv_match = lv_string+lv_offset(1). WRITE lv_match. FIND REGEX '([a-zA-Z])' IN lv_string IGNORING CASE MATCH OFFSET DATA(lv_offset). ENDWHILE. ``` 在这个例子中,我们使用FIND REGEX语句和正则表达式来搜索字符串中的字母字符。使用WHILE循环来迭代找到的每个匹配项,并使用WRITE语句将其输出。 这些是在ABAP语言中循环字符串的一些常用方法。根据具体的需求,你可能需要选择适合你的情况的方法来循环字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值