ABAP-SD-创建发票-BAPI_BILLINGDOC_CREATEMULTIPLE

本文介绍了一个用于创建发票的ABAP程序片段,通过定义多个数据结构来处理发票创建过程中的各种数据,并调用BAPI_BILLINGDOC_CREATEMULTIPLE函数来实现批量发票的创建。如果创建成功,将返回发票凭证。
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_INVOICE
*&---------------------------------------------------------------------*
*       text 
*----------------------------------------------------------------------*
FORM FRM_CREATE_INVOICE.
  ATA: LS_CREATORDATAIN         TYPE BAPICREATORDATA,
       LT_BILLING TYPE STANDARD TABLE OF BAPIVBRK,
       LT_RETURN1 TYPE STANDARD TABLE OF BAPIRETURN1,
       LT_ERRORS  TYPE STANDARD TABLE OF BAPIVBRKERRORS,
       LT_SUCCESS TYPE STANDARD TABLE OF BAPIVBRKSUCCESS,
       LS_BILLING TYPE BAPIVBRK,
       LS_RETURN1 TYPE BAPIRETURN1,
       LS_ERRORS  TYPE BAPIVBRKERRORS,
       LS_SUCCESS TYPE BAPIVBRKSUCCESS.

*创建发票
  LS_CREATORDATAIN-CREATED_BY = SY-UNAME.
  LS_CREATORDATAIN-CREATED_ON = '20190108'.

  LS_BILLING-REF_DOC    = CS_OUTTAB-VBELN.
  LS_BILLING-BILL_DATE  =  '20190131'.
  LS_BILLING-REF_DOC_CA = 'K'. " 'L'.
  LS_BILLING-COSTCENTER = P_KOSTL.    " 成本中心 K时
  APPEND LS_BILLING TO LT_BILLING.
  
  CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE'
*      exporting
*        creatordatain = ls_creatordatain
    TABLES
      BILLINGDATAIN = LT_BILLING
      ERRORS        = LT_ERRORS
      RETURN        = LT_RETURN1
      SUCCESS       = LT_SUCCESS.
  IF LT_SUCCESS[] IS NOT INITIAL.
    READ TABLE LT_SUCCESS INTO LS_SUCCESS INDEX 1.
    IF SY-SUBRC EQ 0.
      CS_OUTTAB-VBELF = LS_SUCCESS-BILL_DOC."发票凭证
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
      LOOP AT LT_RETURN1 INTO LS_RETURN1 WHERE TYPE = 'E' .
        CS_OUTTAB-MESSAGE = LS_RETURN1-MESSAGE.
        EXIT.
      ENDLOOP.
    ENDIF.
  ELSE.
    CLEAR CS_OUTTAB-MESSAGE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    LOOP AT LT_ERRORS INTO LS_ERRORS WHERE TYPE = 'E' OR TYPE = 'A'.
      CONCATENATE CS_OUTTAB-MESSAGE LS_ERRORS-MESSAGE INTO CS_OUTTAB-MESSAGE.
      CLEAR LS_ERRORS.
    ENDLOOP.
  ENDIF.
  
ENDFORM.                    "FRM_CREATE_INVOICE

 

<think>好的,我现在需要帮助用户解决在并发场景下使用BAPI_BILLINGDOC_CREATEMULTIPLE时可能遇到的问题。首先,我应该回顾用户提供的信息和之前的引用内容,确保理解问题的背景。 用户提到在使用BAPI_BILLINGDOC_CREATEMULTIPLE创建发票时,即使在调用BAPI_TRANSACTION_COMMIT后,有时提交不成功。特别是在并发情况下,这可能涉及到数据库锁、事务处理或者接口本身的限制。用户希望得到解决方案,确保在高并发时能够正确处理。 首先,我应该考虑并发操作中常见的问题,比如数据库锁冲突。SAP系统中,当多个事务同时操作同一数据时,可能会发生锁等待或死锁。引用3提到,即使提交了事务,也可能需要检查VBRK表确认发票是否生成,这说明可能存在延迟或锁问题。 接下来,我需要整理可能的解决方案。根据SAP BAPI的最佳实践,处理并发问题通常包括以下几个步骤: 1. **事务隔离与锁管理**:确保每个BAPI调用在独立的事务中执行,避免长时间持有锁。可能需要在调用BAPI后立即提交事务,减少锁的持有时间。 2. **重试机制**:当检测到锁冲突时,可以加入等待和重试的逻辑。例如,捕获特定的错误消息,等待几秒后重试操作,引用3提到使用WAIT UP TO X SECONDS,这可以作为参考。 3. **队列处理**:对于高并发请求,使用队列系统按顺序处理请求,避免同时竞争同一资源。这可能需要外部工具或ABAP程序实现队列管理。 4. **数据库优化**:检查数据库参数,调整锁超时时间,优化表性能,减少锁冲突的可能性。例如,调整enque/process的配置。 5. **异步处理**:将发票创建任务转为后台作业,分散负载。使用SM36/SM37安排作业,避免高峰时段的并发压力。 6. **状态检查与补偿机制**:在提交后主动查询VBRK表,确认发票生成。如果失败,记录日志并触发补偿流程,比如重新提交或通知管理员。 另外,用户提供的引用2中有数据结构示例,可能需要确保在并发处理时,每个BAPI调用的参数独立,避免数据交叉污染。比如,确保LT_BILL和LT_RETURN等内表在每个会话中是独立的。 还需要考虑BAPI本身的限制,是否有最大并发数的限制,或者是否需要使用BAPI的扩展参数来控制并发。例如,某些BAPI可能需要设置特定的标志来允许并行处理。 测试也是关键的一环。建议用户在测试环境中模拟高并发场景,使用事务SM12监控锁情况,ST22查看ABAP Dump,以及ST01进行跟踪,找出具体的冲突点。 最后,综合以上思路,整理出结构化的解决方案,分点说明,并附上相关代码示例,比如重试循环和队列处理的伪代码,帮助用户具体实施。</think>针对BAPI_BILLINGDOC_CREATEMULTIPLE在并发场景下的问题,以下是分步解决方案: ### 1. 事务隔离与锁管理 - **独立事务处理**:每个发票创建请求应包裹在独立事务中,防止锁扩散 - **立即提交**:调用BAPI后立即执行`BAPI_TRANSACTION_COMMIT`并清空内表 ```abap CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE' EXPORTING objs_type = 'VBRK' TABLES billingdoc = lt_bill return = lt_return success = lt_success. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true. ``` [^3] ### 2. 重试机制实现 - **捕获锁错误**:当发生`SY-SUBRC = 12`(锁冲突)时自动重试 - **指数退避策略**:每次重试间隔时间递增(示例最大重试3次) ```abap DATA: lv_retry TYPE i VALUE 0. DO 3 TIMES. PERFORM create_billing_doc. IF sy-subrc = 0. EXIT. ELSEIF sy-msgid = '00' AND sy-msgno = '123'. "锁错误判断 WAIT UP TO ( 2 ** lv_retry ) SECONDS. lv_retry = lv_retry + 1. ELSE. EXIT. ENDIF. ENDDO. ``` ### 3. 异步队列处理 - **RFC队列化**:使用`RFC BACKGROUND TASK`实现异步调用 - **并行度控制**:通过参数`SPOOLID`限制并发进程数 ```abap CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE' DESTINATION 'NONE' BACKGROUND TASK 'INVOICE_CREATE' PERFORMING return_callback ON END OF TASK EXPORTING objs_type = 'VBRK' TABLES billingdoc = lt_bill return = lt_return success = lt_success. ``` ### 4. 数据库层优化 - **锁超时调整**:通过事务DB13调整`enque/process`参数 - **表缓存设置**:使用事务SE11为VBRK表启用缓冲(需评估业务场景) ### 5. 状态验证机制 - **双重确认**:提交后立即查询VBRK表验证结果 ```abap SELECT SINGLE vbeln FROM vbrk INTO @DATA(lv_vbeln) WHERE vbeln = @ls_success-bill_doc. IF sy-subrc <> 0. PERFORM error_handling. ENDIF. ``` ### 6. 并发监控建议 - **事务监控**:使用SM12检查锁对象`E_BILLINGDOC` - **性能分析**:通过STAD跟踪响应时间分布 - **错误跟踪**:使用ST22查看ABAP Dump详情
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值