会计凭证合并OBCY

1. 概述

SAP财务凭证同时启用了录入视图BSEG和总账视图ACDOCA时, 由于BSEG的行项目BUZEI的999限制,会导致会计凭证创建失败,提示消息:F5727在FI中达到的项目最大编号。
针对以上问题,SAP提出了凭证合并的方案,将BSEG中不重要的字段清除,汇总,明细的正确数据存储到ACDOCA中。

相关的表如下:

表名 描述
TTYPS FI汇总:允许的凭证字段
TTYPV 分录视图的独立汇总
TTYPVX 分录视图的相关汇总

分录视图的独立汇总和相关汇总不允许同时存在

2. 以分录视图的独立汇总为例,

TCODE : OBCY (表 :TTYPV)
IMG 路径 : 财务会计 >> 财务会计全局设置 >> 凭证>> 汇总>> 分录视图的独立汇总
会计凭证合并OBCY_第1张图片

3. 合并原理

SAP通过函数FI_DOCUMENT_PROJECT实现凭证合并。
实现的原理也很简单,下面详细分析。

  1. 在子例程DOCUMENT_PROJ 中,根据参考过程AWTYP读取TTYPV或TTYPVX中配置的表和字段名;
   "read summarization settings                              "note 892315
    PERFORM read_ttypv.                                    "note 892315
 " begin of note 1779136
  LOOP AT gt_ttypv WHERE awtyp EQ acchd_fi-awtyp.
    EXIT.
  ENDLOOP.

  CHECK NOT sy-subrc IS INITIAL.

  CLEAR gt_ttypv.                                         "note 1369659
  REFRESH gt_ttypv.

  SELECT * FROM ttypv INTO CORRESPONDING FIELDS OF TABLE gt_ttypv
    WHERE awtyp EQ acchd_fi-awtyp.

  CHECK NOT sy-subrc IS INITIAL.

  SELECT * FROM ttypvx INTO CORRESPONDING FIELDS OF TABLE gt_ttypv
    WHERE awtyp EQ acchd_fi-awtyp.
"  end of note 1779136
  1. 在子例程FI_DOCUMENT_COLLECT合并凭证
    循环传输的凭证行项目,先调用子例程COMPRESS ,将配置表中字段的值清空;
*---------------------------------------------------------------------*
*       FORM COMPRESS                                                 *
*---------------------------------------------------------------------*
*       Verdichtung des FI-Beleges gemäß Einstellung des Kunden       *
*       - Kein Eintrag in TTYPV        -> keine Verdichtung           *
*       - Maskierter Eintrag in TTYPV  -> COLLECT                     *
*       - Spezifizier Eintrag in TTYPV -> Feldinhalt löschen + COLLECT*
*---------------------------------------------------------------------*
FORM compress CHANGING compres LIKE boole.

  DATA: field(20) TYPE c.
  FIELD-SYMBOLS .
*
  LOOP AT gt_ttypv WHERE   awtyp EQ p_acc-awtyp           "note 1779136
                   AND   ( blart EQ p_acc-blart           "note 1779136
                   OR      blart EQ space )               "note 1779136
                   AND   ( bukrs EQ p_acc-bukrs           "note 1779136
                   OR      bukrs EQ space )               "note 1779136
                   AND     tabname NE 'BSET'.             "note 1431727
*
* Feste SAP-Felder (Tabelle TTYPS)
*
    CASE gt_ttypv-fieldname.                               "note 892315
      WHEN '*    '.
      WHEN 'WERKS'.
        CLEAR p_acc-werks.
      WHEN 'MATNR'.
        CLEAR p_acc-matnr.
      WHEN 'MENGE'.
        CLEAR p_acc-menge.
        CLEAR field.                                      "note 2185343
        field+00(06) = 'P_ACC-'.                          "note 2185343
        field+06(10) = 'SQUAN'.                           "note 2185343
        ASSIGN (field) TO .                            "note 2185343
        IF sy-subrc IS INITIAL.                           "note 2185343
          CLEAR .                                      "note 2185343
        ENDIF.                                            "note 2185343
      WHEN 'MEINS'.
        CLEAR p_acc-meins.
      WHEN 'BPMNG'.
        CLEAR p_acc-bpmng.
      WHEN 'BPRME'.
        CLEAR p_acc-bprme.
      WHEN 'PPRCT'.
        CLEAR p_acc-pprct.
      WHEN OTHERS.
*
* Kundenfelder
*
        CLEAR field.
        field+00(06) = 'P_ACC-'.
        field+06(10) = gt_ttypv-fieldname.                 "note 892315
        ASSIGN (field) TO .
        IF NOT sy-subrc IS INITIAL.
          MESSAGE e843 WITH gt_ttypv-fieldname 'LFACIGEN' 'SAPFACCG'.
        ENDIF.
        CLEAR .
    ENDCASE.
  ENDLOOP.                                                 "note 892315
*
* Wird überhaupt komprimiert?
*
  IF sy-subrc IS INITIAL
* always compress tax items from SD
  OR ( p_acc-mwart NE space
* AND ACCHD_FI-GLVOR EQ 'SD00' ).                          "N1477287
  AND ( acchd_fi-glvor EQ 'SD00'                            "N1477287
      OR NOT g_badi_tax_compress IS INITIAL ) ).            "N1477287
    compres = char_x.
  ELSE.
    compres = space.
  ENDIF.
ENDFORM.                    "COMPRESS
  1. 然后将凭证行使用COLLECT汇总;
    PERFORM compress CHANGING compres.
    IF compres IS INITIAL.
      APPEND p_acc.
    ELSE.
      COLLECT p_acc.
    ENDIF.

4. 异常处理

  1. 现象: 在OBCY配置了合并的字段,理论上BSEG合并后应该只有60多行,但是通过BAPI创建会计凭证,程序依然报错, F5727在FI中达到的项目最大编号。
  2. 排查方式:进入调试模式,将表汇总后的内表p_acc下载下来,去除金额和数字字段,然后排重,检查发现有一个字段RFZEI。
  3. 原因:在子例程FI_DOCUMENT_COLLECT 中调用子例程FI_ITEM_FILL时给RFZEI赋值。

从业务上分析,这个字段不影响,直接将这个字段配置到OBCY,如果业务上有影响,则不能合并。

*
* Credit Card - Referenzzeile
*
  LOOP AT CCLTAB WHERE AWTYP = ACCHD_FI-AWTYP
                 AND   AWREF = ACCHD_FI-AWREF
                 AND   AWORG = ACCHD_FI-AWORG
                 AND   POSNR = ACCIT_FI-POSNR.
* begin of note 1570210
    IF ACCHD_FI-AWTYP EQ 'BKPFF'.                         "Note 1636190
      IF GS_CCREF-BUKRS NE ACCIT_FI-BUKRS OR
         GS_CCREF-BELNR NE ACCIT_FI-BELNR OR
         GS_CCREF-GJAHR NE ACCIT_FI-GJAHR.
      GS_CCREF-BUKRS = ACCIT_FI-BUKRS.
      GS_CCREF-BELNR = ACCIT_FI-BELNR.
      GS_CCREF-GJAHR = ACCIT_FI-GJAHR.
      GS_CCREF-RFZEI = 1.
    ELSE.
      GS_CCREF-RFZEI = GS_CCREF-RFZEI + 1.
    ENDIF.
      P_ACC-RFZEI = GS_CCREF-RFZEI.
    ELSE.                                                 "Note 1636190
      P_ACC-RFZEI = CCLTAB-RFZEI.                         "Note 1636190
    ENDIF.                                                "Note 1636190
* end of note 1570210
  ENDLOOP.
  1. 修复方法:通过OBCY将RFZEI配置到参考过程BKPFF中.

你可能感兴趣的:(ABAP,开发语言)