SAP中对内表及表的操作

2024-04-21 15:58
文章标签 操作 sap 表及表 对内

本文主要是介绍SAP中对内表及表的操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内表的定义:TYPES|DATA itab {TYPE|LIKE}  tabkind OF{linetype|lineobj}[WITH key] [INITIAL SIZE n].

内表的种类:

1.      标准表(STANDARDTABLE).系统为该表的每一行数据生成一行数据生成一个逻辑索引.填充标准表时,可以将数据附加在现有行之后,也可以插入到指定的位置,程序对内表行的寻址操作可通过关键字或索引进行.在对表进行插入,删除等操作时,各数据行在内在中的位置不变,系统仅重新排列各数据行的索引值.

2.      排序表(SORTEDTABLE).与标准表相同,也具有一个逻辑索引,但其按关键字升序排序后再进行存储,其访问方式与标准表相同.

3.      哈希表(HASHEDTABLE).没有索引,只能通过关键字来访问.系统用哈希算法管理表中的数据,因而其寻址一个数据行的时间与表的行数无关.

EX.      REPORTZ_ITAB_DEFINE.      

 TYPES:BEGIN OFAddress,         

           Street(20) TYPEC,          

          City(20) TYPE C, 

           END OF Address. 

     DATA:BEGIN FOCompany,   

                 Name(20) TYPE C,     

               Addresses TYPEAddress,   

            END OFCompany.   

    DATAItab_Company LIKE HASHED TABLE OF Company WITH UNIQUE KEYName.    

   DATA Itab_Company_SortedLIKE SORTED TABLE OF Company WITH UNIQUE KEY Name.

内表行的操作.

1.      工作区.程序对内表的操作不能直接进行,必须通过一种接口来传输,这个接口就是工作区(WorkArea).如果程序需要从关系数据库中撮数据到内表各行中,必须先将数据读入工作区,然后把工作区中的数据赋给内表的行.工作区必须具有和内表的行一致或者可相互转换的数据结构.

2.      表行头.在创建内表对象的同时可以隐式地定义一个同名工作区.创建了带表头的内表之后,可以认为程序中存在两个数据对象,一个是内表,另一个与内表结构相同的结构体.如果一个语句中,该名称同时代表内表或同名表的工作区,则需要在内表名称之后加“[]”。

3.      插入行.(INSERT语句)语法:       INSERT line INTO itab INDEXidx.”通过索引插入单行.       INSERT [line INTO|INITIAL LINE INTO] TABLEitab.”一般性插入语句.对于标准表,不指定索引值,附加至表最后一行,与APPEND语句效果完全一致.对于排序表,插入的行不可以打乱按照关键字排序的顺序,否则插入不成功.对于哈希表,插入过程中系统按照关键字对行进行定位.INSERTwa_company INTO TABLE itab_company.”将一个内表中的所有行插入到另一个内表中.

4.      附加行.(APPEND语句)附加行是在一个已经存在的索引表中使用APPEND语句增添新行.可以对单行或多行进行操作.语法:APPEND [lineTO|INITIAL LINE TO ]itab.”单行APPEND LINES OF Itab1 [FROM n1][TO n2]TO itab2.”多行.

5.      聚集附加.(COLLECT语句)COLLECT line INTOitab.要求:内表必需为扁平结构,行要与工作区兼容,而且除关键字以外的字段必须为数字类型.

6.      读取一行.(READ语句)READ TABLE itab [INTO wa| ASSIGNING<fa>] INDEXidx.读取的结果可以是结构与行类型兼容的工作区或字段符号<fs>.如果读取成功,则SY-TABIX返回该行的索引.一般在访问目标工作区之前,要先用SY-SUBRC字段查看一下读取成功与否.READTABLE itab FROM key [INTO wa|ASSIGNING<fs>].目标数据结构中的关键字段必须已经被预赋值,内表中相同关键字的首个数据行中的其他字段将被读入目标区域中.READTABLE itab WITH TABLE KEY k1 = f1 …ki = fi [INTO wa |ASSIGNING<fs>].指定表中的所有表关键字段的值,目标结构在操作前可以为任何值,内表数据行整体读入目标区域.READTABLE itab WITH KEY k1 = f1 …ki = fi [INTO wa|ASSIGNING<fs>].KEY列表可以为任意字段,不一定是表关键字.

7.      修改一行.(MODIFY语句)MODIFY itab [FROM wa] [INDEX idx][TRANSPORTINGf1,f2…].使用FROM选项指定的工作区域wa代替itab中索引为idx的现有行,一般需要指定INDEX选项.MODIFYTABLE itab FROM wa [TRANSPORTINGf1,f2…].工作区域wa在语句操作过程中起到双重作用,其一是根据其关键字段的值来确定需要替换的内表的行;其二是根据其他非关键字段的值来替换内表行中相应字段的数据.如果只希望更新部分字段的值,可以使用TRANSPORTING选项.MODIFYitab FROM wa TRANSPORTING f1,f2…WHERE cond.使用WHERE选项修改多行.

8.      删除一行.DELETE语句.DELETE itab INDEXidx.如果删除成功,则所有行的索引数减一,SY-SUBRC值为0,如果不存在索引行为idx,则SY-SUBRC返回4.DELETETABLE itab FROM wa.DELETE TABLE itab WITH KEY k1 = f1…ki =fi.DELETE TABLE [FROM n1 ][TO n2][WHERE<condition>].

9.      循环处理.LOOP AT itab <result> [FROMn1][TO n2] [WHERE<condition>].       <statement block>.ENDLOOP.

10.   初始化内表.

CLEARitab.该语句将内表重置为填充前的状态,该表将不包含任何行.如果内表有表头行,会同时清空内表数据行和表头行的内容.

CLEAR itab[].只希望初始化内表本身,保留表头行的内容.REFRESHitab.如果内表有表头行,该语句确保只初始化内表本身.FREE itab.使用CLEAR或REFRESH初始化内表后,系统仍保持在内在中为内表预留的空间.该语句可以重置内表并同时释放其内存,而不必先使用REFRESH或CLEAR语句.…itabIS INITIAL…

11.  整体复制内表.如果想将内表的全部内容复制到另一个内表中,可以进行整体赋值操作,使用MOVE或”=”.MOVE itab1 TOitab2.Itab1 = itab2.

12.  比较内表大小.内表可用作逻辑表达式的操作数进行比较.…itab1<operator>itab2…其中<operator>可以为操作符EQ,=,NE,<>,><,GE,>=,LE,<=,GT,>,LT,<等. 业务表的操作.

 

(OPEN SQL语句).

1.      SELECT语句SELECT <result> FROM<source> INTO<target>[WHERE<condition>][GROUP BY<fields>][HAVING<cond>][ORDER BY<fields>].

2.      选择单行语句SELECT SINGLE <result> INTO<target> FROM<source>…可以选择多个字段(*所有字段).

3.      选择多行数据. 可通过SELECT/ENDSELECT.循环从数据库中读取多行.

4.      选择至内表.SELECT …INTO|APPENDING [CORRESPONDING FIELDS OF] TABLEitab.

5.      指定选择包大小.包大小是指一次选择到内表的行数,可以将所有先行按已定义大小的包一段段的读到内表中.SELECT * … INTOTABLE itab PACKAGE SIZEn…       <statements>ENDSELECT.

6.      查询条件

a.      比较运算符比较运算符有,=,>,<,<>,<=,>=等.

b.      范围限定运算符WHERE …f [NOT] BETWEEN g1 ANDg2…c.      字符比较运算符WHERE …f[NOT]LIKE g [ESCAPEh]…d.      检查列表值WHERE … f[NOT] IN(g1…gi)…e.      检查空值WHERE … f  IS [NOT]NULL…f.       检查选择表选择表是一种复杂而强大的逻辑表达式组合形式,其本身是一个内表,检查选择表意味着数据库字段f需要满足所有逻辑表达式的组合.

7.      多表结合查询.

a.      SELECT语句嵌套.EX.       

REPORTz_select_nested.       

 DATA:wa_carrid TYPEspfli-carrid,               

 Wa_connid TYPEspfli-connid,               

Wa_carranem TYPEspfli-carrname.       

SELECT carrid connid FROM spfli INTO (wa_carrid,wa_connid) WHEREcityfrom =’Singapore’

SELECT carrname FROM scar INTO wa_carrname WHERE CARRID =wa_carrid.                     

 WRITEwa_carrname.              

ENDSELECT.       

ENDSELECT.

b.      FOR ALL ENTRIES选项.先从一个表中取出要查询的数据,再从相应内表中把数据查出来.

REPORT Z_SELECT_FOR_ALL_ENTRIES.DATA:BEGIN OFwa_spfli,              

Carrid TYPESPFLI-CARRID,              

Connid TYPESPFLI-CONNID,        

END OFwa_spfli,        

BEGIN OFwa_scarr,              

Carrid TYPEscarr-carrid,              

Carrname TYPEscar-carrname,        

END OFwa_scarr,        

Spfli_tab LIKE TABLE OF wa_spfli.SELECT carrid connid FROM spfliINTO TABLE spfli_tab WHERE cityfrom = ‘Singapore’.

SELECT carrid carrname FROM scar INTO wa_scarr FOR ALL ENTRIESIN spfli_tab WHERE carrid = spfli_tab-carrid.…ENDSELECT.

c.      使用视图.

d.      结合查询. INNER JOIN:如果主数据表和结合表中存在共同的字段内容(结合条件为字段),根据其相同值提取.SELECT …FROM table [INNER] JOIN jointable1 [AS asliasA] ON<cond><options>…其中FROM子句中的table为主选择表,后面可以根据需要用JOIN关键字选项加入几个数据库表,称为结合表.OUTERJOIN:在主表选择时,即使在结合表中结合条件不存在,也将该数据行选出,结合表中不存在的字段保持空白.SELECT …FROMtable LEFT [OUTER] JOIN dbtab [AS alias] ON<cond><options>…LEFT OUTERJOIN的语法要求更为严格,在ON附加项中,只能使用”=”操作符,且必须至少有一个条件是对主选择表和结合表中的字段进行比较.

e.      子查询.子查询是没有INTO子句的查询语句,通过EXISTS,IN或者逻辑运算符连接至WHERE子句中,但不能和结合选择附加项ON同时出现.子查询可以进行嵌套.SELECT…FROM scar INTO …WHERE EXIST (SELECT * FROM spfli WHERE carrid =scarr-carrid AND cityfrom =‘singapore’.如果查询中选择只需要返回单个字段,则还可以使用IN关键字.…WHERE city IN (SELECTcityfrom FROM spfli WHERE carrid =scar-carrid…单行返回结果使用运算符”=”:…WHERE city = (SELECT cityfrom FROMspfli WHERE carrid =scar-carrid…返回多行时,必须是子查询之前注明ALL,ANY或SOME附加项.…WHERE city> ALL ( SELECT cityfrom FROM spfli WHERE carrid =scar-carrid…

8.      组合查询结果.

9.      操作性能分析.GET RUN TIME FIELD f.

10.   光标DATA: cur TYPECURSOR.START-OF-SELECTION.OPEN CURSOR cur FOR SELECT …FROM ..WHERE… ORDER BY ….DO.FETCH NEXT CURSOR cur INTO (…)….ENDDO.

11.  更新数据.INSERT,UPDATE,MODIFY,DELETE语句进行数据的更新操作.

a.      INSERT语句

1.      可以通过工作区向数据库中插入单行数据.INSERT INTO dbtab VALUES wa.INSERT INTO dbtabFROMwa.INSERT语句操作后,如果相同表关键字的数据条目已经存在,不能重新插入,只能对该行的非关键字段进行更改(可使用UPDATE或MODIFY).

2.      插入多行数据.INSERT dbtab FROM TABLEitab.如果所有的数据条目均成功插入,则SY-SUBRC返回0;如果至少一行数据不能被插入(具有相同表关键字值条目已经存在),则会触发运行时错误,而且系统不更新任何数据.INSERTdbab FROM TABLE itab ACCEPTING DUPLICATE KEYS.

 b.      UPDATE语句

1.更新单行.UPDATE dbtab SET f1=g1…fn = gn WHERE<fix_key>.根据工作区进行更新.UPDATE dbtab FROMwa.             

2.更新多行.               UPDATE dbtab SET f1 = g1…fi=gi [WHERE<conditions>]. 

c.      MODIFY语句MODIFY语句操作数据库时,如果程序中指定的数据行已经存在于数据库中(根据关键字判断)则对其进行更新操作,如果尚未存在,则进行插入操作.单行与多行.

d.      DELETE语句


这篇关于SAP中对内表及表的操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923471

相关文章

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

MySQL——表操作

目录 一、创建表 二、查看表 2.1 查看表中某成员的数据 2.2 查看整个表中的表成员 2.3 查看创建表时的句柄 三、修改表 alter 3.1 重命名 rename 3.2 新增一列 add 3.3 更改列属性 modify 3.4 更改列名称 change 3.5 删除某列 上一篇博客介绍了库的操作,接下来来看一下表的相关操作。 一、创建表 create

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

PHP7扩展开发之流操作

前言 啥是流操作?简单来讲就是对一些文件,网络的IO操作。PHP已经把这些IO操作,封装成流操作。这节,我们将使用PHP扩展实现一个目录遍历的功能。PHP示例代码如下: <?phpfunction list_dir($dir) {if (is_dir($dir) === false) {return;} $dh = opendir($dir);if ($dh == false) {ret

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

mysql中导入txt文件数据的操作指令

1 表tt的格式:    CREATE TABLE `tt` (   `ind` int NOT NULL auto_increment,   `name` char(100) default NULL,   PRIMARY KEY  (`ind`)  )   2 文件d.txt的内容示例:  1,a  2,b  3,c