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

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

相关文章

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同