1、 对于非数据库表的内表,不能用数据库查询的方式查找,可使用loop语法实现,例子如:
LOOPAT MYJTAB.
LOOP AT JTAB WHERE MATNR = myJTAB-MATNR and KUNRG = myJTAB-KUNRG.
MYJTAB-KAWRT = JTAB-KAWRT.
exit.
endloop.
MODIFY MYJTAB.
ENDLOOP.
例子显示的是内表之间的互相更新操作,内loop根据外loop的参数字段取得内loop的所有记录字段,然后退出内loop,并更新外loop的MYJTAB内表当前记录的KAWRT字段,并使用MODIFY更新MYJTAB当前行
2、 对于数据库表,可使用OPEN SQL等语法取数,方法有两种:
A、 使用select endselect
LOOP AT JTAB.
SELECT * FROM KONV
where KPOSN =JTAB-POSNR
and KNUMV =JTAB-KNUMV
and KSCHL = 'Z007'.
JTAB-KNUMV = KONV-KNUMV.
JTAB-POSNR = KONV-KPOSN.
JTAB-KAWRT = KONV-KBETR / 1000.
collect JTAB. 或 modify JTAB.
endselect .
ENDLOOP.
根据内表JTAB提供的当前行信息,查询KONV表记录,select语法会形成循环,一行行的把记录调出并执行,并且更新JTAB当前行或collect JTAB,适用于简单单表查询
如果只想取的一行数据,可使用以下方式:
SELECT single * FROM KONV
where KPOSN =JTAB-POSNR
and KNUMV =JTAB-KNUMV
and KSCHL ='Z007'.
JTAB-KNUMV = KONV-KNUMV.
JTAB-POSNR = KONV-KPOSN.
JTAB-KAWRT = KONV-KBETR / 1000.
collect JTAB.
区别只在于没有endselect
B、 使用查询语句把数据插入内表
SELECT A~VBELNA~FKART A~FKTYP A~FKDAT A~KUNRG A~ERNAM
A~SFAKN A~FKSTO B~MATNR B~FKIMG B~NETWRB~MWSBP
A~KNUMV B~POSNR
INTO CORRESPONDING FIELDS OF TABLE JTAB
FROM VBRK AS A
JOIN VBRP AS B
ON A~VBELN = B~VBELN
WHERE A~VBELN IN P_VBELN
AND A~VBELN NOT IN S_VBELN
AND A~FKART IN P_FKART
AND A~FKDAT IN P_ERDAT
AND A~RFBSK = 'C'
AND A~BUKRS = P_BUKRS
AND A~KUNRG IN P_KUNRG
AND B~MATNR IN P_MATNR.
然后再使用loop操作内表JTAB,由于JTAB早已定义好字段,INTO CORRESPONDING FIELDS OF TABLE会把对应TTAB的字段把查询中的字段对应的插入到内表JTAB中,这种方式适用于多表关联取数操作
上面的AND A~VBELN NOT INS_VBELN还引出动态查询SQL操作,把动态查询范围放到变量S_VBELN中,有利于接口化查询,例子如下:
RANGES:S_VBELN FORVBRK-VBELN.
SELECT A~VBELN INTO CORRESPONDINGFIELDS OF TABLE VBELN
FROM YKPPZ AS A WHERE A~VBELN IN P_VBELN
AND A~KUNRG IN P_KUNRG
AND A~BUKRS = P_BUKRS
AND A~FKART IN P_FKART
AND A~FKDAT IN P_ERDAT.
CLEAR PLINE.
DESCRIBE TABLE VBELN LINES PLINE.
IF PLINE > 0.
LOOPAT VBELN.
S_VBELN-SIGN = 'I'.
S_VBELN-OPTION = 'EQ'.
S_VBELN-LOW = VBELN-VBELN.
COLLECT S_VBELN.
CLEAR S_VBELN.
ENDLOOP.
首先使用查询语句查询出一定范围的记录,放到内表VBELN中,然后循环把记录放到range变量S_VBELN中,即可嵌入到动态查询语法中,如上面红色所示
内表的定于有headline和无headline两种,有headline的可以方便的使用into CORRESPONDING FIELDS OFTABLe,无headline的话就需要使用selectendselect语法或loop 语法把查询所得一个个的字段对应赋值给内表,使用append或collect进内表中,麻烦一些,但是无headline内表装载方式效率更高,但要写更多的语句,原因是不需要查表结构了。对于使用率极高和数据量极大的表,很有好处