ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SAP资产报废BAPI_ASSET_RETIREMENT_POST实战

SAP资产报废BAPI_ASSET_RETIREMENT_POST实战 做SAP FI-AA运维、写财务接口的同学多少都遇到过这类需求资产管理部门在OA里点了报废审批一通过就得自动把SAP里的资产做掉或者季度盘点完发现一堆笔记本、叉车、测试机台早该清账财务不想在AS02和ABAVN里一台一台手工点。这时候绕不开一个函数BAPI_ASSET_RETIREMENT_POST也就是固定资产报废的标准BAPI。它属于FI-AA模块的资产凭证类接口能把资产原值、累计折旧、报废损益这一整套账务一次性处理干净还能返回资产凭证号和消息方便接口层判断成败。这篇文章写给三类人看做SAP ABAP接口开发的同学、负责资产模块的财务顾问以及需要把SAP和外围系统OA、资产盘点系统、ERP周边平台打通的项目实施人员。下面从业务逻辑、参数拆解、可直接抄的代码、报错排查到项目落地把BAPI_ASSET_RETIREMENT_POST讲透。1. 固定资产报废在SAP里到底动了哪些数据1.1 一次报废动作背后是一串表在联动很多人以为报废就是给资产打个标记其实FI-AA的报废是一次完整的资产交易过账它会同时写资产模块自己的凭证和FI的会计凭证。资产侧系统会生成资产凭证头ANEK和资产凭证行项目ANEP凭证类型通常是一类资产交易凭证价值字段表ANLC里对应的年度APC原值和累计折旧会被冲减如果涉及时间相关数据比如退役日期、停用日期还会更新到ANLZ。FI侧则通过科目确定规则生成BKPF/BSEG凭证一般是一借一贷甚至多行冲资产原值科目、冲累计折旧科目差额进报废损益科目。这里最关键的一点是差额去哪了。报废的会计后果不是资产原值消失而是资产的账面净值被清理掉净值与处置收入如果有之间的差额计进损益。所以真正决定账务走向的不是BAPI本身而是你在后台配的事务类型和科目确定规则FI-AA里通过AO90维护资产科目确定把资产类别、事务类型、折旧范围映射到具体科目。这也是为什么同样的代码在测试公司代码跑得好好的到生产就报科目找不到——九成是AO90的配置差异。提示动手写接口之前先拿一个真实资产在AW01N资产浏览器里看一遍它的APC、累计折旧、账面净值再手工用ABAVN做一笔报废把产生的资产凭证和FI凭证都看一遍。这一步花半小时比后面调试半天报错划算得多。1.2 手工ABAVN能干的事BAPI不可替代的四个理由手工表演示很直观但我们做接口不可能用BDC去录屏。SAP资产模块本身有ABAVN这个事务码做无收入报废操作界面也友好问题是它依赖屏幕字段顺序一旦系统升级、屏幕增强、字段状态变了BDC脚本就会莫名其妙地跑错甚至跑歪——把别的字段填进去了。LSMW更适合一次性数据迁移不适合线上业务接口。BAPI_ASSET_RETIREMENT_POST的优势在于四点参数结构稳定、返回结构标准、天然支持RFC远程调用、批量处理时事务边界可控。还有一个常被忽略的好处BAPI有标准返回表RETURN结构BAPIRET2里面有消息类型、消息类、消息号、消息变量接口层可以直接把消息落库做日志财务对账时能查到这一笔为什么失败。如果走BDC你只能去翻SAP的会话日志和后置的ALV清单效率完全是两个级别。当然BAPI也不是没有坑它不会自动提交调用完必须显式执行BAPI_TRANSACTION_COMMIT这一点后面会详细说。1.3 资产模块BAPI家族速览别选错函数FI-AA里的BAPI不止一个新人最容易犯的错是拿资产主数据创建的BAPI去做报废或者用资产主数据修改去糊弄价值变更。下面这张表是我平时整理给项目组的贴在工位上很有用函数名典型用途调用类型常见误区BAPI_FIXEDASSET_CREATE1创建资产主数据单结构RETURN只管主数据不产生价值过账BAPI_FIXEDASSET_CHANGE修改资产主数据XXXX_X双结构不传X标记字段不生效BAPI_FIXEDASSET_GETDETAIL读取资产主数据明细查询类读不到资产价值明细价值要看ANLCBAPI_ASSET_RETIREMENT_POST资产报废过账单结构RETURN必须COMMIT否则不落地BAPI_ACC_DOCUMENT_POST通用会计凭证过账单结构行项目表不能替代资产报废会破坏资产子账这张表里最需要注意的是最后一行。有些同学图省事直接用BAPI_ACC_DOCUMENT_POST做一张借累计折旧、贷固定资产的总账凭证账面上看起来平了但资产子账和总账从此对不上年末做资产报表比如资产余额表时资产还在账上FI总账科目余额却已经清零最后只能反冲重做。资产报废必须走资产模块的交易这是原则问题不要绕。2. BAPI_ASSET_RETIREMENT_POST参数拆解与事务类型选择2.1 从SE37看进去参数就四组打开SE37查这个函数你会发现界面不算复杂但不同版本ECC 6.0和S/4HANA各版本签名有细微差别动手前一定要自己核一遍。我按用途分成四组来说明。第一组是资产键值ASSET结构里通常就是三件套COMP_CODE公司代码、ASSET资产号、SUBNUMBER子号。有些版本这里用的是BAPI_FIXEDASSET_OVRTAKE_KEY这个结构字段名和含义完全一样SE37里扫一眼就知道该用哪个。第二组是报废信息ASSETRETIREMENT这是核心结构里面有事务类型、过账日期、凭证日期、过账期间、会计年度、参考凭证号、抬头文本等。第三组是返回参数RETURNBAPIRET2有的是导出参数有的在TABLES里看版本。第四组是EXTENSIONIN/EXTENSIONOUT用于客户自定义字段扩展BAPIPAREX结构如果客户在资产凭证上有自开发增强字段要走接口传值就靠它。参数/结构字段示例说明ASSETCOMP_CODE / ASSET / SUBNUMBER定位到具体资产子号不能漏ASSETRETIREMENTTRANSACTION / POSTING_DATE / PSTNG_PERIOD / FISCAL_YEAR决定账务走向的核心ASSETRETIREMENTDOC_DATE / REF_DOC_NO / TEXT凭证日期、外部参考号、抬头文本RETURNTYPE / ID / NUMBER / MESSAGE / MESSAGE_V1~V4判断成败的唯一依据EXTENSIONINSTRUCTURE / VALUEPART1~4自开发增强字段传值注意PSTNG_PERIOD过账期间是字符型正常月份是001到012特别期间是013到016。很多人从外部系统传数字7过来转成字符就是7而不是007系统会直接报期间无效。这种坑排查起来最耗时间因为报错信息看着像配置问题。2.2 事务类型决定账务走向200、210、300怎么选BAPI本身不决定怎么报废它只负责把你给的事务类型执行掉所以事务类型选错账就做歪了。FI-AA里报废相关的事务类型在后台用AO73维护常用的几个逻辑是这样的200是无收入报废也就是资产直接清理没有处置收入最常见的场景是设备损毁、淘汰、盘亏210是有收入报废会在报废的同时产生处置收入相关的会计处理适合设备卖给二手商、报废品回收有收入的场景300是转移那是资产在公司代码内或跨公司代码转移不属于报废范畴很多人把它和报废混在一起讨论是错的。事务类型中文含义典型场景是否需要对方科目/客户200无收入报废设备损毁、淘汰、无偿清理否差额直接进损益210有收入报废二手变卖、回收残值是涉及收入与往来220/230报废相关变体按客户、按成本中心的特殊处理视配置而定300转移资产在公司代码/成本中心间转移否但目标资产必填选事务类型的时候还有一个隐性条件这个事务类型必须在你这个资产类别上被允许使用。后台是按资产类别配置允许的事务类型范围的配合期间控制键。如果接口传的事务类型在该资产类别下没配BAPI会返回E类消息提示事务类型不允许。遇到这种报错不要去改代码先让顾问去AO73和资产类别配置里核对。2.3 报废金额为什么和财务算的不一样折旧口径问题这是资产报废里最容易被投诉的一个点。假设一台设备的净值财务算出来是12000接口跑完损益却是9500中间差的2500很可能就是当期折旧补提。原因在于报废也是一种资产交易事务类型的期间控制决定这笔交易要不要计算从上次折旧到报废期间的折旧。如果你在报废前没有跑当期折旧AFAB折旧运行系统会在报废时把这段折旧一起补提进去损益自然和手工算的不一致。我的建议是给报废接口加一条前置逻辑或者操作规程报废前先确认当期折旧已过账。实操上有两种做法一种是在月结流程里固定先AFAB再跑报废接口另一种是在接口里做校验读取资产最近一次折旧过账的期间如果早于报废期间就给出警告甚至拒绝。后一种更稳但需要多写一段查询逻辑读ANLC或者折旧过账记录就能判断。至于折旧补提本身合不合规那是财务政策问题系统只是忠实执行你配的期间控制。3. 一份可以直接抄的报废程序3.1 动手前的检查清单在写第一行代码之前我一般会先过一遍下面这张清单能省掉后面80%的联调时间。资产是否存在且已资本化只有主数据没有资本化值的资产报废会报错测试时先用AS03确认资产状态和资本化日期。会计年度是否打开FI-AA有自己的年度控制新年度要用AJRW执行会计年度变更打开年末要用AJAB做结算去年的期间一旦结算就不能再往里过账。FI过账期间是否打开OB52里科目类型A资产的期间必须开着很多人只检查了资产年度忘了OB52。然后是权限跑接口的用户需要有资产模块和FI过账的权限自开发的RFC用户经常漏配。并发控制同一资产不能并发报废BAPI内部会加锁两人同时跑会有一个报资产被用户锁定。测试数据正式环境千万不要用真实资产做试验测试公司代码里造几条干净数据报废完还能用AB08冲销重来。3.2 单笔报废的完整ABAP代码下面这段是我平时用来做技术验证的最小可用版本去掉业务判断之后核心就这么点东西。注意RETURN的判断逻辑只要消息类型是E、A、X就要回滚S类的成功消息不能当成失败W类警告要打日志但不一定回滚这个取决于项目策略我一般让警告也过但记进日志。REPORT zasset_retire_demo. DATA: ls_asset TYPE bapi_fixedasset_key, ls_retire TYPE bapi_fixedasset_retirement, ls_return TYPE bapiret2, lt_return TYPE TABLE OF bapiret2, lv_belnr TYPE anek-belnr, lv_gjahr TYPE anek-gjahr. * 1. 资产键值 ls_asset-comp_code 1000. ls_asset-asset 000000000123. ls_asset-subnumber 0000. * 2. 报废信息 ls_retire-transaction 200. 无收入报废 ls_retire-posting_date sy-datum. ls_retire-doc_date sy-datum. ls_retire-pstng_period 007. 注意三位字符 001~016 ls_retire-fiscal_year 2025. ls_retire-ref_doc_no OA-RETIRE-20250001. ls_retire-text OA报废单 OA-RETIRE-20250001. * 3. 调用BAPI CALL FUNCTION BAPI_ASSET_RETIREMENT_POST EXPORTING asset ls_asset assetretirement ls_retire IMPORTING return ls_return. * 部分版本RETURN在TABLES里按SE37签名调整 APPEND ls_return TO lt_return. * 4. 判断结果并提交 IF ls_return-type CA EAX. CALL FUNCTION BAPI_TRANSACTION_ROLLBACK. WRITE: / 报废失败:, ls_return-message. ELSE. CALL FUNCTION BAPI_TRANSACTION_COMMIT EXPORTING wait X. WRITE: / 报废成功.. ENDIF.代码里有三个细节值得展开说。第一个是wait X。BAPI_TRANSACTION_COMMIT的这个参数控制是否同步等待更新任务SAP LUW执行完毕。批量跑的时候为了性能很多人会把它留空但代价是函数返回时数据可能还没真正写进数据库你紧接着去读ANEK会读不到很容易误判成调用没生效。单笔场景我强烈建议带上wait图省事反而更费事。第二个是返回参数的位置。不同SAP版本里BAPI_ASSET_RETIREMENT_POST的RETURN可能是IMPORTING也可能是TABLES代码里必须按你系统的实际签名写。第三个是资产凭证号。有的版本会在导出参数里直接给你资产凭证号和会计年度有的不给那就要在提交之后用参考凭证号去ANEK/ANEP里反查把凭证号写回自己的接口日志表方便后续对账和冲销。3.3 批量报废提交粒度、锁与日志单笔跑通之后就要考虑批量了一次几十上百台资产的场景很常见。这里第一个决策是提交粒度每笔单独COMMIT还是整个内表跑完统一COMMIT。各有各的账。单笔提交的好处是失败隔离第37笔失败不影响前36笔日志清晰坏处是COMMIT次数多、更新任务多几百笔下去性能会明显下降。统一提交的好处是快坏处是一旦有一笔报错回滚前面全部白做。我的做法是折中按批次提交比如每20到50笔一个SAP LUW同时把每一笔的结果资产号、OA单号、返回消息、凭证号、时间戳写进自建日志表。这样既能控制性能又能保证单笔可追溯。日志表建议加唯一索引在OA单号资产号上顺便实现幂等避免外围系统重试时重复报废。锁的问题也不能忽略。BAPI执行时会锁资产主数据如果批量清单里有重复资产比如同一个资产在两张报废单里出现第二笔必然报锁定。更阴的情况是上一轮跑到一半程序异常退出锁没释放SM12里能看到残留的锁条目。所以批量程序里建议对输入清单先做去重跑之前先查SM12这会省下你很多为什么昨天还能跑今天不行的排查时间。LOOP AT lt_input INTO ls_input. lv_cnt lv_cnt 1. PERFORM call_bapi USING ls_input CHANGING ls_result. APPEND ls_result TO lt_log. IF lv_cnt MOD 20 0 OR lv_cnt lines( lt_input ). PERFORM commit_batch CHANGING lt_log. ENDIF. ENDLOOP. * 提交后统一回写凭证号到日志表避免未提交时读不到ANEK PERFORM write_log TABLES lt_log.实操心得批量程序里先提交再写日志还是先收集再写日志很容易写反。如果日志表用的是普通透明表并在同一LUW里写提交失败会连日志一起回滚出问题时你连失败记录都查不到。稳妥做法是失败信息立刻写日志并单独提交成功信息等主流程提交后再补写凭证号。4. 高频报错排查实录4.1 报错速查表下面这张表是我这几年攒下来的基本覆盖了90%的现场问题。看到报错先去这张表里对多数情况下不需要debug代码。报错关键字常见原因处理动作期间 xx/xxxx 未打开OB52科目类型A期间未开或资产年度未打开检查OB52检查AJRW是否执行会计年度 xxxx 未打开新年度没做AJRW年度变更让顾问执行AJRW资产未资本化 / 无APC资产只有主数据或已被完全报废AS03查状态AW01N看价值事务类型 xx 不允许资产类别未允许该事务类型或未配期间控制AO73核对配置资产被用户 xxx 锁定并发报废或前次调用未提交/异常退出SM12查锁并清理无法确定科目AO90科目确定缺配置或资产类别未分配让顾问补配置没有公司代码 xxx 的权限接口用户缺FI-AA权限对象SU53看具体对象并授权期间不在本会计年度内PSTNG_PERIOD格式错误如传了7而非007代码里做格式化转换4.2 三个看着像灵异事件的问题第一个是BAPI调用成功了但查不到数据。这是最经典的COMMIT问题。BAPI只是把数据组装好并触发更新任务真正的数据库写入发生在COMMIT之后。没COMMIT就退程序更新任务被丢弃数据自然不存在更坑的是如果你在没COMMIT的情况下又调了别的BAPI两个操作共享同一个SAP LUW会出现半成品数据互相影响的情况。记住一条铁律要么COMMIT要么明确ROLLBACK不要悬着。第二个是RETURN里有E但数据其实已经进去了。这种情况通常发生在批量场景前面的调用已经COMMIT成功后面的失败判断取到了累积的返回表比如把每次的return往同一个内表里append没清空于是把历史错误当成当期错误。解决办法是每笔调用前清空返回内表或者严格按消息类型和消息号分类处理。第三个是同一批资产测试环境全过生产环境全错。最常见的原因是配置差异事务类型允许范围、科目确定、期间控制其次是权限差异再次是资产本身的状态差异生产上已经是报废状态、或者资本化日期在未开放的年度。遇到这类问题不要在代码里找原因先在两个环境跑同一段只读的检查逻辑读取资产状态、资本化日期、年度与期间开关把差异点列出来问题一般就自己浮出来了。4.3 报废错了怎么救AB08冲销的正确姿势资产报废过账之后要反悔正确的做法是用AB08冲销资产凭证而不是再去调一次BAPI做反向操作。AB08会冲掉资产凭证和对应的FI凭证冲销后资产回到报废前状态可以重新报废。这里有几个注意点冲销也要求期间打开如果原凭证在已结算的会计年度冲销会被拒绝只能在新年度用其他方式处理如果报废后已经跑过折旧冲销和重新报废之间的折旧差额需要财务确认。接口层面我通常不开放接口冲销的入口而是让财务在SAP里用AB08手工处理接口系统里只做一个作废标记的状态字段。原因很实在冲销涉及金额和期间的判断需要人来做决定全自动化风险太高。如果业务方强烈要求接口冲销那就做一个严格的二次确认流程并且冲销前先把资产凭证号、金额、期间这些信息返回给业务系统展示人工确认后再触发。5. BAPI通用套路从资产报废到采购订单改价格5.1 POST类与CHANGE类接口的差别X结构到底是什么写多了BAPI会发现SAP的接口其实分成两大流派理解这个分类能让你少走很多弯路。POST类是造单型比如BAPI_ASSET_RETIREMENT_POST、BAPI_ACC_DOCUMENT_POST参数是单结构加行项目表你传什么它就按什么处理没传的字段用默认值。CHANGE类是改单型比如BAPI_PO_CHANGE、BAPI_FIXEDASSET_CHANGE参数是双结构一个是值结构一个是同名带X后缀的变更标记结构。对比项POST类如资产报废CHANGE类如PO改价参数形态单结构 行项目表值结构 XX_X标记结构未传字段行为取默认值保持不变不传X永不生效典型代表BAPI_ASSET_RETIREMENT_POSTBAPI_PO_CHANGE新手常见坑忘记COMMIT忘记传X标记X结构的逻辑是声明式增量更新值结构里你填了NET_PRICE但BAPI不看它只有当你同时传了ITEMX-NET_PRICE X时系统才知道哦这个字段本次要改。这是设计上的保守防止接口误改字段但也是新手最常栽的地方——传了半天价格返回成功打开ME23N一看价格纹丝不动。5.2 BAPI_PO_CHANGE改价格的最小写法采购订单价格修改是另一个高频需求热搜里sap bapi采购订单修改价格就是这个场景跟资产报废在套路上一脉相承。下面这段是最小可用代码重点是那两个X标记DATA: ls_headerx TYPE bapimepoheaderx, lt_item TYPE TABLE OF bapimepoitem, lt_itemx TYPE TABLE OF bapimepoitemx, ls_item TYPE bapimepoitem, ls_itemx TYPE bapimepoitemx, lt_return TYPE TABLE OF bapiret2. lv_po 4500001234. * 抬头必须有PO号的X标记否则报采购订单号是必填字段 ls_headerx-po_number X. ls_item-po_item 00010. ls_item-net_price 1250.00. APPEND ls_item TO lt_item. ls_itemx-po_item 00010. ls_itemx-net_price X. 少了这行价格不会变 APPEND ls_itemx TO lt_itemx. CALL FUNCTION BAPI_PO_CHANGE EXPORTING purchaseorder lv_po poheaderx ls_headerx TABLES poitem lt_item poitemx lt_itemx return lt_return. IF line_exists( lt_return[ type E ] ) OR line_exists( lt_return[ type A ] ). CALL FUNCTION BAPI_TRANSACTION_ROLLBACK. ELSE. CALL FUNCTION BAPI_TRANSACTION_COMMIT EXPORTING wait X. ENDIF.这段代码里有三个实战要点。第一PO号的X标记是必填的BAPI_PO_CHANGE在抬头层必须有变更标识才会进入修改逻辑只传purchaseorder参数不传标记经常报字段为必填或者直接不生效。第二如果采购订单的价格来自定价条件比如从采购信息记录带出来的价格直接改NET_PRICE有时会被条件重算覆盖表现是返回成功但价格没变。这种订单你要先改条件或者查清楚价格是手工输入还是条件决定我一般的做法是让业务先在ME23N看看价格的来源再决定走哪种改法。第三改价之后要验证别只看RETURN用BAPI_PO_GETDETAIL或ME23N复核一遍实际生效的价格和条件。5.3 在BAPI外面包一层日志、幂等与重试无论是资产报废还是采购订单改价真正决定项目能不能上线的不是BAPI本身而是外面那层封装。幂等是第一位的外围系统发生网络超时重试时你不能把同一笔报废做两遍。我的做法是在自建表里用业务单号对象标识做主键接口进来先查是否已成功处理已成功的直接返回上次的结果包括凭证号。日志是第二位的每次调用的入参、出参、消息、耗时都要落库出问题的时候这张日志表就是唯一的证据链。重试策略要分类型。像资产被锁定更新任务繁忙这种临时性错误可以自动重试几次像事务类型不允许科目找不到期间未打开这种配置类错误重试一万次也不会成功应该直接进异常队列通知人工。判断依据是消息类型和消息号的组合做的时候可以先按E/A全量记录跑一段时间之后根据实际发生的消息号再做细分不用一开始就设计得很复杂。还有一点容易被忽略COMMIT之后的读操作。BAPI返回的凭证号往往不完整需要在提交后用参考凭证号反查。如果批量程序在COMMIT后立即读ANEK而此时更新任务还在异步执行你可能读到空值。带上wait X能缓解这个问题或者用更新任务的同步等待机制再不行就延后查。这个坑我在一个两百台设备的批量报废项目里踩过当时的日志表里凭证号全是空的财务对账时拿不出凭证最后补跑了一段查询程序才把数据补回来。6. 落在项目里审批流、年结与我的踩坑记录6.1 OA审批流对接报废接口的设计要点真实的报废需求很少是财务在SAP里点一下更多是资产管理部门在OA或者资产管理系统发起申请走完审批流后自动过账。这类接口的设计重点有四个。第一是单号设计把OA单号传到REF_DOC_NO参考凭证号字段这样在ANEK里能通过参考凭证号反查凭证号形成闭环业务人员拿OA单号就能在SAP里查到账务处理结果。第二是异步报废集中在月末和盘点后并发量可能很高接口不要同步阻塞等待收单落库后由后台作业定时处理。第三是组织范围校验接口进来先校验公司代码、资产号、资产类别是否在允许范围内避免OA里选错资产导致SAP里做错账。第四是回写状态报废成功或失败都要把处理结果和资产凭证号回写到OA让业务人员在自己的系统里就能看到结果不用来问财务。这四点做完接口基本就稳了。注意外围系统传资产号的时候要统一格式SAP资产号是带前导零的12位字符主资产号。如果OA里存的是去掉前导零的格式接口层必须做补零处理否则BAPI会报资产不存在。同理子号也要统一成4位。6.2 报废高峰撞上年结AJRW、AJAB和OB52的配合FI-AA的会计年度控制和FI总账是分开的这一点做接口的人必须清楚。AJRW是会计年度变更用来打开新的资产会计年度AJAB是年末结算执行之后上一年的资产数据就锁定了不能再过账OB52控制的是FI过账期间其中科目类型A专门管资产相关科目。这三者要同时对报废才做得进去。实际项目里最典型的事故是1月初做12月的报废资产会计年度已经切到新年度了OB52里上一年的期间也关着接口全量报错。这种时候要提前和财务约定好报废窗口期或者干脆把报废接口设计成按期间参数化调用让财务能指定过账到哪个年度的哪个期间而不是默认取当前日期。另外年结前财务会跑AFAB做折旧跑完之后资产账面净值变化接口如果在此之前缓存了资产价值做校验也会出现对不上的情况。我的习惯是不在接口里做金额校验把金额判断交给财务和报表接口只保证账务处理正确。6.3 几个我踩过的坑和验证套路第一个坑是测试环境用生产数据练手。早期项目里为了图快直接在生产环境拿一台真实设备做报废测试结果资产凭证生成后财务的月度报表出了问题只能用AB08冲销再重跑折旧折腾了一整天。后来我给自己定了死规矩技术验证一律在测试公司代码做生产的第一次运行必须由顾问在场盯着。第二个坑是不检查返回表就直接COMMIT。有个项目的接口代码写成了调用完直接COMMIT然后把返回消息写日志结果一批二十台资产里有三台因为事务类型不允许而失败但因为已经COMMIT失败信息只留在日志里没人看两周后财务报表对不上才发现。从那以后我的代码里永远不会出现不看RETURN就提交的写法。第三个坑是忽略W类警告。BAPI返回的消息里E和A要回滚S是成功W是警告。警告往往意味着账做了但可能不是你要的比如资产已经在报废状态、期间控制配置有点问题。我现在的做法是警告也写日志并且回写业务系统让业务看到处理成功但有提示出了问题追溯起来有依据。验证套路我总结成一句话一看AW01N二查ANEK/ANEP三核FI凭证四比报表。AW01N里看资产的价值变化是否符合预期APC归零、累计折旧冲减、净值清理ANEK/ANEP里确认资产凭证生成FB03里看对应的会计凭证科目和金额是否正确最后和资产余额报表对一下总数。四步都过了这批报废才算真的完成。至于批量处理我还会额外跑一次重复检查把接口日志表和ANEK里的凭证记录做匹配确认没有一笔遗漏、没有一笔重复。
返回列表