前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ABAP 之如何传输数据时分批传输

ABAP 之如何传输数据时分批传输

作者头像
百里丶落云
发布2022-12-19 14:47:52
8920
发布2022-12-19 14:47:52
举报
文章被收录于专栏:享~方法

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

HELLO,这里是百里,一个学习中的ABAPER,在工作中,你们是否有遇到,数据量非常大的时候,是那种非常非常大的数据,比如接口,比如上传,比如下发订单信息这种,都是非常大的数据量. 那么该如何解决呢.此时会用到今天的技术,传输数据时分批传输.

为什么要分批传输数据

百里曾经遇到过,非常大的数据,下发要2个小时那种. 介于接口接收端的承受能力,此时如果不使用分批次下发数据.就可能会出现TIME OUT 的情况, 这时,我们的数据就白发了,还可能需要重新发的情况 .此时分批次下发的需求应运而生.我们讲数据分成多段,逐级下发,这样就可以有效避免数据的多次下发无效造成的问题.

技术讲解

本功能并不是使用什么函数,就是使用WHILE 循环, 将数据行数确定后,然后通过,通过输入指定参数,控制数据分堆,我们将数据分成多少堆,然后分批去执行某一个或者某些函数,从而减少因为数据量过大而造成卡机问题.

代码语言:javascript
复制
WHILE lv_end < lines( lt_data_temp ).
......

INSERT LINES OF lt_data_temp FROM lv_start TO lv_end INTO TABLE lt_data .

ENDWHILE .

实际案例

本次案例内容讲的是一个接口下发的案例,下发的代码我就不放在里面了,因为会特别特别的多.我这里只是讲我如何把数据量非常大的数据,给通过算法,分成一个一个的小堆从而执行函数的.

数据准备

代码语言:javascript
复制
TYPES : BEGIN OF ty_Data ,   
  name TYPE char20 ,   
  age TYPE char20,  
  address TYPE char20 ,  
    
  END OF ty_Data .   
  
data : gs_Data TYPE ty_Data .   
data : gt_data TYPE TABLE OF ty_Data .

获取数据

代码语言:javascript
复制
INITIALIZATION .   
  
  
  
  
START-OF-SELECTION .   
  
select * from  zmessage into CORRESPONDING FIELDS OF table gt_Data .

设定子例程

代码语言:javascript
复制
*&amp;---------------------------------------------------------------------*  
*&amp; Form sed_mesg  
*&amp;---------------------------------------------------------------------*  
*&amp; text  
*&amp;---------------------------------------------------------------------*  
*&amp; -->  p1        text  
*&amp; <--  p2        text  
*&amp;---------------------------------------------------------------------*  
FORM sed_mesg .  
  data(gt1_Data) = gt_Data .  
  
  
  DATA: gv_max TYPE i VALUE 250.  
  
  DATA : lt_data TYPE TABLE OF ty_Data.  
 data  :  lt_data_temp TYPE TABLE of ty_Data .  
"数据量分配传  
  DATA : lv_start TYPE  i  VALUE IS INITIAL,  
         lv_end   TYPE i VALUE IS INITIAL.  
  lt_data_temp[] = gt1_data[].  
    lv_start = 0.  
    lv_end = 0.  
WHILE lv_end < lines( lt_data_temp ).  
      CLEAR l_input1.  
      lv_start = lv_end + 1.  
      lv_end = lv_end + gv_max.  
      IF lv_end > lines( gt1_data ).  
        lv_end = lines( gt1_data ).  
      ENDIF.  
  
      CLEAR lt_data.  
      INSERT LINES OF lt_data_temp FROM lv_start TO lv_end INTO TABLE lt_data .  
  
  
  
  
     REFRESH gt_Data .  
     gt_Data[] = lt_data[] .  
  
  
  
  
  
  
"数据转换,及数据处理函数  
  
  "调用发送函数  
  
  
  IF l_input1 IS INITIAL.  
    RETURN .  
  ENDIF.  
  
" 需要分批执行的函数  
  
ENDWHILE .  
ENDFORM.

调用子例程

代码语言:javascript
复制
PERFORM sed_mesg  .

结果及反思

如图所示,我们下发了多条数据,成功的避免了因为一条数据过而造成卡机或者响应失败的问题.

image.png
image.png

反思

不过使用这个也会出现一些问题,就是IO 操作过于频繁的问题.知道的SAP是单进程的东西,不能像其他语言一样可以多个线程进行或者协程等等,总是就是很慢.我们需要反复进行请求目的接口.造成了不必要资源浪费,如果不考虑数据会断的情况,把数据拆分一堆一堆的会比单独直接下发的慢.

技术总结.

今天讲述的内容是,将数据量非常的内容如何分批次,执行一些命令. 这样做的好处是,可以避免一些因硬件如网络,电脑等设备数据量太大产生的中断现象.学会了这个,当你做接口时,尤其是实时接口时,就可以完美解决问题.

百里鸡汤

做出承诺,并做出坚定且持续的行动.

这里是百里,一个努力的学习者. 努力学习好好记录,点滴进步,就是成功.

wallhaven-2kydym.jpg
wallhaven-2kydym.jpg
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要分批传输数据
  • 技术讲解
  • 实际案例
    • 数据准备
      • 获取数据
        • 设定子例程
          • 调用子例程
          • 结果及反思
            • 反思
            • 技术总结.
            • 百里鸡汤
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档