You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从@ObjectModel注解生成的BOPF业务对象调用BAPI的惯用方法

在BOPF业务对象中调用BAPI的惯用方式及无数据库表依赖的保存方案

惯用调用方式

在基于@ObjectModel.*注解生成的BOPF业务对象中,调用BAPI的常见实现方式主要有两种:

  • Action触发:Action是BOPF专门用于触发主动业务操作的机制,适合用户手动触发或特定业务流程中调用外部接口的场景。
  • Save Sequence Exit:通过在BO的保存流程中插入自定义Exit,在保存生命周期的特定阶段(如保存前/后)自动调用BAPI,适合与BO保存动作强绑定的场景。

针对你的问题的具体解决思路

你当前用Determination实现的核心问题在于:Determination设计初衷是推导或补充BO节点数据,要求节点必须配置持久化(对应数据库表)才能生效。要绕过数据库表依赖,直接通过BAPI完成数据保存,可按以下步骤操作:

1. 移除不必要的持久化配置

如果之前为了Determination创建了BO节点对应的数据库表,直接修改BO节点配置:

  • 去掉该节点的@ObjectModel.persistence注解,或者将persistence_type设置为NONE,让节点仅作为内存临时数据载体,不落地到数据库。

2. 用Action替代Determination触发BAPI调用

定义一个自定义Action绑定到目标节点,在Action的实现类中完成BAPI调用逻辑:

METHOD if_bopf_action~execute.
  DATA(lo_message_container) = io_read->get_message_container( ).
  DATA(lt_node_data) = io_read->get_node_data( iv_node = gc_node_root ).

  " 1. 从BO节点读取输入数据
  LOOP AT lt_node_data INTO DATA(ls_node_data).
    " 2. 映射BAPI参数
    DATA(ls_bapi_input) = VALUE bapi_structure(
      field1 = ls_node_data-field1
      field2 = ls_node_data-field2
    ).

    " 3. 调用BAPI
    CALL FUNCTION 'BAPI_EXAMPLE_SAVE'
      EXPORTING
        input = ls_bapi_input
      IMPORTING
        return = DATA(ls_return).

    " 4. 处理BAPI返回结果
    IF ls_return-type CA 'EA'.
      " 添加错误消息到BOPF消息容器,终止保存流程
      lo_message_container->add_message(
        iv_msg_type = ls_return-type
        iv_msg_id = ls_return-id
        iv_msg_number = ls_return-number
        iv_msg_v1 = ls_return-message_v1
      ).
      eo_change->set_failed( ).
    ELSE.
      " 可选:更新BO节点状态(如标记为已同步)
      DATA(ls_change) = VALUE #( key = ls_node_data-key field_status = 'SYNCED' ).
      eo_change->modify( iv_node = gc_node_root it_data = VALUE #( ( ls_change ) ) ).
    ENDIF.
  ENDLOOP.
ENDMETHOD.

3. 配置Save Sequence Exit实现自动触发(可选)

如果需要在BO保存时自动调用BAPI,而非手动触发Action,可以在BO的Save Sequence中添加自定义Exit:

  • 在BO Builder中进入「Save Sequence」配置界面;
  • 在合适的阶段(如After Save)添加一个Custom Exit,实现IF_BOPF_SAVE_EXIT接口的EXECUTE方法;
  • 在Exit方法中读取BO数据、调用BAPI并处理结果,逻辑与Action实现类似。

4. 保证事务一致性

BAPI调用通常会触发独立的数据库操作,需确保与BOPF的事务一致:

  • 若BAPI执行失败,调用BAPI_TRANSACTION_ROLLBACK回滚BAPI的操作,同时通过BOPF的消息容器标记保存失败;
  • 若BAPI执行成功,可根据需求调用BAPI_TRANSACTION_COMMIT(部分BAPI会自动提交,需参考BAPI文档)。

注意事项

  • 非持久化节点的数据仅存在于当前会话中,需确保Action/Exit在数据有效时被调用;
  • 务必将BAPI返回的所有消息同步到BOPF的消息容器,让前端能直观看到操作结果;
  • 如果需要持久化少量状态数据(如同步状态),可以单独创建一个轻量的持久化节点,仅存储必要的状态字段,避免冗余表结构。

内容的提问来源于stack exchange,提问作者Michael Koval

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:52:10