如何阅读ABAP程序

1.要求

在这里插入图片描述

在这里插入图片描述

2.代码

REPORT zjglmm005.
TYPE-POOLS: slis.
TABLES:mseg,mkpf,mard.
*一、数据声明
DATA: BEGIN OF item OCCURS 0,
        lifnr      LIKE mseg-lifnr,                "供应商帐号
        werks      LIKE mseg-werks,                "工厂
        lgort      LIKE mseg-lgort,                "库位
        matnr      LIKE mseg-matnr,                "物料号
        bwart      LIKE mseg-bwart,                "移动类型
        sobkz      LIKE mseg-sobkz,                "特殊库存标识
        mblnr      LIKE mseg-mblnr,                "物料凭证
        meins      LIKE mseg-meins,                "单位
        menge      LIKE mseg-menge,                "数量
        umlgo      LIKE mseg-umlgo,                "发出库存地
        shkzg      LIKE mseg-shkzg,                "借贷标识
        budat_mkpf LIKE mseg-budat_mkpf,      " 过账日期
        xblnr_mkpf LIKE mseg-xblnr_mkpf,
      END OF item.
DATA:itas LIKE TABLE OF item WITH HEADER LINE.
DATA:itaf LIKE TABLE OF item WITH HEADER LINE.
DATA:itag LIKE TABLE OF item WITH HEADER LINE.
DATA:itah LIKE TABLE OF item WITH HEADER LINE.
DATA:itai LIKE TABLE OF item WITH HEADER LINE.
DATA:itaj LIKE TABLE OF item WITH HEADER LINE.
DATA:itak LIKE TABLE OF item WITH HEADER LINE.
DATA:ital LIKE TABLE OF item WITH HEADER LINE.
DATA:itam LIKE TABLE OF item WITH HEADER LINE.
DATA:itan LIKE TABLE OF item WITH HEADER LINE.
DATA:itao LIKE TABLE OF item WITH HEADER LINE.
DATA:itap LIKE TABLE OF item WITH HEADER LINE.
DATA:itaq LIKE TABLE OF item WITH HEADER LINE.
DATA:itar LIKE TABLE OF item WITH HEADER LINE.
DATA:itat LIKE TABLE OF item WITH HEADER LINE.
DATA:itaw LIKE TABLE OF item WITH HEADER LINE.
DATA:BEGIN OF item1 OCCURS 0.
        INCLUDE STRUCTURE item.
DATA:  bktxt LIKE mkpf-bktxt,
       END OF item1.
DATA:lt_mseg LIKE TABLE OF item1 WITH HEADER LINE.
DATA:itac LIKE TABLE OF item1 WITH HEADER LINE.
DATA:ltac LIKE TABLE OF item1 WITH HEADER LINE.
DATA:itqc LIKE TABLE OF item1 WITH HEADER LINE.
DATA:itqd LIKE TABLE OF item1 WITH HEADER LINE.
DATA:itqe LIKE TABLE OF item1 WITH HEADER LINE.
DATA:itqf LIKE TABLE OF item1 WITH HEADER LINE.
DATA:ltag LIKE TABLE OF item1 WITH HEADER LINE.
DATA:ltah LIKE TABLE OF item1 WITH HEADER LINE.
DATA:ltai LIKE TABLE OF item1 WITH HEADER LINE.
DATA:BEGIN OF itae OCCURS 0,
       bukrs      LIKE mseg-bukrs,                " 公司
       werks      LIKE mseg-werks,                "工厂
       matnr      LIKE mseg-matnr,                "物料号码
       maktx      LIKE makt-maktx,                 " 物料描述
       butxt      LIKE t001-butxt,                 "公司名称
       sobkz      LIKE mseg-sobkz,                "特殊库存标识
       mblnr      LIKE mkpf-mblnr,                "物料凭证
       meins      LIKE mseg-meins,                "单位
       menge      LIKE mseg-menge,                "数量
       umlgo      LIKE mseg-umlgo,                "发出库存地
       shkzg      LIKE mseg-shkzg,                "借贷标识
       budat_mkpf LIKE mseg-budat_mkpf,      " 过账日期
       lgort      LIKE mseg-lgort,                  " 库存地点
       lgobe      LIKE t001l-lgobe,                  " 库存地点描述
       lgpbe      LIKE mard-lgpbe,                " 仓库员
       lifnr      LIKE mseg-lifnr,                "供应商帐号
       name1      LIKE lfa1-name1,                "你应商描述
       qcsl       LIKE mseg-menge,               " 期初数量
       zycgsl     LIKE mseg-menge,             " 自有采购入库数量
       jscgsl     LIKE mseg-menge,             " 寄售采购入库数量
       zydbsl     LIKE mseg-menge,            " 自有调拨入库数量
       jsdbsl     LIKE mseg-menge,             " 寄售调拔入库数量
       zyctsl     LIKE mseg-menge,            " 自有仓退数量
       jsctsl     LIKE mseg-menge,            " 寄售仓退数量
       zypssl     LIKE mseg-menge,            " 自有配送数量
       jspssl     LIKE mseg-menge,            " 寄售配送数量
       bmllsl     LIKE mseg-menge,            " 部门领料出库数
       zydbcsl    LIKE mseg-menge,            " 自有调拔出库数
       jsdbcsl    LIKE mseg-menge,            " 寄售调拔出库数
       shllsl     LIKE mseg-menge,            " 售后领料数
       shllsl1    LIKE mseg-menge,            " 售后领料数
*       shyfllsl   LIKE mseg-menge,            " 售后领料数
       yfllsl     LIKE mseg-menge,            " 研发领料数
       yfllsl1    LIKE mseg-menge,            " 研发领料数

       jsshsl     LIKE mseg-menge,            " 寄售售后领料数
       zycjsl     LIKE mseg-menge,            " 自有车间领料数
       jscjsl     LIKE mseg-menge,            " 寄售车间领料
       qmsl       LIKE mseg-menge,             " 期末数量
     END OF itae.
DATA:itad LIKE TABLE OF itae WITH HEADER LINE.
DATA:itab LIKE TABLE OF itae WITH HEADER LINE.
DATA: l_pos TYPE i VALUE 1.
DATA: gd_repid LIKE sy-repid.
DATA: i_grid_settings TYPE lvc_s_glay.
DATA: afield TYPE slis_fieldcat_alv.
DATA: fieldcat TYPE TABLE OF slis_fieldcat_alv WITH HEADER LINE.
DATA: layout TYPE slis_layout_alv.
DATA: lt_sort TYPE slis_t_sortinfo_alv.
DATA: wa_sort TYPE slis_sortinfo_alv.
DATA: l_a LIKE sy-datum, l_b LIKE sy-datum.     " definition  data .
*宏的定义
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.
  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'.
SELECT-OPTIONS      p_lgort  FOR mseg-lgort OBLIGATORY.
SELECT-OPTIONS      p_matnr  FOR mseg-matnr .
SELECT-OPTIONS      s_budat  FOR mseg-budat_mkpf OBLIGATORY .
SELECT-OPTIONS      p_lgpbe  FOR mard-lgpbe .
SELECTION-SCREEN END OF BLOCK blc.

INITIALIZATION.
  s_budat-option = 'BT'.
  s_budat-sign = 'I'.

  CALL FUNCTION 'CCM_GO_BACK_MONTHS'
    EXPORTING
      currdate   = sy-datum
      backmonths = 1            "过去月数
    IMPORTING
      newdate    = s_budat-low.

  s_budat-low+6(2) = '21'.
  s_budat-high = sy-datum.
  s_budat-high+6(2) = '20'.
  APPEND s_budat.

*取数
START-OF-SELECTION.
  PERFORM frm_get_data.                 "获取数据
  IF item1[] IS NOT INITIAL.
    PERFORM frm_show_data.
  ELSE.
    MESSAGE s001(00) WITH '没有查询到数据'.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .
  CLEAR:  item1[].

  SELECT  t1~lifnr t1~werks t1~lgort  t1~matnr   t1~bwart t1~sobkz   t1~mblnr t1~meins  t1~menge t1~umlgo t1~shkzg t1~budat_mkpf t1~xblnr_mkpf
  t2~bktxt    INTO CORRESPONDING FIELDS OF TABLE item1
            FROM mseg  AS t1
            INNER JOIN    mkpf AS t2  ON ( t1~mblnr = t2~mblnr  )
            WHERE werks = p_werks
            AND  lgort  IN p_lgort
            AND  matnr IN p_matnr.

  LOOP AT item1.
    MOVE-CORRESPONDING item1 TO ltah.
    APPEND ltah.
    CLEAR ltah.

    IF item1-budat_mkpf IN s_budat.                               "  itac is  diferent  data total. lt_mesg is  begning data. itab is  matieral  toall.
      MOVE-CORRESPONDING item1 TO lt_mseg.
      APPEND lt_mseg.
      CLEAR lt_mseg.
    ELSEIF item1-budat_mkpf < s_budat-low .
      MOVE-CORRESPONDING item1 TO ltac.
      APPEND ltac.
      CLEAR ltac.
    ENDIF.
    IF item1-sobkz EQ 'K'.
      itae-werks = item1-werks.
      itae-lgort = item1-lgort.
      itae-lifnr = item1-lifnr.
      itae-matnr = item1-matnr.
      itae-meins = item1-meins.
      itae-sobkz = item1-sobkz.
      COLLECT itae.
    ELSEIF item1-sobkz = ''.
      itad-werks = item1-werks.
      itad-lgort = item1-lgort.
      itad-matnr = item1-matnr.
      itad-meins = item1-meins.
      COLLECT itad.
    ENDIF.
    CLEAR item1.
  ENDLOOP.

  LOOP AT ltah.
    IF ltah-budat_mkpf <= s_budat-high .
      MOVE-CORRESPONDING ltah TO ltai.
      APPEND ltai.
      CLEAR ltai.
    ENDIF.

  ENDLOOP.

*
  LOOP AT ltac.
    IF ltac-sobkz = 'K'.
      itqc-matnr = ltac-matnr.
      itqc-lgort = ltac-lgort.
      itqc-lifnr = ltac-lifnr.
      itqc-sobkz = ltac-sobkz.
      IF ltac-shkzg = 'H'.
        itqc-menge = - ltac-menge.
      ELSEIF ltac-shkzg = 'S' .
        itqc-menge = ltac-menge.
      ENDIF.
      COLLECT itqc.
      CLEAR itqc.
    ELSE .

      itqd-matnr = ltac-matnr.                    " 期初数据
      itqd-lgort = ltac-lgort.

      IF ltac-shkzg = 'H'.
        itqd-menge = - ltac-menge.
      ELSEIF ltac-shkzg = 'S' .
        itqd-menge = ltac-menge.
      ENDIF.
      COLLECT itqd.
      CLEAR itqd.
    ENDIF.

  ENDLOOP.
  LOOP AT ltai.                                    " 期末数据
    IF ltai-sobkz = 'K'.
      itqe-matnr = ltai-matnr.
      itqe-lgort = ltai-lgort.
      itqe-lifnr = ltai-lifnr.
      itqe-sobkz = ltai-sobkz.
      IF ltai-shkzg = 'H'.
        itqe-menge = - ltai-menge.
      ELSEIF ltai-shkzg = 'S' .
        itqe-menge = ltai-menge.
      ENDIF.
      COLLECT itqe.
      CLEAR itqe.
    ELSE .
      itqf-matnr = ltai-matnr.
      itqf-lgort = ltai-lgort.

      IF ltai-shkzg = 'H'.
        itqf-menge = - ltai-menge.
      ELSEIF ltai-shkzg = 'S' .
        itqf-menge = ltai-menge.
      ENDIF.
      COLLECT itqf.
      CLEAR itqf.
    ENDIF.
  ENDLOOP.



  LOOP AT lt_mseg .
    IF lt_mseg-sobkz = ''.
      itas-matnr = lt_mseg-matnr .
      itas-lgort = lt_mseg-lgort.

      IF  lt_mseg-bwart = '101' .
        itas-menge  =  lt_mseg-menge.                    " 自有采购数
      ELSEIF lt_mseg-bwart = '102' .
        itas-menge  =  - lt_mseg-menge.
      ENDIF.
      COLLECT itas.
      CLEAR itas.
      IF itas-menge = 0.
        DELETE itas  WHERE menge = 0 .
      ENDIF.
      itag-matnr = lt_mseg-matnr.
      itag-lgort = lt_mseg-lgort.

      IF  lt_mseg-bwart = 'Z69' AND lt_mseg-shkzg = 'S' .
        itag-menge  =   lt_mseg-menge.                                                                 " 自有调拨入库数
      ELSEIF  lt_mseg-bwart = 'Z70'  AND lt_mseg-shkzg = 'H' .
        itag-menge  =  - lt_mseg-menge.
      ENDIF.
      COLLECT itag.
      CLEAR itag.
      IF itag-menge = 0.
        DELETE itag  WHERE menge = 0 .
      ENDIF.
      itai-matnr = lt_mseg-matnr.
      itai-lgort = lt_mseg-lgort.
      " 自有仓退数
      IF  lt_mseg-bwart = '122'  .
        itai-menge  =   lt_mseg-menge.
      ELSEIF lt_mseg-bwart = '123'  .
        itai-menge  =  - lt_mseg-menge.
      ENDIF.
      COLLECT itai.
      CLEAR itai.
      IF itai-menge = 0.
        DELETE itai  WHERE menge = 0 .
      ENDIF.

      itak-matnr = lt_mseg-matnr.
      itak-lgort = lt_mseg-lgort.

      IF lt_mseg-bwart = '411' AND lt_mseg-shkzg = 'H' AND  lt_mseg-xblnr_mkpf+0(2)  = 'PD' .    " 自有配送数
        itak-menge  =   - lt_mseg-menge.
      ELSEIF  lt_mseg-bwart = '412' AND lt_mseg-shkzg = 'S' AND  lt_mseg-xblnr_mkpf+0(2) = 'PD' .
        itak-menge =   lt_mseg-menge.
      ENDIF.
      COLLECT itak.
      CLEAR itak.
      IF itak-menge = 0.
        DELETE itak  WHERE menge = 0 .
      ENDIF.

      itam-matnr = lt_mseg-matnr.
      itam-lgort = lt_mseg-lgort.

      IF lt_mseg-bwart = 'z37'OR  lt_mseg-bwart = '201' AND lt_mseg-shkzg = 'H'  .                        " 自有部门领料
        itam-menge  =  - lt_mseg-menge.
      ELSEIF lt_mseg-bwart = 'Z38'OR lt_mseg-bwart ='202' AND lt_mseg-shkzg = 'S'  .
        itam-menge  =   lt_mseg-menge.
      ENDIF.
      COLLECT itam.
      CLEAR itam.
      IF itam-menge = 0.
        DELETE itam  WHERE menge = 0 .
      ENDIF.

      itan-matnr = lt_mseg-matnr .
      itan-lgort = lt_mseg-lgort.

      IF  lt_mseg-bwart = 'Z69'  AND lt_mseg-shkzg = 'H' AND   lt_mseg-lgort <> '1301' AND  lt_mseg-lgort <> '1302' AND  lt_mseg-lgort <> '2301' AND  lt_mseg-lgort <>'2302' .       " 自有调拨出库数
        itan-menge  =  - lt_mseg-menge.
      ELSEIF lt_mseg-bwart = 'Z70' AND lt_mseg-shkzg = 'S' AND ( lt_mseg-lgort <> '1301' AND  lt_mseg-lgort <> '1302' AND  lt_mseg-lgort <> '2301' AND  lt_mseg-lgort <>'2302') .
        itan-menge  =  lt_mseg-menge .
      ENDIF.
      COLLECT itan.
      CLEAR itan.
      IF itan-menge = 0.
        DELETE itan  WHERE menge = 0 .
      ENDIF.

      itap-matnr = lt_mseg-matnr.
      itap-lgort = lt_mseg-lgort.

      IF  lt_mseg-bwart = 'Z69'  AND lt_mseg-shkzg = 'H' AND ( lt_mseg-umlgo = '1301' OR lt_mseg-umlgo = '1302' OR lt_mseg-umlgo = '2301' OR lt_mseg-umlgo ='2302' ).         " 自有其它领料1
        itap-menge  =  - lt_mseg-menge.
      ELSEIF lt_mseg-bwart = 'Z70' AND lt_mseg-shkzg = 'S' AND (  lt_mseg-umlgo = '1301' OR lt_mseg-umlgo = '1302' OR lt_mseg-umlgo = '2301' OR lt_mseg-umlgo ='2302') .
        itap-menge  =  lt_mseg-menge.
      ENDIF.
      COLLECT itap.
      CLEAR itap.
      IF itap-menge = 0.
        DELETE itap  WHERE menge = 0 .
      ENDIF.

      itaq-matnr = lt_mseg-matnr.
      itaq-lgort = lt_mseg-lgort.

      IF  lt_mseg-bwart = '601' AND lt_mseg-shkzg = 'H'   .      "自有其它领料2
        itaq-menge  =   - lt_mseg-menge.
      ELSEIF  lt_mseg-bwart = '602' AND lt_mseg-shkzg = 'S'  .
        itaq-menge =   lt_mseg-menge.
      ENDIF.
      COLLECT itaq.
      CLEAR itaq.
      IF itaq-menge = 0.
        DELETE itaq  WHERE menge = 0 .
      ENDIF.

      itat-matnr = lt_mseg-matnr .
      itat-lgort = lt_mseg-lgort.

      IF ( lt_mseg-bwart = '411' OR lt_mseg-bwart = '201' )  AND lt_mseg-shkzg = 'H' AND ( lt_mseg-bktxt+0(2) = 'FL' OR lt_mseg-bktxt+0(2) = 'LJ' OR lt_mseg-bktxt+0(2) = 'BJ' OR    "自由车间恍
              lt_mseg-xblnr_mkpf+0(2) ='YL' OR lt_mseg-xblnr_mkpf+0(2) ='ZC' )  .
        itat-menge  = -  lt_mseg-menge.
      ELSEIF   ( lt_mseg-bwart = '412' OR lt_mseg-bwart = '202' )  AND lt_mseg-shkzg = 'S' AND ( lt_mseg-bktxt+0(2) = 'FL' OR lt_mseg-bktxt+0(2) = 'LJ' OR lt_mseg-bktxt+0(2) = 'BJ' OR
        lt_mseg-bktxt+0(2) ='YL' OR lt_mseg-bktxt+0(2) ='ZC' )  .
        itat-menge  =   lt_mseg-menge.
      ENDIF.
      COLLECT itat.
      CLEAR itat.
      IF itat-menge = 0.
        DELETE itat  WHERE menge = 0 .
      ENDIF.

    ENDIF.

    IF  lt_mseg-sobkz = 'K' .
      itaf-matnr = lt_mseg-matnr .
      itaf-lifnr = lt_mseg-lifnr.
      itaf-lgort = lt_mseg-lgort.
      IF  lt_mseg-bwart = '101' .
        itaf-menge  =  lt_mseg-menge.                  " 寄售采购数
      ELSEIF lt_mseg-bwart = '102' .
        itaf-menge =  - lt_mseg-menge.
      ENDIF.
      COLLECT itaf.
      CLEAR itaf.
      IF itaf-menge = 0.
        DELETE itaf  WHERE menge = 0 .
      ENDIF.


      itah-matnr = lt_mseg-matnr.
      itah-lifnr = lt_mseg-lifnr.
      itah-lgort = lt_mseg-lgort.
      IF  ( lt_mseg-bwart = 'Z69'  ) AND lt_mseg-shkzg = 'S' .                                " 寄售调拨入库数
        itah-menge  = lt_mseg-menge.
      ELSEIF ( lt_mseg-bwart = 'Z70' ) AND lt_mseg-shkzg = 'H'.
        itah-menge =  - lt_mseg-menge.
      ENDIF.
      COLLECT itah.
      CLEAR itah.
      IF itah-menge = 0.
        DELETE itah  WHERE menge = 0 .
      ENDIF.

      itaj-matnr = lt_mseg-matnr.
      itaj-lifnr = lt_mseg-lifnr.
      itaj-lgort = lt_mseg-lgort.
      IF  lt_mseg-bwart = '122'  .                                             " 寄售仓退数
        itaj-menge  =  lt_mseg-menge.
      ELSEIF  lt_mseg-bwart = '123' .
        itaj-menge =  - lt_mseg-menge.
      ENDIF.
      COLLECT itaj.
      CLEAR itaj.
      IF itaj-menge = 0.
        DELETE itaj  WHERE menge = 0 .
      ENDIF.

      ital-matnr = lt_mseg-matnr .
      ital-lifnr = lt_mseg-lifnr .
      ital-lgort = lt_mseg-lgort.
      IF ( lt_mseg-bwart = '411' OR lt_mseg-bwart ='311' ) AND lt_mseg-shkzg = 'H' AND  lt_mseg-xblnr_mkpf+0(2) = 'PS' .           " 寄售配送数
        ital-menge  =  - lt_mseg-menge.
      ELSEIF ( lt_mseg-bwart = '412'OR lt_mseg-bwart ='312') AND lt_mseg-shkzg = 'S' AND  lt_mseg-xblnr_mkpf+0(2) = 'PS'  .
        ital-menge  =   lt_mseg-menge.
      ENDIF.
      COLLECT ital.
      CLEAR ital.

      IF ital-menge = 0.
        DELETE ital  WHERE menge = 0 .
      ENDIF.

      itao-matnr = lt_mseg-matnr .
      itao-lifnr = lt_mseg-lifnr .
      itao-lgort = lt_mseg-lgort.
      IF ( lt_mseg-bwart = 'Z69'  ) AND lt_mseg-shkzg = 'H' AND  lt_mseg-lgort <> '1301' AND lt_mseg-lgort <> '1302' AND lt_mseg-lgort <> '2301' AND lt_mseg-lgort <> '2302'  . " 寄售调拨出库数
        itao-menge  =  - lt_mseg-menge.
      ELSEIF ( lt_mseg-bwart = 'Z70' ) AND lt_mseg-shkzg = 'S' AND  lt_mseg-lgort <> '1301' AND lt_mseg-lgort <> '1302' AND lt_mseg-lgort <> '2301' AND lt_mseg-lgort <>'2302' .
        itao-menge =   lt_mseg-menge.
      ENDIF.
      COLLECT itao.
      CLEAR itao.
      IF itao-menge = 0.
        DELETE itao  WHERE menge = 0 .
      ENDIF.


      itar-matnr = lt_mseg-matnr.
      itar-lifnr = lt_mseg-lifnr.
      itar-lgort = lt_mseg-lgort.
      IF  lt_mseg-bwart = '411' AND lt_mseg-shkzg = 'H' AND ( lt_mseg-umlgo = '1301' OR lt_mseg-umlgo = '1302' OR lt_mseg-umlgo = '2301' OR lt_mseg-umlgo ='2302' ).        " 寄售其它领料
        itar-menge  = - lt_mseg-menge.
      ELSEIF  lt_mseg-bwart = '412' AND lt_mseg-shkzg = 'S' AND ( lt_mseg-umlgo = '1301' OR lt_mseg-umlgo = '1302' OR lt_mseg-umlgo = '2301' OR lt_mseg-umlgo ='2302') .
        itar-menge =   lt_mseg-menge.
      ENDIF.
      COLLECT itar.
      CLEAR itar.
      IF itar-menge = 0.
        DELETE itar  WHERE menge = 0 .
      ENDIF.


      itaw-matnr = lt_mseg-matnr .
      itaw-lifnr = lt_mseg-lifnr .
      itaw-lgort = lt_mseg-lgort.
      IF ( lt_mseg-bwart = '411' OR lt_mseg-bwart = '311' )  AND lt_mseg-shkzg = 'H' AND ( lt_mseg-bktxt+0(2) = 'FL' OR lt_mseg-bktxt+0(2) = 'LJ' OR lt_mseg-bktxt+0(2) = 'BJ' OR  " 寄售车间
          lt_mseg-bktxt+0(2) ='YL' OR lt_mseg-bktxt+0(2) ='ZC' )  .
        itaw-menge  =  - lt_mseg-menge.
      ELSEIF   ( lt_mseg-bwart = '412' OR lt_mseg-bwart = '312' )  AND lt_mseg-shkzg = 'S' AND ( lt_mseg-bktxt+0(2) = 'FL' OR lt_mseg-bktxt+0(2) = 'LJ' OR lt_mseg-bktxt+0(2) = 'BJ' OR
        lt_mseg-bktxt+0(2) ='YL' OR lt_mseg-bktxt+0(2) ='ZC' )  .
        itaw-menge  =   lt_mseg-menge.
      ENDIF.
      COLLECT itaw.
      CLEAR itaw.
      IF itaw-menge = 0.
        DELETE itaw  WHERE menge = 0 .
      ENDIF.

    ENDIF.

  ENDLOOP.


  LOOP AT itad.
    CLEAR: itas,itag,itai,itak,itam,itan,itap,itaq,itat.

    " 自有采购领料
    READ TABLE itas INTO itas WITH KEY  matnr = itad-matnr  lgort = itad-lgort .
    itad-zycgsl = itas-menge.
    "自有调拨数量
    READ TABLE itag INTO itag WITH KEY  matnr = itad-matnr  lgort = itad-lgort  .
    itad-zydbsl = itag-menge.
    " 自有仓退数量
    READ TABLE itai INTO itai WITH KEY  matnr = itad-matnr lgort = itad-lgort  .
    itad-zyctsl = itai-menge.
    " 自有配送数量
    READ TABLE itak INTO itak WITH KEY  matnr = itad-matnr lgort = itad-lgort .
    itad-zypssl = itak-menge.
    " 自有部门数量
    READ TABLE itam INTO itam WITH KEY  matnr = itad-matnr lgort = itad-lgort .
    itad-bmllsl = itam-menge.
    " 自有调拨数量
    READ TABLE itan INTO itan WITH KEY  matnr = itad-matnr  lgort = itad-lgort .
    itad-zydbcsl = itan-menge.
    " 售后领料自有
    READ TABLE itap INTO itap WITH KEY  matnr = itad-matnr  lgort = itad-lgort .
    itad-shllsl1 = itap-menge.
    " 销售出库领料
    READ TABLE itaq INTO itaq WITH KEY  matnr = itad-matnr  lgort = itad-lgort .
    itad-yfllsl1 = itaq-menge.
*    itad-shyfllsl =  itad-shllsl1 + itad-yfllsl1 + itad-shyfllsl.
    "自有车间领料
    READ TABLE itat INTO itat WITH KEY  matnr = itad-matnr lgort = itad-lgort  .
    itad-zycjsl = itat-menge.
    MODIFY itad.
    CLEAR itad.
  ENDLOOP.



  LOOP AT itae.
    CLEAR: itaf,itah,itaj,ital,itao,itar,itaw.

    " 寄售采购领料
    READ TABLE itaf INTO itaf WITH KEY  matnr = itae-matnr lgort = itae-lgort lifnr = itae-lifnr.

    itae-jscgsl = itaf-menge.

    " 寄售调拨数量

    READ TABLE itah INTO itah WITH KEY  matnr = itae-matnr lgort = itae-lgort lifnr = itae-lifnr.

    itae-jsdbsl = itah-menge.
    " 寄后仓退数量

    READ TABLE itaj INTO itaj WITH KEY  matnr = itae-matnr  lgort = itae-lgort lifnr = itae-lifnr.

    itae-jsctsl = itaj-menge.
    " 寄售配送数量

    READ TABLE ital INTO ital WITH KEY  matnr = itae-matnr lgort = itae-lgort lifnr = itae-lifnr.

    itae-jspssl = ital-menge.
    " 寄售调拨数量

    READ TABLE itao INTO itao WITH KEY  matnr = itae-matnr  lgort = itae-lgort lifnr = itae-lifnr.

    itae-jsdbcsl = itao-menge.
    "寄售售后领料

    READ TABLE itar INTO itar WITH KEY  matnr = itae-matnr  lgort = itae-lgort lifnr = itae-lifnr.

    itae-jsshsl = itar-menge.
    "寄售车间领料

    READ TABLE itaw INTO itaw WITH KEY  matnr = itae-matnr  lgort = itae-lgort lifnr = itae-lifnr.

    itae-jscjsl = itaw-menge.
    MODIFY itae.


  ENDLOOP.

  APPEND LINES OF itae TO itad.

  LOOP AT itad.
    CLEAR: itqc ,itqd,itqe,itqf.

    "期初数量
    IF itad-sobkz = 'K'.
      READ TABLE itqc INTO itqc WITH KEY  matnr = itad-matnr  lgort = itad-lgort lifnr = itad-lifnr sobkz = itad-sobkz.
      itad-qcsl = itqc-menge.
    ELSE.
      READ TABLE itqd INTO itqd WITH KEY  matnr = itad-matnr  lgort = itad-lgort  .
      itad-qcsl = itqd-menge.
    ENDIF.
    IF itad-sobkz = 'K'.
      READ TABLE itqe INTO itqe WITH KEY  matnr = itad-matnr  lgort = itad-lgort lifnr = itad-lifnr sobkz = itad-sobkz.
      itad-qmsl = itqe-menge.
    ELSE.
      READ TABLE itqf INTO itqf WITH KEY  matnr = itad-matnr  lgort = itad-lgort  .
      itad-qmsl = itqf-menge.
    ENDIF.


    SELECT SINGLE butxt INTO itad-butxt FROM t001 WHERE bukrs = itad-bukrs.
    SELECT SINGLE maktx INTO itad-maktx FROM makt WHERE matnr = itad-matnr.
    SELECT SINGLE lgobe   INTO itad-lgobe FROM t001l WHERE lgort = itad-lgort.
    SELECT SINGLE lgpbe   INTO itad-lgpbe FROM mard WHERE matnr = itad-matnr and lgort = itad-lgort.
    SELECT SINGLE name1   INTO itad-name1 FROM lfa1 WHERE lifnr = itad-lifnr.
    MODIFY itad.
  ENDLOOP .

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  'LGORT'      '仓储地点'             '' '' ''.
  fill  'lgobe'      '仓储地点描述'             '' '' ''.
  fill  'lgpbe'      '仓库员'             '' '' ''.
  fill  'meins'      '单位'             '' '' ''.
  fill  'lifnr'      '供应商代码'             '' '' ''.
  fill  'name1'      '供应商名称'             '' '' ''.
  fill  'qcsl'         '期初数量'             'X' '' ''.
  fill  'zycgsl'       '自有采购入库数'             'X' '' ''.
  fill  'jscgsl'       '寄售采购入库数'             'X' '' ''.
  fill  'zydbsl'       '自有调拨入库数'             'X' '' ''.
  fill  'jsdbsl'       '寄售调拨入库数'             'X' '' ''.
  fill  'zyctsl'        '自有仓退数'             'X' '' ''.
  fill  'jsctsl'        '寄售仓退数'             'X' '' ''.
  fill  'zypssl'       '自有配送出库数'             'X' '' ''.
  fill  'jspssl'       '寄售配送出库数'             'X' '' ''.
  fill  'bmllsl'       '自有部门领料出库数'             'X' '' ''.
  fill  'zydbcsl'      '自有调拨出库数'             'X' '' ''.
  fill  'jsdbcsl'      '寄售调拨出库数'             'X' '' ''.
  fill  'shllsl1'     '售后领料自有出库数'             'X' '' ''.
  fill  'yfllsl1'     '销售领料出库数'             'X' '' ''.
  fill  'jsshsl'      '售后领料寄售出库数'             'X' '' ''.
  fill  'zycjsl'      '自有车间领料出库数'             'X' '' ''.
  fill  'jscjsl'      '寄售车间领料出库数'             'X' '' ''.
  fill  'qmsl'           '期末数量'             'X' '' ''.
  wa_sort-fieldname = 'MAKTX'.
  wa_sort-up = 'X'.
  APPEND wa_sort TO lt_sort.
  CLEAR wa_sort.
  wa_sort-fieldname = 'LGOBE'.
  wa_sort-up = 'X'.
  APPEND wa_sort TO lt_sort.
  CLEAR wa_sort.
  wa_sort-fieldname = 'NAME1'.
  wa_sort-up = 'X'.
  APPEND wa_sort TO lt_sort.
  CLEAR wa_sort.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_grid_settings          = i_grid_settings                 "显示界面可编辑字段上修改了数据,回车后就会立即将内表的数据也修改
      i_callback_program       = sy-cprog "sy-repid                        "标记当前程序
      it_fieldcat              = fieldcat[]
      is_layout                = layout
      i_callback_user_command  = 'USER_COMMAND'
      i_callback_pf_status_set = 'SET_STATUS'
    TABLES
      t_outtab                 = itad.
ENDFORM.                    " FRM_SHOW_DATA

FORM set_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZJGLL'.
ENDFORM.
FORM user_command USING rf_ucomm  LIKE sy-ucomm
                            rs TYPE slis_selfield .
  rs-refresh = 'X'.
  CASE rf_ucomm.
    WHEN '&IC1'.
      READ TABLE item  INDEX rs-tabindex.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.

3 总结

3.1 逻辑拆分

上面实现的逻辑是
a 先从数据库表里取值 到内表,
b 然后这个内表分成二部分,第一部分是期初数据内表,第二部份是这个时间段的数据;
c.对这个时间雄的内表数据进行处理分成(自有和寄售)
d.然后对这三部分数据做逻辑处理
e 然后对数据进行合并后处理
f: 最后实现展示.

3.2 总结

a ABAP实际上就是处理数据流的逻辑处理语言;
b 如果你很了解业务,你做ABAP开发是非常有优势的,你知道某个地方该怎么控制;
c:凡是都有一个借贷关系(有正负);

猜你喜欢

转载自blog.csdn.net/beyond911/article/details/111060629