大家都知道,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结构中添加任意字段,并且无需调整增强代码的处理。