ABAP 使用BAPI批量修改销售订单增强字段

我在vbap表添加了两个增强字段ZYJHSL,ZYKPSLE,要通过bapi去批量修改这两个字段。

1.首先扩展结构

这里列出了需要扩展的结构。

抬头扩展:VBAKKOZ、VBAKKOZX、BAPE_VBAK、BAPE_VBAKX

行项目扩展:VBAPKOZ,VBAPKOZX,BAPE_VBAP,BAPE_VBAPX

计划化扩展:VBEPKOZ、VBEPKOZX、BAPE_VBEP、BAPE_VBEPX

我这里需要扩张行项目,参照类型为char,长度和增强字段相同

名称与增强字段相同,长度为CHAR1.

扩展BAPE_VBAP,字段名称和字段类型与增强字段相同

名称和增强字段相同,长度为1位。

2.代码实现

对变量进行声明

REPORT  ztes03.
TYPE-POOLS: ckmpr .
DATA: order_header_inx LIKE bapisdh1x,
      schedule_lines   LIKE bapischdl  OCCURS 0 WITH HEADER LINE,
      schedule_linesx  LIKE bapischdlx OCCURS 0 WITH HEADER LINE,
      order_item_in    LIKE bapisditm  OCCURS 0 WITH HEADER LINE,
      order_item_inx   LIKE bapisditmx OCCURS 0 WITH HEADER LINE,
      return           LIKE bapiret2   OCCURS 0 WITH HEADER LINE.

DATA: lwa_bape_vbak      TYPE bape_vbak,
      lwa_bape_vbakx     TYPE bape_vbakx,
      lwa_bape_vbap      TYPE bape_vbap,
      lwa_bape_vbapx     TYPE bape_vbapx,

      lwa_valuepart(240),
      lit_parex          LIKE TABLE OF bapiparex   WITH HEADER LINE.

DATA: BEGIN OF it_tab OCCURS 0,
        vbeln TYPE vbeln,
        posnr TYPE posnr,
        etenr TYPE etenr,
        lifsp TYPE lifsp_ep,
      END OF it_tab.
DATA:l_c1(6) TYPE c.
DATA: r_vbeln LIKE vbap-vbeln,
      r_posnr LIKE vbap-posnr.
FIELD-SYMBOLS:<fs_x_vbap>     TYPE x,<fs_c_vbap> TYPE c."抬头
FIELD-SYMBOLS:<fs_x_vbapx>     TYPE x,<fs_c_vbapx> TYPE c."抬头
r_vbeln = '1000042734'.
r_posnr ='000010'.
order_header_inx-updateflag = 'U'.  “更新标记
"行项目
CLEAR: order_item_in,order_item_inx.
order_item_in-itm_number = r_posnr.
APPEND order_item_in.
order_item_inx-itm_number = r_posnr.
order_item_inx-updateflag = 'U'.
APPEND order_item_inx.
"要修改的增强字段
CLEAR: lwa_bape_vbap,lit_parex.
lwa_bape_vbap-vbeln = r_vbeln.
lwa_bape_vbap-posnr = r_posnr.
lwa_bape_vbap-zykpsle = 35.
ASSIGN lwa_bape_vbap TO <fs_x_vbap> CASTING.”先强制转换为X类型
ASSIGN <fs_x_vbap> TO <fs_c_vbap> CASTING.”再强制转换为C类型,否则报错,修改不成功
lit_parex+30 = <fs_c_vbap>.
lit_parex-structure = 'BAPE_VBAP'.”指定结构

APPEND lit_parex.
CLEAR:lit_parex.
*lwa_bape_vbapx-vbeln = r_vbeln.
lwa_bape_vbapx-posnr = r_posnr.
"lwa_bape_vbapx-zyjhsl = 'X' .
lwa_bape_vbapx-zykpsle = 'X' .
ASSIGN lwa_bape_vbapx TO <fs_x_vbapx> CASTING.”同样进行强制转换
ASSIGN <fs_x_vbapx> TO <fs_c_vbapx> CASTING.
lit_parex-structure = 'BAPE_VBAPX'.”指定结构名称
lit_parex+30 = <fs_c_vbapx>.
APPEND lit_parex.
CLEAR:lit_parex.

CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
  EXPORTING
    salesdocument    = r_vbeln
    order_header_inx = order_header_inx
  TABLES
    return           = return
    order_item_in    = order_item_in
    order_item_inx   = order_item_inx
    extensionin      = lit_parex[].”增强对应的传入结构
READ TABLE return WITH KEY type = 'E'.
IF sy-subrc <> 0.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.
  "保存日期
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.

<think>我们正在讨论ABAP使用BAPI批量创建WBS元素的方法。根据引用内容,我们知道在创建WBS时,增强点PROJECTDEF_UPDATE可以在前后台创建时都进行校验,这很重要。另外,引用[2]提到了复制标准项目模板实现项目立项,但用户的问题焦点在批量创建WBS上。 开发步骤: 1. 准备数据:定义内表,填充多个WBS元素的数据。 2. 调用批量BAPI使用BAPI_BUS2054_CREATE_MULTI。 3. 错误处理:检查返回消息,如果有错误则回滚,否则提交。 4. 增强考虑:如果需要校验,可以在增强点PROJECTDEF_UPDATE中实现,但注意批量操作时,增强点可能会被多次调用(每个WBS元素一次)。 注意:批量创建时,每个WBS元素的数据结构应与单个创建时相同。同时,要确保权限、公司代码等字段正确。 代码示例:</think>### ABAP使用BAPI批量创建WBS的开发方法 以下基于SAP标准BAPI和最佳实践,详细说明批量创建WBS元素的开发流程: #### 一、核心开发步骤 1. **数据准备** 定义批量创建所需的内表结构: ```abap DATA: lt_wbs_data TYPE TABLE OF bapi_wbs_elements, lt_return TYPE TABLE OF bapiret2, lt_extension TYPE TABLE OF bapiparex. " 用于增强字段 ``` 2. **填充批量数据** 循环填充WBS元素信息,支持自定义字段: ```abap LOOP AT it_source_data ASSIGNING FIELD-SYMBOL(<fs_data>). APPEND VALUE #( wbs_element = |{ <fs_data>-project_id }_SO_{ sy-datum }| " WBS编码规则 description = <fs_data>-project_name " 描述 plant = '1000' " 工厂 user_field1 = <fs_data>-custom_field " 增强字段 ) TO lt_wbs_data. " 处理增强字段映射 APPEND VALUE #( structure = 'BAPI_WBS_ELEMENTS' valuepart1 = 'USER_FIELD1' valuepart2 = <fs_data>-custom_field ) TO lt_extension. ENDLOOP. ``` 3. **调用批量BAPI** 使用多对象处理函数: ```abap CALL FUNCTION 'BAPI_BUS2054_CREATE_MULTI' TABLES i_wbs_elements = lt_wbs_data extension_in = lt_extension " 传递增强字段 return = lt_return. ``` 4. **事务控制与错误处理** 批量提交前检查所有返回值: ```abap IF line_exists( lt_return[ type = 'E' ] ). CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. " 错误日志处理 PERFORM log_errors USING lt_return. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true. ENDIF. ``` #### 二、关键技术要点 1. **增强字段处理** 通过`extension_in`参数传递自定义字段,需在增强点`PROJECTDEF_UPDATE`中实现校验逻辑[^1]: ```abap METHOD if_ex_projectdef_update~at_save. " 校验增强字段有效性 IF cs_projectx-user_field1 IS INITIAL. MESSAGE e001(zz) WITH '增强字段必填'. " 通过消息中断保存 ENDIF. ENDMETHOD. ``` 2. **性能优化** - 每批次处理建议不超过500条记录 - 使用`BAPI_PS_INITIALIZATION`初始化项目缓存 ```abap CALL FUNCTION 'BAPI_PS_INITIALIZATION' EXPORTING external_number_check = abap_false. " 关闭外部编码检查 ``` 3. **模板复制技术** 如需基于模板创建,使用项目复制BAPI: ```abap CALL FUNCTION 'BAPI_PROJECT_COPY' EXPORTING source_project = 'TEMPLATE_PROJ' target_project = 'NEW_PROJECT' TABLES return = lt_return. ``` #### 三、错误预防措施 1. **权限校验** 批量操作前检查公司代码权限: ```abap AUTHORITY-CHECK OBJECT 'F_BKPF_BUK' ID 'BUKRS' FIELD '1000' ID 'ACTVT' FIELD '06'. " 创建权限 IF sy-subrc <> 0. MESSAGE e001(00) WITH '无公司代码1000的操作权限'. ENDIF. ``` 2. **预算可用性检查** 使用专用类验证预算分配: ```abap DATA(lo_budget) = cl_psb_item=>get_item( im_wbs = 'N400792' ). IF lo_budget->check_availability( ) = abap_false. MESSAGE e002(zz) WITH '预算不足'. ENDIF. ``` > **调试提示**:使用事务码`CJ20N`监控批量创建结果,通过`PRPS`表字段`ERDAT/ERNAM`验证创建信息[^1][^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值