如何优化ABAP程序

文章目录

      • 1 Before code
      • 3 After code
      • 3 Performance
      • 4 Summary
        • 4.1 We don' t use nested loop as possible as .
        • 4.2 We use useful data in the program .
        • 4.3 Take care history data .

1 Before code

 DATA:BEGIN OF LW_SZJE,
         ZJN    TYPE P DECIMALS 1, "折旧年
         KANSW  LIKE ANLC-KANSW,  "原值
         LJZJJE LIKE ANLC-KANSW,  "累计折旧
         ZCJZ   LIKE ANLC-KANSW,  "净值
         BNJTZJ LIKE ANLC-KANSW,  "本年计提折旧
         YJTJZ  LIKE ANLC-KANSW,  "已计提减值
         MENGE  LIKE ANLA-MENGE,  "数量/建筑
       END OF LW_SZJE.

  CLEAR:LV_DATUM,LV_LASTDAY.

  CONCATENATE P_GJAHR P_AFBLPE+1(2) '01' INTO LV_DATUM.

  CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'  "获取期间当月最后一天
    EXPORTING
      I_DATE = LV_DATUM
    IMPORTING
      E_DATE = LV_LASTDAY.

  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '020'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '100'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '101'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '105'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '115'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '120'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '130'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '131'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '300'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '310'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '320'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '330'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '341'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '346'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '400'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = 'Z01'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = 'Z02'.
  APPEND S_BWASL.
***20190729 begeing
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '200'.
  APPEND S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '201'.
  APPEND S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '20A'.
  APPEND S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '250'.
  APPEND S_BWASL.
***20190729 ending
  SELECT  ANLA~BUKRS ANLA~ANLN1 ANLA~ANLN2 ANLA~ANLKL ANLA~TXT50 ANLA~AKTIV ANLA~INVNR ANLA~TXA50 ANLA~MENGE ANLA~MEINS ANLA~SERNR
    ANLA~ORD41 ANLA~ORD42 ANLA~ORD43 ANLA~HERST ANLA~DEAKT ANLA~AIBN1 ANLA~AIBDT ANLA~ERDAT
    FROM ANLA
    INNER JOIN ANLZ ON ANLA~BUKRS = ANLZ~BUKRS AND ANLA~ANLN1 = ANLZ~ANLN1 AND ANLA~ANLN2 = ANLZ~ANLN2
    INTO CORRESPONDING FIELDS OF TABLE LT_ANLA
    WHERE ANLA~BUKRS IN S_BUKRS
    AND ANLA~ANLKL IN S_ANLKL
    AND ANLA~ANLN1 IN S_ANLN1
    AND ANLA~ORD41 IN S_ORD41
    AND ANLA~ORD42 IN S_ORD42
    AND ANLA~AKTIV <= LV_LASTDAY
    AND ANLA~AKTIV IN S_AKTIV
    AND ANLA~AKTIV NE '00000000'
    AND ANLZ~KOSTL IN S_KOSTL
    AND ANLZ~BDATU >= LV_DATUM.

  SELECT * FROM T087T INTO CORRESPONDING FIELDS OF TABLE LT_T087T[].

  IF LT_ANLA IS NOT INITIAL.
    SORT LT_ANLA BY BUKRS ANLN1 ANLN2.

    SELECT *
      FROM ANLC
      INTO CORRESPONDING FIELDS OF TABLE LT_ANLC
      FOR ALL ENTRIES IN LT_ANLA
      WHERE BUKRS = LT_ANLA-BUKRS
      AND ANLN1 = LT_ANLA-ANLN1
      AND ANLN2 = LT_ANLA-ANLN2
      AND AFABE = '01'
      AND GJAHR <= P_GJAHR.


    IF LT_ANLC IS NOT INITIAL.
      SORT LT_ANLC BY BUKRS ANLN1 ANLN2.

      SELECT BUKRS
             ANLN1
             ANLN2
             GJAHR
             PERAF
             NAFAZ
             AAFAZ
      FROM ANLP
      INTO CORRESPONDING FIELDS OF TABLE LT_ANLP
      FOR ALL ENTRIES IN LT_ANLC
      WHERE BUKRS = LT_ANLC-BUKRS
      AND ANLN1 = LT_ANLC-ANLN1
      AND ANLN2 = LT_ANLC-ANLN2
      AND GJAHR = LT_ANLC-GJAHR.

      SELECT ANEK~BUKRS
             ANEK~ANLN1
             ANEK~ANLN2
             ANEK~GJAHR
             ANEK~LNRAN
             ANEK~MONAT
             ANEA~NAFAV
             ANEA~NAFAL
      FROM  ANEK INNER JOIN ANEA ON ANEK~BUKRS = ANEA~BUKRS AND ANEK~ANLN1 = ANEA~ANLN1 AND ANEK~ANLN2 = ANEA~ANLN2 AND ANEK~GJAHR = ANEA~GJAHR AND  ANEK~LNRAN = ANEA~LNRAN
      INTO CORRESPONDING FIELDS OF TABLE LT_ANEK
      FOR ALL ENTRIES IN LT_ANLC
      WHERE ANEK~BUKRS = LT_ANLC-BUKRS
      AND ANEK~ANLN1 = LT_ANLC-ANLN1
      AND ANEK~ANLN2 = LT_ANLC-ANLN2
      AND ANEK~GJAHR = LT_ANLC-GJAHR.
    ENDIF.


    SELECT BUKRS
           ANLN1
           ANLN2
           GJAHR
           KNAFA
           KAAFA
    FROM ANLC
    INTO CORRESPONDING FIELDS OF TABLE LT_ANLC_SN
    FOR ALL ENTRIES IN LT_ANLA
    WHERE BUKRS = LT_ANLA-BUKRS
    AND ANLN1 = LT_ANLA-ANLN1
    AND ANLN2 = LT_ANLA-ANLN2
    AND GJAHR <= P_GJAHR.

    SELECT   BUKRS
             ANLN1
             ANLN2
             GJAHR
             BWASL
             ANBTR
             LNRAN
      FROM ANEP
      INTO CORRESPONDING FIELDS OF TABLE LT_ANEP
      FOR ALL ENTRIES IN LT_ANLA
      WHERE BUKRS = LT_ANLA-BUKRS
      AND ANLN1 = LT_ANLA-ANLN1
      AND ANLN2 = LT_ANLA-ANLN2
      AND BZDAT <=  LV_LASTDAY
      AND BWASL IN S_BWASL.


    SELECT * FROM ANLZ INTO CORRESPONDING FIELDS OF TABLE LT_ANLZ
      FOR ALL ENTRIES IN LT_ANLA
      WHERE BUKRS = LT_ANLA-BUKRS
      AND ANLN1 = LT_ANLA-ANLN1
      AND ANLN2 = LT_ANLA-ANLN2
      AND ADATU <= LV_LASTDAY
      AND BDATU >= LV_DATUM.

    IF LT_ANLZ IS NOT INITIAL.
      SORT LT_ANLZ BY WERKS STORT.
      SELECT * FROM T499S INTO CORRESPONDING FIELDS OF TABLE LT_T499S
        FOR ALL ENTRIES IN LT_ANLZ
        WHERE WERKS = LT_ANLZ-WERKS
        AND STAND = LT_ANLZ-STORT.
    ENDIF.

    SELECT * FROM ANLH INTO CORRESPONDING FIELDS OF TABLE LT_ANLH
      FOR ALL ENTRIES IN LT_ANLA
      WHERE BUKRS = LT_ANLA-BUKRS
      AND ANLN1 = LT_ANLA-ANLN1.

    SELECT * FROM ANLB INTO CORRESPONDING FIELDS OF TABLE LT_ANLB
      FOR ALL ENTRIES IN LT_ANLB
      WHERE BUKRS = LT_ANLB-BUKRS
      AND ANLN1 = LT_ANLB-ANLN1
      AND ANLN2 = LT_ANLB-ANLN2.

    SELECT
    ILOA~BUKRS
    ILOA~ANLNR
    ILOA~ANLUN
    ILOA~ILOAN
    EQUZ~EQUNR
    FROM ILOA INNER JOIN EQUZ ON ILOA~ILOAN = EQUZ~ILOAN
    INTO CORRESPONDING FIELDS OF TABLE LT_EQUNR
    FOR ALL ENTRIES IN LT_ANLA
    WHERE  ILOA~BUKRS = LT_ANLA-BUKRS
   AND ILOA~ANLNR = LT_ANLA-ANLN1
   AND ILOA~ANLUN = LT_ANLA-ANLN2
   AND EQUZ~DATAB <= LV_LASTDAY
   AND EQUZ~DATBI >= LV_LASTDAY.

    IF LT_EQUNR IS NOT INITIAL.
      SORT LT_EQUNR BY EQUNR.
      SELECT EQUNR
             EQKTX
       FROM EQKT INTO CORRESPONDING FIELDS OF TABLE LT_EQKT
       FOR ALL ENTRIES IN LT_EQUNR
       WHERE EQUNR = LT_EQUNR-EQUNR
       AND SPRAS = '1'.
    ENDIF.

    SELECT * FROM ANKT INTO CORRESPONDING FIELDS OF TABLE LT_ANKT
      FOR ALL ENTRIES IN LT_ANLA
      WHERE SPRAS = '1'
      AND ANLKL = LT_ANLA-ANLKL.
  ENDIF.

  SORT LT_ANLC BY ANLN1 ANLN2 GJAHR DESCENDING.
  SORT LT_ANLC_SN BY ANLN1 ANLN2 GJAHR DESCENDING.

  LOOP AT  LT_ANLA INTO LS_ANLA.
    CLEAR:LS_ALV,LV_SNZJ,LV_BNZJ,LV_JZJE,LV_GJAHR,LV_AFBLPE,LS_ANLC,LW_SZJE.
    MOVE-CORRESPONDING LS_ANLA TO LS_ALV.
    CALL FUNCTION 'CONVERSION_EXIT_GERNR_OUTPUT'
      EXPORTING
        INPUT  = LS_ALV-SERNR
      IMPORTING
        OUTPUT = LS_ALV-SERNR.

    READ TABLE LT_T087T WITH  KEY ORD4X = LS_ANLA-ORD41  ORDNR = '1'.
    IF SY-SUBRC = 0.
      LS_ALV-ORD41X = LT_T087T-ORDTX.
    ENDIF.
    READ TABLE LT_T087T WITH  KEY ORD4X = LS_ANLA-ORD42  ORDNR = '2'.
    IF SY-SUBRC = 0.
      LS_ALV-ORD42X = LT_T087T-ORDTX.
    ENDIF.
    READ TABLE LT_T087T WITH  KEY ORD4X = LS_ANLA-ORD43  ORDNR = '3'.
    IF SY-SUBRC = 0.
      LS_ALV-ORD43X = LT_T087T-ORDTX.
    ENDIF.

    READ TABLE LT_ANLZ INTO LS_ANLZ WITH KEY BUKRS = LS_ANLA-BUKRS ANLN1 = LS_ANLA-ANLN1 ANLN2 = LS_ANLA-ANLN2.
    IF SY-SUBRC = 0.
      LS_ALV-RAUMN = LS_ANLZ-RAUMN.
      LS_ALV-STORT = LS_ANLZ-STORT.
      LS_ALV-KFZKZ = LS_ANLZ-KFZKZ.
      LS_ALV-KOSTL = LS_ANLZ-KOSTL.

      READ TABLE LT_T499S INTO LS_T499S WITH KEY WERKS = LS_ANLZ-WERKS STAND = LS_ANLZ-STORT.
      IF SY-SUBRC = 0.
        LS_ALV-KTEXT = LS_T499S-KTEXT.
      ENDIF.
    ENDIF.

    READ TABLE LT_ANLH INTO LS_ANLH WITH KEY BUKRS = LS_ANLA-BUKRS ANLN1 = LS_ANLA-ANLN1.
    IF SY-SUBRC = 0.
      LS_ALV-ANLHTXT = LS_ANLH-ANLHTXT.
    ENDIF.

    READ TABLE LT_ANKT INTO LS_ANKT WITH KEY ANLKL = LS_ANLA-ANLKL.
    IF SY-SUBRC = 0.
      LS_ALV-TXK20 = LS_ANKT-TXK20.
    ENDIF.

    IF LS_ANLA-DEAKT IS NOT INITIAL.
      IF LS_ANLA-DEAKT < LV_LASTDAY.
        "已经报废数据
        LV_GJAHR = LS_ANLA-DEAKT+0(4).
      ELSE.
        LV_GJAHR = LV_LASTDAY+0(4).
      ENDIF.
    ELSE.
      LV_GJAHR = P_GJAHR.
    ENDIF.

    READ TABLE LT_ANLC INTO LS_ANLC WITH KEY BUKRS = LS_ANLA-BUKRS  ANLN1 = LS_ANLA-ANLN1 ANLN2 = LS_ANLA-ANLN2 GJAHR = LV_GJAHR.
    IF SY-SUBRC = 0.
      LW_SZJE-KANSW = LS_ANLC-KANSW.

      IF LS_ANLC-GJAHR = P_GJAHR.
        IF LS_ANLC-PSTEND IS INITIAL.
          LV_AFBLPE = P_AFBLPE.
        ELSE.
          IF LS_ANLC-PSTEND <= P_AFBLPE.
            LV_AFBLPE = LS_ANLC-PSTEND.
          ELSE.
            LV_AFBLPE = P_AFBLPE.
          ENDIF.
        ENDIF.
      ELSE.
        LV_AFBLPE = LS_ANLC-PSTEND.
      ENDIF.

      LW_SZJE-ZJN = ( LS_ANLC-NDABJ * 12 + LS_ANLC-NDABP + LV_AFBLPE ) / 12.
      LS_ALV-ZJN = LW_SZJE-ZJN.

      IF LV_AFBLPE = '012'.
*        LOOP AT lt_anlp INTO ls_anlp WHERE bukrs = ls_anla-bukrs AND anln1 = ls_anla-anln1 AND anln2 = ls_anla-anln2 AND gjahr = ls_anlc-gjahr .
        LOOP AT LT_ANLP INTO LS_ANLP WHERE BUKRS = LS_ANLA-BUKRS AND ANLN1 = LS_ANLA-ANLN1 AND ANLN2 = LS_ANLA-ANLN2 AND GJAHR = P_GJAHR .
          LV_BNZJ = LV_BNZJ + LS_ANLP-NAFAZ + LS_ANLP-AAFAZ.
          IF LS_ANLA-DEAKT IS INITIAL OR LS_ANLA-DEAKT(6) GT LV_LASTDAY(6).
            LW_SZJE-BNJTZJ = LW_SZJE-BNJTZJ + LS_ANLP-NAFAZ.
          ENDIF.
          LW_SZJE-YJTJZ = LW_SZJE-YJTJZ + LS_ANLP-AAFAZ.
        ENDLOOP.

*        LOOP AT lt_anek INTO ls_anek WHERE bukrs = ls_anla-bukrs AND anln1 = ls_anla-anln1 AND anln2 = ls_anla-anln2 AND gjahr = ls_anlc-gjahr .
        LOOP AT LT_ANEK INTO LS_ANEK WHERE BUKRS = LS_ANLA-BUKRS AND ANLN1 = LS_ANLA-ANLN1 AND ANLN2 = LS_ANLA-ANLN2 AND GJAHR = P_GJAHR .
          LV_BNZJ = LV_BNZJ + LS_ANEK-NAFAV + LS_ANEK-NAFAL.
        ENDLOOP.
      ELSE.
*        LOOP AT lt_anlp INTO ls_anlp WHERE bukrs = ls_anla-bukrs AND anln1 = ls_anla-anln1 AND anln2 = ls_anla-anln2 AND gjahr = ls_anlc-gjahr  AND peraf <= lv_afblpe.
        LOOP AT LT_ANLP INTO LS_ANLP WHERE BUKRS = LS_ANLA-BUKRS AND ANLN1 = LS_ANLA-ANLN1 AND ANLN2 = LS_ANLA-ANLN2 AND GJAHR = P_GJAHR  AND PERAF <= LV_AFBLPE.
          LV_BNZJ = LV_BNZJ + LS_ANLP-NAFAZ + LS_ANLP-AAFAZ.
          IF LS_ANLA-DEAKT IS INITIAL OR LS_ANLA-DEAKT(6) GT LV_LASTDAY(6).
            LW_SZJE-BNJTZJ = LW_SZJE-BNJTZJ + LS_ANLP-NAFAZ.
          ENDIF.
          LW_SZJE-YJTJZ = LW_SZJE-YJTJZ + LS_ANLP-AAFAZ.
        ENDLOOP.

        CLEAR LV_MONAT.
        LV_MONAT = LV_AFBLPE+1(2).
*        LOOP AT lt_anek INTO ls_anek WHERE bukrs = ls_anla-bukrs AND anln1 = ls_anla-anln1 AND anln2 = ls_anla-anln2 AND gjahr = ls_anlc-gjahr AND monat <= lv_monat .
        LOOP AT LT_ANEK INTO LS_ANEK WHERE BUKRS = LS_ANLA-BUKRS AND ANLN1 = LS_ANLA-ANLN1 AND ANLN2 = LS_ANLA-ANLN2 AND GJAHR = P_GJAHR AND MONAT <= LV_MONAT .
          LV_BNZJ = LV_BNZJ + LS_ANEK-NAFAV + LS_ANEK-NAFAL.
        ENDLOOP.
      ENDIF.
    ENDIF.

*    READ TABLE lt_anlc_sn INTO ls_anlc_sn WITH KEY bukrs = ls_anla-bukrs  anln1 = ls_anla-anln1  anln2 = ls_anla-anln2 gjahr = ls_anlc-gjahr.
    READ TABLE LT_ANLC_SN INTO LS_ANLC_SN WITH KEY BUKRS = LS_ANLA-BUKRS  ANLN1 = LS_ANLA-ANLN1  ANLN2 = LS_ANLA-ANLN2 GJAHR = P_GJAHR.
    IF SY-SUBRC = 0.
      LV_SNZJ =  LS_ANLC_SN-KNAFA + LS_ANLC_SN-KAAFA.
    ENDIF.

    LOOP AT LT_ANEP INTO LS_ANEP WHERE BUKRS = LS_ANLA-BUKRS AND ANLN1 = LS_ANLA-ANLN1 AND ANLN2 = LS_ANLA-ANLN2 AND GJAHR = LS_ANLC-GJAHR .
      LV_JZJE = LV_JZJE + LS_ANEP-ANBTR.
    ENDLOOP.

    LW_SZJE-KANSW = LW_SZJE-KANSW + LV_JZJE.

    LW_SZJE-LJZJJE = LV_BNZJ + LV_SNZJ.

    LW_SZJE-ZCJZ = LW_SZJE-KANSW + LW_SZJE-LJZJJE.
******数字金额字段转换
    LS_ALV-KANSW  = LW_SZJE-KANSW.
    LS_ALV-LJZJJE = LW_SZJE-LJZJJE.
    LS_ALV-ZCJZ   = LW_SZJE-ZCJZ.
    LS_ALV-BNJTZJ = LW_SZJE-BNJTZJ.
    LS_ALV-YJTJZ  = LW_SZJE-YJTJZ.
*    ls_alv-menge  = lw_szje-menge.  "COMMENT BY LW 20191121 这句语句给数量清零了
****
    READ TABLE LT_ANLB INTO LS_ANLB WITH KEY BUKRS = LS_ANLA-BUKRS ANLN1 = LS_ANLA-ANLN1 ANLN2 = LS_ANLA-ANLN2.
    IF SY-SUBRC = 0.
      LS_ALV-AFASL = LS_ANLB-AFASL.
      LS_ALV-NDJAR = LS_ANLB-NDJAR.

      IF LS_ANLA-DEAKT IS NOT INITIAL AND LS_ANLA-DEAKT <= LV_LASTDAY AND LS_ANLB-AFASL = '0000'.
        CONTINUE.
      ENDIF.

*      IF LS_ANLB-SCHRW IS NOT INITIAL.
*        LS_ALV-ZCJZ = LS_ALV-KANSW + LS_ALV-LJZJJE - LS_ANLB-SCHRW.
*      ELSE.
*        IF LS_ANLB-SCHRW_PROZ IS NOT INITIAL.
*          LS_ALV-ZCJZ = LS_ALV-KANSW + LS_ALV-LJZJJE - LS_ANLB-SCHRW_PROZ * LS_ALV-KANSW.
*        ELSE.
*          IF LS_ANLB-AFASL = 'LJ00' OR LS_ANLB-AFASL = 'LJ02'.
*            LS_ALV-ZCJZ = LS_ALV-KANSW + LS_ALV-LJZJJE - ( LS_ALV-KANSW * 5 / 100 ) .
*          ELSE.
*            LS_ALV-ZCJZ = LS_ALV-KANSW + LS_ALV-LJZJJE.
*          ENDIF.
*        ENDIF.
*      ENDIF.
    ENDIF.

    LOOP AT LT_EQUNR INTO LS_EQUNR WHERE BUKRS = LS_ANLA-BUKRS AND ANLNR = LS_ANLA-ANLN1 AND ANLUN = LS_ANLA-ANLN2.
      LS_ALV-EQUNR = LS_EQUNR-EQUNR.
      READ TABLE LT_EQKT INTO LS_EQKT WITH KEY EQUNR = LS_EQUNR-EQUNR.
      IF SY-SUBRC = 0.
        LS_ALV-EQKTX = LS_EQKT-EQKTX.
        SELECT SINGLE TYPBZ INTO  LS_ALV-TXA50 FROM EQUI WHERE EQUNR = LS_EQUNR-EQUNR.
      ENDIF.
******20190729 begning
      PERFORM FRM_CHENGE_DATA CHANGING LS_ALV.
******20190729 ending
      APPEND LS_ALV TO LT_ALV.
    ENDLOOP.

    IF SY-SUBRC <> 0.
      APPEND LS_ALV TO LT_ALV.
    ENDIF.

  ENDLOOP.

  IF LT_ALV IS INITIAL.
    MESSAGE '未找到符合条件的数据,请重新设置您的查询条件' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

3 After code

 DATA:BEGIN OF LW_SZJE,
         ZJN    TYPE P DECIMALS 1, "折旧年
         KANSW  LIKE ANLC-KANSW,  "原值
         LJZJJE LIKE ANLC-KANSW,  "累计折旧
         ZCJZ   LIKE ANLC-KANSW,  "净值
         BNJTZJ LIKE ANLC-KANSW,  "本年计提折旧
         YJTJZ  LIKE ANLC-KANSW,  "已计提减值
         MENGE  LIKE ANLA-MENGE,  "数量/建筑
       END OF LW_SZJE.

  CLEAR:LV_DATUM,LV_LASTDAY.

  CONCATENATE P_GJAHR P_AFBLPE+1(2) '01' INTO LV_DATUM.

  CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'  "获取期间当月最后一天
    EXPORTING
      I_DATE = LV_DATUM
    IMPORTING
      E_DATE = LV_LASTDAY.

  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '020'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '100'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '101'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '105'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '115'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '120'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '130'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '131'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '300'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '310'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '320'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '330'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '341'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '346'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '400'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = 'Z01'.
  APPEND S_BWASL.
  CLEAR S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = 'Z02'.
  APPEND S_BWASL.
***20190729 begeing
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '200'.
  APPEND S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '201'.
  APPEND S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '20A'.
  APPEND S_BWASL.
  S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '250'.
  APPEND S_BWASL.

   S_BWASL-SIGN = 'I'.
  S_BWASL-OPTION = 'EQ'.
  S_BWASL-LOW = '159'.
  APPEND S_BWASL.
***20190729 ending
  SELECT  ANLA~BUKRS ANLA~ANLN1 ANLA~ANLN2 ANLA~ANLKL ANLA~TXT50 ANLA~AKTIV ANLA~INVNR ANLA~TXA50 ANLA~MENGE ANLA~MEINS ANLA~SERNR
    ANLA~ORD41 ANLA~ORD42 ANLA~ORD43 ANLA~HERST ANLA~DEAKT ANLA~AIBN1 ANLA~AIBDT ANLA~ERDAT
    FROM ANLA
    INNER JOIN ANLZ ON ANLA~BUKRS = ANLZ~BUKRS AND ANLA~ANLN1 = ANLZ~ANLN1 AND ANLA~ANLN2 = ANLZ~ANLN2
    INTO CORRESPONDING FIELDS OF TABLE LT_ANLA
    WHERE ANLA~BUKRS IN S_BUKRS
    AND ANLA~ANLKL IN S_ANLKL
    AND ANLA~ANLN1 IN S_ANLN1
    AND ANLA~ORD41 IN S_ORD41
    AND ANLA~ORD42 IN S_ORD42
    AND ANLA~AKTIV <= LV_LASTDAY
    AND ANLA~AKTIV IN S_AKTIV
    AND ANLA~AKTIV NE '00000000'
    AND ANLZ~KOSTL IN S_KOSTL
    AND ANLZ~BDATU >= LV_DATUM.

  SELECT * FROM T087T INTO CORRESPONDING FIELDS OF TABLE LT_T087T[].

  IF LT_ANLA IS NOT INITIAL.
    SORT LT_ANLA BY BUKRS ANLN1 ANLN2.

    SELECT *
      FROM ANLC
      INTO CORRESPONDING FIELDS OF TABLE LT_ANLC
      FOR ALL ENTRIES IN LT_ANLA
      WHERE BUKRS = LT_ANLA-BUKRS
      AND ANLN1 = LT_ANLA-ANLN1
      AND ANLN2 = LT_ANLA-ANLN2
      AND AFABE = '01'
      AND GJAHR <= P_GJAHR.


    IF LT_ANLC IS NOT INITIAL.
      SORT LT_ANLC BY BUKRS ANLN1 ANLN2.

      SELECT BUKRS
             ANLN1
             ANLN2
             GJAHR
             PERAF
             NAFAZ
             AAFAZ
      FROM ANLP
      INTO CORRESPONDING FIELDS OF TABLE LT_ANLP
      FOR ALL ENTRIES IN LT_ANLC
      WHERE BUKRS = LT_ANLC-BUKRS
      AND ANLN1 = LT_ANLC-ANLN1
      AND  PERAF <=      P_AFBLPE
      AND ANLN2 = LT_ANLC-ANLN2
      AND GJAHR = LT_ANLC-GJAHR.

      SELECT ANEK~BUKRS
             ANEK~ANLN1
             ANEK~ANLN2
             ANEK~GJAHR
             ANEK~LNRAN
             ANEK~MONAT
             ANEA~NAFAV
             ANEA~NAFAL
      FROM  ANEK INNER JOIN ANEA ON ANEK~BUKRS = ANEA~BUKRS AND ANEK~ANLN1 = ANEA~ANLN1 AND ANEK~ANLN2 = ANEA~ANLN2 AND ANEK~GJAHR = ANEA~GJAHR AND  ANEK~LNRAN = ANEA~LNRAN
      INTO CORRESPONDING FIELDS OF TABLE LT_ANEK
      FOR ALL ENTRIES IN LT_ANLC
      WHERE ANEK~BUKRS = LT_ANLC-BUKRS
      AND ANEK~ANLN1 = LT_ANLC-ANLN1
      AND ANEK~ANLN2 = LT_ANLC-ANLN2
      AND ANEK~GJAHR = LT_ANLC-GJAHR.
    ENDIF.


    SELECT BUKRS
           ANLN1
           ANLN2
           GJAHR
           KNAFA
           KAAFA
    FROM ANLC
    INTO CORRESPONDING FIELDS OF TABLE LT_ANLC_SN
    FOR ALL ENTRIES IN LT_ANLA
    WHERE BUKRS = LT_ANLA-BUKRS
    AND ANLN1 = LT_ANLA-ANLN1
    AND ANLN2 = LT_ANLA-ANLN2
    AND GJAHR <= P_GJAHR.

    SELECT   BUKRS
             ANLN1
             ANLN2
             GJAHR
             BWASL
             ANBTR
             LNRAN
      FROM ANEP
      INTO CORRESPONDING FIELDS OF TABLE LT_ANEP
      FOR ALL ENTRIES IN LT_ANLA
      WHERE BUKRS = LT_ANLA-BUKRS
      AND ANLN1 = LT_ANLA-ANLN1
      AND ANLN2 = LT_ANLA-ANLN2
      AND AFABE  = '01'
      AND BZDAT <=  LV_LASTDAY
      AND BWASL IN S_BWASL.


    SELECT * FROM ANLZ INTO CORRESPONDING FIELDS OF TABLE LT_ANLZ
      FOR ALL ENTRIES IN LT_ANLA
      WHERE BUKRS = LT_ANLA-BUKRS
      AND ANLN1 = LT_ANLA-ANLN1
      AND ANLN2 = LT_ANLA-ANLN2
      AND ADATU <= LV_LASTDAY
      AND BDATU >= LV_DATUM.

    IF LT_ANLZ IS NOT INITIAL.
      SORT LT_ANLZ BY WERKS STORT.
      SELECT * FROM T499S INTO CORRESPONDING FIELDS OF TABLE LT_T499S
        FOR ALL ENTRIES IN LT_ANLZ
        WHERE WERKS = LT_ANLZ-WERKS
        AND STAND = LT_ANLZ-STORT.
    ENDIF.

    SELECT * FROM ANLH INTO CORRESPONDING FIELDS OF TABLE LT_ANLH
      FOR ALL ENTRIES IN LT_ANLA
      WHERE BUKRS = LT_ANLA-BUKRS
      AND ANLN1 = LT_ANLA-ANLN1.

    SELECT * FROM ANLB INTO CORRESPONDING FIELDS OF TABLE LT_ANLB
*      FOR ALL ENTRIES IN LT_ANLB
      FOR ALL ENTRIES IN LT_ANLA
      WHERE BUKRS = LT_ANLA-BUKRS
      AND ANLN1 = LT_ANLA-ANLN1
      AND ANLN2 = LT_ANLA-ANLN2.

    SELECT
    ILOA~BUKRS
    ILOA~ANLNR
    ILOA~ANLUN
    ILOA~ILOAN
    EQUZ~EQUNR
    FROM ILOA INNER JOIN EQUZ ON ILOA~ILOAN = EQUZ~ILOAN
    INTO CORRESPONDING FIELDS OF TABLE LT_EQUNR
    FOR ALL ENTRIES IN LT_ANLA
    WHERE  ILOA~BUKRS = LT_ANLA-BUKRS
   AND ILOA~ANLNR = LT_ANLA-ANLN1
   AND ILOA~ANLUN = LT_ANLA-ANLN2
   AND EQUZ~DATAB <= LV_LASTDAY
   AND EQUZ~DATBI >= LV_LASTDAY.

    IF LT_EQUNR IS NOT INITIAL.
      SORT LT_EQUNR BY EQUNR.
      SELECT EQUNR
             EQKTX
       FROM EQKT INTO CORRESPONDING FIELDS OF TABLE LT_EQKT
       FOR ALL ENTRIES IN LT_EQUNR
       WHERE EQUNR = LT_EQUNR-EQUNR
       AND SPRAS = '1'.
    ENDIF.

    SELECT * FROM ANKT INTO CORRESPONDING FIELDS OF TABLE LT_ANKT
      FOR ALL ENTRIES IN LT_ANLA
      WHERE SPRAS = '1'
      AND ANLKL = LT_ANLA-ANLKL.
  ENDIF.

  SORT LT_ANLC BY BUKRS ANLN1 ANLN2 GJAHR DESCENDING .
  DELETE ADJACENT DUPLICATES FROM LT_ANLC COMPARING BUKRS ANLN1 ANLN2 .
  SORT LT_ANLC_SN BY BUKRS ANLN1 ANLN2 GJAHR DESCENDING.

  SORT LT_ANLZ  BY BUKRS ANLN1 ANLN2 .
  SORT LT_ANLH  BY BUKRS ANLN1 .
  SORT LT_ANLB  BY BUKRS  ANLN1 ANLN2 .




    DATA : LT_EQUI  LIKE STANDARD TABLE OF EQUI,
           LW_EQUI LIKE LINE OF LT_EQUI.


    IF LT_EQUNR IS NOT INITIAL.

    SELECT * FROM EQUI INTO  CORRESPONDING FIELDS OF TABLE  LT_EQUI
            FOR ALL ENTRIES IN LT_EQUNR
           WHERE EQUI~EQUNR  =   LT_EQUNR-EQUNR.

     ENDIF.
         SORT LT_EQKT  BY EQUNR.
         SORT LT_EQUI  BY EQUNR.



" START ADD IT BY JINGGL 20230520.

  data : l_dex type sy-tabix.

  LOOP AT LT_ANLC INTO LS_ANLC.

      l_dex  = sy-tabix.

    READ TABLE LT_ANLA INTO LS_ANLA WITH KEY BUKRS = LS_ANLC-BUKRS  ANLN1 = LS_ANLC-ANLN1 ANLN2 = LS_ANLC-ANLN2.
    IF SY-SUBRC = 0.


      IF LS_ANLC-GJAHR = P_GJAHR.
        IF LS_ANLC-PSTEND IS INITIAL.
       LS_ANLC-LV_AFBLPE = P_AFBLPE.
        ELSE.
          IF LS_ANLC-PSTEND <= P_AFBLPE.
            LS_ANLC-LV_AFBLPE = LS_ANLC-PSTEND.
          ELSE.
            LS_ANLC-LV_AFBLPE = P_AFBLPE.
          ENDIF.
        ENDIF.
      ELSE.
        LS_ANLC-LV_AFBLPE = LS_ANLC-PSTEND.
      ENDIF.

     MODIFY  LT_ANLC  INDEX  l_dex  FROM  LS_ANLC  TRANSPORTING  LV_AFBLPE .
    ENDIF.

    CLEAR:LS_ANLC ,LS_ANLA .
  ENDLOOP.



 SORT LT_ANLP  BY BUKRS ANLN1 ANLN2 GJAHR .
 SORT LT_ANLC  BY BUKRS ANLN1 ANLN2 GJAHR .
*
* IF   LV_AFBLPE = '012'.
  LOOP AT LT_ANLP INTO LS_ANLP.


     READ TABLE LT_ANLC INTO LS_ANLC WITH KEY BUKRS = LS_ANLP-BUKRS  ANLN1 = LS_ANLP-ANLN1 ANLN2 = LS_ANLP-ANLN2  BINARY SEARCH  .
     IF SY-SUBRC = 0.
     IF   LS_ANLC-LV_AFBLPE = '012'.
     LS_ANLP_COL-BUKRS =  LS_ANLP-BUKRS.
     LS_ANLP_COL-ANLN1 =  LS_ANLP-ANLN1.
     LS_ANLP_COL-ANLN2 =  LS_ANLP-ANLN2.
     LS_ANLP_COL-GJAHR =  LS_ANLP-GJAHR.
     LS_ANLP-LV_BNZJ =  LS_ANLP-NAFAZ + LS_ANLP-AAFAZ.
     LS_ANLP_COL-LV_BNZJ =  LS_ANLP-LV_BNZJ.
       IF LS_ANLA-DEAKT IS INITIAL OR LS_ANLA-DEAKT(6) GT LV_LASTDAY(6).
           LS_ANLP_COL-NAFAZ = LS_ANLP-NAFAZ.
          ENDIF.
          LS_ANLP_COL-AAFAZ =  LS_ANLP-AAFAZ.

     COLLECT LS_ANLP_COL INTO LT_ANLP_COL.

     ELSE.
     IF   LS_ANLP-PERAF <= LS_ANLC-LV_AFBLPE.

     LS_ANLP_COL_PERAF-BUKRS =  LS_ANLP-BUKRS.
     LS_ANLP_COL_PERAF-ANLN1 =  LS_ANLP-ANLN1.
     LS_ANLP_COL_PERAF-ANLN2 =  LS_ANLP-ANLN2.
     LS_ANLP_COL_PERAF-GJAHR =  LS_ANLP-GJAHR.

     LS_ANLP_COL_PERAF-LV_BNZJ =  LS_ANLP-NAFAZ + LS_ANLP-AAFAZ.
       IF LS_ANLA-DEAKT IS INITIAL OR LS_ANLA-DEAKT(6) GT LV_LASTDAY(6).
           LS_ANLP_COL_PERAF-NAFAZ = LS_ANLP-NAFAZ.
          ENDIF.
          LS_ANLP_COL_PERAF-AAFAZ =  LS_ANLP-AAFAZ.

     COLLECT LS_ANLP_COL_PERAF INTO LT_ANLP_COL_PERAF.

      ENDIF.

      ENDIF.
      ENDIF.
     CLEAR:LS_ANLP,LS_ANLP_COL, LS_ANLP_COL_PERAF ,LS_ANLC .

 ENDLOOP.

 SORT LT_ANEK BY BUKRS ANLN1 ANLN2  GJAHR.




  LOOP AT LT_ANEK INTO LS_ANEK.
    READ TABLE LT_ANLC INTO LS_ANLC WITH KEY BUKRS = LS_ANEK-BUKRS  ANLN1 = LS_ANEK-ANLN1 ANLN2 = LS_ANEK-ANLN2  BINARY SEARCH  .
     IF SY-SUBRC = 0.

          CLEAR LV_MONAT.
        LV_MONAT = LS_ANLC-LV_AFBLPE+1(2).

    IF   LV_AFBLPE = '012'.
     LS_ANEK_COL-BUKRS =  LS_ANEK-BUKRS.
     LS_ANEK_COL-ANLN1 = LS_ANEK-ANLN1.
     LS_ANEK_COL-ANLN2 = LS_ANEK-ANLN2.
     LS_ANEK_COL-GJAHR = LS_ANEK-GJAHR.
     LS_ANEK-LV_BNZJ =  LS_ANEK-NAFAV + LS_ANEK-NAFAL.
     LS_ANEK_COL-LV_BNZJ  =    LS_ANEK-LV_BNZJ.
     COLLECT LS_ANEK_COL  INTO LT_ANEK_COL.

     ELSE.
     IF LS_ANEK-MONAT <= LV_MONAT.

      LS_ANEK_COL_MONAT-BUKRS =  LS_ANEK-BUKRS.
     LS_ANEK_COL_MONAT-ANLN1 = LS_ANEK-ANLN1.
     LS_ANEK_COL_MONAT-ANLN2 = LS_ANEK-ANLN2.
     LS_ANEK_COL_MONAT-GJAHR = LS_ANEK-GJAHR.
     LS_ANEK-LV_BNZJ =  LS_ANEK-NAFAV + LS_ANEK-NAFAL.
     LS_ANEK_COL_MONAT-LV_BNZJ  =    LS_ANEK-LV_BNZJ.
     COLLECT LS_ANEK_COL_MONAT  INTO LT_ANEK_COL_MONAT.

     ENDIF.
      ENDIF.
      ENDIF.
     CLEAR: LS_ANEK_COL, LS_ANEK, LS_ANEK_COL_MONAT,LS_ANLC.

   ENDLOOP.
*   ENDIF.

  SORT LT_ANEP BY BUKRS ANLN1 ANLN2 GJAHR.

  LOOP AT LT_ANEP INTO LS_ANEP .
        LS_ANEP_COL-BUKRS =   LS_ANEP-BUKRS .
        LS_ANEP_COL-ANLN1 =   LS_ANEP-ANLN1 .
        LS_ANEP_COL-ANLN2 =   LS_ANEP-ANLN2 .
        LS_ANEP_COL-GJAHR =   LS_ANEP-GJAHR .
        LS_ANEP_COL-ANBTR =   LS_ANEP-ANBTR .
        COLLECT LS_ANEP_COL INTO LT_ANEP_COL .

        CLEAR:LS_ANEP,LS_ANEP_COL.
    ENDLOOP.

   CLEAR:LV_AFBLPE,LV_MONAT.

  SORT LT_ANLP_COL  BY BUKRS  ANLN1  ANLN2  GJAHR.
  SORT LT_ANLP_COL_PERAF  BY BUKRS  ANLN1  ANLN2  GJAHR.
  SORT   LT_ANEK_COL  BY BUKRS ANLN1 ANLN2 GJAHR .
  SORT LT_ANEK_COL_MONAT  BY BUKRS ANLN1 ANLN2 GJAHR .
  SORT  LT_ANEP_COL   BY BUKRS ANLN1 ANLN2 GJAHR .


 " END ADD IT BY JINGGL 20230520



  LOOP AT  LT_ANLA INTO LS_ANLA.
    CLEAR:LS_ALV,LV_SNZJ,LV_BNZJ,LV_JZJE,LV_GJAHR,LV_AFBLPE,LS_ANLC,LW_SZJE.
    MOVE-CORRESPONDING LS_ANLA TO LS_ALV.
    CALL FUNCTION 'CONVERSION_EXIT_GERNR_OUTPUT'
      EXPORTING
        INPUT  = LS_ALV-SERNR
      IMPORTING
        OUTPUT = LS_ALV-SERNR.

    READ TABLE LT_T087T WITH  KEY ORD4X = LS_ANLA-ORD41  ORDNR = '1'.
    IF SY-SUBRC = 0.
      LS_ALV-ORD41X = LT_T087T-ORDTX.
    ENDIF.
    READ TABLE LT_T087T WITH  KEY ORD4X = LS_ANLA-ORD42  ORDNR = '2'.
    IF SY-SUBRC = 0.
      LS_ALV-ORD42X = LT_T087T-ORDTX.
    ENDIF.
    READ TABLE LT_T087T WITH  KEY ORD4X = LS_ANLA-ORD43  ORDNR = '3'.
    IF SY-SUBRC = 0.
      LS_ALV-ORD43X = LT_T087T-ORDTX.
    ENDIF.

    READ TABLE LT_ANLZ INTO LS_ANLZ WITH KEY BUKRS = LS_ANLA-BUKRS ANLN1 = LS_ANLA-ANLN1 ANLN2 = LS_ANLA-ANLN2 BINARY SEARCH.
    IF SY-SUBRC = 0.
      LS_ALV-RAUMN = LS_ANLZ-RAUMN.
      LS_ALV-STORT = LS_ANLZ-STORT.
      LS_ALV-KFZKZ = LS_ANLZ-KFZKZ.
      LS_ALV-KOSTL = LS_ANLZ-KOSTL.

      READ TABLE LT_T499S INTO LS_T499S WITH KEY WERKS = LS_ANLZ-WERKS STAND = LS_ANLZ-STORT.
      IF SY-SUBRC = 0.
        LS_ALV-KTEXT = LS_T499S-KTEXT.
      ENDIF.
    ENDIF.

    READ TABLE LT_ANLH INTO LS_ANLH WITH KEY BUKRS = LS_ANLA-BUKRS ANLN1 = LS_ANLA-ANLN1 BINARY SEARCH.
    IF SY-SUBRC = 0.
      LS_ALV-ANLHTXT = LS_ANLH-ANLHTXT.
    ENDIF.

    READ TABLE LT_ANKT INTO LS_ANKT WITH KEY ANLKL = LS_ANLA-ANLKL.
    IF SY-SUBRC = 0.
      LS_ALV-TXK20 = LS_ANKT-TXK20.
    ENDIF.

    IF LS_ANLA-DEAKT IS NOT INITIAL.
      IF LS_ANLA-DEAKT < LV_LASTDAY.
        "已经报废数据
        LV_GJAHR = LS_ANLA-DEAKT+0(4).
      ELSE.
        LV_GJAHR = LV_LASTDAY+0(4).
      ENDIF.
    ELSE.
      LV_GJAHR = P_GJAHR.
    ENDIF.

    READ TABLE LT_ANLC INTO LS_ANLC WITH KEY BUKRS = LS_ANLA-BUKRS  ANLN1 = LS_ANLA-ANLN1 ANLN2 = LS_ANLA-ANLN2 GJAHR = LV_GJAHR  BINARY SEARCH .
    IF SY-SUBRC = 0.
      LW_SZJE-KANSW = LS_ANLC-KANSW.

*      IF LS_ANLC-GJAHR = P_GJAHR.
*        IF LS_ANLC-PSTEND IS INITIAL.
*          LV_AFBLPE = P_AFBLPE.
*        ELSE.
*          IF LS_ANLC-PSTEND <= P_AFBLPE.
*            LV_AFBLPE = LS_ANLC-PSTEND.
*          ELSE.
*            LV_AFBLPE = P_AFBLPE.
*          ENDIF.
*        ENDIF.
*      ELSE.
        LV_AFBLPE = LS_ANLC-LV_AFBLPE.
*      ENDIF.

      LW_SZJE-ZJN = ( LS_ANLC-NDABJ * 12 + LS_ANLC-NDABP + LV_AFBLPE ) / 12.
      LS_ALV-ZJN = LW_SZJE-ZJN.

      IF LV_AFBLPE = '012'.
*        LOOP AT lt_anlp INTO ls_anlp WHERE bukrs = ls_anla-bukrs AND anln1 = ls_anla-anln1 AND anln2 = ls_anla-anln2 AND gjahr = ls_anlc-gjahr .


        READ TABLE LT_ANLP_COL INTO LS_ANLP_COL WITH KEY BUKRS =  LS_ANLA-BUKRS  ANLN1 = LS_ANLA-ANLN1  ANLN2 = LS_ANLA-ANLN2  GJAHR = P_GJAHR  BINARY SEARCH.

         IF SY-SUBRC  = 0.
           LV_BNZJ = LS_ANLP_COL-LV_BNZJ.
            LW_SZJE-BNJTZJ =  LS_ANLP_COL-NAFAZ.
           LW_SZJE-YJTJZ = LS_ANLP_COL-AAFAZ.
          ENDIF.
          CLEAR:LS_ANLP_COL.


*        LOOP AT LT_ANLP INTO LS_ANLP WHERE BUKRS = LS_ANLA-BUKRS AND ANLN1 = LS_ANLA-ANLN1 AND ANLN2 = LS_ANLA-ANLN2 AND GJAHR = P_GJAHR .
*          LV_BNZJ = LV_BNZJ + LS_ANLP-NAFAZ + LS_ANLP-AAFAZ.
*          IF LS_ANLA-DEAKT IS INITIAL OR LS_ANLA-DEAKT(6) GT LV_LASTDAY(6).
*            LW_SZJE-BNJTZJ = LW_SZJE-BNJTZJ + LS_ANLP-NAFAZ.
*          ENDIF.
*          LW_SZJE-YJTJZ = LW_SZJE-YJTJZ + LS_ANLP-AAFAZ.
*        ENDLOOP.

*        LOOP AT lt_anek INTO ls_anek WHERE bukrs = ls_anla-bukrs AND anln1 = ls_anla-anln1 AND anln2 = ls_anla-anln2 AND gjahr = ls_anlc-gjahr .

          READ TABLE  LT_ANEK_col INTO LS_ANEK_col WITH key   BUKRS = LS_ANLA-BUKRS  ANLN1 = LS_ANLA-ANLN1  ANLN2 = LS_ANLA-ANLN2  GJAHR = P_GJAHR BINARY SEARCH .
          if sy-subrc = 0.
            LV_BNZJ = LS_ANEK_col-LV_BNZJ .

          ENDif.
          CLEAR: LS_ANEK_col.

*        LOOP AT LT_ANEK INTO LS_ANEK WHERE BUKRS = LS_ANLA-BUKRS AND ANLN1 = LS_ANLA-ANLN1 AND ANLN2 = LS_ANLA-ANLN2 AND GJAHR = P_GJAHR .
*          LV_BNZJ = LV_BNZJ + LS_ANEK-NAFAV + LS_ANEK-NAFAL.
*        ENDLOOP.
      ELSE.
*        LOOP AT lt_anlp INTO ls_anlp WHERE bukrs = ls_anla-bukrs AND anln1 = ls_anla-anln1 AND anln2 = ls_anla-anln2 AND gjahr = ls_anlc-gjahr  AND peraf <= lv_afblpe.

          READ TABLE LT_ANLP_COL_PERAF INTO LS_ANLP_COL_PERAF WITH KEY BUKRS = LS_ANLA-BUKRS  ANLN1 = LS_ANLA-ANLN1  ANLN2 = LS_ANLA-ANLN2  GJAHR = P_GJAHR  BINARY SEARCH  .

           IF SY-SUBRC = 0.
             LV_BNZJ =  LS_ANLP_COL_PERAF-LV_BNZJ.
             LW_SZJE-BNJTZJ =  LS_ANLP_COL_PERAF-NAFAZ.
             LW_SZJE-YJTJZ  =  LS_ANLP_COL_PERAF-AAFAZ.

           ENDIF.
            CLEAR:LS_ANLP_COL_PERAF.

*        LOOP AT LT_ANLP INTO LS_ANLP WHERE BUKRS = LS_ANLA-BUKRS AND ANLN1 = LS_ANLA-ANLN1 AND ANLN2 = LS_ANLA-ANLN2 AND GJAHR = P_GJAHR  AND PERAF <= LV_AFBLPE.
*          LV_BNZJ = LV_BNZJ + LS_ANLP-NAFAZ + LS_ANLP-AAFAZ.
*          IF LS_ANLA-DEAKT IS INITIAL OR LS_ANLA-DEAKT(6) GT LV_LASTDAY(6).
*            LW_SZJE-BNJTZJ = LW_SZJE-BNJTZJ + LS_ANLP-NAFAZ.
*          ENDIF.
*          LW_SZJE-YJTJZ = LW_SZJE-YJTJZ + LS_ANLP-AAFAZ.
*        ENDLOOP.

        CLEAR LV_MONAT.
        LV_MONAT = LV_AFBLPE+1(2).
*        LOOP AT lt_anek INTO ls_anek WHERE bukrs = ls_anla-bukrs AND anln1 = ls_anla-anln1 AND anln2 = ls_anla-anln2 AND gjahr = ls_anlc-gjahr AND monat <= lv_monat .
        READ TABLE LT_ANEK_COL_MONAT INTO LS_ANEK_COL_MONAT  WITH KEY BUKRS = LS_ANLA-BUKRS  ANLN1 = LS_ANLA-ANLN1  ANLN2 = LS_ANLA-ANLN2  GJAHR = P_GJAHR BINARY SEARCH .

         IF SY-SUBRC  = 0 .
           LV_BNZJ = LS_ANEK_COL_MONAT-LV_BNZJ .


          ENDIF.

         CLEAR:LS_ANEK_COL_MONAT .
*
*        LOOP AT LT_ANEK INTO LS_ANEK WHERE BUKRS = LS_ANLA-BUKRS AND ANLN1 = LS_ANLA-ANLN1 AND ANLN2 = LS_ANLA-ANLN2 AND GJAHR = P_GJAHR AND MONAT <= LV_MONAT .
*          LV_BNZJ = LV_BNZJ + LS_ANEK-NAFAV + LS_ANEK-NAFAL.
*        ENDLOOP.
      ENDIF.
    ENDIF.

*    READ TABLE lt_anlc_sn INTO ls_anlc_sn WITH KEY bukrs = ls_anla-bukrs  anln1 = ls_anla-anln1  anln2 = ls_anla-anln2 gjahr = ls_anlc-gjahr.
    READ TABLE LT_ANLC_SN INTO LS_ANLC_SN WITH KEY BUKRS = LS_ANLA-BUKRS  ANLN1 = LS_ANLA-ANLN1  ANLN2 = LS_ANLA-ANLN2 GJAHR = P_GJAHR  .
    IF SY-SUBRC = 0.
      LV_SNZJ =  LS_ANLC_SN-KNAFA + LS_ANLC_SN-KAAFA.
    ENDIF.

   READ TABLE LT_ANEP_COL INTO LS_ANEP_COL WITH KEY BUKRS = LS_ANLA-BUKRS  ANLN1 = LS_ANLA-ANLN1  ANLN2 = LS_ANLA-ANLN2  GJAHR = LS_ANLC-GJAHR  BINARY SEARCH.
    IF SY-SUBRC = 0.
      LV_JZJE  =   LS_ANEP_COL-ANBTR.
    ENDIF.

    CLEAR:LS_ANEP_COL .
*    LOOP AT LT_ANEP INTO LS_ANEP WHERE BUKRS = LS_ANLA-BUKRS AND ANLN1 = LS_ANLA-ANLN1 AND ANLN2 = LS_ANLA-ANLN2 AND GJAHR = LS_ANLC-GJAHR .
*      LV_JZJE = LV_JZJE + LS_ANEP-ANBTR.
*    ENDLOOP.

    LW_SZJE-KANSW = LW_SZJE-KANSW + LV_JZJE.

    LW_SZJE-LJZJJE = LV_BNZJ + LV_SNZJ.

    LW_SZJE-ZCJZ = LW_SZJE-KANSW + LW_SZJE-LJZJJE.
******数字金额字段转换
    LS_ALV-KANSW  = LW_SZJE-KANSW.
    LS_ALV-LJZJJE = LW_SZJE-LJZJJE.
    LS_ALV-ZCJZ   = LW_SZJE-ZCJZ.
    LS_ALV-BNJTZJ = LW_SZJE-BNJTZJ.
    LS_ALV-YJTJZ  = LW_SZJE-YJTJZ.
*    ls_alv-menge  = lw_szje-menge.  "COMMENT BY LW 20191121 这句语句给数量清零了
****
    READ TABLE LT_ANLB INTO LS_ANLB WITH KEY BUKRS = LS_ANLA-BUKRS ANLN1 = LS_ANLA-ANLN1 ANLN2 = LS_ANLA-ANLN2 BINARY SEARCH.
    IF SY-SUBRC = 0.
      LS_ALV-AFASL = LS_ANLB-AFASL.
      LS_ALV-NDJAR = LS_ANLB-NDJAR.

      IF LS_ANLA-DEAKT IS NOT INITIAL AND LS_ANLA-DEAKT <= LV_LASTDAY AND LS_ANLB-AFASL = '0000'.
        CONTINUE.
      ENDIF.

*      IF LS_ANLB-SCHRW IS NOT INITIAL.
*        LS_ALV-ZCJZ = LS_ALV-KANSW + LS_ALV-LJZJJE - LS_ANLB-SCHRW.
*      ELSE.
*        IF LS_ANLB-SCHRW_PROZ IS NOT INITIAL.
*          LS_ALV-ZCJZ = LS_ALV-KANSW + LS_ALV-LJZJJE - LS_ANLB-SCHRW_PROZ * LS_ALV-KANSW.
*        ELSE.
*          IF LS_ANLB-AFASL = 'LJ00' OR LS_ANLB-AFASL = 'LJ02'.
*            LS_ALV-ZCJZ = LS_ALV-KANSW + LS_ALV-LJZJJE - ( LS_ALV-KANSW * 5 / 100 ) .
*          ELSE.
*            LS_ALV-ZCJZ = LS_ALV-KANSW + LS_ALV-LJZJJE.
*          ENDIF.
*        ENDIF.
*      ENDIF.
    ENDIF.





    LOOP AT LT_EQUNR INTO LS_EQUNR WHERE BUKRS = LS_ANLA-BUKRS AND ANLNR = LS_ANLA-ANLN1 AND ANLUN = LS_ANLA-ANLN2.
      LS_ALV-EQUNR = LS_EQUNR-EQUNR.
      READ TABLE LT_EQKT INTO LS_EQKT WITH KEY EQUNR = LS_EQUNR-EQUNR BINARY SEARCH.
      IF SY-SUBRC = 0.
        LS_ALV-EQKTX = LS_EQKT-EQKTX.

        READ TABLE LT_EQUI INTO LW_EQUI WITH KEY EQUNR = LS_EQUNR-EQUNR BINARY SEARCH.
         IF SY-SUBRC = 0.
           LS_ALV-TXA50  =  LW_EQUI-TYPBZ.


         ENDIF.
       CLEAR: LW_EQUI.
*        SELECT SINGLE TYPBZ INTO  LS_ALV-TXA50 FROM EQUI WHERE EQUNR = LS_EQUNR-EQUNR.
      ENDIF.
******20190729 begning
      PERFORM FRM_CHENGE_DATA CHANGING LS_ALV.
******20190729 ending
      APPEND LS_ALV TO LT_ALV.
    ENDLOOP.

    IF SY-SUBRC <> 0.
      APPEND LS_ALV TO LT_ALV.
    ENDIF.

  ENDLOOP.

  IF LT_ALV IS INITIAL.
    MESSAGE '未找到符合条件的数据,请重新设置您的查询条件' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

3 Performance

如何优化ABAP程序_第1张图片

4 Summary

4.1 We don’ t use nested loop as possible as .

4.2 We use useful data in the program .

4.3 Take care history data .

你可能感兴趣的:(ABAP,数学建模)