SAP ABAP教程记录_3.ABAP基础

3.1 数据定义

3.1.1 数据类型

定义数据需要指定其数据类型。数据类型有预定义数据类型和自定义数据类型之分。预定义数据类型的名称是固定的。用户定义的数据类型的名称由用户在程序中指定。ABAP/4 中预定义的数据类型如下表所示。

类型 长度 Rang 初始值 说明
C 1 1-65535Byte space 字符串数据, 如’Program’
D 8 8Byte ‘00000000’ 日期数据, 格式为YYYYMMDD
F 8 8Byte 0 浮点数
I 4 -231至231-1 0 整数
N 1 1-65535Byte ‘00…0’ 数值所组成的字符串
P 8 1-16Byte 0 Packed 数, 用在小数点数
T 6 6Byte ‘000000’ 时间数据, 格式为HHMMSS
X 1 1-65535Byte X’00’ 16进位数

3.1.2 变量定义

*DATA语法:
*DATA  [] TYPE  [] []
*: 变量名称, 最长30个字符, 不可含有 +  .  ,  :  (  ) 等字符。
*: 数据类型及长度, 如 LINE(20)  TYPE C.亦如MYNAME LIKE SY-UNAME 。
*: 初值。
*: 小数位数。

"实例1
DATA: COUNTER  TYPE  P  VALUE  1,            "名称为COUNTER变量,类型为P ,初值为1	
  FLAG  TYPE  C  VALUE  IS  INITIAL,     "名称为FLAG的变量,类型为 C ,初值为默认值	
  WEIGHT  TYPE  P  DECIMALS  2  VALUE  ‘1.25’.  "名称为WEIGHT的变量,类型为P ,初值为1.25		

"实例2
DATA: BEGIN  OF  ADDRESS,     "定义数组变量ADDRESS				
      NAME(10)  TYPE  C ,		
      NUMBER   TYPE  P,				
      END  OF  ADDRESS.																						
"使用时用字段变量加上组件名称, 如 ADDRESS-NAME。																						

3.1.3 常量定义

*常数定义使用 CONSTANTS 指令, 如定义 PI 是一个有5位小数的数值 3.14159 .	
"实例:																									
 CONSTANTS  PI  TYPE  P  DECIMALS  5  VALUE  ‘3.14159’.		

3.1.4 系统定义的数据

SPACE							    "空白字符串											
SY-SUBRC							"系统执行返回值,0表示执行成功 4代表错误										
SY-UNAME							"登陆帐号名称											
SY-DATUM							"系统日期											
SY-UZEIT							"系统时间											
SY-TCODE							"目前的事务代码											

3.1.5 指令

  1. TYPE指令
*TYPE用来指定数据类型。
"实例:										
		DATA: NAME(10) TYPE C.								
		TYPES: NUMBER  TYPE I.								
  1. TYPES指令
*TYPES用来自定义数据类型。												
"实例:												
		TYPES:BEGIN OF MYLIST,										
		      NAME(10) TYPE C,										
		      NUMBER   TYPE I,										
		      END OF MYLIST.										
  1. LIKE指令
*LIKE也用来指定数据类型,使用格式与TYPE相同,LIKE与TYPE的区别是LIKE 用在已有值的数据项,
*如系统变量, 而TYPE叙述则是用在指定数据类型。																																																				
"实例:																																																				
		DATA: MYDATA LIKE SY-DATUM.																																																		
  1. STATICS指令
*STATICS用来定义变量,使用格式与DATA相同。与DATA的区别是STATICS只能在子程序中使用,
*用STATICS定义的变量可以在退出子程序后保留局部数据																																																				
*对象的值,而DATA不能。																																																				
"语法:																																																				
"		 STATICS  []  [] [] 																																																		
"实例:																																																				
		FORM DATATEST2.																																																		
		     STATICS A(20) TYPE C .																																																		
		     A = 'AAA'.																																																		
		     WRITE: / A.																																																		
		ENDFORM.																																																		
  1. TABLES指令

TABLES 语句用来创建称为表工作区的数据对象。表工作区是参考 ABAP/4 词典对象的字段串。语法:TABLES .其中 是ABAP/4 词典 对象的名称,同时也是创建的表工作区的名称。表工作区组件的顺序和名称与在 ABAP/4 词典中声明的对象相同。

TABLES: EBAN.			

3.2 数据运算指令

3.2.1 赋值

语法:   																																												
		MOVE    TO   																																										
		将F1的值存至变数 F2 中, 也可写成 F2 = F1																																										
实例:		
DATA M_NAME(10)  TYPE C.
		 M_NAME = 'CHER'.	
     MOVE M_NAME TO DATA(M_NAME1).

3.2.2 截取字符串赋值

DATA: F1(10) TYPE C VALUE  'ABCDEFGHIJ'.
      F2(5) TYPE C.	
F2  =  F1+3(5).           "自第4个位置开始取出5个字符	
"F2 的内容会变成 DEFGH 																					

3.2.3 数组值的复制

语法: MOVE –CORRESPONDING TO .
将Strings1中的字段名称相同的数据复制至Strings2相应字段中

DATA:  BEGIN  OF  ADDRESS,																																
		       FIRSTNAME(10) TYPE C VALUE  'LULU',		
		       LASTNAME(10) TYPE C VALUE  'CHOU',				
		       TEL(12) TYPE C  VALUE  '4660570',			
		       END  OF  ADDRESS.								
		DATA: BEGIN  OF  NAME,							
		       FIRSTNAME(10) TYPE C,					
		       LASTNAME(10) TYPE C,				
		       E_MAIL(30) TYPE C,			
		       END  OF  NAME.																																
		MOVE-CORRESPONDING  ADDRESS  TO  NAME.	
		"NAME-FIRSTNAME 变成 ‘LULU’, NAME-LASTNAME 变成 ‘CHOU’, 而 NAME-E_MAIL 则不变。

3.2.4 清除变量内容

*语法:   																		
*		CLEAR  .																
*		清除变量现在内容																
*实例:																		
		DATA  N  TYPE  I  VALUE  100.		
		CLEAR  N.					
    FREE abc[]    "清空数组
		"变量 N 的内容变成 0	

3.2.5 算术符号

符号 说明
** 乘幂
*
/
+
-
DIV 整数除法
MOD 余数除法

3.2.6 数值函数

1	ABS(N): 取数值 N 的绝对值																															
2	SIGN(N): 1   if  N > 0																															
	         0   if  N = 0																															
	        -1   if  N < 0																															
3	CEIL(N): 传回大于数值N的最小整数 																															
	实例:																															
			DATA:INT1 TYPE I,																													
			     INT2 TYPE I.																													
			INT1 = CEIL('-5.65').																													
			WRITE:INT1.   输出结果:5-																													
			INT2 = CEIL('4.54').																													
			WRITE:INT2.   输出结果:5																													
4	FLOOR(N): 传回小于数值N的最大整数																															
	实例: 																															
			DATA:INT1 TYPE I																													
			     INT2 TYPE I.																													
			INT1 = FLOOR('-5.65').																													
			WRITE:INT1.   输出结果:6-																													
			INT2 = FLOOR('4.54').																													
			WRITE:INT2.   输出结果:4																													
5	TRUNC(N): 传回数值N的整数部分																															
	实例:																															
			DATA: INTI TYPE I.																													
			INTI = TRUNC('5.65').																													
			WRITE  INTI.  输出结果: 5																													
6	FRAC(N):  传回数值 N 的小数部分																															
	实例:																															
			DATA: MYF TYPE F.																													
			MYF = FRAC('5.65').																													
			WRITE  MYF.  输出结果: 0.65																													
7	COS(A),SIN(A),TAN(A): 传回三角函数 cos A, sin A, tan A 的值, A 为弪度量																															
8	EXP(N): 传回 e^N 值																															
9	LOG(N): 传回 log eN 值																															
	LOG10(N): 传回 log N值																															
10	SQRT(N): 传回 N 的平方根值																															

3.2.7 日期与时间运算

1	日期数据的运算																								
	日期数据可以直接运算, 如加法与减法的运算																								
	实例:																								
			DATA: Mdate TYPE  d.																						
			Mdate  =  SY-DATUM.     "如传回 19971015																						
			Mdate  =  SY-DATUM.     "如传回 19971015																						
			Mdate+6(2)  =  '01'.    "Mdate 变成 19971001																						
			Mdate  =  Mdate  -  1.  "Mdate 变成 19970930																						
																									
2	时间数据的运算																								
	时间格式为 ‘hhmmss’, 如 ‘212030’  表 ’21:20:30’																								
	实例:																								
			DATA: HOURS  TYPE  I,																						
			      MINUTES  TYPE  I,																						
			      T2  TYPE  T  VALUE '200000',																						
			      T1  TYPE  T  VALUE  '183000'.																						
			      HOURS = ( T2 - T1 ) / 3600.  "计算有几小时																						
			      MINUTES = ( T2 - T1 ) / 60.  "计算几分钟																						

3.2.8 字符串数据处理

1	字符串移位																																									
	语法:   																																									
			SHIFT    [BY  PLACES]  [] [CIRCULAR]																																							
			[BY  PLACES]:表示移动的位数,没有此参数默认移动一位。																																							
			[] : 移动的方向,没有此参数默认向左移动。																																							
			           (1).LEFT, 字符串往左移 n 位																																							
			           (2).RIGHT, 字符串往右移 n 位																																							
			[CIRCULAR]: 字符串以环状方式移位																																							
	实例:																																									
			DATA  STRING(10) TYPE C  VALUE  'ABCDEFGHIJ'.																																							
			SHIFT  STRING.                        "得到 'BCDEFGHIJ'																																							
			SHIFT  STRING  BY  2  PLACES  RIGHT.  "得到 ABCDEFGH																																							
																																										
2	取代字符串内容																																									
	语法: 																																									
			REPLACE    WITH    INTO  																																							
			将字符串  中的  来取代																																							
	实例:																																									
			DATA:  STRING(10) TYPE C VALUE  'ABCDEFGHI',																																							
			       STR1(3) TYPE C VALUE  'DEF',																																							
			       STR2(3)  TYPE C VALUE  '123'.																																							
			REPLACE  STR1  WITH  STR2  INTO  STRING.																																							
			WRITE / STRING.          "得到 ABC123GHI																																							
																																										
3	大小写的转换																																									
	语法:  																																									
			TRANSLATE    TO  UPPER  CASE.  *转成大写																																							
			TRANSLATE    TO  LOWER  CASE.  *转成小写																																							
																																										
4	在字符串中寻找部分字符串																																									
	语法:  																																									
			SEARCH    FOR  																																							
			从字符串查询字符串																																							
			执行结果存至两个变数, SY-SUBRC 和 SY-FDPOS, 若找到则 SY-SUBRC 为 0 ,SY-FDPOS 存开始位迭(从0开始计)。																																							
			若找不到则 SY-SUBRC为 4, SY-FDPOS为 0。																																							
	实例:																																									
			DATA  STRING(10) TYPE C VALUE  'ABCDEFGHIJ'.																																							
			SEARCH STRING FOR 'CDE'.																																							
			SY-SUBRC值为:0																																							
			SY-FDPOS值为:2																																							
																																										
5	字符串长度																																									
	语法:																																									
			STRLEN()																																							
	实例:																																									
			DATA:INT TYPE I.																																							
			INT = STRLEN('XYZABC').  "得到 6																																							
			INT = STRLEN('ABC ').    "得到 3																																							
																																										
6	取部分字符串																																									
	语法:																																									
			[+][]																																							
	实例:																																									
			DATA  T(10) TYPE C VALUE  'ABCDEFGHI'.																																							
			WRITE  /  T+2(4).																																							
			执行结果:CDEF																																							
																																										
7	组合字符串的函数																																									
	语法:																																									
			CONCATENATE   INTO .																																							
	实例:																																									
			DATA:str1(4) type c,																																							
			     str2(4) type c,																																							
			     str3(8) type c.																																							
			str1 = '2007'.																																							
			str2 = '0902'.																					 																		
			CONCATENATE str1 str2 INTO str3.																																							
			WRITE:str3.																																							
			执行结果:20070902																																							
																																										
8	去掉字符串中间的空格																																									
	语法:																																									
			CONDENSE  NO-GAPS.																																							
	实例:																																									
			DATA: str0(10) TYPE c.																																							
			str0 = 'abc   sde'.																																							
			CONDENSE str0 NO-GAPS.																																							
			WRITE:/ str0.																																							
			执行结果:abcsde																																							

3.3 屏幕输入指令

在ABAP/4中要自屏幕输入变量的内容, 使用的命令是 PARAMETERS 及 SELECTION-OPTIONS:

  1. PARAMETER: 输入一个变量或字段内容
  2. SELECTION-OPTIONS: 使用条件筛选画面来输入数据

3.3.1 PARAMETERS 指令

语法:
PARAMETERS

[DEFAULT ] [LOWER CASE] [OBLIGATORY] [AS CHECKBOX] [RADIOBUTTON GROUP ]
实例:
PARAMETERS: NAME(8) TYPE C,
AGE TYPE I,
BIRTH TYPE D.
执行行結果:
image.png
LOWER CASE:ABAP/4预设是将字串输入值自动转换为大写, 加上此参数会将输入的资料转成小写。
OBLIGATORY:强制要求输入, 屏幕上会出現一个“ ?” , 使用者必须要输入才可。
AS CHECKBOX:输入 CHECKBOX的格式。
实例:
PARAMETERS: TAX AS CHECKBOX DEFAULT ‘X’,
NTD AS CHECKBOX.
执行結果:
image.png
RADIOBUTTON GROUP :输入 RADIO BUTTON GROUP 的方式。
实例:
PARAMETERS: BOY RADIOBUTTON GROUP SEX DEFAULT ‘X’,
GIRL RADIOBUTTON GROUP SEX.
执行結果:
image.png

3.3.2 SELECTION-OPTIONS

语法:
SELECT-OPTIONS FOR
[DEFAULT TO ]
[NO-EXTENSION]
[NO INTERVALS]
[LOWER CASE]
[OBLIGATORY]
实例: TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID. *将条件的输入值存放入 AIRLINE, 筛选对象为SPFLI中的CONNID栏位。
执行結果:
image.png

DEFAULT    TO  :设定开始结束范围输入默认值	
实例:	
		SELECT-OPTIONS  AIRLINE  FOR  SPFLI_WA-CONNID	
		DEFAULT  '2042'  TO  '4555'.	
NO-EXTENSION:设定不要多值输入的画面
NO INTERVALS:设定不要区间范围输入的画面
LOWER CASE:输入转换成大写	
OBLIGATORY:强制要求输入

3.3.3 配合 SELECT 命令

条件输入完后要将符合条件的数据筛选出来, 可配合使用 SELECT 指令

  1. 使用WHERE <条件式>
SELECT-OPTIONS  AIRLINE  FOR  SPFLI-CONNID.	
SELECT  *  FROM  SPFLI  WHERE  CONNID  IN  AIRLINE.	
WRITE: / SPFLI-CONNID,SPFLI-FROMCITY,SPFLI-TOCITY.	
ENDSELECT.	
  1. 使用CHECK参数
SELECT-OPTIONS  AIRLINE  FOR  SPFLI-CONNID.	
SELECT  *  FROM  SPFLI.	
CHECK  AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-FROMCITY,SPFLI-TOCITY.
ENDSELECT.
  1. 使用 IF … IN 叙述
SELECT-OPTIONS  AIRLINE  FOR  SPFLI-CONNID.
SELECT  *  FROM  SPFLI.
IF  SPFLI-CONNID  IN  AIRLINE
WRITE: / SPFLI-CONNID,SPFLI-FROMCITY,SPFLI-TOCITY.
ENDIF.
ENDSELECT.

3.4 屏幕输出指令

略…用处不大

3.5 内表

3.5.1 内表定义

  1. 自定义内表
TYPES: BEGIN OF LINE,                      *定义数组类型
       COL1 TYPE I,
       COL2 TYPE I,
       END OF LINE.
TYPES:ITABT TYPE LINE OCCURS 10.           *定义表类型
DATA: MYITAB TYPE ITABT WITH HEADER LINE.  *定义带工作区的内表,工作区名称与内表名称相同:MYITAB
  1. 使用DATA直接定义内表
*自带工作区的内表,工作区名称与内表名称相同:MYITAB
DATA: BEGIN OF MYITAB OCCURS 0,  
      COL1 TYPE I,
      COL2 TYPE I,
      END OF MYITAB.
  1. 参照数据库表结构定义内表,内表结构与所参照数据库表完全相同
DATA: ITAB LIKE SPFLI OCCURS 0 WITH HEADER LINE.(参数指定带工作区)
ITAB是定义的内表。
SPFLI是参照的数据库表。
  1. 定义内表结构包含数据表的所有字段
DATA: BEGIN OF ITAB OCCURS 0.(自带同名工作区)
INCLUDE STRUCTURE ZTABLE1.(DATA BEGIN结构中每个子句用句号结束)
DATA: NAME(20) TYPE C.(可将定义NAME和AGE字段的DATA合并为一个,中间用逗号分割)
DATA: AGE TYPE I.
DATA: END OF ITAB.
ITAB是定义的内表。
ZTABLE1是参照的数据库表。
内表ITAB结构除包含数据库表ZTABLE1的所有字段外还包括字段NAME和字段AGE。

3.5.2 APPEND指令

  1. 把内表工作区内容追加到内表中
DATA: BEGIN OF MYITAB OCCURS 0,
      COL1 TYPE I,
      COL2 TYPE I,
      END OF MYITAB.
MYITAB-COL1 = 11.
MYITAB-COL2 = 12.
APPEND MYITAB.
  1. 把相同结构数组变量内容追加到内表中(也可以把LINE看作ITAB不同名的工作区)
DATA: BEGIN  OF  LINE,
      COL1  TYPE  I,
      COL2  TYPE  I,
      END  OF  LINE.
DATA  ITAB  LIKE  LINE  OCCURS  10.
LINE-COL1 = 10.
LINE-COL2 = 20
APPEND  LINE  TO  ITAB.

3.5.3 COLLECT指令

使用COLLECT指令向内表添加数据时将有相同standard key(非数值字段)的数据的数值字段进行汇总。

*语法: 	
*		COLLECT  [  INTO]  	
DATA: BEGIN  OF  ITAB  OCCURS  3,
      COL1(3)  TYPE  C,
      COL2    TYPE  I,
      END  OF  ITAB.
ITAB-COL1 = ‘ABC’.  
ITAB –COL2 = 10.
COLLECT  ITAB.
ITAB-COL1 = ‘XYZ’.  
ITAB-COL2 = 20.
COLLECT  ITAB.
ITAB-COL1 = ‘ABC’.  
ITAB-COL2 = 30.
COLLECT  ITAB.    “汇总COL2 至 COL1=ABC 的元素上
LOOP  AT  ITAB.
     WRITE:  /  ITAB-COL1,ITAB-COL2.
ENDLOOP.
执行结果:
   ABC      40 
   XYZ      20

3.5.4 INSERT指令

  1. Insert Line 在指定的内表位置之前插入新数据
*语法
*INSERT  [ INTO] [INITIAL  LINE  INTO]    [INDEX  ] 
*INITIAL LINE INTO:与前面的[ INTO]参数不能同时使用,意义是插入空记录行到内表中
*INDEX  :插入在第idx条记录之前的位置

*实例
DATA:  BEGIN  OF  LINE,
       COL1  TYPE  I,
       COL2  TYPE  I,
       END  OF  LINE.
DATA  ITAB  LIKE  LINE  OCCURS  10.
DO  3  TIMES.
LINE-COL1 = SY-INDEX *10.
LINE-COL2 = SY-INDEX *20.
APPEND  LINE  INTO  ITAB.
ENDDO.
LINE-COL1=100.
LINE-COL2=200.
INSERT  LINE  INTO  ITAB  INDEX  2.  *插入在位置2之前
LOOP  AT  ITAB  INTO  LINE.
WRITE:  /  SY-TABIX,LINE-COL1,LINE-COL2. *SY-TABIX为Table位置
ENDLOOP. 
*执行结果:
* 1        10       20
* 2       100      200  
* 3        20       40
* 4        30       60
  1. 插入另一Internal Table元素
*语法:  
*INSERT  LINES  OF    [FROM  TO ]  INTO    INDEX 
*将中自的范围的数据插入至中, 位置在 之前。
*实例:
INSERT  LINES  OF  ITAB  INTO  JTAB  INDEX  3.
*将ITAB所有元素插入JTAB中, 位置在第三个元素之前。

3.5.5 读取内表数据

  1. 循环读取Internal Table元素数据
*LOOP  AT    [INTO ] [FROM  TO ] [WHERE ]
*          
*ENDLOOP.
*实例:
LOOP  AT  ITAB  INTO  LINE  WHERE  COL1 >100.
WRITE:  /  SY-TABIX,LINE-COL1.
ENDLOOP.
*仅读取 COL1 > 100 的元素。
  1. 读取Internal Table指定位置的元素
*语法:  
*READ  TABLE    [INTO ]  INDEX  
*自指定位置  读取元素数据。
*实例:
READ  TABLE  ITAB  INTO  LINE  INDEX  5.
*读取 ITAB的第5个元素数据, 放入 LINE的字段中。

  1. 根据字段内容寻找
*语法:   
READ  TABLE    INTO   COMPARING .
*实例:
ITAB-COL1 = 'ABC'.
READ  TABLE  ITAB  INTO  LINE COMPARING COL1.
*找出ITAB 中 COL1 字段内容是 ABC 的元素, 找到的值放入 LINE 中。
*若找到 SY-SUBRC传回0, 找不到则SY-SUBRC传回 4, 必须定义有工作区。

READ TABLE ITAB INTO DATA(LS_TAB) WITH KEY COL1 = 'ABC'.   "根据字段查数据

3.5.6 修改内表数据

  1. 更新内表数据
*语法: 
*MODIFY    [FROM ] [INDEX ] [TRANSPORTING ]
*[WHERE ] 
*TRANSPORTING   .. : 指定更新的字段名称。
*可分解为一下三种指令格式:
*(1) MODIFY   [FROM ] [INDEX ]	
*(2) MODIFY   [FROM ] [TRANSPORTING ] [WHERE ]	
*(3) LOOP AT ITAB. *没有参数确定修改哪条数据的情况MODIFY要在循环中使用,默认修改当前记录	
*    MODIFY    [FROM ].
*    ENDLOOP.
*实例:													
		LOOP AT ITAB.											
		LINE-COL1 = 4.											
		LINE-COL2 = 100.											
		MODIFY  ITAB  FROM  LINE.											
		ENDLOOP.											
		"将目前位置数据以LINE的内容更新											
*实例:
LINE-COL1 = 10.
MODIFY  ITAB  FROM  LINE  INDEX  3  TRANSPORTING  COL1.
*将第三个元素的COL1字段更新为 10

  1. 删除内表行

删除Internal Table 的数据

*语法:
DELETE    INDEX  
*实例:
DELETE ITAB  INDEX  4
*删除第四个数据
*加上删除条件:
DELETE   [FROM  TO ]  [WHERE 
*实例:
DELETE  ITAB  FROM  3  TO  10.
*删除第3至第10个数据 

你可能感兴趣的:(SAP,开发语言,SAP,ABAP)