记录实习培训的学习记录
SAP是一套ERP系统,SAP( Systems Applications and Products in Data Processing) 是一种企业管理软件,SAP使用的程序语言就是用ABAP,ABAP是种先进经营应用编程语言(Advanced Business Application ProgrammingLanguage)。ABAP/4是SAP自己的第四代编程语言。从4.0版本开始,它简称为ABAP;是经技术改进的编程语言,主要添加了新特性以成为面向对象的语言。ABAP/4支持封装性和继承性,封装性是面向对象的基础,而继承性是建立在封装性基础上的重要特性。它适合生成报表,支持对数据库的操作,如:Sqlserver,Oracle,DB2等主流数据库系统。
常用的T-Code:
se21——开发类的建立
se80——ABAP工作台
se38——程序建立过程
se11——dictionary 可以查看到Tcode的底表和相关自建表
se37——function 封装相关的功能信息,达到代码功能的复用;RFC接口可 以和第三方平台进行数据交互
请求传送 se01 se09 se10
重要编辑功能键
在SE38 屏右下角,点“optins ”图标,然后选“代码完成”,在右侧
窗最下面一行选中“建议文本中的非关键字”,一路确认。
快速调整字体大小 Ctrl + 鼠标滚轮
剪切一行 Ctrl + Shift + X
删除一行 Ctrl + Shift + L
复制一行 Ctrl + Shift + T
转成小写 Ctrl + L
转成大写 Ctrl + U
大小写相互转换 Ctrl + K
取消 Ctrl + Z
重做 Ctrl + Y
原地复制一行 Ctrl + D
常用预定义数据类型:
1.默认的定义数据类型是CHAR。
2.取值的时候C型默认从左取,N型从右取,超过定义长度则截断。
3.C类型,可以赋值数值,也可以赋值字符,还可以混合,不过取值时如果是数值类
型靠右取值。
4.日期和时间类型的变量可进行加减乘除运算。
5.P类型.小数点要使用DECIMAL声明
自定义数据类型:
定义数据类型——TYPES
• 在程序中用types声明局部数据类型
• 语法格式与变量类似
• 用Types定义的类型在程序中用于声明常量或者变量
• Types定义的是类型,不是变量,所以不能直接赋值
• ABAP数据类型可以是预定义数据类型,可以是数据字典里的全局数据类型,或者用户在程序中自定义的数据类型。
eg:
变量
变量定义包含name, length, type等,语法如下:
DATA < name> [< length>] type < type>[ value < value>] [ decimal < decimals>]
其中: [] 里的内容表示可选项。<>表示名称
< name>: 变量名称, 最长30个字符, 不可含有 + . , : ( ) 等字符
< length>长度,要用圆括号括起来 如 LINE(20) TYPE C.
< type>:数据类型
< value>: 初始值
< decimals>: 小数位
变量定义也可以用关键字LIKE
DATA < name> [< length>] like< object>|< type>[ value
< value>] [ decimal < decimals>]
• TYPE 与LIKE的区别:
LIKE 用在已有值的数据类型, 如系统变量, 而TYPE则是用在
定义数据类型。
常量
常量定义使用CONSTANTS
CONSTANTS<常量名>[<长度> ] TYPE <数据类型> VALUE <默认值>
• 常量值一旦被定义,即被长期保存在内存,其值无法改变
系统变量
以下是常用的系统变量:
SY-SUBRC : 系统执行某指令后,表示执行成功与否的变量,‘0’ 表示成功
SY-UNAME: 当前使用者登入SAP的USERNAME;
SY-DATUM: 当前系统日期;
SY-UZEIT: 当前系统时间;
SY-TCODE: 当前执行程序的Transaction code
SY-INDEX : 当前LOOP循环过的次数
SY-TABIX: 当前处理的是internal table 的第几笔
SY-MANDT: CLIENT(客户端编号) NUMBER
SY-VLINE: 画竖线
SY-ULINE: 画横线
结构体
定义:
• 有结构的变量
• 程序中用DATA定义的局部变量
DATA: BEGIN OF < name>
< field1>……
< field2>……
END OF< name>.
赋值:
• 可对结构体直接赋值
• 相同结构体之间可以使用等号来实现数据的复制
• WRITE Structure Name可输出所有字段,或使用< Structure>-< field name>输出指定字段
• 相同结构体之间使用Move……To……进行赋值;
有差异的结构体,可使用MOVE-CORRESSPONDING匹配及赋值相同的字段
继承:
• 参考已存在的结构体创建一个属性相同的新结构体
• 可在新结构体中增加字段
• 定义语句:INCLUDE STRUCTURE
基本输出:
• 使用Write语句进行数据对象的输出
• 可在输出时控制对象的长度、输出位置及格式等
属性的控制
• 可同时输出多个数据对象
• 不同对象可通过反斜杠“/”换行输出
Write AT [/] [< pos>] [(< len>)] 资料项
/ : 换行
pos : 屏幕X轴坐标
(len): 显示输出的长度
• 产生 n 个空白行
SKIP [< n>]
颜色输出:
语法:
FORMAT [COLOR {{{color [ON]}|OFF}|{= col}}] "使用颜色
[INTENSIFIED [{ON|OFF}|{= flag}]] "背景颜色
[INVERSE [{ON|OFF}|{= flag}]] "字体颜色
练习代码:
DATA col TYPE i VALUE 0.
DO 8 TIMES.
col = sy-index - 1.
FORMAT COLOR = col.
WRITE: / col COLOR OFF,
‘INTENSIFIED ON’ INTENSIFIED ON,
‘INTENSIFIED OFF’ INTENSIFIED OFF,
‘INVERSE ON’ INVERSE ON.
ENDDO.
赋值
1.MOVE < F1> TO < F2>
将F1的值存至变量 F2 中,F1与F2可以是不同类
型的变量,但有一定限制
2.WRITE < value> TO < field>.带有格式的赋值
•这里的WRITE用于赋值,不是用于输出
偏移
在源字段中取偏移量赋值给目标变量:
MOVE [+<偏移量>][(<取数位>)] TO [+<偏移量>][(<取数位>)
WRITE [+<偏移量>][(<取数位>)] TO [+<偏移量>][(<取数位>)
[+<偏移量>][(<取数位>) = + [+<偏移量>][(<取数位>)]
用于结构体的赋值,将Strings1中的field组件的数据复制至String2中, 仅复制相同名称的字段:
MOVE –CORRESPONDING < Strings1> TO < String2>.
指针对象,通过语句FIELD-SYMBOLS加上将括号“<>”来定义。
FIELD-SYMBOLS < fs>.
ASSIGN < value> TO < field>.
• 可以不指定参考类型,用语句ASSIGN来分配给它变量.
• < FS>并不是变量,存放的是变量的地址,而非变量本身。
• 如果修改了field symbol的值,则相应的变量的值也随之更改。
类型转换
• 在不同类型的数据对象之间赋值,会自动进行类型的转换;
• 转换过程遵照固定的规则,如C类型数据赋值给N类型,只有数字字符被传递,其他忽略;
• C不能直接赋值给I,需要C→N→I;
• 可以使用MOVE TO或WRITE TO语句。
算数运算符
算术运算符号:
*乘
/ 除 + 加 - 减
DIV 整数除法
MOD 余数除法
• 运算符与变量之间必须有空格。
比较逻辑运算符
比较运算符:
= 或 EQ : 等于
<> 或 >< 或 NE: 不等于
< 或 LT: 小于
<= 或 LE: 小于等于
GT 或 >: 大于
= 或 GE : 大于等于
逻辑运算符:
AND: 且
OR : 或
NOT : 非
字符串移位
将字符串整体或者子串进行位移:
SHIFT < c> [BY < n> PLACES] [< modes>]
< modes> :
(1).空白, 字符串往左移一位
(2).LEFT, 字符串往左移 n 位
(3).RIGHT, 字符串往右移 n 位
指定字符串c从子串c1进行位移:
SHIFT c UP TO c1
执行结果返回系统参数SY-SUBRC
执行成功,返回0,不匹配,返回4
移除字符串c左边/右边的子字符串c1:
SHIFT c LEFT/RIGHT DELETING
LEADING/ TRAILING c1
执行结果返回系统参数SY-SUBRC
执行成功,返回0,不匹配,返回4
替换字符串
REPLACE < string1> WITH < string2> INTO < c>
将字符串 中的 < string1> 以 < string2> 来取代
字符串转换
TRANSLATE < c> TO UPPER/LOWER CASE.
将全部字符转成大写/小写
寻找字符串
从字符串f/表itab中搜索字符串g
SEARCH f/itabFOR g
…ABBREVIATED
从指定字符串中/内表中按顺序/逐行搜索相匹配字符串,
搜索单词第一个需与字符串中包含的单词第一个匹配
…STARTING AT n1/line1
从字符串n1个字符/内表中具体某行开始搜索匹配字符串
…ENDING AT n2/line2
搜索到字符串第n2个字符止/最大范围到内表中具体某行
…AND MARK:
从指定字符串/内表中模糊搜索相匹配字符串
• 会回存至两个变数,SY-SUBRC 和 SY-FDPOS:
若找到则 SY-SUBRC 为 0,SY-FDPOS 存开始位置
若找不到则 SY-SUBRC为 4, SY-FDPOS为 0
• 对于一些特殊符号,如“ * ”、“@”、“.”等,需要在其两
边加上句号作为修饰。如某字符串为"AAABBB",查找符号""
的位置
• 若内表有多行,那么字符串查找位置默认为从某行数据第一
位开始
字符串的合并
将多个字符串合并成一个字符串:
CONCATENATE f1…fn INTO g [SEPARATED BY h]
SPARATED BY表示在连接字符串中加入分隔符号
• SPARATED BY表示在连接字符串中加入分隔符号
字符串的拆分
将一个字符串拆分并赋值给多个变量:
SPLIT f AT g INTO h1…hn
将一个字符串拆分并分配给一个内表:
SPLIT f AT g INTO TABLE itab
去除字符串的空格
去除字符串的空格:
CONDENSE c
•字符串前置空格被删除
•NO-GAPS——前置空格以及中间所有空格被删除
条件语句
IF语句:
IF < condition1>.
< statement block>.
ELSEIF < condition2>.
< statement block>.
ELSE.
< statement block>
ENDIF.
CASE语句:
CASE < f>.
WHEN < f1>.
< statement block>.
WHEN < f2>.
< statement block>.
WHEN …
WHEN OTHERS.
< statement block>.
ENDCASE.
循环语句
(计数循环)使用DO指定循环次数:
DO [< n> TIMES]
< statement block>
ENDDO.
• n:可以是数字或者变量,如果n是0或者负数,系统
不执行该循环
• TIMES:循环次数
•使用DO语句时要避免死循环,如果不使用TIMES选项,则在语句块中至少包含一个EXIT、STOP语句,以使系统能退出循环
•系统变量SY-INDEX记录循环的次数
• DO语句内部还可以实现多层嵌套,为了保证程序可读性,建议嵌套最多不要超过6层
(条件循环)使用WHILE指定循环条件:
WHILE < condition>
< statement block>
ENDWHILE.
满足条件< condition>时候执行,不满足,退出
LOOP循环常用于实现内表数据的循环读取和操作
LOOP AT ITAB.
WRITE: ITAB.
ENDLOOP.
内表是仅在程序运行过程中存在的表,内表用来存放多条相同结构的数据,可以对其插入,修改或者删除行操作。
概念
内表是内存中建立的一个临时表,你可以在程序运行时对表中的数据进行,插入,修改,删除等操作,程序跑完了,就会被释放
分类
1.Standard:标准表
2.Sorted:排序表
3.Hashed:哈希表,一般用的比较少
工作区:内表按照行进行访问,必须使用某个区域作为与表格互相传输的接口。
• 从内表中读取数据时,已定址的行内容覆盖工作区的内容。讲数据写入内表时,必须首先在工作区中输入数据。
定义
TYPES自定义的表类型来定义内表
TYPES < t> TYPE < type> OCCURS < n>
TYPES < T> TYPE TABLE OF < type>
DATA直接定义内表:
DATA: BEGIN OF OCCURS
……
END OF itab.
参照内表或数据库表结构定义内表,内表结构与所参照数据库表完全相同:
DATA < f> LIKE <内表或数据库表> OCCURS n WITH HEADER LINE
• WITH参数指定是否带工作区
使用INCLUDE STRUCTURE包括已存在的结构体的所有字段
获取
通过DESCRIBE获得内表的行
DESCRIBE TABLE < itab> LINES n
增加数据
INSERT可以按内表的具体字段向表中插入一行
或者多行数据:
INSERT [wa INTO|INITIAL LINE INTO] itab
[INDEX idx].
INSERT [wa INTO|INITIAL LINE INTO] TABLE
itab.
INSERT LINES OF itab1 [FROM idx] [TO idx2]
INTO itab2 [INDEX idx3].
增加内表
要增加内表,既可逐行添加数据,也可复制另一个表格的内容。要逐行填充内表,
可以使用APPEND、 COLLECT或 INSERT 语句。
更改数据
MODIFY(直接修改内表数据)按内表位置或者具体内表字段值相等条件修改内表数据:
MODIFY itab [FROM wa] [INDEX idx]
[TRANSPORTING f1…fn] WHERE cond.
删除数据
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.
删除重复数据,执行此条件前必须先排序
读取数据
READ依据具体行数或字段值等条件读取某一内表的数据:
READ TABLE itab FROM wa.
READ TABLE itab WITH [TABLE] KEY
k1=v1…kn=vn [BINARY SEARCH].
READ TABLE itab INDEX i.
• 使用READ操作的表必须得HEADER LINE作为查找出的数据存储窗口
• BINARY SEARCH可以提高内表数据查找的速度,但是使用前必须先对内表进行排序
LOOP循环常用于实现内表数据的循环读取
和操作
LOOP AT ITAB.
WRITE: ITAB.
ENDLOOP.
排序与汇总
对内表进行排序,可以指定具体的排序字段、
排序方式(升/降),语法如下:
SORT itab [BY f2 f2…fn]
[ASCENDING/DESCENDING]
• < f2>:为指定的字段
• 递减(DESCENDING)和递增(ASCENDING)
将内表中相同的字段合并,若有类型为I的字段,则将其值加总:
COLLECT [wa INTO] itab.
• < f2>:为指定的字段
• 递减(DESCENDING)和递增(ASCENDING)
SQL( Structured Query Language )
• 结构化查询语言
• 用于定义、创建、读取数据库表数据
Native SQL(本地SQL)
• 每种关系型数据库都有其对应的 SQL,是数据库相关的
• 不同的SAP 系统可能使用各种不同的数据库,使用本地SQL 的 ABAP 程序无法适应所
有的 SAP 系统
• 可直接对数据库表进行修改删除等,有一定安全风险
• 能实现一些OpenSQL无法实现的功能
Open SQL(开放SQL)
• SAP 为 ABAP 定义的数据库无关的SQL 标准
• 在ABAP程序运行时由系统动态的转化成当前数据库使用的本地SQL
• 在编写程序时不需要考虑SAP 系统使用的数据库差异
• 对数据库主要操作语法包括:
SELECT\UPDATE\INSERT\DELETE\MODIFY
• 执行状态通过系统变量SY-SUBRC表现
等于0,表示执行成功
不为0,表示执行失败
使用OpenSQL注意事项:
SELECT语法(读取数据)
SELECT语法结构:
SELECT < result> FROM < dbtab>
INTO < target>
WHERE < condition>
GROUP BY < fields> ORDER BY < fields>
其中各关键字的属性描述如下:
SELECT < result>:具体的查询字段。
SELECT SINGLE:定义单行查询。
FROM < dbtab>:所查询的透明表。
INTO < target>:查询结果赋值对象,赋值到具体
表或结构体。
INTO (< f1>…< fn>):将查询结果赋值到具体字段。
INTO CORRESPONDING FILES OF < itab>:将查询
结果按字段匹配赋值给具体的内表或者结构体。
WHERE < condition>:查询条件。
GROUP BY < fileds>:分组查询条件。
ORDER BY < fields>:排序条件。
• WHERE中多个字段为查询条件时:表名和字段用“~”符号连接
多个表数据连接查询,可以用两种方法实现表连接:
常用标准函数
• COUNT():统计查询总数
• SUM():统计表中某个数值字段的总和
• AVG():统计表中某个数值字段的平均值
• MAX():统计表中某个字段的最大值
• MIN() :统计表中某个字段的最小值。
UPDATE语法(更新数据)
UPDATE实现对数据的更新操作,语法如下:
UPDATE < dbtab> SET f1…fn (WHERE < condition>).
UPDATE < dbtab> FROM TABLE < itab> (WHERE < condition>).
UPDATE < dbtab> FROM < wa>.
INSERT语法(新增数据)
INSERT语句用于对数据的新增操作,语法如下:
INSERT < dbtab> FROM TABLE < itab>.
INSERT < dbtab> FROM < wa>.
DELETE语法(删除数据)
DELETE 语句用于删除表中的数据,语法如下:
DELETE FROM < dbtab> WHERE < condition>.
DELETE FROM < dbtab>.
DELETE < dbtab> FROM TABLE < itab>.
MODIFY语法(修改数据)
MODIFY操作是用于修改数据库中的数据:
MODIFY < dbtab> FROM < wa>.
MODIFY < dbtab> FROM TABLE < itab>.
•如表中不存在符合条件的数据时会添加新数据
•MODIFY拥有 INSERT 和 UPDATE的操作动作
•通过MODIFY修改的数据效率比较低下
使用Natie SQL:
• Open SQL存在局限
• 如Oracle字段名是区分大小写的,而在Oracle中是将字段都转为大写或小写以固定查询
• Open SQL无法实现此,需要使用NativeSQL
• Native SQL不能直接向内表直接传递所有值,需要通过调用SubRouting方式进行APPEND操作
•查询字段和条件字段都要以逗号分开
•查询条件前需要加上冒号
•SQL语句结尾不需要句号
在R/3 4.6C之前ALV全称为ABAP List Viewer,在其后的版本中,已经正式更名为SAP List Viewer。ALV是SAP系统中心的列表标准,可以在ABAP程序中进行报表输出。除去列表的显示和少量交互功能之外,ALV还提供给系统用户多种其它丰富的交互功能。
1.Alv分类:salv和ooalv。
Salv就是我们正常使用的调用function的alv。Ooalv是面对对象的alv,在屏幕对象上画alv。
Ooalv参考网址:https://www.cnblogs.com/jiangzhengjun/p/4291373.html
2.Alv事件
Alv事件可以笼统的分为两种,一种是提供回调函数的事件,例如菜单栏的设置,表头的设置,用户点击事件的设置,这些都是提供了导入参数的。另一种是通过it_events传参进去。
2.1回调函数的事件
i_callback_pf_status_set菜单栏,最简单的。前面讲过se41复制和slvc(应该是叫这个错误了提醒我改)复制标准的菜单栏到目标程序。细节不讲了。
i_callback_top_of_page表头,测试放在下面了,这个有点问题。无法实现。
i_callback_user_command用户键盘事件。最经常用的,几乎所有alv展示后的处理都可以通过这个回调函数完成。
2.2 It_events事件
结构如下图所示,内表,包含两个字段name和form。系统预存了17个
这里包括了前文提到的三个回调函数,name分别是USER_COMMAND,TOP_OF_PAGE,PF_STATUS_SET,但是事件的form为空。
在参考资料之后,可以认为,it_events里面预存的事件name,可以认为是对应的form执行的时间。
17种event的name放在下面:CALLER_EXIT,USER_COMMAND,TOP_OF_PAGE,TOP_OF_COVERPAGE,END_OF_COVERPAGE,FOREIGN_TOP_OF_PAGE,FOREIGN_END_OF_PAGE,PF_STATUS_SET,LIST_MODIFY,TOP_OF_LIST,END_OF_PAGE,END_OF_LIST,AFTER_LINE_OUTPUT,BEFORE_LINE_OUTPUT,REPREP_SEL_MODIFY,SUBTOTAL_TEXT,GROUPLEVEL_CHANGE。
3.事件的使用
3.1菜单栏
3.2用户键盘事件
3.3表头(测试部分失败)
3.4新建event
3.5建立event
4.开发ALV的基本流程
1.定义一些数据结构,主要是用于存数和显示的内表和alv的一些参数变量。
2.制作屏幕(界面).
3.获取屏幕输入的数据,用该数据从数据库中获取所需的数据放到前面定义的内表中。
4.调用ALV生成函数。其中还要为ALV定义表结构,布局等信息,主要是layout和fieldcat。其中定义报表字段fieldcat的时候可以用子程序便捷的赋值。
4.1 声明变量
4.2 定义内表
4.3 读取数据
4.4 ALV格式控制
4.5 定义事件
4.6 调用ALV
4.7 用户事件