在 SAP 固定资产管理(FI-AA)模块里,“固定资产报废” 是很常见的业务 —— 比如旧电脑用坏了、机器设备淘汰了,都需要在系统里做报废操作,让资产从 “在用” 状态转为 “报废”,同时生成对应的会计凭证(比如冲减资产价值、记录清理费用)。
很多新手可能会想:直接改资产表行不行?当然不行!SAP 里改表容易导致数据乱套,比如资产价值和财务凭证对不上。正确的做法是用 SAP 标准 BAPI——BAPI_ASSET_RETIREMENT_POST,它能自动处理资产状态变更和会计凭证生成,还会做各种校验(比如资产是否存在、报废日期是否合法)。
今天就用一段实际项目代码,带你一步步搞懂 “固定资产报废 BAPI” 怎么用,全程大白话,小白也能看明白!
一、先搞懂:这段代码是干嘛的?
简单说,这段代码的核心功能是:根据用户输入的参数(比如公司代码、资产号、报废日期),调用 BAPI 把指定的固定资产做报废处理,成功后生成会计凭证,失败了就回滚操作。
适用场景也很明确:
- 单个固定资产报废(比如财务人员手动录入资产号做报废);
- 批量报废的基础(比如后续加个循环,就能一次处理多个资产);
- 自定义报废报表(比如做个界面让用户选资产,点个按钮就完成报废)。
二、代码拆解:从 “定义变量” 到 “调用 BAPI”
代码总共分 3 步:定义变量→给变量赋值(填报废信息)→调用 BAPI + 处理结果。咱们一步一步来,每个地方都讲清楚 “为什么这么写”。
第一步:定义变量 —— 告诉系统 “要存哪些数据”
就像你收拾东西前要准备好各种盒子,这里 “变量” 就是装数据的 “盒子”,而且每个盒子只能装对应类型的数据(比如 “装报废日期的盒子” 不能装资产号)。
* 定义BAPI需要的各种“数据盒子”
DATA:
"1. 通用过账数据盒子:存报废的基础信息(比如谁操作的、哪个公司的资产)
ls_generalpostingdata TYPE bapifapo_gen_info,
"2. 报废数据盒子:存报废的关键参数(比如是不是全量报废、报废日期)
ls_retirementdata TYPE bapifapo_ret,
"3. 凭证参考盒子:存BAPI返回的会计凭证号(报废成功后会生成这个)
ls_doc TYPE bapifapo_doc_ref,
"4. 返回消息盒子:存BAPI的执行结果(成功/失败,失败原因是什么)
ls_return TYPE bapiret2,
"5. 附加过账数据盒子:存额外信息(比如报废凭证的抬头文本)
ls_furtherpostingdata TYPE bapifapo_add_info.
这里要注意:这些 “盒子”(变量)的类型都是 BAPI 自带的标准类型(比如bapifapo_gen_info),不是随便定义的 ——SAP 已经把报废需要的字段都整理好放在这些类型里了,咱们直接用就行,不用自己造。
第二步:给变量赋值 —— 填好 “报废的具体信息”
定义好 “盒子” 后,就要往里面填数据了。这些数据要么是用户输入的(比如报废日期、资产号),要么是根据业务逻辑判断出来的(比如 “当年报废” 还是 “往年报废”)。
先解释下代码里的 “变量符号”:
p_deakt:用户输入的 “报废日期”(比如 20240830,格式是 YYYYMMDD);p_bukrs:用户输入的 “公司代码”(比如 1000,代表某个子公司);p_rldnr:用户输入的 “主资产号”(比如 10000001,要报废的资产编号);c_alv-zujhr:资产的 “购置年份”(从资产主数据里取的,比如 2023 代表 2023 年买的);sy-uname:当前登录用户(比如张三登录的,就自动填张三的账号);sy-datum:系统当前日期(比如今天是 20240830,这个值就是 20240830)。
1. 填 “通用过账数据”—— 报废的基础信息
* 1. 给“通用过账数据盒子”填信息
ls_generalpostingdata-username = sy-uname. "操作人:当前登录用户(自动填,不用手动输)
ls_generalpostingdata-doc_date = p_deakt. "凭证日期:用用户输入的报废日期(比如20240830)
ls_generalpostingdata-pstng_date = p_deakt. "过账日期:也用报废日期(和凭证日期保持一致,避免混乱)
ls_generalpostingdata-fis_period = p_deakt+4(2). "会计期间:从报废日期里拆出来(比如20240830,拆第5-6位是“08”,代表8月)
ls_generalpostingdata-trans_date = p_deakt. "换算日期:用报废日期(主要是外币资产用,人民币资产填这个就行)
ls_generalpostingdata-comp_code = p_bukrs. "公司代码:用户输入的(比如1000,确保报废的是这个公司的资产)
ls_generalpostingdata-assetmaino = p_rldnr. "主资产号:用户输入的(比如10000001,要报废的资产)
ls_generalpostingdata-assetsubno = '0000'. "资产次级编号:填0000(大部分资产没有子编号,默认用这个)
这里有个关键逻辑:判断是 “当年报废” 还是 “往年报废”,选不同的 “资产交易类型”——SAP 里用 “交易类型” 区分不同的资产操作,比如 “250” 代表 “当年购置资产的报废”,“200” 代表 “往年购置资产的报废”,这个是 SAP 的标准配置,不能乱填。
* 判断资产购置年份,选对应的交易类型
IF p_deakt = sy-datum+0(4). "如果资产是今年买的(购置年份=当前年份,比如2024)
ls_generalpostingdata-assettrtyp = '250'. "选交易类型250(当年报废)
ELSE. "如果是往年买的(比如2023年买的,今年报废)
ls_generalpostingdata-assettrtyp = '200'. "选交易类型200(往年报废)
ENDIF.
2. 填 “报废数据”—— 怎么报废?
这里主要填 “是不是全量报废”“报废日期” 这些关键信息。比如电脑报废肯定是整个报废,不会只报废一半,所以 “全量报废” 要打勾(填 'X')。
* 2. 给“报废数据盒子”填信息
* ls_retirementdata-quantity = c_alv-menge. "报废数量:注释掉了,默认1个(比如1台电脑)
ls_retirementdata-valuedate = p_deakt. "参考日期:用报废日期(和过账日期一致)
ls_retirementdata-compl_ret = 'X'. "全量报废:填'X'代表整个资产报废(大部分场景用这个)
* ls_retirementdata-base_uom = c_alv-meins. "单位:注释掉了,默认个/台(资产主数据里有)
如果是 “部分报废”(比如一批机器报废 2 台,总共 5 台),就需要把注释的 “数量” 和 “单位” 打开,填具体的数量(比如 2)和单位(比如台)。
3. 填 “附加过账数据”—— 给凭证加个备注
报废后会生成会计凭证,这里可以给凭证加个 “抬头文本”,方便后续查凭证时知道 “这张凭证是干嘛的”(比如填 “测试固定资产报废”,一看就知道是测试用的)。
* 3. 给“附加过账数据盒子”填信息
ls_furtherpostingdata-header_txt = '测试测试'. "凭证抬头文本:填业务相关的描述
第三步:调用 BAPI—— 执行报废,处理结果
填好所有信息后,就该让 BAPI 干活了。调用 BAPI 后,一定要判断 “成功还是失败”:成功了就提交事务(让报废生效),失败了就回滚(撤销操作,避免数据错)。
* 调用BAPI执行固定资产报废
CALL FUNCTION 'BAPI_ASSET_RETIREMENT_POST'
EXPORTING
"把刚才填好的3个数据盒子传给BAPI
generalpostingdata = ls_generalpostingdata "通用过账数据
retirementdata = ls_retirementdata "报废数据
furtherpostingdata = ls_furtherpostingdata "附加过账数据
IMPORTING
documentreference = ls_doc "BAPI返回的凭证信息(里面有凭证号)
return = ls_return. "BAPI返回的结果(成功/失败)
调用完 BAPI,接下来处理结果:
情况 1:报废成功(BAPI 返回 'S')
如果成功,要调用BAPI_TRANSACTION_COMMIT提交事务(这步很关键!不提交的话,报废只是 “临时的”,没真正存在系统里),还能拿到生成的会计凭证号。
IF ls_return-type = 'S'. "判断:BAPI返回'S'代表成功
"提交事务,让报废真正生效
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'. "填'X'代表等提交完再继续,避免后续操作拿不到凭证号
"判断:如果是AA类消息374,说明凭证号已生成(AA是固定资产模块的消息类,374是“报废凭证生成”的消息号)
IF ls_return-number = '374' AND ls_return-id = 'AA'.
WRITE:ls_return-message_v2 . "输出凭证号(message_v2里存的是凭证号)
" c_alv-xblnr = ls_return-message_v2. "注释掉的:把凭证号存到ALV报表里,方便用户看
" c_alv-done = 'X'. "注释掉的:标记“这个资产已经报废成功”
ENDIF.
" c_alv-light = icon_green_light. "注释掉的:ALV里显示绿灯,代表成功
" c_alv-msg = ls_return-message. "注释掉的:显示成功消息
情况 2:报废失败(BAPI 返回 'E'/'A')
如果失败(比如资产号不存在、报废日期非法),就要调用BAPI_TRANSACTION_ROLLBACK回滚操作,然后把失败原因输出来,方便排查问题。
ELSE. "BAPI返回不是'S'(比如'E'是错误,'A'是终止),代表报废失败
"回滚操作,撤销所有临时修改
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
WRITE:ls_return-message. "输出失败原因(比如“资产10000001在公司代码1000下不存在”)
" c_alv-light = icon_red_light. "注释掉的:ALV里显示红灯,代表失败
" c_alv-msg = ls_return-message. "注释掉的:显示失败消息
ENDIF.
三、新手必看:这些坑别踩!
-
“资产交易类型” 不能乱填
当年报废用 250、往年报废用 200,这是 SAP 标准配置,填错了会导致 “报废后资产价值算错”。如果不知道填什么,可在 SAP 里查 “资产交易类型配置”(事务码 AO73)。 -
“次级编号” 默认填 '0000'
大部分固定资产没有 “次级编号”(比如一台电脑就是一个主资产号,没有子编号),所以填 '0000' 就行。如果有次级编号(比如一套设备分多个子部件),再填具体的编号(比如 0001)。 -
必须调用 “提交 / 回滚”
成功了一定要用BAPI_TRANSACTION_COMMIT提交,失败了一定要用BAPI_TRANSACTION_ROLLBACK回滚 —— 不然要么报废没生效,要么数据乱掉。 -
日期格式要对
不管是doc_date(凭证日期)还是pstng_date(过账日期),都要填 “YYYYMMDD” 格式(比如 20240830),不能填 “2024-08-30” 或者 “08302024”,不然 BAPI 会报错 “日期格式非法”。 -
查结果的小技巧
报废成功后,除了代码里输出凭证号,还能在 SAP 里用事务码AW01N查资产价值(看资产是不是已经 “报废”),用FB03查生成的会计凭证(看凭证是不是对的)。
四、总结:报废 BAPI 的核心逻辑
其实整个过程很简单,就像你去行政部报废旧电脑:
- 准备资料(填公司、资产号、报废日期)—— 对应 “定义变量 + 赋值”;
- 提交申请(把资料交给行政)—— 对应 “调用 BAPI”;
- 确认结果(成功拿凭证,失败改资料)—— 对应 “处理 BAPI 返回结果”。
这个代码不仅能处理单个资产报废,稍微改改就能做 “批量报废”(比如加个LOOP循环,一次读多个资产号,逐个调用 BAPI)。新手可以先拿这个代码在测试环境试试,改改参数(比如换个资产号、报废日期),看看成功和失败的情况,很快就能掌握!
如果遇到报错,别慌 —— 看ls_return-message里的提示(比如 “资产不存在” 就去查资产号对不对,“日期非法” 就检查日期格式),大部分问题都能通过提示解决~
资产报废T-CODE:ABAVN
2550

被折叠的 条评论
为什么被折叠?



