文章目录

  • 1 原则
  • 2 demo
  • 3.总结

1 原则

loop在ABAP中使用太多,尽量不要在loop中用loop.这样的结果是行数太多,非常的影响速度,这可能是几何倍数增加循环次数。但如果数据量很少,也可以使用,如果没办法,那只有使用,下面是一个DEMO,按正常使用是loop table into wa_table

modify table from wa_table
endloop.
以上是正确的格式,在实际中很多是用到带表头的内表,然后都不用加工作区.

2 demo

REPORT zmm051.
TYPE-POOLS: slis.
TABLES:MKOL,mbew,marc,t024,agr_users, mseg.
*数据声明
DATA: BEGIN OF item OCCURS 0,meins      LIKE mara-meins,matnr      LIKE mseg-matnr,maktx      LIKE makt-maktx,werks      LIKE mseg-werks,bwart      LIKE mseg-bwart,       "移动类型lgort      LIKE mseg-lgort,budat_mkpf LIKE mseg-budat_mkpf,menge      LIKE mseg-menge,"数量zrkl       TYPE p DECIMALS 3,     "当前库存"总入库量zckl       TYPE p DECIMALS 3,     "当前库存"总出库量zbyrk      TYPE p DECIMALS 3,"     "到最小日期期初库存中本月入库数量zbyrk1     TYPE p DECIMALS 3,"    "到最大日期期初库存中本月入库数量zsyjy      TYPE p DECIMALS 3,"    "上月结余库存za         TYPE p DECIMALS 3,"   LIKE mard-labst,"当前库存"期初库存zb         TYPE p DECIMALS 3,"   LIKE mard-labst,"当前库存期末库存"zb         LIKE mseg-menge,"期末库存shkzg      LIKE mseg-shkzg,peinh      LIKE mbew-peinh,"价格单位stprs      LIKE mbew-stprs,"标准价格bzdj       LIKE mbew-stprs,"标准单价zajz       TYPE p DECIMALS 3,"    LIKE mbew-stprs,"期初库存价值zbjz       TYPE p DECIMALS 3,"   LIKE mbew-stprs,"期末库存价值zrkjz      TYPE p DECIMALS 3,"   LIKE mbew-stprs,"总入库价值zckjz      TYPE p DECIMALS 3,"   LIKE mbew-stprs,"总出库价值ekgrp      LIKE marc-ekgrp,"采购组eknam      LIKE t024-eknam,"采购组描述labst      LIKE mard-labst,"当前库存zzqt       LIKE mard-labst,"清退数量zcrk       TYPE i,         "总装整车入库数量zcxs       TYPE i,         "整车销售数量zeile      TYPE mseg-zeile,         "整车销售数量klabs      TYPE mard-klabs,         "寄售当前库存lifnr       like mseg-lifnr,sobkz       like  mseg-sobkz,END OF item.DATA: gd_repid LIKE sy-repid.
DATA: i_grid_settings TYPE lvc_s_glay.
DATA: ita LIKE TABLE OF item WITH HEADER LINE.
DATA: itb LIKE TABLE OF item WITH HEADER LINE.
DATA: itc LIKE TABLE OF item WITH HEADER LINE.               "输出到sf 的抬头数据
DATA: lft_i LIKE TABLE OF item WITH HEADER LINE.               "输出到sf 的项目数据
DATA: is_i LIKE TABLE OF item  WITH HEADER LINE.
DATA: lt_ztpp015 LIKE TABLE OF ztpp015 WITH HEADER LINE.
DATA: l_zdbls   LIKE zjlst-zdbls,l_con(30),"过度变量l_num     TYPE numc4.
DATA: p_zjlst LIKE TABLE OF zjlst  WITH HEADER LINE.
DATA: l_ztsycs LIKE TABLE OF ztsycs WITH HEADER LINE.
DATA: afield TYPE slis_fieldcat_alv.
DATA: fieldcat TYPE TABLE OF slis_fieldcat_alv WITH HEADER LINE.
DATA: layout TYPE slis_layout_alv.
DATA: l_pos TYPE i VALUE 1.
DATA: s_i TYPE i .
DATA: l_erdat LIKE sy-datum.
DATA: l_a LIKE sy-datum,l_b LIKE sy-datum."年度月度控制
DATA: wa_i LIKE item.
DATA: zbz(1).
DATA: BEGIN OF itd OCCURS 0 ,mblnr LIKE mseg-mblnr,mjahr LIKE mseg-mjahr,END OF itd.
*宏的定义
DEFINE fill.afield-col_pos = l_pos.afield-fieldname = &1.afield-seltext_l = &2.afield-no_zero   = &3.afield-key       = &4.afield-qfieldname    = &5.   "  去掉小数点后边0      = &5.*  IF afield-fieldname = 'ZA'.
*    afield-DECIMALS_OUT = '0'.         "去掉小数点后边0
* ENDIF.
*  IF afield-fieldname = 'ZCKL'.
*    afield-DECIMALS_OUT = '0'.         "去掉小数点后边0
* ENDIF.
* IF afield-fieldname = 'ZZQT'.
*    afield-DECIMALS_OUT = '0'.         "去掉小数点后边0
* ENDIF.
* IF afield-fieldname = 'ZRKL'.
*    afield-DECIMALS_OUT = '0'.         "去掉小数点后边0
* ENDIF.
* IF afield-fieldname = 'ZB'.
*    afield-DECIMALS_OUT = '0'.         "去掉小数点后边0
* ENDIF.
* IF afield-fieldname = 'ZCRK'.
*    afield-DECIMALS_OUT = '0'.         "去掉小数点后边0
* ENDIF.
* IF afield-fieldname = 'ZCXS'.
*    afield-DECIMALS_OUT = '0'.         "去掉小数点后边0
* ENDIF.append afield to fieldcat.clear afield.l_pos = l_pos + 1.
END-OF-DEFINITION.
*筛选界面
SELECTION-SCREEN BEGIN OF BLOCK blc WITH FRAME TITLE text-001.
PARAMETERS:         p_werks  LIKE mseg-werks OBLIGATORY DEFAULT '2100',p_lgort  LIKE mseg-lgort OBLIGATORY.
SELECT-OPTIONS      p_matnr  FOR mseg-matnr .
SELECT-OPTIONS     P_LIFNR  FOR mkol-LIFNR .
SELECT-OPTIONS      p_ekgrp  FOR marc-ekgrp .
SELECT-OPTIONS      p_erdat  FOR mseg-budat_mkpf OBLIGATORY .
SELECTION-SCREEN END OF BLOCK blc.INITIALIZATION.p_erdat-option = 'BT'.p_erdat-sign = 'I'.p_erdat-low = sy-datum.p_erdat-low+6(2) = '01'.p_erdat-high = sy-datum.APPEND p_erdat.
*取数
START-OF-SELECTION.PERFORM frm_auth_check.PERFORM frm_get_data.                 "获取数据IF item[] IS NOT INITIAL.PERFORM frm_modify.PERFORM frm_show_data.ELSE.MESSAGE s001(00) WITH '没有查询到数据'.ENDIF.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .CLEAR:l_a,l_b.l_a = p_erdat-low.l_b = sy-datum."取当前所有物料抬头数据SELECT MARD~matnr MARD~lgort MARD~werks MARD~labst MARD~klabs  INTO CORRESPONDING FIELDS OF TABLE itemFROM mardWHERE MARD~werks = p_werksAND MARD~lgort = p_lgortAND MARD~matnr IN p_matnr.*  SELECT mblnr mjahr INTO CORRESPONDING FIELDS OF TABLE itd
*  FROM mkpf CLIENT SPECIFIED
*  WHERE budat BETWEEN l_a AND l_b
*  AND mandt = sy-mandt.
*  "取一段时间内总入库量
*  IF itd[] IS NOT INITIAL .
*    SELECT zeile matnr lgort budat_mkpf bwart menge shkzg INTO CORRESPONDING FIELDS OF TABLE ita
*    FROM mseg
*    CLIENT SPECIFIED "取出物料、库存地点、物料金额、移动类型、数量、借贷标识
*    FOR ALL ENTRIES IN itd
*    WHERE
*    mandt = sy-mandt
*    AND mjahr = itd-mjahr
*    AND mblnr = itd-mblnr
*    AND matnr IN p_matnr
*    AND werks = p_werks
*    AND lgort = p_lgort.
*  ENDIF.*  add by wanghc 20191224 将上述逻辑重构SELECT zeile matnr lgort budat_mkpf bwart menge shkzg  sobkz INTO CORRESPONDING FIELDS OF TABLE ita FROM msegWHERE werks  = p_werksAND lgort = p_lgortAND matnr IN p_matnr
*    AND lifnr IN P_LIFNRAND budat_mkpf BETWEEN l_a AND l_bAND shkzg <> ''.LOOP AT item.LOOP AT ita WHERE matnr = item-matnr AND lgort = item-lgort AND budat_mkpf <= p_erdat-high ."总入库量取值IF ita-shkzg = 'S'.item-zrkl = item-zrkl + ita-menge.ELSE.item-zckl = item-zckl + ita-menge.ENDIF.ENDLOOP.
*    if ita-lifnr is not INITIAL and ( Ita-sobkz = 'K' ) .
*    item-lifnr = ita-lifnr.                                     " add it by jingguilin 20210330
*    ENDIF.MODIFY item.CLEAR  item.ENDLOOP."屏幕小日期到今日入库数量取值LOOP AT ita.IF ita-shkzg = 'H'.ita-menge =  - ita-menge.ENDIF.MODIFY  ita.ENDLOOP.LOOP AT item.LOOP AT ita WHERE matnr = item-matnr AND lgort = item-lgort. "AND budat_mkpf < l_erdat.item-zbyrk = item-zbyrk + ita-menge.ENDLOOP.MODIFY item.CLEAR  item.ENDLOOP.""""""最大日期到今日入库数量取值LOOP AT item.LOOP AT ita WHERE matnr = item-matnr AND lgort = item-lgort AND budat_mkpf > p_erdat-high .item-zbyrk1 = item-zbyrk1 + ita-menge.ENDLOOP.MODIFY item.CLEAR  item.ENDLOOP.""""""""""""""""""DATA: l_n LIKE mardh-lfgja,l_m LIKE mardh-lfmon.DATA: l_c LIKE mseg-menge,l_d LIKE mseg-menge.LOOP AT item.CLEAR:l_a,l_b.
*    LOOP AT itb.
*      SELECT SUM( menge ) INTO l_c FROM mseg
*           INNER JOIN mara ON mseg~matnr = mara~matnr WHERE mtart ='FERT'                 " commenit by jingguilin 20210414
*        AND bwart IN ('411')
*        AND budat_mkpf IN p_erdat
*        AND mseg~matnr = item-matnr
*        AND lgort IN ( '1001','1004' )"= '1001' OR lgort = '1005'
*        AND werks = p_werks.
*      SELECT SUM( menge ) INTO l_d FROM mseg
*             INNER JOIN mara ON mseg~matnr = mara~matnr WHERE mtart ='FERT'
*          AND bwart IN ('412')
*          AND budat_mkpf IN p_erdat
*          AND mseg~matnr = item-matnr
*          AND lgort IN ( '1001','1004' )
*          AND werks = p_werks.
*      itb-zcrk = l_c - l_d.
*      MODIFY itb.
*    ENDLOOP.SELECT SINGLE maktx INTO item-maktx FROM makt WHERE matnr = item-matnr AND spras = '1'.SELECT SINGLE ekgrp INTO item-ekgrp FROM marc WHERE matnr = item-matnr.SELECT SINGLE eknam INTO item-eknam FROM t024 WHERE ekgrp = item-ekgrp.SELECT SINGLE stprs peinh INTO (item-stprs,item-peinh) FROM mbew WHERE matnr = item-matnr AND bwkey = p_werks."标准价格SELECT SINGLE meins INTO item-meins FROM mara WHERE matnr = item-matnr.item-za = item-labst + item-klabs - item-zbyrk.item-zb = item-labst + item-klabs - item-zbyrk1."item-bzdj = item-stprs / item-peinh."标准单价item-zajz = item-za * item-stprs / item-peinh."期初库存价值item-zbjz = item-zb * item-stprs / item-peinh."期末库存价值item-zrkjz = item-zrkl * item-stprs / item-peinh."总入库价值item-zckjz = item-zckl * item-stprs / item-peinh."总出库价值item-zzqt = item-za - item-zckl.MODIFY item.ENDLOOP.DELETE item WHERE za = 0 AND zb = 0 AND zrkl = 0 AND zckl = 0.IF p_ekgrp IS NOT INITIAL.DELETE item WHERE ekgrp NOT IN p_ekgrp.ENDIF.
ENDFORM.                    " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_SHOW_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_show_data .i_grid_settings-edt_cll_cb  = 'X' .            "显示界面可编辑字段上修改了数据,回车后就会立即将内表的数据也修改layout-colwidth_optimize    = 'X'.                "设置字段列宽自适应layout-zebra             = 'X'.CLEAR afield.REFRESH fieldcat.fill  'MATNR'      '物料编号'             '' '' ''.fill  'MAKTX'      '物料描述'             '' '' ''.fill  'EKGRP'      '采购组'               '' '' ''.fill  'EKNAM'      '采购组描述'           '' '' ''.fill  'LGORT'      '仓储地点'             '' '' ''.fill  'ZA'         '期初库存'             'X' '' 'MEINS'.IF zbz = 'X'.fill  'ZAJZ'       '期初库存价值'         'X' '' ''.ENDIF.fill  'ZCKL'       '总出库量'             'X' '' 'MEINS'.IF zbz = 'X'.fill  'ZCKJZ'      '总出库价值'           'X' '' ''.ENDIF.IF p_lgort = '5001'.fill  'ZZQT'     '清退数量'               'X' '' 'MEINS'.ENDIF.fill  'ZRKL'      '总入库量'              'X' '' 'MEINS'.IF zbz = 'X'.fill  'ZRKJZ'     '总入库价值'            'X' '' ''.ENDIF.fill  'ZB'        '期末库存'              'X' '' 'MEINS'.IF zbz = 'X'.fill  'ZBJZ'      '期末库存价值'          'X' '' ''.ENDIF.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'EXPORTINGi_grid_settings         = i_grid_settings                 "显示界面可编辑字段上修改了数据,回车后就会立即将内表的数据也修改i_callback_program      = sy-cprog "sy-repid                        "标记当前程序it_fieldcat             = fieldcat[]is_layout               = layouti_callback_user_command = 'USER_COMMAND'"i_callback_pf_status_set = 'SET_STATUS'TABLESt_outtab                = item.
ENDFORM.                    " FRM_SHOW_DATAFORM user_command USING rf_ucomm  LIKE sy-ucommrs        TYPE slis_selfield .rs-refresh = 'X'.CASE rf_ucomm.WHEN '&IC1'.READ TABLE item INTO wa_i INDEX rs-tabindex.IF  rs-fieldname = 'MATNR'.SUBMIT rm07docs USING SELECTION-SCREEN 1000WITH matnr = wa_i-matnrWITH lgort = wa_i-lgortWITH budat IN p_erdatAND RETURN.ENDIF.ENDCASE.ENDFORM.                    "user_command1
*&---------------------------------------------------------------------*
*&      Form  FRM_MODIFY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_modify .l_ztsycs-tcode2_mkpf = sy-tcode.l_ztsycs-zname =  sy-uname.l_ztsycs-zerdat = sy-datum.l_ztsycs-cputm = sy-uzeit.APPEND l_ztsycs.LOOP AT l_ztsycs.SELECT SINGLE zsycs INTO l_ztsycs-zsycs FROM ztsycs WHERE tcode2_mkpf = l_ztsycs-tcode2_mkpf.l_ztsycs-zsycs = l_ztsycs-zsycs + 1.MODIFY l_ztsycs.ENDLOOP.MODIFY ztsycs FROM TABLE l_ztsycs[].
ENDFORM.                    " FRM_MODIFY
*&---------------------------------------------------------------------*
*&      Form  FRM_AUTH_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_auth_check .CLEAR:zbz.SELECT SINGLE *  FROM agr_users WHERE uname = sy-uname AND agr_name = 'Z_AU_ZRMM051'."用户是否拥有此角色判断是否可查看价格IF sy-subrc = 0.zbz = 'X'.ENDIF.
ENDFORM.                    " FRM_AUTH_CHECK

3.总结

没有办法,一个表里有很多数据,每个数据下还有很多数据,这种情况只有用loop中还有loop.
如果表头和表行,只有在循环中有循环.

ABAP中的loop相关推荐

  1. ABAP中的F4帮助怎么用?

    ABAP中的F4帮助怎么用? 当我们在sap的界面上,焦点放到一个字段上的时候,按F4,会出现选择或者搜索的界面,这就是abap中的f4帮助. 有多种实现f4帮助的方法,现在就把我指导的一点点说出来: ...

  2. ABAP中的F4帮助怎么用

    ABAP中的F4帮助怎么用?  当我们在sap的界面上,焦点放到一个字段上的时候,按F4,会出现选择或者搜索的界面,这就是abap中的f4帮助.    有多种实现f4帮助的方法,现在就把我指导的一点点 ...

  3. ABAP中使用浏览器打开网页

    在SAP ABAP中可以在Screen中嵌入Html control打开网页,也可以通过调用本地的IE浏览器打开. 1.在Screen中嵌入Html control的例子,在系统中有,se38:SAP ...

  4. [转]SAP ABAP中使用Read_Text函数读取项目文本的方法

    SAP ABAP中使用Read_Text函数读取项目文本的方法 使用Read_Text函数来读取文本内容.需要找到相关参数. 下面以采购订单为例: 双击文本,进入文本编辑器. 转到->表头. 显 ...

  5. 【转载】ABAP中数据和对象的动态创建和调用

    ABAP中数据和对象的动态创建和调用 动态创建数据或者对象是指在程序运行过程中创建数据变量或者对象实例,我们可以用引用定义来创建数据变量,格式为: CREATE DATA  gt_def TYPE ( ...

  6. ABAP中P类型介绍

    ABAP中比较难以理解的是P类型的使用,P类型是一种压缩类型,主要用于存储小数,定义时要指定字节数和小数点位数,定义语法如下: DATA: name(n) TYPE P decimals m,n代表字 ...

  7. ABAP中常见的接口技术类型

    下面总结一下ABAP中的各种接口技术,因为学习时间不是很长,肯定还不全(还有增强.出口等),以后再补上. 针对具体的情况,选择不同的接口方法,或几种方法并行使用. 一.CPI-C 是基础,但不是很常用 ...

  8. ABAP中接收.NET语言byte[]类型返回值问题

    在公司自开发的一个项目中,使用了.NET编写的视频监控控件.控件提供了CutBytePicture接口函数用于截取视频图片,返回图片字节流..NET函数原型如下: public byte[] CutB ...

  9. ABAP中的Table Control编程

    SAP中,Table Control是在Screen中用的最广泛的控件之一了,可以实现对多行数据的编辑. 简单来说,Table Control是一组屏幕元素在Screen上的重复出现,这就是它与普通屏 ...

最新文章

  1. b站编程课程资源汇总
  2. redis数据库各种数据类型的增删改查命令
  3. Python爬虫框架Scrapy学习笔记原创
  4. mysql 密码重置 linux_怎么在linux系统重置mysql的root密码
  5. 戴尔T630安装Ubuntu操作系统及Gaussian 09
  6. python win32com模块
  7. 扫读笔好还是点读笔好 有什么区别
  8. python神经网络模型调用后预测值不变_用R语言实现神经网络预测股票实例
  9. CPP QT实现excel的冻结窗格
  10. SyntaxError报错成功解决
  11. windows10启动项修复||an operating system wasn't found解决办法
  12. ElasticSearch知识概括
  13. 只是想要自己喜欢的生活,可是你有资格么?
  14. Android:开发中,代码被横线划掉是什么意思
  15. 分享受用一生的高效 PyCharm 使用技巧。
  16. 【180622】带音效的VC++俄罗斯方块游戏源码
  17. ThreeJS导入外部obj和mtl
  18. 【性能优化】PHP - 优化手段 - 学习/实践
  19. 世界各国英文简写代码
  20. 天猫精灵控制8266 服务器环境

热门文章

  1. 联通用户的福利,不了解就拉倒!
  2. 海康威视USB相机踩坑指南
  3. VS2010中VB.NET中API函数的调用
  4. 斯坦福机器人学导论(视频+英文PPT讲义+课程作业+英文书籍)
  5. [附源码]Java计算机毕业设计SSM潮购购物网站
  6. 第五章:B视频Include包含文件
  7. 【代码复现】Windows10复现nerf-pytorch
  8. Sourcetree的下载与安装
  9. ubuntu下安装和配置Qt5.12.8
  10. 如何将Dicom系列转换为一个Nifti文件(Python)