BAPI_MATERIAL_SAVEDATA在后台任务中

2020-09-10 22:34发布

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

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


嗨,

情况:需要扩展具有特定视图的物料,例如工厂,仓库,销售组织等。由于数据量非常大,因此决定在后台任务中开始扩展过程。

  • 创建FM:"在后台任务中调用函数Z_ASSIGN_PROC"
  • 在FM内:按材料循环,在循环内:BAPI_MATERIAL_SAVEDATA

但是,在后台任务中运行fm之后,我看到SM50中有许多DIA进程。 他们占用了所有免费的流程,这对系统造成了很大的压力...

有人可以解释为什么会这样吗?

为什么要创建DIA进程而不是BTS?

是否可以将BAPI_MATERIAL_SAVEDATA的DIA进程包装到一个BTC进程中?

主程序如下:

lt_matnr处的
循环分配字段符号()。

     如果lines(lt_id)= c_counter。

       做。

         循环在lt_id处分配字段符号()。

           数据(lv_tabix)= sy-tabix。

           调用函数" STATUS_OF_BACKGROUNDTASK"
             出口
               tid =  -tid
             桌子
               errortab = lt_errtab
             例外情况
               通讯= 1
               记录= 2
               回滚= 3
               其他= 4。

           如果sy-subrc = 0。

             数据(lv_exit)= abap_true。
             删除lt_id索引lv_tabix。

             出口。

           其他。

             lv_exit = abap_false。

           万一。

         结束循环。

         如果lv_exit = abap_true。

           出口。

         万一。

       恩多。

     万一。

     lv_taskname = 。

       调用函数" Z_ASSIGN_PROC"
         在后台任务
         出口
           iv_matnr = 
           it_werks = s_werks []
           it_lgnum = s_lgnum []
         例外情况
           communication_failure = 1
           resource_failure = 2
           system_failure = 3
           其他= 4。

       调用函数" ID_OF_BACKGROUNDTASK"
         输入
           tid = ls_tid
           fnum = lv_fnum。

       附加值#(
                       tid = ls_tid
                       fnum = lv_fnum
                     )到lt_id。

       "开始'Z_ASSIGN_PROC'
       提交工作。

 结束循环。

FM Z_ASSIGN_PROC喜欢:

lt_t001w处的
循环分配字段符号()。

 "填充bapi的结构

   调用函数" BAPI_MATERIAL_SAVEDATA"
 ...
   如果sy-subrc = 0。

         调用函数" BAPI_TRANSACTION_COMMIT"
           出口
             等待= abap_true。
   万一。

   在lt_warehouse循环,分配field-symbol(),其中werks eq  -werks。

 "填充bapi的结构

     调用函数" BAPI_MATERIAL_SAVEDATA"
 ...
     如果sy-subrc = 0。

           调用函数" BAPI_TRANSACTION_COMMIT"
             出口
               等待= abap_true。
     万一。

   结束循环。

 结束循环。
 

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

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


嗨,

情况:需要扩展具有特定视图的物料,例如工厂,仓库,销售组织等。由于数据量非常大,因此决定在后台任务中开始扩展过程。

  • 创建FM:"在后台任务中调用函数Z_ASSIGN_PROC"
  • 在FM内:按材料循环,在循环内:BAPI_MATERIAL_SAVEDATA

但是,在后台任务中运行fm之后,我看到SM50中有许多DIA进程。 他们占用了所有免费的流程,这对系统造成了很大的压力...

有人可以解释为什么会这样吗?

为什么要创建DIA进程而不是BTS?

是否可以将BAPI_MATERIAL_SAVEDATA的DIA进程包装到一个BTC进程中?

主程序如下:

lt_matnr处的
循环分配字段符号()。

     如果lines(lt_id)= c_counter。

       做。

         循环在lt_id处分配字段符号()。

           数据(lv_tabix)= sy-tabix。

           调用函数" STATUS_OF_BACKGROUNDTASK"
             出口
               tid =  -tid
             桌子
               errortab = lt_errtab
             例外情况
               通讯= 1
               记录= 2
               回滚= 3
               其他= 4。

           如果sy-subrc = 0。

             数据(lv_exit)= abap_true。
             删除lt_id索引lv_tabix。

             出口。

           其他。

             lv_exit = abap_false。

           万一。

         结束循环。

         如果lv_exit = abap_true。

           出口。

         万一。

       恩多。

     万一。

     lv_taskname = 。

       调用函数" Z_ASSIGN_PROC"
         在后台任务
         出口
           iv_matnr = 
           it_werks = s_werks []
           it_lgnum = s_lgnum []
         例外情况
           communication_failure = 1
           resource_failure = 2
           system_failure = 3
           其他= 4。

       调用函数" ID_OF_BACKGROUNDTASK"
         输入
           tid = ls_tid
           fnum = lv_fnum。

       附加值#(
                       tid = ls_tid
                       fnum = lv_fnum
                     )到lt_id。

       "开始'Z_ASSIGN_PROC'
       提交工作。

 结束循环。

FM Z_ASSIGN_PROC喜欢:

lt_t001w处的
循环分配字段符号()。

 "填充bapi的结构

   调用函数" BAPI_MATERIAL_SAVEDATA"
 ...
   如果sy-subrc = 0。

         调用函数" BAPI_TRANSACTION_COMMIT"
           出口
             等待= abap_true。
   万一。

   在lt_warehouse循环,分配field-symbol(),其中werks eq  -werks。

 "填充bapi的结构

     调用函数" BAPI_MATERIAL_SAVEDATA"
 ...
     如果sy-subrc = 0。

           调用函数" BAPI_TRANSACTION_COMMIT"
             出口
               等待= abap_true。
     万一。

   结束循环。

 结束循环。
 
付费偷看设置
发送
2条回答
CPLASF-自律
1楼-- · 2020-09-10 23:19

后台任务表示事务RFC(tRFC)。

所有RFC仅在DIA工作流程中运行。

不,它不能在BTC工作流程中运行。

p>

有一些配置文件参数可调整可分配给RFC任务的DIA工作流程的最大数量。 您应该向管理员询问一些建议,以减轻系统压力。

代楠1984
2楼-- · 2020-09-10 23:05

您可以使用背景RFC 一次,在执行标准事务期间以防止破坏LUW。

但是在执行FM期间,请使用 RFC异步调用并处理当前正在运行的进程数,请使用RFC服务器组(RZ12)

"以使用RZ12定义的组(其限制 定义)
  调用功能'Z_ASSIGN_PROC'开始新任务nbtask
                 DESTINATION NONE IN GROUP组
                 在任务结束时拨打减号1。
 

NB:还可以处理调用中的最低异常:system_failure,communication_failure和resource_failure。

,或者,如果您不(不想)使用 一组,自己处理任务数(调用后为+1,被调用方法为-1)。

注意:要获取最大/可用的进程数,请在循环开始时使用FM SPBT_INITIALIZE。

如果您确实要使用批处理,则不要 不会调用FM RFC模式,而是在一个小报告中重写代码,并改用JOP_OPEN/SUBMIT/JOB_CLOSE。


一周热门 更多>