SAP BOPF确定,在不设置et_failed_key或引发异常的情况下停止插入记录

2020-08-16 08:33发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我是SAP和ABAP的新手。 我需要在表中插入多个记录。 我已经确定了对应CDS的循环,并手动插入了记录。 但是,也会执行确定的默认插入操作,即在表中插入不需要的记录。 如何停止通过默认执行路径插入记录?

我已经设置了et_failed_key,它将停止插入,但是在前端产生了一个错误。 那么,有没有更好的方法呢?

以下是代码

 class/atu/cl_sf_d_ws_save_and_valid定义
   上市
   从/bobf/cl_lib_d_supercl_simple继承
   最后
   创造公众。
   公共部分。
     方法/bobf/if_frw_determination〜execute
         重新定义。
   受保护的部分。
   私人部分。
 结束类。

/atu/cl_sf_d_ws_save_and_valid实现类。
   方法/bobf/if_frw_determination〜execute。

     清除:et_failed_key,eo_message。

     "使用给定的密钥读取数据
     数据:lt_data类型/atu/t_sfi_work_station,
            ls_key类型/bobf/s_frw_key,
            lo_cm类型引用到/bobf/cm_frw,
            lv_msg类型字符串,
            lv_stationno类型int8,
            lv_stationcount类型为int8,
            lv_counter类型为int8。

     io_read->检索(
         出口
             iv_node = is_ctx-node_key"节点名称的uuid
             it_key = it_key"确定键
         输入
             et_data = lt_data"带有节点数据的itab
             eo_message = eo_message
       et_failed_key = et_failed_key
     )。

     在lt_data参考处循环到data(lo_inp)中。
 *如果有多个工作站添加循环并检查迷离
       如果lo_inp-> workstationno <0。
 *获取车站数
         lv_stationcount = abs(lo_inp-> workstationno)。
 *设置站号
         lv_stationno = 0。
         lv_counter = 1。

         数据:iztab类型/atu/sf_wkstn。

         同时(lv_counter 工作中心
             和工厂= @ lo_inp-> factory
             和工作站编号= @lv_stationno
               到@data(lv_ws_items)中。
 *如果不存在,添加工作站
           如果lv_ws_items = 0。

 *设置站号
             lo_inp-> workstationno = lv_stationno。

             清除iztab。
             iztab-factory = lo_inp-> factory。
             iztab-workcenter = lo_inp-> workcenter。
             iztab-workstationno = lv_stationno。
             iztab-active ='X'。
             将iztab值插入/atu/sf_wkstn。

 *增加计数器以添加下一个电台
             将1加到lv_counter。

           万一。
         最后。
         如果sy-subrc = 0。
           提交工作。
         万一。

 *设置ET Failed key stop BOPF插入记录
         et_failed_key = it_key。

       其他。
 *在CDS中搜索匹配数据
         从/atu/sf_i_work_station选择单个(工作站编号)
         工作中心= @ lo_inp->工作中心
         和工厂= @ lo_inp-> factory
         和工作站编号= @ lo_inp-> workstationno
         且有效='X'
         到@data(lv_codes)。

         如果lv_codes不是初始的。

           et_failed_key = it_key。
           如果eo_message没有绑定。
             eo_message =/bobf/cl_frw_factory => get_message()。
           万一。

           消息i001(/atu/sf_validat_msg)转换为lv_msg。

           创建对象lo_cm类型/bobf/cm_frw_symsg
             出口
               严重性='E'
               症状='000'
               message_text = lv_msg。

           eo_message-> add_cm(
            出口
             io_message = lo_cm)。

           返回。

         万一。
       万一。
     结束循环。

   方法。
 结束类。

 

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我是SAP和ABAP的新手。 我需要在表中插入多个记录。 我已经确定了对应CDS的循环,并手动插入了记录。 但是,也会执行确定的默认插入操作,即在表中插入不需要的记录。 如何停止通过默认执行路径插入记录?

我已经设置了et_failed_key,它将停止插入,但是在前端产生了一个错误。 那么,有没有更好的方法呢?

以下是代码

 class/atu/cl_sf_d_ws_save_and_valid定义
   上市
   从/bobf/cl_lib_d_supercl_simple继承
   最后
   创造公众。
   公共部分。
     方法/bobf/if_frw_determination〜execute
         重新定义。
   受保护的部分。
   私人部分。
 结束类。

/atu/cl_sf_d_ws_save_and_valid实现类。
   方法/bobf/if_frw_determination〜execute。

     清除:et_failed_key,eo_message。

     "使用给定的密钥读取数据
     数据:lt_data类型/atu/t_sfi_work_station,
            ls_key类型/bobf/s_frw_key,
            lo_cm类型引用到/bobf/cm_frw,
            lv_msg类型字符串,
            lv_stationno类型int8,
            lv_stationcount类型为int8,
            lv_counter类型为int8。

     io_read->检索(
         出口
             iv_node = is_ctx-node_key"节点名称的uuid
             it_key = it_key"确定键
         输入
             et_data = lt_data"带有节点数据的itab
             eo_message = eo_message
       et_failed_key = et_failed_key
     )。

     在lt_data参考处循环到data(lo_inp)中。
 *如果有多个工作站添加循环并检查迷离
       如果lo_inp-> workstationno <0。
 *获取车站数
         lv_stationcount = abs(lo_inp-> workstationno)。
 *设置站号
         lv_stationno = 0。
         lv_counter = 1。

         数据:iztab类型/atu/sf_wkstn。

         同时(lv_counter 工作中心
             和工厂= @ lo_inp-> factory
             和工作站编号= @lv_stationno
               到@data(lv_ws_items)中。
 *如果不存在,添加工作站
           如果lv_ws_items = 0。

 *设置站号
             lo_inp-> workstationno = lv_stationno。

             清除iztab。
             iztab-factory = lo_inp-> factory。
             iztab-workcenter = lo_inp-> workcenter。
             iztab-workstationno = lv_stationno。
             iztab-active ='X'。
             将iztab值插入/atu/sf_wkstn。

 *增加计数器以添加下一个电台
             将1加到lv_counter。

           万一。
         最后。
         如果sy-subrc = 0。
           提交工作。
         万一。

 *设置ET Failed key stop BOPF插入记录
         et_failed_key = it_key。

       其他。
 *在CDS中搜索匹配数据
         从/atu/sf_i_work_station选择单个(工作站编号)
         工作中心= @ lo_inp->工作中心
         和工厂= @ lo_inp-> factory
         和工作站编号= @ lo_inp-> workstationno
         且有效='X'
         到@data(lv_codes)。

         如果lv_codes不是初始的。

           et_failed_key = it_key。
           如果eo_message没有绑定。
             eo_message =/bobf/cl_frw_factory => get_message()。
           万一。

           消息i001(/atu/sf_validat_msg)转换为lv_msg。

           创建对象lo_cm类型/bobf/cm_frw_symsg
             出口
               严重性='E'
               症状='000'
               message_text = lv_msg。

           eo_message-> add_cm(
            出口
             io_message = lo_cm)。

           返回。

         万一。
       万一。
     结束循环。

   方法。
 结束类。

 
付费偷看设置
发送
4条回答
Climb_Ma
1楼-- · 2020-08-16 09:03

Thanushka Gunasekara

一些建议:

将"提交工作"从"循环"中删除。 那会改变一些事情。

不是将每个记录插入数据库表中。 我会将所有更新收集到一个内部表中,然后从中写入INSERT

清理内部表,例如没有键,重复项等的条目。

请勿在LOOP中进行数据声明。 我会避免在WHILE LOOP内选择那些单打。

SAP砖家
2楼-- · 2020-08-16 09:03

您能发表您的代码吗?

粗暴的香蕉
3楼-- · 2020-08-16 09:24

Thanushka Gunasekara

因此,您说的是3条记录中如果2条正确,则执行插入,而当1条记录不正确时,您将引发错误,并且希望这2条正确的插入记录会回滚 ? 令人困惑,您能提供更多解释吗?

谢谢

Mahesh

CJones
4楼-- · 2020-08-16 09:07

嗨,Thanushka,

您能够解决此问题吗? 我遇到同样的问题

一周热门 更多>