ABAP Basics

ABAP语法详解


一. ABAP基本数据类型

C : Character text
N : Numeric text(不能进行计算)
I : Interger
D : Date(YYYYMMDD)
T : Time(HHMMSS)
F : Floating point
P : Packed(包类型:1-16)
X : 十六进制
常用系统变量:
   sy-uname:用户登录名     sy-datum:日期    sy-uzeit:时间   sy-host:服务器名称
   sy-subrc:报表返回值     sy-index:循环,当前通过的编号   sy-tabix:返回当前编号        
   sy-dynnr:屏幕的编号     sy-dbcnt:DB操作处理过的表行号

二. 变量的声明

透明表,数据字典,结构:既是类型又是对象,可用type和like。
只能使用LIKE引用另一定义变量的类型,type不可以
<1> DATA <var>(len) TYPE <type> VALUE <value>. <自定义变量类型>
<2> DATA <var1> like <var2>. <参考定义变量>
    DATA <var1> type <var2>. 
<3>继承结构
   DATA:BEGIN OF STAFFINFO. <此处是.操作符>
       INCLUDE STRUCTURE USER_INFO.
    DATA:BIRTHDAY TYPE D,
       ADDRESS(50) TYPE C,
    END OF STAFFINFO.

三. 定义常量、宏

常量定义
  CONSTANTS <var>(len) TYPE <type> VALUE <value>.
  CONSTANTS <var>(len) LIKE <var2> VALUE <value>.
宏定义 
  1. 定义:
    DEFINE operation.
      result = &1 &2 &3.
      output   &1 &2 &3 result.
    END-OF-DEFINITION.

    DEFINE output.
      write: / 'The result of &1 &2 &3 is', &4.
    END-OF-DEFINITION.
  2. 使用:
    operation 4+3.

四. DESCRIBE使用

DESCRIBE TABLE lt_mat LINES lv_cont.
  这行的意思是 计算内表 lt_mat 的行数 ,将行数放到变量 lv_cont 里。
Field Properties:describe field <field> [mes var]...
                                (一个data的类型、长度、小数点、输出长度等信息)
Internal Table:describe table itab [kind knd] [LINES lin] [COCCURS n].
Distance two fields:describe distance ...

五. 内表、Table

工作区域:工作区域可以存放多个变量数据。
  直接定义: DATA: BEGIN OF <str>   END OF <str>.
  参照DB或则结构:DATA <wa> TYPE <dbtab>|<str>.
  继承结构:
        DATA: BEGIN OF <str>.
              INCLUDE STRUCTURE <Str_Other>.
            DATA: <ele> TYPE <db-ele> ,
        END OF <str>.
  参照内表: DATA  <wa>  LIKE LINE OF <dbtab>.
内表:
  内表类型:
    索引内表:标准内表(Standard table)、排序表(Sorted table)
      标准内表:每一行数据都有关键字和系统生成的逻辑索引。
      排序表:排序表按照关键字升序排序后再进行存储。
      哈希表:Hashed table
        没有索引的表,只能靠关键字进行寻址,用哈希算法管理数据。
  内表定义:可以参考结构体、其他内表、透明表
    参考结构: DATA <table_name> TYPE STANDARD TABLE OF <structure> [WITH HEADER LINE].
    参考内表: DATA <table_name> TYPE TABLE OF <内表或透明表> [WITH HEADER LINE].
     1. with header line,用 itab[] 和 itab 来区分内表和工作区
     2. 分别定义内表和工作区
     3. 定义结构时用occur 0直接定义
     4. LIKE LINE OF后面接一个内表,表示一个data参数具有和内表一样的结构,可当做Work Area使用
     5. LIKE TABLE OF后面接一个结构,表示一个data参数是一个内表,这个内表和后面接的结构一样
  内表清空:
     CLEAR <ITAB>:仅清空HEADER LINE,对内表数据存储空间不影响。
     REFRESH <ITAB>:清空内表数据存储空间,对HEADER LINE不影响。
     REFRESH <itab> FROM TABLE <dbtab>:清空内表存储空间,填充从数据库表所获数据。
     FREE <ITAB>:清空内表数据存储空间,对HEADER LINE不影响。
  APPEND(增加,内表赋值)
    有HEADER LINE内表,数据被赋给内表HEADER LINE后再APPEND到表中最后一行。
      APPEND ITAB.
    对于没有HEADER LINE的内表,只能通表外部WORK AREA来传递数据。
      APPEND (<work area> into) <ITAB>.
  INSERT(向内表插入数据)
    INSERT itab INDEX idx. :若itab有多行数据,将新记录新增到第一行
    INSERT wa INTO TABLE itab.   :将结构体中数据新增到内表
    INSERT LINES OF itab1 [FROM idx] [TO idx2] INTO itab2 [INDEX idx3].:范围插入
  DELETE(删除数据)
    DELETE TABLE itab WITH TABLE KEY k1=v1...kn=vn.:按具体值删除。
    DELETE TABLE itab [FROM wa].:参照其它内表值删除。
    DELETE itab INDEX idx.:根据索引删除具体行数据。
    DELETE itab FROM idx1 TO idx2.:根据索引删除具体行数范围间数据。
    DELETE ADJACENT DUPLICATES FROM itab.:删除重复数据,执行此条件前必须先排序。
  MODIFY:(修改内表数据)
    按内表位置或者具体内表字段值相等条件修改内表数据。
    MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1...fn] WHERE cond.
  LOOP....ENDLOOP:(循环读取内表数据)
    循环读取内表数据,在循环中使用系统变量SY-TABIX可获取当前所执行的行数。
    LOOP AT ITAB [INTO WA] FROM n1 TO n2.:读取内表具体行数间数据。
    LOOP AT ITAB [INTO WA] WHERE cond.:按具体字段条件读取内表。
  AT...ENDAT(设置内表循环触发条件)
    该语法为事件控制函数,应用于LOOP循环语句中,用于获取内表的数据变化事件。
    AT NEW f.:当某个字段数据与上一行数据值不同时触发该事件。
    AT END OF f.:当内表中某个字段当前行值与下一行值不同时触发该事件。
    AT FIRST.:当执行内表第一行时触发该事件。
    AT LAST.:当执行内表最后一行时触发该事件。
  READ:(读取)
    READ TABLE itab [INTO wa] FROM wa.
    READ TABLE itab [INTO wa] WITH [TABLE] KEY k1=v1...kn=vn [BINARY SEARCH].
    READ TABLE itab [INTO wa] INDEX i.
  COLLECT(内表数据分类汇总)
    将内表中相同的字段合并,若有类型为I的字段,则将其值加总。
    COLLECT [wa INTO] itab.
  DESCRIBE(获取内表具体属性)
    DESCRIBE TABLE itab LINES n:获取内表当前总行数,n为整型(i)。
Table:透明表(Transparent table)、簇表 (Cluster table)、 池表(Pool table)
    透明表:和数据库具有相同结构的表存储结构。数据库中有一个相应得物理表。
    簇表:该表在SAP Dict展现在我们眼前的结构,由透明表转化<Extras—Change table category>
          从单个表去理解与透明表没有差异,但是多个表组成簇表,它们在物理上对主键只存储一遍,故对簇表
        的关联查询可以极大提高访问速度。
    池表:由透明表转换,可用来存储控制数据,与数据库中的表是多对一关系。
     INSERT 透明表 INTO 簇表。 只要透明的簇表的主键都在透明表里面就行。就是透明表主键多了也无所谓。
     INSERT 透明表 INTO 池表. 透明表和池表的主键必须相同的。
    表簇:几个簇表可以组合成一个表簇,几个簇表存贮在数据库中一个相应的表里,DB层的物理表。
    结构:结构在数据库不存在数据记录。结构用于在程序之间或程序与屏幕之间的接口定义。
    附加结构:附加结构定义字段的子集,该字段属于其他表格或结构,但是在修正管理中作为单独的对象。
Data element:构成结构、表的基本组件 search help、parameter ID、标签描述。
    Goto > Documentation > Change :修改提示文档信息
Domain:定义数据元素的技术属性,类型,长度,精度。
    Definition:
       Format、Output Charact、
       Converse Routine(转换规则):注意前导0的补充问题,将该字段设置为ALPHA。
       Lower Case:不勾选,默认会全部转换为大写字母。
  value range:设置该Domain的固定取值列表和其含义。

    DEC:double FLTP:Float  INT1:0~255  INT2:-32768~32767     INT4:4字节   
    NUMC:数字字符(1-255)   CHAR:字符(1-255)   STRING
    CURR:货币字段(1-17)    CUKY:货币代码(5)   QUAN:金额(1-17)  UNIT:单位(2-3)   
    DATS:Date(8)          TIMS:Time(6)       CLNT:Client(3)    
    LANG:Language(internal 1,external 2)
SM30:表维护 Utilities ----->Table maintenance generator
          Technical Dialog Details
          Authorization Group:&NC&
          Function group:ZFG_tablename
          Maintenance Screens : 
          Maintenance type:one step

六.字符串处理

<1> SPLIT dobj AT sep INTO {res1 res2}. :将字符串的值分配给具体变量
    SPLIT f AT g INTO TABLE itab:将字符串的值分配给一内表。  
<2> CONDENSE <c> [NO-GAPS]  :重新整合分配字符串,去除空格
<3> CONCATENATE var1 var2 INTO result [separated BY SEQ] [RESPECTING BLANKS]. :拼接字段
<4> SHIFT dobj [LEFT|RIGHT] BY num PLACES. :指定移动字符位数。
<5> contains (val=TEXT)
<6> REPLACE ALL OCCURRENCES OF REGEX regex IN  dobj WITH new
<7> Var1 = <field>+4(6) : 从指点字段的第4位开始往后取出长度为6的内容
<8> TRANSLATE c TO UPPER|LOWER CASE.:将字符串转换为大|小写。

七.全局变量,局部变量

   报表程序中:选择屏幕事件块(AT SELECTION-SCREEN),逻辑数据库事件块,及methods,
              subroutines(FORM子过程)、Function Modules中声明的变量为局部的。
   其他块里的变量属于全局的(报表事件块、列表事件块、对话module)效果与在程序开头定义的变量一样。

八.Form、Function

Form中的参数:
  1.TABLES:Type和like只能接标准内表类型或标准内表对象
    FORM TABLES itab1...itabn. :以表的方式传输数据
  2.USING:值传递,则对形参的修改不会改变实参。
    FORM <name> USING [p1....pn].
  3.CHANGING:使用排序表或则哈希表,如果CHANGE值传递,对形参的修改还是会改变实参,
    在form或则function执行完后才去修改。
     FORM <name> CHANGING [p1....pn].
  4.调用指定程序中的子程序:
    不同的ABAP程序中的子程序是可以共用的.
      PERFORM <sub_name> [CHANGING p1..pn] IN PROFRAM <prog_name>.
  5.通过TCode调用指定程序中的子程序:
    CALL TRANSACTION <TCode.  
  6.使用SUBMIT调用另一个程序:
    SUBMIT <程序名>.
     ...USING SELECTION-SCREEN <SCR>. "调用子屏幕
     ...IVA  SELECTION-SCREEN.        "显示所调用程序的初始屏幕
     ...AND RETURN.    "调用指定程序执行后可返回上一屏幕

Function Group SE37:
  系统会自动创建Main program与相应的include程序。
  SAPL<fgrp>:主程序名,将Function Group里的所有的Include文件包括进来,只有Include语句
  L<fgrp>TOP:有FUNCTION-POOL语句,以及所有Function model都可以使用的全局数据定义
  L<fgrp>UXX:只有include语句,为相应具体Function Model所对应的Include文件名:
             L<fgrp>U01...包含了对应的FM代码。
  L<fgrp>U01:01,02编号对应UXX,代表其创建先后的序号。
  L<fgrp>FXX:用来存放一些Form子程序,可以被所有Function Modules所使用。
  L<fgrp>PAI,L<fgrp>PBO:PAI,PBO事件。

九.AT...END (SUM)

AT...END:中的组件名不一定要是结构中的关键字段,但是需要在声明结构时按调用顺序排序。
          f1,f2,fn.  f1,f2,fn
SUM:根据结构中对应的字段进行分组求和,且指定字段之前的依次分组

十.事件终止

1.RETURN : 用来退出当前执行的程序块,而不仅仅是退出循环。如FORM,METHOD,报表事件块
2.STOP : INITIALIZATION中STOP会导致跳转到AT SELECTION-SCREEN OUTPUT事件块
         如果STOP在AT SELECTION-SCREEN OUTPUT块里,则只是退出当前块,STOP后面语句不执行而已
         STOP在循环中,FORM,METHOD直接从被调用的点退出所在事件块
3.EXIT : INITIALIZATION中的EXIT会跳转到AT SELECTION-SCREEN OUTPUT事件
         如果EXIT在AT SELECTION-SCREEN OUTPUT块里,则只是退出当前块,EXIT后面语句不执行而已
         EXIT 在循环中,只是跳出当前循环而已;循环之外的模块则与RETURN类似
4.CHECK : CHECK只是跳出当前事件块,继续下个事件块的处理,相当于方法的RETURN
          CHECK在循环中,只是跳出循环(DO,WHILE,LOOP)类似于CONTINUE,在循环外则跳出当前执行的程序块
5.LEAVE : LEAVE PROGRAM.退出整个程序
          LEAVE TO TRANSACTION <ta>.跳转到另外的TCode
          LEAVE LIST-PROCESSING.从List processor回到Dialog processor
          LEAVE TO LIST-PROCESSING. 控制权从dialog processor 转交到list processor
          LEAVE {SCREEN | {TO SCREEN dynnr}}
6.REJECT : 用在逻辑数据库GET event blocks中,可以从循环或则一个FORM中直接跳出所在的GET事件块

十一.MESSAGES

1.ID : "00"消息ID中的001消息本身未设置任何消息串,这条消息可以传递8个参数,拼接消息时用
2.消息常量 : MESSAGE 'xxxxxxxxxxxxxxx' TYPE 'S' [DISPLAY LIKE 'E']. 

十二.数据格式化、转换

1.输入输出转换
  如果某个变量参照的数据所对应的Domain具有转换规则,在(Write,ALV,文本框显示),最后结果会自动转换。
  通过转换规则输入输出函数手动转换,转换公式。CONVERSION_EXIT_ALPHA_INPUT/OUTPUT(前面补齐0,去掉前导0)。
2.显示内容
  基本数据类型是QUAN,其小数位由字段关联的度量衡单位决定。
  ALV显示时,如果是金额或数量时,需通过Fieldcat设置Cfieldname、ctabname等才会正确显示。
3.单位换算
  UNIT_CONVERSION_SIMPLE
4.货币转换因子
  CURRENCY_CONVERTING_FACTOR:输入币种,可以得到相应的转换比率。SE16中看到数据的经过转换后存入,取出时应做转换
  BAPI_CURRENCY_CONV_TO_INTERNAL:转换为数据库中内部存储金额
  BAPI_CURRENCY_CONV_TO_EXTERNAL:转换成外部的实际金额
  CONVERT_TO_LOCAL_CURRENCY:自动将最近时间多的汇率作为转换的汇率
  OB07、OB08:维护各币种之间的汇率
  CONVERT_TO_FOREIGN_CURRENCY是将外币转换为本位币
  CONVERT_TO_LOCAL_CURRENCY是将本位币转换为其他外币

十三、Open SQL

1.ABAP可以通过两种方式与数据库交互
  Native SQL:数据库自身的SQL,可以直接访问数据库,不够安全。
  Open SQL:集成到ABAP中的标准SQL子集,通过SAP数据库接口识别不同的数据库,
           然后将语句进行转换成底层数据库对应的语言。
2.基本语法
    与其他SQL语句类似,主要包括增删改查:Select、Update、Insert、Delete、Modify
  <1> SELECT 语法
    SELECT [SINGLE] <result> FROM <dbtab> :SINGLE表示查询单行数据
      INTO <target>                :内表或则结构
      [INTO <f1>...<fn>]           :将查询结果赋值到具体字段
      [INTO CORRESPONDING FILES OF <itab>]
                                   : 将查询结果按字段匹配赋值给具体的表或者结构体。
      WHERE <condition>            :查询条件
      Group BY <fields>            :分组查询条件
      ORDER BY <fields>.           :排序条件 
   表连接:
     1)INNER JOIN:查询结果包含两个连接表中彼此相对应的数据记录。
     2)LEFT OUTER JOIN:查询结果集中包含左表中的所有数据记录,右表中仅查询出包含相匹配的数据。
     3)FULL OUTER JOIN:包含左右表所有的记录。   
   以内表为查询条件:
     SELECT <f1...fn> FROM <dbtab> FOR ALL ENTRIED IN <itab> WHERE <cond>.
     使用 FOR ALL ENTRIED IN itab 前,一定要检查itab表是否为空,否则会造成SQL的执行效率极低。
   获取限制读取数据的条数:前n条
     SELECT * FROM <dbtab> INTO <itab> UP TO <n> ROWS.                            
   标准函数:
    COUNT():统计查询总数。
      SUM():统计表中某个数值字段的总和。
      AVG():统计表中某个数值字段的平均值。
      MAX():统计表中某个字段的最大值。
      MIN() :统计表中某个字段的最小值。
 <2> UPDATE(修改更新操作)
   UPDATE <dbtab> SET: f1...fn (WHERE <condition>).    
   UPDATE <dbtab> FROM TABLE <itab> (WHERE <condition>).
 <3> INSERT(插入数据)
   INSERT INTO <dbtab> VALUES <conditin>.
   INSERT <dbtab> FROM TABLE <itab>.
 <4> DELETE(删除操作)
   DELETE FROM <dbtab> WHERE <condition>.
   DELETE <dbtab> FROM TABLE <itab>.
 <5> MODIFY(修改操作,相当于Update & Insert)    
   MODIFY <dbtab> FROM TABLE <itab>.

效率优化

数据库

1. 不要使用 SELECT * ...,选择需要的字段, SELECT * 既浪费CPU,还需占用大量的ABAP内存
2. 不要使用SELECT DISTINCT .,会绕过缓存,可使用 SORT BY + DELETE ADJACENT DUPLICATES 
3. 少用相关子查询,因为子查询对外层查询结果集中的每条记录都会执行一次
4. 少用嵌套SELECT … ENDSELECT,可以使用联合查询或FOR ALL ENTRIES来替换,减少循环次数
5. 如果确定只查一条数据时,使用 SELECT SINGLE... 或者是 SELECT ...UP TO 1 ROWS ...
6. 统计时,直接使用SQL聚合函数,而不是将数据读取出来后在程序里再进行统计
7. 使用游标读取数据,这样省掉了将从数据库中的取记录放入内表的INTO语句这一过程开销
8. 多使用inner join,必要时才使用left join
9. inner join获取数据时,尽量不要用太多的表关联,特别是大表关联,关联顺序为:小表-大表
10. where 条件里面多用索引、主键,顺序也要遵循小表-大表
11. inner join条件放置的位置应该按照 On、Where、Having的顺序放,因为SQL条件的的执行一般
    是按这个顺序来执行的,将条件放在最开始执行,则可过滤掉大部数据;但要注意Left Outer
    Join,是否可以将ON中的条件移动到Where从句则要考虑(如果真能放在Where从句中,则应该用
    Inner Join,而非Left Outer Join,因为Where条件会过滤掉那些包括在右表中不存在的左表数据),因为此时条件放在
    On后面与放在Where语句后面结果是不一样的(因为不管on中的条件是否为真,左表中在右边表不存在的数据也会被返回,
    但如放在where条件中,则会对On产生的数据再次过滤的条件,会滤掉不满足条件的记录,包括左表在右表中找不到的记录,
    这时已经没有left join的含义)
12. 要根据主键或索引字段查找数据,且WHERE从句中的条件字段需按INDEX字段顺序书写,且将索引字段条件靠前(左边),
    检查条件组合字段是否是主键,或者是上在上面创建了索引,避免条件组合字段即不是主键又没有索引。
13\. SELECT语句WHERE条件,应该先将主键相关条件放在前面 然后按照比较符 = 、< 、>、 <> 、LIKE IN 的顺序排列
14\. 使用部分索引字段问题:如果一个索引是由多个字段组成的,只使用一部分关键字段来进行查询时,也是可以使用到索引,
     但使用时要注意要按照索引定义的顺序且取其前面部分。
15\. 请根据索引字段进行ORDER BY,否则通过程序进行SORT BY。与其在数据库在通过非索引字段进行排序,不如在程序中用   
     SORT BY语句进行排序,因为此情况下应用服务器上的执行速度要比数据库服务器快(应用服务器上采用的是内存排序)。
16\. 避免在索引字段上使用:not、<>、!=、IS NULL、IS NOT NULL,可以用> 与 < 来替代避免使用 LIKE,但LIKE
     '销售组1000'和LIKE '销售组1000%'可以用到,而LIKE '%销售组1000'(百分号前置)则用不到索引不要使用OR来连接
     多个索引字段(但同一字段多个值之间可以使用OR);对于同一索引字段,可以使用IN来替代OR:带有BETWEEN 的WHERE 
     条件不能通过索引来搜索?也可使用IN代替。
17\. 避免使用以下语句,因为使用这些语句时,不能使用 Table Buffer:
    Aggregate expressions
    Select distinct
    Select … for update
    Order by、group by、having从句
    Joins,使用JOIN时,会绕过SAP缓存,可以使用FOR ALL ENTRIES来代替
    WHERE从句中使用Sub queries(子查询)
    WHERE从句中使用IS NULL条件
18\. 在下面情况下使用FOR ALL ENTRIES IN:
    在循环内表时Loop...at itab时
    join超过三个表会出现性能问题,当使用JOIN连接超过3个表时
    表数据非常大时,使用JOIN会很慢,此时改用FOR ALL ENTRIES IN
19\. 使用内表批量操作数据库,而不要使用工作区一条条操作,如:
    SELECT ... INTO TABLE itab
    INSERT dbtab FROM TABLE itab
    DELETE dbtab FROM TABLE itab
    UPDATE/MODIFY dbtab FROM TABLE itab          

程序

 1. READ TABLE ...WITH [TABLE] KEY...BINARY SEARCH读取标准内表使用二分查找
 2. 在循环(LOOP AT ...WHERE..)或查询(READ TABLE ...)某内表时,如果未使用索引(排序表、哈希表)或二分查找,
 则在查询组合字段创建第二索引,查询时通过USE KEY或WITH [TABLE] KEY选项使用第二索引,这样在查询时会自动进行二分
 查找或哈希找查在没有用二分查找的情况下,可在查询组合字段上创建第二索引(哈希或排序索引),则在读取或循环内表时会
 自动使用二分查找或哈希查找算法
 3. 查找时,优先考虑使用哈希表进行查找,再考虑使用排序表进行二分查找,因为哈希查找的时间复杂度为(O (1)),不会因
 数据的增加而受到影响;而二分查找虽然比顺序搜索快很多,但随着数据的增加会慢下来,其时间复杂度为(O (log2n));标准
 内表的时间复杂度为O(n)。
 注:如果只使用到部分关键字为搜索条件,哈希表则会全表扫描,此时应该使用二分找查
 4. FOR ALL ENTRIES:需要判断内表是否为空,否则会查询出所有数据
 5. LOOP AT itab... ASSIGNING ...、READTABLE ...ASSIGNING ... 在循环或读取内表 时,使用字段符号来替换表工作
    区,将数据分配给字段符号Field Symbols,减少数据来回传递
 6. 尽量避免嵌套循环,如必须时,将循环次数少的放在外层,次数多的放在内层,这样可以减少在不同循环层之间的频繁地
    切换及内部循环次数
 7. 条件语句中多使用短路与或,“与”连接时将为假的机率大的条件放在前面,“或”连接时将为真的机率大的条件放在前面
 8. 少使用递归算法,递归时会增加调用栈层次,降低了性能,可使用队列或栈来避免递归
 9. 尽量不要使用通用类型(如FIELD-SYMBOLS、及形式参数),使用具体限定类型;比较时尽量使用同一数据类型:
    IF c = c.比IF i = c.快,原因是未发生类型转换
 10. 不要使用混合类型进行计算与比较,除非有必须
 11. 尽量使用静态语句,少用动态编程,动态编辑虽然灵活,但性能有所下降
 12. 在对字符进行操作进,尽量使用String代替C固定长度类型,如:concatenate[kənˈkatɪneɪt]语句对固定长度的C连接时
     会去扫描那些非空字符出来再进行连接,速度没有String快
 13. READ/MODIFY TABLE时使用TRANSPORTING只读取或修改必要的字段
 14. 尽量避免使用MOVE-CORRESPONDING和 SELECT...INTO CORRESPONDING FIELDS OF [TABLE] (SELECT时,查询几个字
     段就定义具有这几个字段的内表,而不是直接使用基于数据库表类型创建的内表,否则如果直接使用INTO TABLE语法检查
     时会警告,但结果是没有问题的)。
     CORRESPONDING语句在系统内部存在隐式操作: 逐个字段的检查元素名称匹配; 检查元素类型匹配;元素类型转换; 
 15. 最好不要向排序内表中插入(INSERT ... INTO TABLE ...)数据,因为在插入时会进行排序,速度会随着数据量的增加
     而慢下来,所以最好只向标准内表或哈希表中插入数据
 16. 将某个内表中的全部记录或部分记录追加到另一内表时,使用INSERT/APPEND LINES OF … 代替循环逐条追加;
     如果是全新赋值,直接对内表使用“=”进行赋值操作即可
 17. 调用类方法要快于Function:
    Calling Methods of global Classes:    
    call method CL_PERFORMANCE_TEST=>M1.
    Calling Function Modules:         
    call function 'FUNCTION1'.
 18. 通过运行事务代码SLIN(或者直接通过SE38的菜单),进行代码静态检查,根据SAP提供的反馈信息,优化代码
 19. 通过老式方式定义内表时,使用OCCURS 0 而非OCCURS n :重现
        lOCCURS n 代表初始化内表的空间大小为n(空间固定),当内表存储记录条数超出n时,系统将依靠页面文件存放
                  超出部分的数据。 当系统内存资源十分紧缺的时候,我们可以使用OCCURS n的初始化方法, 
                  但是这样的效率稍微慢
        lOCCURS 0 代表初始化内表的空间大小为无限,当内表存储记录条数不断增加时, 内表所使用的内存空间不断扩大, 
                  直到系统无法分配为止。使用内存比使用页面交换更快一些, 但是要考虑系统的资源状态
 20\. 使用完成后及时清空释放内表所占用的空间:FREE <itab>.
 21\. 使用CASE…WHEN语句代替 IF…ELSEIF…;使用WHILE…ENDWHILE 代替 DO…ENDDO
 22\. LOOP循环内表时加上Where条件减少CPU负荷,而不是在循环里通过IF语句来过滤数据
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,783评论 0 38
  • 《假期日记第一篇》 今天,我在家写完每天要完成的作业,都写完了,我对妈妈说,妈妈我写完了,我可以出去玩吗...
    张子落阅读 139评论 0 0
  • 近年,教育培训行业开始火爆起来,很多家长都开始重视对孩子的教育,相信很多做家长的朋友们,可能经常会收到来自学校、家...
    牛飞天阅读 200评论 0 1
  • 银河,你好! 我在家里给你写信。你问我人为什么活着,我哪能知道啊?我又不是牧师。释迦牟尼为了解决这个问题出了家,结...
    立即停止阅读 296评论 0 2
  • 据说某个小乖乖周末跟着同学去春熙路耍去了 我想胖十斤,涨到110 小玛玛今天以身试毒 哈哈哈,请往下看,来首歌压压...
    赤云踏雪阅读 286评论 0 0