inner table processing: on subtotal and total item

*&---------------------------------------------------------------------*
*& Report  ZTEST999
*&---------------------------------------------------------------------*
*& [email protected]
*&---------------------------------------------------------------------*
REPORT  ztest999.
DATA: BEGIN OF gt_test OCCURS 0,
      flag,
      xh    TYPE i,
      item(2),
      saknr LIKE skb1-saknr,
*      belnr LIKE bsis-belnr,
      hbkid LIKE t012-hbkid,
      bankl LIKE t012-bankl,
      banka LIKE bnka-banka,
      c     LIKE bsis-dmbtr,
      d     LIKE bsis-dmbtr,
      e     LIKE bsis-dmbtr,
      f     LIKE bsis-dmbtr,
      g     LIKE bsis-dmbtr,
      h     LIKE bsis-dmbtr,
      i     LIKE bsis-dmbtr,
      j     LIKE bsis-dmbtr,
      k     LIKE bsis-dmbtr,
      l     LIKE bsis-dmbtr,
      m     LIKE bsis-dmbtr,
      n     LIKE bsis-dmbtr,
      o     LIKE bsis-dmbtr,
      p     LIKE bsis-dmbtr,
      q     LIKE bsis-dmbtr,
      r     LIKE bsis-dmbtr,
      s     LIKE bsis-dmbtr,
      t     LIKE bsis-dmbtr,
      u     LIKE bsis-dmbtr,
      v     LIKE bsis-dmbtr,
      w     LIKE bsis-dmbtr,
      x     LIKE bsis-dmbtr,
      y     LIKE bsis-dmbtr,
      END OF gt_test.
DATA: BEGIN OF gt_itab OCCURS 0,
      flag,
      flag2,
      xh    TYPE i,
      item(2),
      banka LIKE bnka-banka,
            c     LIKE bsis-dmbtr,
      d     LIKE bsis-dmbtr,
      e     LIKE bsis-dmbtr,
      f     LIKE bsis-dmbtr,
      g     LIKE bsis-dmbtr,
      h     LIKE bsis-dmbtr,
      i     LIKE bsis-dmbtr,
      j     LIKE bsis-dmbtr,
      k     LIKE bsis-dmbtr,
      l     LIKE bsis-dmbtr,
      m     LIKE bsis-dmbtr,
      n     LIKE bsis-dmbtr,
      o     LIKE bsis-dmbtr,
      p     LIKE bsis-dmbtr,
      q     LIKE bsis-dmbtr,
      r     LIKE bsis-dmbtr,
      s     LIKE bsis-dmbtr,
      t     LIKE bsis-dmbtr,
      u     LIKE bsis-dmbtr,
      v     LIKE bsis-dmbtr,
      w     LIKE bsis-dmbtr,
      x     LIKE bsis-dmbtr,
      y     LIKE bsis-dmbtr,
      END OF gt_itab.
DATA: wa LIKE LINE OF gt_test.
DATA: BEGIN OF gt_result OCCURS 0,
      item(2),
      c     LIKE bsis-dmbtr,
      d     LIKE bsis-dmbtr,
      e     LIKE bsis-dmbtr,
      f     LIKE bsis-dmbtr,
      g     LIKE bsis-dmbtr,
      h     LIKE bsis-dmbtr,
      i     LIKE bsis-dmbtr,
      j     LIKE bsis-dmbtr,
      k     LIKE bsis-dmbtr,
      l     LIKE bsis-dmbtr,
      m     LIKE bsis-dmbtr,
      n     LIKE bsis-dmbtr,
      o     LIKE bsis-dmbtr,
      p     LIKE bsis-dmbtr,
      q     LIKE bsis-dmbtr,
      r     LIKE bsis-dmbtr,
      s     LIKE bsis-dmbtr,
      t     LIKE bsis-dmbtr,
      u     LIKE bsis-dmbtr,
      v     LIKE bsis-dmbtr,
      w     LIKE bsis-dmbtr,
      x     LIKE bsis-dmbtr,
      y     LIKE bsis-dmbtr,
      END OF gt_result.
DATA: BEGIN OF gt_bsis OCCURS 0,
      hkont LIKE bsis-hkont,
      dmbtr LIKE bsis-dmbtr,
      END OF gt_bsis.
DATA: BEGIN OF gt_temp OCCURS 0,
      hkont LIKE bsis-hkont,
      dmbtr LIKE bsis-dmbtr,
      gsber LIKE bsis-gsber,
      END OF gt_temp.
DATA: BEGIN OF wa_bsis ,
      shkzg LIKE bsis-shkzg.
        INCLUDE STRUCTURE gt_bsis.
DATA: END OF wa_bsis.
DATA: BEGIN OF gt_bsis2 OCCURS 0,
        flag,
        belnr LIKE bsis-belnr.
        INCLUDE STRUCTURE wa_bsis.
DATA: END OF gt_bsis2.
PARAMETER: p_bukrs LIKE t012-bukrs.
PARAMETER: p_gjahr LIKE bkpf-gjahr.
SELECT-OPTIONS: p_date FOR sy-datum.
PERFORM getdata.
PERFORM fixdata.
*&---------------------------------------------------------------------*
*&      Form  getdata
*&---------------------------------------------------------------------*
FORM getdata .
  SELECT t012~bankl skb1~saknr skb1~hbkid bnka~banka FROM t012 INNER JOIN skb1
                               ON t012~bukrs = skb1~bukrs
                               INNER JOIN bnka
                               ON t012~bankl = bnka~bankl
  INTO CORRESPONDING FIELDS OF TABLE gt_test
  WHERE skb1~bukrs = p_bukrs AND
        skb1~saknr LIKE '1002%' AND
        t012~hbkid = skb1~hbkid .
  SELECT hkont dmbtr shkzg FROM bsis
  INTO CORRESPONDING FIELDS OF wa_bsis
  FOR ALL ENTRIES IN gt_test
  WHERE hkont = gt_test-saknr AND
        bukrs = p_bukrs AND
        budat < p_date-low .
    IF wa_bsis-shkzg = 'H'.
      wa_bsis-dmbtr = 0 - wa_bsis-dmbtr.
    ENDIF.
    gt_bsis-hkont = wa_bsis-hkont.
    gt_bsis-dmbtr = wa_bsis-dmbtr.
    COLLECT gt_bsis.
  ENDSELECT.
  SELECT belnr hkont dmbtr shkzg FROM bsis
  INTO CORRESPONDING FIELDS OF TABLE gt_bsis2
  FOR ALL ENTRIES IN gt_test
  WHERE bukrs = p_bukrs AND
        budat >= p_date-low AND
        budat < p_date-high AND
        hkont = gt_test-saknr.
  LOOP AT gt_bsis2 WHERE flag = '' AND shkzg = 'S'.
    IF sy-subrc = 0.
      SELECT SINGLE hkont dmbtr gsber FROM bsis
      INTO CORRESPONDING FIELDS OF gt_temp
      WHERE shkzg = 'H' AND
            belnr = gt_bsis2-belnr.
    ENDIF.
    gt_bsis2-flag = 'X'.
    MODIFY gt_bsis2 INDEX sy-tabix.
    READ TABLE gt_test WITH KEY saknr = gt_bsis2-hkont.
    IF sy-subrc = 0.
      IF gt_temp-hkont = '2101000000'.
        gt_test-d = gt_test-d + gt_temp-dmbtr.
      ELSEIF gt_temp-hkont = '2301010000'.
        gt_test-e = gt_test-e + gt_temp-dmbtr.
      ELSEIF gt_temp-hkont+0(4) = '1431'.
        gt_test-f = gt_test-f + gt_temp-dmbtr.
      ELSEIF gt_temp-hkont+0(4) = '1441' OR gt_temp-hkont+0(4) = '2213'.
        gt_test-g = gt_test-g + gt_temp-dmbtr.
      ELSEIF gt_temp-hkont+0(4) = '1002'.
        gt_test-h = gt_test-h + gt_temp-dmbtr.
      ELSEIF gt_temp-hkont+0(4) = '1131' OR gt_temp-hkont+0(4) = '1133'.
        IF gt_temp-gsber = '001'.
          gt_test-i = gt_test-i + gt_temp-dmbtr.
        ELSEIF gt_temp-gsber = '002'.
          gt_test-j = gt_test-j + gt_temp-dmbtr.
        ELSE.
          gt_test-k = gt_test-k + gt_temp-dmbtr.
        ENDIF.
      ELSE.
        gt_test-k = gt_test-k + gt_temp-dmbtr.
      ENDIF.
      MODIFY gt_test INDEX sy-tabix.
    ENDIF.
  ENDLOOP.
  LOOP AT gt_bsis2 WHERE flag = '' AND shkzg = 'H'.
    IF sy-subrc = 0.
      SELECT SINGLE hkont dmbtr gsber FROM bsis
      INTO CORRESPONDING FIELDS OF gt_temp
      WHERE shkzg = 'S' AND
            belnr = gt_bsis2-belnr.
      gt_temp-dmbtr = - gt_temp-dmbtr.
    ENDIF.
    gt_bsis2-flag = 'X'.
    MODIFY gt_bsis2 INDEX sy-tabix.
    READ TABLE gt_test WITH KEY saknr = gt_bsis2-hkont.
    IF sy-subrc = 0.
      IF gt_temp-hkont+0(4) = '2320' OR gt_temp-hkont+0(4) = '2213'.
        gt_test-m = gt_test-m + gt_temp-dmbtr.
      ELSEIF gt_temp-hkont+0(4) = '1431'.
        gt_test-n = gt_test-n + gt_temp-dmbtr.
      ELSEIF gt_temp-hkont = '2101000000' OR gt_temp-hkont = '2301010000'.
        gt_test-o = gt_test-o + gt_temp-dmbtr.
*    ELSEIF gt_temp-hkont+0(4) = '1441' OR gt_temp-hkont+0(4) = '2213'.
*      gt_test-g = gt_temp-dmbtr.
      ELSEIF gt_temp-hkont+0(4) = '1002'.
        gt_test-q = gt_test-q + gt_temp-dmbtr.
      ELSEIF gt_temp-hkont+0(4) = '2171'.
        gt_test-r = gt_test-r + gt_temp-dmbtr.
      ELSE.
        gt_test-s = gt_test-s + gt_temp-dmbtr.
      ENDIF.
      MODIFY gt_test INDEX sy-tabix .
    ENDIF.
  ENDLOOP.
  LOOP AT gt_bsis.
    READ TABLE gt_test WITH KEY saknr = gt_bsis-hkont.
    IF sy-subrc = 0.
      gt_test-c = gt_bsis-dmbtr.
    ENDIF.
    MODIFY gt_test INDEX sy-tabix.
  ENDLOOP.
  LOOP AT gt_test.
    gt_test-xh = sy-tabix.
    gt_test-item = gt_test-saknr+4(2).
    MODIFY gt_test.
  ENDLOOP.
*  BREAK-POINT.
ENDFORM.                    " getdata
*&---------------------------------------------------------------------*
*&      Form  fixdata
*&---------------------------------------------------------------------*
FORM fixdata .
  FIELD-SYMBOLS <fs> TYPE ANY.
  DATA: n TYPE i.
*指针动态标记相邻行item相同的数据
  LOOP AT gt_test ASSIGNING <fs>.
    IF sy-subrc = 0.
      n = sy-tabix + 1.
      READ TABLE gt_test INDEX n.
      IF sy-subrc = 0.
        MOVE-CORRESPONDING <fs> TO wa.
        IF wa-item = gt_test-item.
          wa-flag = 'X'.
          gt_test-flag = 'X'.
        ENDIF.
        MOVE-CORRESPONDING wa TO <fs>.
        MODIFY gt_test INDEX n.
      ENDIF.
    ENDIF.
    MOVE-CORRESPONDING <fs> TO gt_test.
    MODIFY gt_test.
  ENDLOOP.
*在第二个内表中小计
  LOOP AT gt_test.
    MOVE-CORRESPONDING gt_test TO gt_result.
    COLLECT gt_result.
  ENDLOOP.
  LOOP AT gt_result.
    MOVE-CORRESPONDING gt_result TO gt_itab.
    SELECT SINGLE banka FROM ztest999
    INTO gt_itab-banka
    WHERE item = gt_itab-item.
    APPEND gt_itab.
  ENDLOOP.
  CLEAR n.
*将第一个内表中flag = 'X'的行数据插入第二个内表中,同时完成小计在明细之上
  LOOP AT gt_test WHERE flag = 'X'.
    READ TABLE gt_itab WITH KEY item = gt_test-item.
    n = sy-tabix + 1.
    IF sy-subrc = 0.
      MOVE-CORRESPONDING gt_test TO gt_itab.
      INSERT gt_itab INDEX n.
    ENDIF.
  ENDLOOP.
  LOOP AT gt_itab WHERE flag = 'X'.
    gt_itab-xh = ''.
    MODIFY gt_itab.
  ENDLOOP.
  CLEAR n.
  n = 1.
*
  LOOP AT gt_itab WHERE flag = ''.
    gt_itab-xh = n.
    gt_itab-flag2 = 'X'.
    MODIFY gt_itab.
    n = n + 1.
  ENDLOOP.
*如需进行总计,可以通过汇总flag2 = 'X'实现,这里没有具体写出代码
ENDFORM.                    " fixdata

你可能感兴趣的:(process)