内表使用小结

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内表装载方式效率更高,但要写更多的语句,原因是不需要查表结构了。对于使用率极高和数据量极大的表,很有好处

猜你喜欢

转载自blog.csdn.net/kuangben1/article/details/7084123