一、ABAP程序执行流程
1、SAP NetWeaver 应用服务器结构原理
- 最底层是数据库层。只有SAP 自身管理和运行所需的程序和元数据没有保存在数据库里,而应用系统运行的几乎所有数据都存储在数据库中。
- ABAP 程序运行在应用服务层。ABAP 程序包括SAP 提供的标准程序和我们自己开发的程序。ABAP 程序从数据库读数据,处理数据,储存数据。
- 第三层是表示层 。这一层就是用户界面,用户可以通过它访问程序,输入数据,接收工作进程处理的结果。它的工作模式跟web浏览器类似,负责把应用服务器传来的界面布局数据转换成用户可 浏览的界面。
2、程序运行示例
- 系统在程序开始后,会把所有程序上下文读到应用服务器上。程序上下文包括:存储变量和复杂对象的内 存区,用户会话的屏幕信息,ABAP程序块等。上述的这些东西都存储在知识库中。
- 知识库(Repository), 它是SAP 系统中非常重要的组成部分,负责存储系统运行的基本数据,例如:程序库、数据字典、ABAP 对象等,被保存在数据库中。(JAVA程序是以文件的形式保存在应用服务器上的。)
二、ABAP工作台简介
1、知识库和对象浏览器
- 知识库包含了所有系统开发对象——程序、函数模块、数据库表定义等等。在知识库中既有SAP 提供的表,也有客户自定义的表。知识库在数据库中,并且通常都与客户端无关,这就意味着知识库可以被所有客户端访问。
- 除知识库外,数据库还包含应用和定制表,这些表是客户端相关的, 都有一个客户端列。
- 知识库信息系统/对象浏览器(se80/se81)。ABAP工作台包括了开发和编辑知识库对象所需的全部工具,这些工具覆盖了整个软件开发周期。
2、开发程序和组织开发
- 使用SE01、SE09、SE10 等事务码创建和管理请求号。按SAP 的开发组织原则,开发人员不能自己创建和释放请求,只能使用项目经理分配的请求。
- 示例和功能:ABAP文档与范例(事务码ABAPDOCU)、BAPI手册(事务码BAPI)、数据模型(事务码SD11)等。
- 用SE93来管理事务码
三、ABAP字典简介
1、数据模型
2、航班数据模型:se80/package/SAPBC_DATAMODEL
3、描述性元素
- 数据元素(Data element)是对字段的描述,包括语义和字段技术属性(域)
- 语义字段属性包括字段文档和标签,它们直接保存在数据元素定义中。
- 域(Domain)保存了例如数据类型、字段长度等技术信息。
4、透明表:数据库中的透明表就是保存了实际应用数据的表
5、结构(Structure)
- ABAP字典中的结构用来描述结构变量,而结构变量的数据都是从透明表中取得的
- 结构变量通常用来在程序中临时存储数据,或者在程序和屏幕之间作为字段传输的接口。
四、ABAP语言的基本元素
1、数据类型和数据对象
- 三大类数据类型:标准类型、本地类型、全局类型。
- type定义数据类型,data定义数据对象
- 参考现有的数据对象:DATA myvar2 LIKE myvar1
- 使用CONSTANTS 语句来定义常数
- 基本语句/关键字:move/=/clear/div/mod/strlen/computer/if else/case when/do/while/loop/
- MESSAGE:SAP 系统提供了一个消息测试的程序DEMO_MESSAGES,可以学习消息的各种类型和用法。
2、操作结构
- MOVE-CORRESPONDING
3、操作内表
- 内表是一个数据对象 ,在运行时可以用内表保存多个相同结构的数据。
- 操作语句:APPEND/INSERT/READ/MODIFY/DELETE/COLLECT
- 排序:如果使用STABLE 子句,则排序时排序字段具有相同值的记录的顺序在排序后仍保持不变
- 清除表的内容:REFRESH:清除整个内表的内容,释放部分内存,保留一些以备后续操作。CLEAR:对于没有表头的内表,跟REFRESH 一样,清除内表的内容。对于有表头的内表,则只初始化表头。FREE:清除整个内表的内容,释放所有内存。在程序里,当内表以后不再使用的时候可以使用FREE,这样能尽量多释放一些不用的内存。
- 表头:WITH HEADER LINE 子句可以在定义表的时候指定表头。新的SAP 标准建议舍弃表头。
五、数据获取
1、读数据库表
- 在SELECT 语句中使用CLIENT SPECIFIED 子句(在FROM 后面加上CLIENT SPECIFIED)可以关闭自动客户端选定,从选择条件里指定访问某个 客户端的数据。
- 如果目标结构的数据结构与查询字段的顺序不一致, 或者使用* 这样的通配符来指定查询字段,就需要用CORRESPONDING FIELDS OF 子句,它会自动在源字段和目标字段之间找名称相同的项自动对应填入。建议使用这种方法,因为:使用它就可以不需要目标结构的前面字段与查询字段一致,将来增加目标结构的字段时不需要修改查询语句。
- 在SELECT 循环后会产生一些返回值,sy-subrc 为0 说明至少查询到一条记录,而sy-dbcnt 则记录了一共查询到多少条记录。
2、权限检查
- 关键字:AUTHORITY-CHECK
- 使用AUTHORITY-CHECK 语句来执行权限检查,检查结果保存在sy-subrc 字段里,0 表示检查通过,执行相应功能,非0 表示检查未通过,给用户一个权限不足的提示。
- 可以使用事务码SU20 创建权限字段,用事务码SU21 创建对象类和权限对象,如果包含了ACTVT 字段,则还要维护它的可选值。
- 系统的TACT 表保存了ACTVT 字段所有可能的值, TACTZ 表则保存了在各个权限对象中允许的值。
六、程序分析工具
1、运行时分析工具
- 在对象浏览器中用程序的右键菜单,找“执行Execute -运行时分析Runtime Analysis”打开运行时分析工具。
2、代码检查员
- 代码检查员是从纯代码角度检查性能、安全和典型的语义错误
七、在ABAP中使用子程序
- 子程序的定义:以FORM 开始,以ENDFORM 结束
- 值调用:在USING 节用VALUE(f1) 的形式,值和结果调用:在CHANGING 节用VALUE(f2) 的形式,引用调用:在CHANGING 节用f3 的形式,不要VALUE
- 调用:调用子程序时,实际参数按照USING 和CHANGING 的定义依次传递给形式参数,传递顺序与参数名称无关,只按调用顺序
- 全局对象和本地对象遵循“阴影规则”
- 为了区分全局对象和本地对象,建议使用不同的前缀命名对象,比如全局用g_ 开头,参数用f_ 开头,本地用l_ 开头。
- 通常使用PERFORM 语句调用子程序。
八、ABAP事件简介
1、ABAP事件
- 基本事件的触发顺序
- 所有WRITE 的输出先保存在清单缓存里,只有在事件 START-OF-SELECTION 执行后才会显示清单缓存
九、用户会话
1、列表
- 表头:初始维护表头的时候,可以先激活程序,然后运行并显示列表,通过选择菜单的“系统-清单-清单表头”来维护表头,下次运行程序的时候,这个表头就会自动 带出来。
- 如果需要修改已维护过的表头(重复维护),就不必再次开始程序生成列表了。只需要把程序读到ABAP 编辑器中,然后通过菜单的“转到-文本元素-清单标题”来修改表头。
- 在ABAP 编辑器中,可以用菜单“转到-翻译”来翻译程序的文本元素。
- 在程序里用TEXT-xxx 标记文本符号,运行时系统就会根据当前登录语言插入相关的翻译。
2、选择屏幕
- 可以把当前输入保存为变式(variant),为以后重复利用。
3、屏幕
- 调用屏幕:CALL SCREEN
- 应用按钮:如果用户选择了一个按钮,运行时系统就把指定的功能码拷贝到一个专门的屏幕字段,这个字段一般叫做ok_code。
- 在屏幕绘制器中需要添加按钮,指定名称、显示文字和功能码,同时在屏幕的元素清单中总会有一个默认的OK 类型的命令字段,一般我们用OK_CODE 做为它的名字。而在程序中要对应定义一个sy-ucomm 类型的变量ok_code(DATA ok_code TYPE sy-ucomm)。这样在触发按钮的时候,系统就会自动把屏幕元素OK_CODE 的值传给程序变量ok_code。
- 功能码传输异常的解决办法:a、在字段传输给屏幕之前的PBO 模块中初始化变量ok_code。b、在PAI 模块中添加一个附加变量,用它保存ok_code 的值,并且立即清除ok_code 的值。
4、用户接口
- 在屏幕上应用GUI title 和GUI status 需要相应语句, SET TITLEBAR 和SET PF-STATUS
5、ABAP Web Dynpro 程序
- 一个与客户端和各自协议无关的新编程模型。
- 支持使用Web Services。从任何应用上都可以以标准、舒适的方法访问各种系统的业务功能。
十、可重用组件
1、使用功能模块(function)
- 功能模块就是存储在SAP 功能库中的完成一定功能的子程序。每个功能模块都包含一定的输入和输出接 口,使用功能模块的主要意图就是重用,也就是说,它们属于可重用组件。
- 功能模块的接口:功能模块的接口包括import、export、changing 参数和exception。
- 使用ABAP 语句CALL FUNCTION 来调用功能模块,功能模块的名字必须大写,并且用单引号括起来。
2、使用方法
- 定义引用变量:DATA reference_name TYPE REF TO class_name.
- 创建实例:CREATE OBJECT reference_name.
- 使用CREATE OBJECT 时可能需要用一个特殊的方法CONSTRUCTOR 来传入一些数据,生成实例的初始值。
- 调用:CALL METHOD reference_name->method_name.
- 创建实例时,隐含调用了类的构造函数(类的特殊方法CONSTRUCTOR),它的作用是用输入参数填写创建实例的相应字段,因此,在使用CREATE OBJECT 创建实例时必须提供构造器所要求的必要数据。
//3、Grid控件
3、使用BAPIs
- 事务码:BAPI
- BAPI 不但能用ABAP 调用,也可以用其他外部的编程语言调用。
- 找到所需的BAPI 后,可以在右面看它的作用,还可以通过Function Builder 查看它的功能模块代码。
十一、调整SAP 标准程序
- 术语:original, copy, correction, repair, customizing, modification,enhancement