REPORT zjason_test2 .
DATA: BEGIN OF s1 OCCURS 0,
id TYPE i,
sqr TYPE i,
END OF s1.
DATA itab1 LIKE s1 OCCURS 20 WITH HEADER LINE.
DATA itab2 LIKE s1 OCCURS 20 WITH HEADER LINE.
DATA: wa LIKE LINE OF s1.
DO 2 TIMES.
itab1-id = sy-index.
itab1-sqr = sy-index ** 2.
APPEND itab1.
ENDDO.
itab2-id = 1.
itab2-sqr = 9999.
APPEND itab2.
READ TABLE itab1 WITH KEY id = 1.
IF sy-subrc = 0.
READ TABLE itab2 WITH KEY id = itab1-id.
IF sy-subrc = 0.
itab2-sqr = itab1-sqr.
MODIFY itab2 INDEX sy-tabix. “注意很多时候都会更改sy-tabix等系统变量,应用要小心
ENDIF.
ENDIF.
LOOP AT itab2 INTO s1.
WRITE : / s1-id,s1-sqr.
ENDLOOP.
CLEAR itab2.
--------------------------------------
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