多线程执行后台任务,提供效率

2024-01-08 14:36

本文主要是介绍多线程执行后台任务,提供效率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

场景:
大批量复制物料描述到新的物料上,多线程同时执行已提高效率

在这里插入图片描述

REPORT zmm316.

INCLUDE zmm316_top.

INCLUDE zmm316_f01.
*-----------------------------------------------------------------------

  • I N I T I A L I Z A T I O N
    *-----------------------------------------------------------------------
    INITIALIZATION.

*-----------------------------------------------------------------------

  • A T S E L E C T I O N - S C R E E N
    *-----------------------------------------------------------------------
    AT SELECTION-SCREEN.

START-OF-SELECTION.

  • 读取文件
  • IF p_sc = ‘X’.
  • PERFORM read_file.
  • PERFORM frm_data_check.
  • ELSEIF p_cx = ‘X’.

PERFORM frm_get_data.

  • ENDIF.
    &---------------------------------------------------------------------
    *& 包含 ZMM316_TOP
    &---------------------------------------------------------------------
    ----------------------------------------------------------------------
    TABLES: sscrfields,ztmatnr_match,a017,mara.

TYPES: BEGIN OF ty_alv,
matnr_o TYPE mseg-matnr, "旧物料号
matnr_n TYPE mseg-matnr,
zdate TYPE ztmatnr_match-zdate,
ztime TYPE ztmatnr_match-ztime,
zsel TYPE char1,
zlight TYPE char04, " 指示灯
zmsg TYPE char100,

  •     zwlsl   type P LENGTH 10  DECIMALS 3,
    
  •     zdate   TYPE DATS,
    
  •     zsl     TYPE i,END OF ty_alv.
    

TYPES: BEGIN OF ty_alv2,
matnr_n(18) TYPE c,
zsel TYPE char1,
zlight TYPE char04, " 指示灯
zmsg TYPE char100,

  •     zwlsl   type P LENGTH 10  DECIMALS 3,
    
  •     zdate   TYPE DATS,END OF ty_alv2.
    

DATA:gt_alv TYPE STANDARD TABLE OF ty_alv. "定义内表
DATA:gs_alv TYPE ty_alv. "定义工作区
FIELD-SYMBOLS: <fs_alv> TYPE ty_alv.

DATA:gt_fieldcat TYPE lvc_t_fcat, "字段目录内表
gs_fieldcat TYPE lvc_s_fcat, "字段目录工作区
gs_layout TYPE lvc_s_layo. "用于定义ALV表单的相关格式、属性
*DATA:gt_index_all TYPE STANDARD TABLE OF ty_index,

  • gs_index     TYPE ty_index.
    

DATA: gv_messages TYPE c LENGTH 200,
bdcdata TYPE TABLE OF bdcdata WITH HEADER LINE,
gs_option TYPE ctu_params,
messtab TYPE TABLE OF bdcmsgcoll WITH HEADER LINE.

RANGES:r_matnr_old FOR mara-bismt.
RANGES:r_werks FOR a017-werks.
*-----------------------------------------------------------------------

  • P A R A M E T E R S & S E L E C T - O P T I O N S
    *-----------------------------------------------------------------------
  • 功能选择界面
    SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-t01.
    SELECT-OPTIONS: s_jmatnr FOR ztmatnr_match-matnr_old, "旧物料
  •            s_werks FOR a017-werks OBLIGATORY,"工厂s_xmatnr FOR ztmatnr_match-matnr_new NO-DISPLAY.   "新物料
    

PARAMETERS: p_sjfb TYPE char07, "数据分包
p_htrw TYPE char04. "后台任务

SELECTION-SCREEN END OF BLOCK blk1.

  • 下载模版按钮
    SELECTION-SCREEN FUNCTION KEY 1.

&---------------------------------------------------------------------
*& 包含 ZMM316_F01
&---------------------------------------------------------------------
FORM frm_get_data .

SELECT bismt AS matnr_n
matnr AS matnr_o
INTO CORRESPONDING FIELDS OF TABLE gt_alv
FROM mara
WHERE matnr IN s_jmatnr
AND bismt IN s_xmatnr
AND bismt <> ‘’.

SELECT matnr_new AS matnr_n,
matnr_old AS matnr_o,
zdate,
ztime
INTO TABLE @DATA(lt_match)
FROM ztmatnr_match "pa001 bseg mseg ekpo
.

SORT lt_match BY matnr_o.
.
REFRESH r_werks.

r_werks-sign = ‘I’.
r_werks-option = ‘CP’.
r_werks-low = ‘*’.
APPEND r_werks.

  • LOOP AT gt_alv ASSIGNING <fs_alv>.
  • READ TABLE lt_match INTO DATA(ls_match) WITH KEY matnr_o = <fs_alv>-matnr_o
  •                                                 BINARY SEARCH.
    
  • IF sy-subrc = 0.
  •  <fs_alv>-zlight = icon_green_light.
    
  • ENDIF.
  • ENDLOOP.
  • DELETE gt_alv[] WHERE zlight = icon_green_light.

******后台数据处理
DATA:lv_xhhs TYPE p LENGTH 13 DECIMALS 2."每次循环数据行数
DATA:lv_num TYPE p LENGTH 13 DECIMALS 2,
lv_time TYPE int4, "
lvf_indexf TYPE int4, "
lvt_indext TYPE int4. "

lv_num = lines( gt_alv ).

lv_xhhs = ceil( lv_num / p_sjfb ). "获得包得数量

DO lv_xhhs TIMES.

lv_time = lv_time + 1.
lvf_indexf = lvt_indext + 1."计算本次包发送的数据开始索引
lvt_indext = lv_time * p_sjfb ."计算本次包发送的数据结束索引REFRESH r_matnr_old.
LOOP AT gt_alv ASSIGNING <fs_alv> FROM lvf_indexf TO lvt_indext.   "循环取到得数据r_matnr_old-sign = 'I'.r_matnr_old-option = 'EQ'.r_matnr_old-low = <fs_alv>-matnr_o.APPEND r_matnr_old.
ENDLOOP.PERFORM frm_creat_job .

ENDDO.

ENDFORM.
&---------------------------------------------------------------------
*& Form FRM_CREAT_JOB
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------

  • –> p1 text
  • <-- p2 text
    ----------------------------------------------------------------------
    FORM frm_creat_job .

DATA:lv_number TYPE tbtcjob-jobcount,
lv_name TYPE tbtcjob-jobname,
lv_print_parameters TYPE pri_params VALUE ‘LP01’.

DATA lv_rep LIKE trdir-name VALUE ‘ZMM315’.
DATA:lv_job LIKE tbtco-jobname.
DATA:lv_num TYPE p LENGTH 13 DECIMALS 2.

lv_job =‘ZMM315后台复制采购信息记录’&& ‘-’ && sy-datum && ‘-’&& sy-uzeit.

DO.
SELECT COUNT(*)
INTO @DATA(lv_count)
FROM tbtco
WHERE tbtco~jobname LIKE ‘ZMM315后台复制采购信息记录%’
AND tbtco~status IN ( ‘R’,‘Y’ ).

IF lv_count < p_htrw.EXIT.
ENDIF.

ENDDO.

CLEAR lv_number.

"创建已计划状态的JOB
CALL FUNCTION ‘JOB_OPEN’
EXPORTING
jobname = lv_job
IMPORTING
jobcount = lv_number
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc = 0.

SUBMIT (lv_rep)
TO SAP-SPOOL "打印机参数设置
SPOOL PARAMETERS lv_print_parameters "打印机格式
WITH s_matnr IN r_matnr_old
WITH s_werks IN r_werks
WITH p_job = 'X'
WITHOUT SPOOL DYNPRO
USER syst-uname
VIA JOB lv_job
NUMBER lv_number
AND RETURN.IF sy-subrc = 0."释放已计划的JOB,JOB状态为活动CALL FUNCTION 'JOB_CLOSE'EXPORTINGjobcount             = lv_numberjobname              = lv_jobstrtimmed            = 'X'EXCEPTIONScant_start_immediate = 1invalid_startdate    = 2jobname_missing      = 3job_close_failed     = 4job_nosteps          = 5job_notex            = 6lock_failed          = 7OTHERS               = 8.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.
ENDIF.

ENDIF.

ENDFORM.

这篇关于多线程执行后台任务,提供效率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/583782

相关文章

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因