财务凭证过账参考号码传输问题

项目场景:

财务凭证过账参考号码传输问题

问题描述

在BAPI_ACC_DOCUMENT_POST的抬头参数DOCUMENTHEADER中的参考凭证编号REF_DOC_NO和参考凭证号(对相关性参看长文本)REF_DOC_NO_LONG都传值时,会出现以下情形:

  1. REF_DOC_NO_LONG有值,且长度不超过16位, 最终保存的参考号号码取REF_DOC_NO_LONG;
  2. REF_DOC_NO_LONG有值,且长度超过16位,则最终保存的参考号码为空

原因分析:

调试代码发现,程序使用函数REF_DOC_NO_CONVERSION_INBOUND进行转换:财务凭证过账参考号码传输问题_第1张图片
分析函数REF_DOC_NO_CONVERSION_INBOUND中的代码,可以看出,程序会根据接收参数E_REF_DOC_NO_LONG的长度执行不同的转换逻辑,
E_REF_DOC_NO_LONG参考类型为XBLNR1,默认XBLNR1为16位,具体逻辑可以参照一下代码。

FUNCTION ref_doc_no_conversion_inbound.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(I_REF_DOC_NO) TYPE  XBLNR
*"     REFERENCE(I_REF_DOC_NO_LONG) TYPE  XBLNR_LONG
*"  EXPORTING
*"     REFERENCE(E_REF_DOC_NO_LONG) TYPE  XBLNR1
*"----------------------------------------------------------------------

* Exporting field E_REF_DOC_NO_LONG, filled with
* a) the value of the long field ,  if this is filled
* b) the value of the short field,  if this is filled and the long one
**   isn't

  DATA: l_length LIKE sy-tabix.
*-----Check the length of domain XBLNR1
  DESCRIBE FIELD e_ref_doc_no_long LENGTH l_length IN CHARACTER MODE.
  CASE l_length.
    WHEN '16'.
      IF NOT i_ref_doc_no_long IS INITIAL.
        IF i_ref_doc_no_long+16 IS INITIAL.
          MOVE: i_ref_doc_no_long TO e_ref_doc_no_long.
        ELSE.
          CLEAR: e_ref_doc_no_long.
        ENDIF.
      ELSE.
        MOVE: i_ref_doc_no TO e_ref_doc_no_long.
      ENDIF.
    WHEN '35'.
      IF NOT i_ref_doc_no_long IS INITIAL.
        MOVE: i_ref_doc_no_long TO e_ref_doc_no_long.
      ELSE.
        MOVE: i_ref_doc_no      TO e_ref_doc_no_long.
      ENDIF.
    WHEN OTHERS.
      CLEAR: e_ref_doc_no_long.
  ENDCASE.
ENDFUNCTION.

解决方案:

如果REF_DOC_NO_LONG传值超过16位,尽量不要传输,会导致BKPF中参考号码为空值。

延伸理解:

XBLNR1长度固定是16位,SAP为什么还要写一段长度为35的逻辑呢。答案就在REF_DOC_NO_LONG的类型XBLNR_LONG的文档中。根据文档的描述,在特定的情况下,XBLNR1会被扩展到35位.
财务凭证过账参考号码传输问题_第2张图片

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