bapi BAPI_ASSET_RETIREMENT_POST 可实现ABAVN固定资产的报废,具体实现方式可参考
http://www.baidusap.com/abap/bapi/7284>
这里不再赘述。但这个bapi只能实现一个资产号报废后生成一个会计凭证号,无法批量处理多重资产的报废(多个资产号同时报废后最后只生成一个会计凭证号)。查了许多资料,在网上并没有找到关于多重资产批量报废的bapi。这时候就需要通过ABAVN前台去跟一下标准代码,将标准代码的实现方式copy出来即可。
在ABAVN 前台找到事物代码对应存储的包
SE80 在AB包中>业务工程>业务对象类型>固定资产 ,双击,
找到方法中关于资产报废的方法描述,双击,找到对应的函数模块
在该函数中打上断点,前台abavn 输入数据后/h进去前台调试,发现可以进行该函数的断点处,一步步debug,前台的输入数据都传入该函数AMDP_BAPI_CALL_ON_TRANSACTION中
查看执行多重资产报废的时候,系统给哪些参数赋值,赋的固定值由哪些参数承接,动态变更的资产号传到哪里
debug后发现函数AMDP_BAPI_CALL_ON_TRANSACTION只是在校验前台输入的数据能否报废,如果不能报废该函数会带出相应的消息提示 ,如果能报废成功,执行报废的这一操作则是在函数AMDP_USER_COMMAND_PROCESS 中实现的
最后将整理后的代码贴上,根据这些代码就可以像前台一样实现多重资产的批量报废了
DATA:wa_ge TYPE bapifapo_gen_info, "会计记帐:资产事务
wa_re TYPE bapifapo_ret, "固定资产记帐购置
wa_fu TYPE bapifapo_add_info, "会计记帐:资产事务部分结构3
wa_return TYPE bapiret2. "返回的消息
DATA:BEGIN OF i_list1 OCCURS 0,
bukrs LIKE anlc-bukrs, "公司代码
anln1 LIKE anlc-anln1, "资产编号
END OF i_list1.
DATA c_raifp1 LIKE raifp1. "资产会计:过帐表头输入字段
DATA:lf_txnok.
DATA:t_raifp2 LIKE TABLE OF raifp2 WITH HEADER LINE. "资产会计:过帐输入字段
DATA t_raifp3 LIKE TABLE OF raifp3 WITH HEADER LINE.
DATA e_fcode LIKE sy-ucomm.
DATA: lt_bapiret2 LIKE bapiret2 OCCURS 0 WITH HEADER LINE.
DATA: lt_acchd LIKE acchd OCCURS 0 WITH HEADER LINE.
DATA: lt_accit LIKE accit OCCURS 0 WITH HEADER LINE.
DATA: lt_acccr LIKE acccr OCCURS 0 WITH HEADER LINE.
DATA: lt_accda LIKE accda OCCURS 0 WITH HEADER LINE.
DATA: ld_awref LIKE anek-belnr.
DATA: ld_awtyp LIKE anek-awtyp.
DATA: ld_aworg LIKE anek-aworg.
DATA: ld_awsys LIKE anek-awsys.
e_fcode = 'SAVE'.
DATA: t_return LIKE bapiret2 OCCURS 0 WITH HEADER LINE.
c_raifp1-gsvor = 'ABGA'.
c_raifp1-vorgn = 'ABAV'.
c_raifp1-bzdat = i_date. "资产价值日
c_raifp1-budat = i_date. "凭证中的过帐日期
c_raifp1-bldat = i_date. "凭证中的凭证日期
IF i_list[] IS NOT INITIAL.
LOOP AT i_list.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = i_list-anln1
IMPORTING
output = i_list-anln1.
CLEAR t_raifp3.
t_raifp2-bukrs = i_bukrs. "公司代码
t_raifp2-anln1 = i_list-anln1. "资产编号
t_raifp2-xvabg = 'X'. "全部报废标识
t_raifp2-sgtxt = i_list-sgtxt. "项目文本
APPEND t_raifp2.
MODIFY i_list.
CLEAR i_list.
ENDLOOP.
ENDIF.
SELECT SINGLE waers INTO c_raifp1-waers FROM t001 WHERE bukrs = i_bukrs.
CALL FUNCTION 'AMDP_BAPI_CALL_ON_TRANSACTION'
EXPORTING
i_raifp1 = c_raifp1
IMPORTING
e_txnok = lf_txnok
TABLES
t_raifp2 = t_raifp2
t_raifp3 = t_raifp3
t_return = t_return
CHANGING
c_fcode = e_fcode.
IF lf_txnok IS INITIAL.
LOOP AT t_return.
READ TABLE i_list WITH KEY anln1 = t_return-message_v1.
IF sy-subrc = 0.
i_list-msg = t_return-message.
MODIFY i_list TRANSPORTING msg WHERE anln1 = t_return-message_v1.
ENDIF.
ENDLOOP.
o_msg = '报废失败,请查看具体报错信息'.
RETURN.
ENDIF.
CALL FUNCTION 'ACC5_RETURN_APPEND_OR_CHECK'
EXPORTING
i_refresh_return = 'X'.
CALL FUNCTION 'AMBU_CALL_AC_DOCUMENT_CHECK'
TABLES
t_acchd = lt_acchd
t_accit = lt_accit
t_acccr = lt_acccr
t_accda = lt_accda
t_return = lt_bapiret2.
* im RWIN aufgetretene Fehler bzw. Erfolgsmeldung ausgeben
CALL FUNCTION 'AMDP_MESSAGE_SEND'
TABLES
t_return = lt_bapiret2
CHANGING
c_fcode = e_fcode "<0584750
EXCEPTIONS
OTHERS = 4.
* RWIN zwecks Verbuchung aufrufen
CHECK sy-subrc = 0.
CALL FUNCTION 'ACC5_RETURN_APPEND_OR_CHECK'
EXPORTING
i_refresh_return = 'X'.
CALL FUNCTION 'AMBU_CALL_AC_DOCUMENT_POST'
IMPORTING
e_awref = ld_awref
e_aworg = ld_aworg
e_awtyp = ld_awtyp
e_awsys = ld_awsys
TABLES
t_acchd = lt_acchd
t_accit = lt_accit
t_acccr = lt_acccr
t_accda = lt_accda
t_return = lt_bapiret2.
READ TABLE lt_bapiret2 WITH KEY type = 'E'.
IF sy-subrc = 0.
o_msg = lt_bapiret2-message.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
READ TABLE lt_bapiret2 WITH KEY type = 'S' id = 'AA'.
IF sy-subrc = 0.
CONCATENATE '报废成功:' lt_bapiret2-message INTO o_msg.
ENDIF.
ENDIF.
这个方法也是自己凭感觉研究出来,如果有大佬有更好的实现多重资产批量报废的方式,请多指教。