abap 多线程运行demo

SAP 提供多种多线程的方法去优化程序的执行效率

1.分别执行多个job

2.Call function STARTING NEW TASK

3.直接使用SAP 提供的SPTA 框架函数:SPTA_PARA_PROCESS_START_2

本次,我们着重来介绍一下三种方法中函数的使用方法

获取空闲线程数:SPBT_INITIALIZE

*&---------------------------------------------------------------------*
*& Report  ZDEMO_TEST_PARALLEL
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zdemo_test_parallel.
TYPE-POOLS:spta.
DATA: gs_head  TYPE zsfi_doc_head.
DATA: gt_head  TYPE STANDARD TABLE OF zsfi_doc_head.
DATA: gt_out   TYPE STANDARD TABLE OF zsfi_doc_head_o.
DATA: gt_item  TYPE STANDARD TABLE OF zsfi_doc_item.
DATA: gs_item  TYPE zsfi_doc_item.
DATA: ls_head  TYPE zsfi_doc_head.
DATA: lt_head  TYPE STANDARD TABLE OF zsfi_doc_head.
DATA: lt_item  TYPE STANDARD TABLE OF zsfi_doc_item.
DATA: ls_item  TYPE zsfi_doc_item.
DATA: lv_int     TYPE numc4.
DATA: gs_parallel TYPE zsfi_doc_head_run.
DATA: gt_parallel TYPE ztfi_doc_head_run_t.
DATA: gt_result TYPE ztfi_doc_head_run_t.

DATA: gv_start TYPE char10.
DATA: gv_end   TYPE char10.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME  TITLE text-t01.
PARAMETERS: p_group TYPE spta_rfcgr OBLIGATORY MEMORY ID spta_rfcgr DEFAULT 'parallel_generators'.
PARAMETERS: p_task  LIKE sy-index DEFAULT '10'.
PARAMETERS: p_times TYPE numc4 OBLIGATORY DEFAULT '100'.
PARAMETERS: p_loop  TYPE char01 RADIOBUTTON GROUP rd1 DEFAULT 'X'.
PARAMETERS: p_para  TYPE char01 RADIOBUTTON GROUP rd1 .

SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.
  lv_int = p_times.

  SELECT SINGLE *
  INTO CORRESPONDING FIELDS OF ls_head
  FROM ztfi_doc_head
  WHERE zsernr = 'BPM26020240606000003'.

  SELECT  *
  INTO CORRESPONDING FIELDS OF TABLE lt_item
  FROM ztfi_doc_item
  WHERE zsernr = 'BPM26020240606000003'.

  CASE 'X'.
    WHEN p_loop.
      PERFORM frm_loop_process.
    WHEN p_para.
      PERFORM frm_parallel_process.

    WHEN OTHERS.
  ENDCASE.


*&---------------------------------------------------------------------*
*&      Form  FRM_LOOP_PROCESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_loop_process .

  DATA: lv_errcode TYPE char8.
  DATA: lv_errdesc TYPE char250.




  gv_start = sy-uzeit.

  IF  ls_head IS NOT INITIAL AND lt_item IS NOT INITIAL .
    DO p_times TIMES.
      lv_int = lv_int - 1.

      CLEAR:lv_errcode,lv_errdesc,gt_item,gt_head,gt_out.
      CONCATENATE  'BPM06020240612LOOP9' lv_int INTO ls_head-zsernr.
      CONCATENATE  '240606LOOP4' lv_int INTO ls_head-orderid.

      APPEND ls_head TO gt_head.

      LOOP AT  lt_item INTO ls_item .
        CONCATENATE 'BPM06020240612LOOP9' lv_int INTO ls_item-zsernr.
        APPEND ls_item TO gt_item.
      ENDLOOP.

      CALL FUNCTION 'ZFIFM_RECEIPT_POSTING'
        IMPORTING
          errcode = lv_errcode
          errdesc = lv_errdesc
        TABLES
          it_head = gt_head
          it_item = gt_item
          ot_head = gt_out.


    ENDDO.
  ENDIF.

  gv_end = sy-uzeit.

  WRITE gv_start.
  WRITE gv_end.


ENDFORM.                    " FRM_LOOP_PROCESS
*&---------------------------------------------------------------------*
*&      Form  FRM_PARALLEL_PROCESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_parallel_process .
  CLEAR:gt_parallel.
  DO p_times TIMES.
    lv_int = lv_int + 1.
    CLEAR:gt_item,gt_head,gs_parallel.
    CONCATENATE  'BPM06020240612PARALLEL9' lv_int INTO ls_head-zsernr.
    CONCATENATE  '240612PARAL9' lv_int INTO ls_head-orderid.

    MOVE-CORRESPONDING ls_head TO gs_parallel.

    LOOP AT  lt_item INTO ls_item .
      CONCATENATE 'BPM06020240612PARALLEL9' lv_int INTO ls_item-zsernr.
      APPEND ls_item TO gt_item.
    ENDLOOP.

    gs_parallel-item = gt_item.
    APPEND gs_parallel TO  gt_parallel.
  ENDDO.

  gv_start = sy-uzeit.

  CALL FUNCTION 'SPTA_PARA_PROCESS_START_2'
    EXPORTING
      server_group             = p_group
      max_no_of_tasks          = p_task
      before_rfc_callback_form = 'BEFORE_RFC'
      in_rfc_callback_form     = 'IN_RFC'
      after_rfc_callback_form  = 'AFTER_RFC'
      callback_prog            = sy-repid
    CHANGING
      user_param               = gt_parallel   "this is for you to transfer data you want to deal
    EXCEPTIONS
      invalid_server_group     = 1
      no_resources_available   = 2
      OTHERS                   = 3.

  gv_end = sy-uzeit.

  WRITE gv_start.
  WRITE gv_end.

ENDFORM.                    " FRM_PARALLEL_PROCESS

*&---------------------------------------------------------------------*
*&      Form  before_rfc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IS_BEFORE_RFC_IMP      text
*      -->CS_BEFORE_RFC_EXP      text
*      -->CT_RFCDATA            text
*      -->CT_FAILED_OBJECTS      text
*      -->CT_OBJECTS_IN_PROCESS  text
*      -->P_USER_PARAM          text
*----------------------------------------------------------------------*
FORM before_rfc    USING  is_before_rfc_imp     TYPE spta_t_before_rfc_imp
                     CHANGING
                        cs_before_rfc_exp      TYPE spta_t_before_rfc_exp
                        ct_rfcdata             TYPE spta_t_indxtab
                        ct_failed_objects      TYPE spta_t_failed_objects
                        ct_objects_in_process  TYPE spta_t_objects_in_process
                        ct_user_param          TYPE ztfi_doc_head_run_t.   " you own data

  DATA: ls_parallel TYPE zsfi_doc_head_run.
  DATA: lt_parallel TYPE STANDARD TABLE OF  zsfi_doc_head_run.
  DATA: lv_counter TYPE i.
  DATA: lv_package TYPE i.


* define the package size as 10
  lv_package = 10.
  CLEAR:lt_parallel.

  LOOP AT ct_user_param INTO gs_parallel.
    IF lv_counter < lv_package.
      APPEND gs_parallel TO lt_parallel.
      DELETE ct_user_param INDEX 1.
      lv_counter = lv_counter + 1.
    ELSE.
      EXIT.
    ENDIF.

  ENDLOOP.



* Convert the input data into the INDX structure that is needed for the RFC
  CALL FUNCTION 'SPTA_INDX_PACKAGE_ENCODE'
    EXPORTING
      data    = lt_parallel
    IMPORTING
      indxtab = ct_rfcdata.

  IF lt_parallel IS INITIAL.
    CLEAR cs_before_rfc_exp-start_rfc.
    EXIT.
  ELSE.
* Inform task manager that an RFC can be started from the
* data compiled
    cs_before_rfc_exp-start_rfc = 'X'.
  ENDIF.




ENDFORM.                    "before_rfc
*&---------------------------------------------------------------------*
*&      Form  in_rfc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IS_IN_RFC_IMP  text
*      -->ES_IN_RFC_EXP  text
*      -->IT_RFCDATA     text
*----------------------------------------------------------------------*
FORM in_rfc
        USING    is_in_rfc_imp TYPE spta_t_in_rfc_imp
        CHANGING es_in_rfc_exp TYPE spta_t_in_rfc_exp
                 ct_rfcdata    TYPE spta_t_indxtab.

  DATA: ls_head_temp  TYPE zsfi_doc_head.
  DATA: lt_head_temp  TYPE STANDARD TABLE OF zsfi_doc_head.
  DATA: lt_out_temp   TYPE STANDARD TABLE OF zsfi_doc_head_o.
  DATA: lt_item_temp  TYPE STANDARD TABLE OF zsfi_doc_item.
  DATA: ls_parallel   TYPE zsfi_doc_head_run.
  DATA: lt_parallel   TYPE STANDARD TABLE OF zsfi_doc_head_run.
  DATA: gt_out_temp   TYPE STANDARD TABLE OF zsfi_doc_head_o.

  DATA: lv_errcode TYPE char8.
  DATA: lv_errdesc TYPE char250.

* decode the data from the INDX Structure into the process work list
  CALL FUNCTION 'SPTA_INDX_PACKAGE_DECODE'
    EXPORTING
      indxtab = ct_rfcdata
    IMPORTING
      data    = lt_parallel.



*you own process logic
  LOOP AT lt_parallel INTO ls_parallel.
    CLEAR:lv_errcode,lv_errdesc,lt_item_temp,lt_head_temp,lt_out_temp.


    MOVE-CORRESPONDING ls_parallel TO ls_head_temp.
    APPEND ls_head_temp TO lt_head_temp.

    lt_item_temp = ls_parallel-item.

    CALL FUNCTION 'ZFIFM_RECEIPT_POSTING'
      IMPORTING
        errcode = lv_errcode
        errdesc = lv_errdesc
      TABLES
        it_head = lt_head_temp
        it_item = lt_item_temp
        ot_head = lt_out_temp.

    APPEND LINES OF lt_out_temp TO gt_out_temp.
  ENDLOOP.





* repack output data for AFTER_RFC form
  CALL FUNCTION 'SPTA_INDX_PACKAGE_ENCODE'
    EXPORTING
      data    = lt_parallel
    IMPORTING
      indxtab = ct_rfcdata.
  COMMIT WORK.

ENDFORM.                    "in_rfc
*&---------------------------------------------------------------------*
*&      Form  after_rfc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IT_RFCDATA             text
*      -->IF_RFCSUBRC            text
*      -->IF_RFCMSG              text
*      -->IT_OBJECTS_IN_PROCESS  text
*      -->IS_AFTER_RFC_IMP       text
*      -->ES_AFTER_RFC_EXP       text
*      -->CS_USER_PARAM          text
*----------------------------------------------------------------------*
FORM after_rfc USING it_rfcdata  TYPE spta_t_indxtab
                     if_rfcsubrc TYPE sy-subrc
                     if_rfcmsg   TYPE spta_t_rfcmsg
                     it_objects_in_process TYPE spta_t_objects_in_process
                     is_after_rfc_imp      TYPE spta_t_after_rfc_imp
            CHANGING es_after_rfc_exp TYPE spta_t_after_rfc_exp
                     cs_user_param   .
  DATA: lt_out   TYPE STANDARD TABLE OF zsfi_doc_head_o.
  DATA: lt_parallel   TYPE STANDARD TABLE OF zsfi_doc_head_run.
* uppack RFC output data and add RFC reulsts to global data
  CALL FUNCTION 'SPTA_INDX_PACKAGE_DECODE'
    EXPORTING
      indxtab = it_rfcdata
    IMPORTING
      data    = lt_parallel.

  APPEND LINES OF lt_parallel TO gt_result.

ENDFORM.                    "after_rfc

  上面的demo 我分别使用loop和parallel (10线程)去创建会计凭证

   创建1000条,运行时间分别为:95 sec  17 sec

   如此一比较下来。多线程的效率提升还是很快的。对于没有升级到HANA的ECC 系统还是有很多提升空间的

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/705214.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Calibre版图验证工具调用_笔记

Siemens EDA Calibre版图验证工具调用 采用Cadence Virtuoso Layout Editor直接调用Siemens EDA Calibre工具需要进行文件设置&#xff0c; 在用户的根目录下&#xff0c;找到.cdsinit文件&#xff0c; 在文件的结尾处添加以下语句即可&#xff0c;其中&#xff0c;calibre.skl…

随手记:uniapp图片展示,剩余的堆叠

UI效果图&#xff1a; 实现思路&#xff1a; 循环图片数组&#xff0c;只展示几张宽度就为几张图片边距的宽度&#xff0c;剩下的图片直接堆叠展示 点击预览的时候传入当前的下标&#xff0c;如果是点击堆叠的话&#xff0c;下标从堆叠数量开始计算 <template><…

某国资集团数据治理落地,点燃高质量发展“数字引擎”

​某国有资产经营控股集团为快速提升集团的内控管理能力和业务经营能力&#xff0c;以数字化促进企业转型的信息化建设势在必行。集团携手亿信华辰开启数据治理项目&#xff0c;在数据方面成功解决“哪里来、怎么盘、怎么管、怎么用”的问题&#xff0c;不断推动企业数字化转型…

【开发环境】PX4无人机实物使用视觉或运动捕捉系统进行位置估计

PX4无人机实物使用视觉或运动捕捉系统进行位置估计 PX4中关于外部位置信息的MAVLink话题参考坐标系EKF2调整配置参数调整EKF2_EV_DELAY参数 与ROS共同使用将OptiTrack MoCap系统提供的姿态数据导入ROSMotive MoCap软件的步骤将姿态数据导入ROS重新映射姿态数据 将姿态数据转发到…

GIS开发到底能应用在哪些行业 ?

GIS应用的领域到底有多广&#xff1f;恐怕很多GIS从业者都想不到。 尤其是近些年&#xff0c;互联网GIS的普及与发展&#xff0c;GIS技术的应用领域越来越多&#xff0c;涉及的范围也越来越广。很多我们以为跟GIS不相关的行业&#xff0c;都在悄悄用GIS技术。 从大类上分析&a…

【SkyWalking】启用apm-trace-ignore-plugin追踪忽略插件

背景 使用Agent采集追踪数据的时候&#xff0c;想排除某些路径&#xff0c;比如健康检查等&#xff0c;这样可以减少上报的数据&#xff0c;也可以去除一些不必要的干扰数据。 加载插件 在agent/optional-plugins目录中有个apm-trace-ignore-plugin-${version}.jar插件&…

flask南京市旅游景点信息可视化的设计与实现-计算机毕业设计源码02941

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对南京市旅游景点信息可视化等问题&#xff0…

TDengine Open Day 成功举办:洞察技术革新与职场策略!

随着时序数据库技术的迅速流行和广泛应用&#xff0c;行业对相关人才的需求急剧增长。为应对这一挑战&#xff0c;TDengine 特别举办了 “TDengine Open Day”技术沙龙&#xff0c;旨在为广大技术爱好者、学者及未来职场新星提供一个深入了解时序数据库及其应用的平台&#xff…

【Python】中的X[:,0]、X[0,:]、X[:,:,0]、X[:,:,1]、X[:,m:n]、X[:,:,m:n]和X[: : -1]

Python中 x[m,n]是通过numpy库引用数组或矩阵中的某一段数据集的一种写法,m代表第m维,n代表m维中取第几段特征数据。 通常用法: x[:,n]或者x[n,:] X[:,0]表示对一个二维数组,取该二维数组第一维中的所有数据,第二维中取第0个数据。 X[0,:]使用类比前者。 举例说明: x[:,0…

抖音a_bogus爬虫逆向补环境

抖音a_bogus爬虫逆向补环境 写在前面 https://github.com/ShilongLee/Crawler 这是我为了学习爬虫而搭建的爬虫服务器项目&#xff0c;目标是作为一个高性能的可靠爬虫服务器为广大爬虫爱好者和安全工程师提供平台进行学习爬虫&#xff0c;了解爬虫&#xff0c;应对爬虫。现已…

vue 之 vuex

目录 vuex 是什么 Vuex管理哪些状态呢&#xff1f; Vuex 页面刷新数据丢失怎么解决 1. 使用浏览器的本地存储 2. 使用 Vuex 持久化插件 3. 使用后端存储 注意事项 Vuex 为什么要分模块并且加命名空间 vuex 是什么 vuex 是专门为 vue 提供的全局状态管理系统&#xff0c…

Protected and unprotected Meilisearch projects(/health)

Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求&#xff0c;极快&#xff0c;单文件&#xff0c;超轻量。 所以&#xff0c;对于中小型项目来说…

案例 | JIMUMETA元宇宙体验馆,助力品牌打开营销新思路!

视创云展作为行业领先的3D数字化场景营销平台&#xff0c;专注于帮助企业迅速构建集多样化营销活动于一体的元宇宙空间。 通过整合虚拟展厅、数字人互动、音视频通话以及弹幕聊天等创新功能&#xff0c;我们为企业打造极具沉浸感的体验环境&#xff0c;并提供高效的线上营销手段…

element 树组件 tree 横向纵向滚动条

Html <el-cardshadow"hover"class"solo flex-2"style"height: calc(100vh - 1.6rem); border: 1px solid #ebeef5"><div slot"header" class"clearfix"><span>问题分类</span></div><div …

坑记(MySQL之delete操作)

背景知识 我们知道MySQL有两种删除操作&#xff1a;delete和truncate。 二者之间是否一样&#xff0c;且看以下内容&#xff1a; 操作名称操作简介deleteDML中的一种&#xff0c;操作对象是记录&#xff0c;即table中的一行&#xff0c;可恢复&#xff0c;速度慢truncateDDL中…

java自动化之java基础03-09java基础之数组

数组 1、定义 数组是一种用于存储固定大小的同类型数据的数据结构 1&#xff09;固定大小 2&#xff09;同类型数据的存储 2、声明数组 1&#xff09;数据类型[] 变量名称&#xff1b; 例如&#xff1a;int[] numsArry; 2&#xff09;数据类型 变量名称[]; 例如&#xf…

MYSQL、ORACLE、PostgreSQL数据库对象层次及权限管理对比

文章目录 前言一、PostgreSQL二、MySQL三、Oracle 前言 本文为出于自己扩展、比较、图形化的思维路径自行总结归纳&#xff0c;可能有些细节不太准确&#xff0c;欢迎指正。 MySQL、Oracle、PostgreSQL关系型数据库都有管理员用户、用户、权限管理、表函数索引等数据库对象&am…

JFinal学习07 控制器——接收数据之getBean()和getModel()

JFinal学习07 控制器——接收数据之getBean()和getModel() 视频来源https://www.bilibili.com/video/BV1Bt411H7J9/?spm_id_from333.337.search-card.all.click 文章目录 JFinal学习07 控制器——接收数据之getBean()和getModel()一、接收数据的类型二、getBean()和getModel()…

6.每日LeetCode-数组类,找到所有数组中消失的数字(Go)

题目 448找到所有数组中消失的数字.go 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,…

PCIE的吞吐量如何计算和记忆诀窍?

简介&#xff1a; PCIe标准中的性能参数有好几个&#xff0c;比如设备的带宽和吞吐量是多少&#xff1f;传输速率&#xff1f; 百度百科上&#xff0c;PCIE标准的传输速率与带宽对应表如下&#xff08;表中速率为单向速率&#xff09;。网上有些数据是双向的&#xff0c;性能数…