分享

BAPI

 沈双鹰展翅 2014-03-04

所有包涵 ‘BAPI_ACC_DOCUMENT_POST’ 标签的日志

星期五, 12月 23rd, 2011

    大家都知道,BAPI_ACC_DOCUMENT_POST用于过账会计凭证,并且BADI增强ACC_DOCUMENT是用于处理会计凭证项目的客制化字段,以及标准字段的替代。在系统中找到此BADI的示例代码:
   DATA: wa_extension   TYPE bapiparex,
        ext_value(960) TYPE c,
        wa_accit       TYPE accit,
        l_ref          TYPE REF TO data.

  FIELD-SYMBOLS: <l_struc> TYPE ANY,
                 <l_field> TYPE ANY.

  SORT c_extension2 BY structure.

  LOOP AT c_extension2 INTO wa_extension.
    AT NEW structure.
      CREATE DATA l_ref TYPE (wa_extension-structure).
      ASSIGN l_ref->* TO <l_struc>.
    ENDAT.
    CONCATENATE wa_extension-valuepart1 wa_extension-valuepart2
                wa_extension-valuepart3 wa_extension-valuepart4
           INTO ext_value.
    MOVE ext_value TO <l_struc>.
    ASSIGN COMPONENT ‘POSNR’ OF STRUCTURE <l_struc> TO <l_field>.
    READ TABLE c_accit WITH KEY posnr = <l_field>
          INTO wa_accit.
    IF sy-subrc IS INITIAL.
      MOVE-CORRESPONDING <l_struc> TO wa_accit.
      MODIFY c_accit FROM wa_accit INDEX sy-tabix.
    ENDIF.
  ENDLOOP.
这段代码详细的告知了你如何对客制化的字段进行处理;我这里对此处理做一个小小的优化。
按照此代码,当增强结构中的字段越来越多,并且包含标准字段替代处理,可能造成某些行项目的标准字段替代成了空字段,导致出错。如下代码完全避免此问题。

  DATA: WA_EXTENSION   TYPE BAPIPAREX,
        EXT_VALUE(960) TYPE C,
        WA_ACCIT       TYPE ACCIT,
  L_REF          TYPE REF TO DATA.

  FIELD-SYMBOLS: <L_STRUC> TYPE ANY,
  <L_FIELD> TYPE ANY.
  FIELD-SYMBOLS: <L_EXTEN> TYPE ANY,
  <L_ACCIT> TYPE ANY.
  DATA: L_FLDNAME(30) TYPE C.
  DATA: LT_DFIES TYPE TABLE OF DFIES,
        LS_DFIES TYPE DFIES.
  DATA: L_TABIX TYPE SY-TABIX.

  SORT C_EXTENSION2 BY STRUCTURE.

  LOOP AT C_EXTENSION2 INTO WA_EXTENSION.
    CHECK WA_EXTENSION-STRUCTURE = ‘Z_EXTEN’.
    CHECK WA_EXTENSION-VALUEPART1 IS NOT INITIAL OR
    WA_EXTENSION-VALUEPART2 IS NOT INITIAL OR
    WA_EXTENSION-VALUEPART3 IS NOT INITIAL OR
    WA_EXTENSION-VALUEPART4 IS NOT INITIAL.

*& 获取增强结构的所有字段
    IF SY-TABIX = 1.
      CALL FUNCTION ‘DDIF_FIELDINFO_GET’
      EXPORTING
        TABNAME        = ‘Z_EXTEN’
      TABLES
        DFIES_TAB      = LT_DFIES
      EXCEPTIONS
        NOT_FOUND      = 1
        INTERNAL_ERROR = 2
        OTHERS         = 3.
    ENDIF.

*& 将增强表结构中的数据放入按表结构创建的指针
    AT NEW STRUCTURE.
      CREATE DATA L_REF TYPE (WA_EXTENSION-STRUCTURE).
      ASSIGN L_REF->* TO <L_STRUC>.
    ENDAT.
    CONCATENATE WA_EXTENSION-VALUEPART1 WA_EXTENSION-VALUEPART2
    WA_EXTENSION-VALUEPART3 WA_EXTENSION-VALUEPART4
    INTO EXT_VALUE.
    MOVE EXT_VALUE TO <L_STRUC>.

*& 根据增强数据的输入情况进行替代处理
    ASSIGN COMPONENT ‘POSNR’ OF STRUCTURE <L_STRUC> TO <L_FIELD>.
    IF SY-SUBRC = 0.
      READ TABLE C_ACCIT INTO WA_ACCIT WITH KEY POSNR = <L_FIELD>.
      IF SY-SUBRC = 0.
        L_TABIX = SY-TABIX.

        DO 100 TIMES.
          CHECK SY-INDEX > 1.
          ASSIGN COMPONENT SY-INDEX OF STRUCTURE <L_STRUC> TO <L_EXTEN>.
          IF SY-SUBRC NE 0.
            EXIT.
          ENDIF.

          IF <L_EXTEN> NE SPACE.
            READ TABLE LT_DFIES INTO LS_DFIES INDEX SY-INDEX.
            IF SY-SUBRC = 0.
              CONCATENATE ‘WA_ACCIT-’ LS_DFIES-FIELDNAME INTO L_FLDNAME.
              CONDENSE L_FLDNAME NO-GAPS.
              ASSIGN (L_FLDNAME) TO <L_ACCIT>.
              IF SY-SUBRC = 0.
                <L_ACCIT> = <L_EXTEN>.
              ENDIF.

            ENDIF.
          ENDIF.

        ENDDO.

        MODIFY C_ACCIT FROM WA_ACCIT INDEX L_TABIX.
      ENDIF.

      UNASSIGN: <L_FIELD>.
    ENDIF.
  ENDLOOP.

此处理方式中,你可任意在Z_EXTEN结构中添加任意字段,并且无需调整增强代码的处理。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多