ABAP 程序运行和屏幕小结
Select语句的使用 关键字into后可以加 structure(结构体), internal table(内表) 和 field list(字段列表) Authority 权限 程序员可以根据权限对象创建权限实例 而basic 负责将权限分配给其他用户 At selection-screen 在选择屏幕中输入值后,点击屏幕左上角的运行按钮 或 按回车键时,可以对输入的数据进行有效性校验. 重点: at selection-screen 最大的作用是检查当前用户是否具有对输入数据进行操作的权限 程序中 第一个事件块是 load-of-program 也可以附加使用initialization 但是不能只 程序中事件的启动顺序 1. Load-of-program 2. (Initialization) (optional event block 可选事件块) 3. At selection-screen 4. Start-of-selection (default event block 缺省事件块) 5. At line-selection 注意:当程序中没有指定任何事件块时, 系统默认为 start-of-selection事件 用户双击basic list screen的一条数据时,系统从隐藏域中查找相应的数据. 并将数据回传给全局变量中去. 当双击一条数据的时候 sy-lsind + 1 当没找到at line-selection事件块时,sy-lsind又自动减1 Selection screen选择屏幕 选择屏幕的属性 1. Input help 输入帮助Possible entries help 可输入值帮助 2. Value entry 定制字段可选择范围 3. Type checks Multilingual capacity 多语言 4. Variants 变式 变式的创建 1. 将选择屏幕中的输入域填写完毕 2. 将其保存为变式 1) 输入变式名 2) 输入变式描述 3) 为变式设定相关属性 注意:一定要将屏幕中的值填写完毕以后再保存变式 变式的特点 1. 可以简化输入 2. 可以用于后台自动运行程序, 而不需要用户自己输入值 重点: variant 变式 是 client-specifc client依赖的. Seletion screen 选择屏幕 定义选择屏幕上的字段有两种方式 1. single value input单值输入选择屏幕, 使用parameters 关键字 定义 . 2. multiple value input 多值输入选择屏幕,使用 select-options 关键字 定义 parameters功能: 用户可以通过选择屏幕输入查询条件对数据库进行访问. 使用parameters 定义选择屏幕的两点限制 1. 变量名的字数长度不可以超过8个字符. 2. 给定义的时候赋值 需要 用关键字 default 而不能用 value 定义语法: parameters <变量名> type <类型>. 注:如果使用data element定义变量,则该变量也具有语义意义. Selction screen 的执行顺序: 1. 程序启动时,触发load-of-program 事件. 2. 显示层弹出屏幕 3. 用户输入值并确定屏幕后,触发start-of-selection事件 4. 输入的值被传到内存中,进一步处理 执行顺序实例: Parameters pa_carr type spfli-carrid. Load-of-program. Pa_carr = ‘LH’. Start-of-selection. Pa_carr=’DL’. Write pa_carr. 屏幕弹出时, 输入域中为 LH , 确定屏幕后, 显示值为 DL. Value Sets(SELECT-OPTIONS) 多值输入屏幕 Parameters 与 select-options 的区别 1. parameters 定义的变量是不可分解的变量 2. select-options ,表面上定义的是一个字段, 实际上定义的是字段取值范围的内表 select-options功能: 根据用户输入的 value range 取值范围 到数据库中查找符合范围的数据 Select-options 定义的内表 重要: Select-options 内表具有表头行 该内表有4个字段 1. Sign 符号标示 取值: I (included 被包含) , E (excluded 不被包含). 2. Option 操作 取值: BT(between 在范围之间) , EQ(equal 等于) 3. Low 最小值 取值: 用户输入的最小值 4. High 最大值 取值: 用户输入的最大值 当屏幕弹出后, 点击mulitple selction按钮 可以加入其他选择范围 范围包括 1. single value include 单值包含 2. range inculde 范围包含 3. single value exclude 单值不包含 4. range exculde 范围不包含 select-options 运行原理 1. 程序运行后, select-options创建的内表中没有数据 2. 屏幕弹出后,用户输入数据 3. 此时,系统将字段范围保存到该内表中 4. 用户确定屏幕后,系统将内表中的信息翻译成对应的native SQL 5. 数据库将符合用户输入范围的数据返回给用户 注意:使用loop at 循环一个带有head line 的内表, 不需要加[]. Selction screen events 选择屏幕事件 事件启动流程 1. 程序启动后,触发load-of-program或initialization 事件对变量进行初始化 2. 如果有parameters 或 select-options屏幕变量,则会弹出选择屏幕 3. 用户输入值后,点击 回车 或 运行(F8)(有区别,见下文) 完成屏幕输入 4. 如果程序中有 at selection-screen 事件的话, 这时它就会被触发,它的功能是 对用户输入的值进行校验, 而最主要的功能是,判断用户是否具有对该数据进行操作的权限. 5. 当校验成功后, start-of-selection 别触发.并显示Basic list screen 6. 双击其中一条数据, 则会触发 at line-selection…….. 重点: 回车 和 运行(F8)的区别 1. 回车: 仅仅具有校验功能, 无论校验成功与否, 程序都不会往下执行 2. 运行(F8): 校验成功后 程序才能往下运行, 如果校验失败,程序无法继续运行 注意: at selection screen 的主要功能 是authority check 权限校验 , 如果校验失败,则应该生成一个E (error)类型的message 以通知用户校验失败. User Dialog screen 用户会话屏幕(或称为Dynpro Screen ,standard screen) Dynpro screen 功能: 用户可以通过屏幕录入或修改数据 Dynpro screen 参数 1. Attributes屏幕属性: screen number short text next screen screen type 2. Layout 屏幕布局: 屏幕属性的摆放顺序 3. Element list 元素列表: 所有元素的集合 4. Flow control 控制流程: flow logic 流逻辑(dynpro screen PBO 和 PAI事件中所调用的module模块). Dypro screen Attributes属性 1. Screen number: 屏幕编号 3位 2. short text : 屏幕描述 3. Nex screen: 下一屏幕编号, 当该屏幕结束后所执行的屏幕, 编号为0时, 程序将会在调用屏幕的语句后继续运行. 4. Screen type :屏幕类型 normal一般屏幕,subscreen子屏幕,modal dialog box 模态窗口 Dypro screen 运行流程 1. 使用call screen 100(屏幕编码), 调用一个屏幕 2. 屏幕弹出之前, 启动PBO事件 3. 用户在屏幕输入值并确定后,输入的值会被传入到内存变量当中 4. 当屏幕关闭时,PAI事件触发 5. PAI结束以后, 程序将会根据该屏幕的next screen 跳到下一屏幕 6. 当next screen 为本屏幕的编号, 则需要使用自定义按钮退出屏幕,否则会出现屏幕死循环现象. PBO module: PBO 事件对应的模块 PAI module. PAI 事件对应的模块 Next screen 的配置 1. 静态配置: 通过dynpro screen 自身属性配置next screen 2. 动态配置: 在程序的PAI事件中 使用关键字 SET screen 200(下一屏幕编号)定义下一屏幕, 当PAI运行到该语句时, 该屏幕的静态配置 则会被 动态配置所覆盖 使用T CODE 运行屏幕 功能: 使用T CODE可以使ABAP以外的配置人员 在work bench 以外运行屏幕. Dynrpo screen 在程序中可以使用的位置 1. 触发Start-of-selection,生成basic list screen 2. 双击单条数据 3. 触发 at line-selection 事件 4. 在这个事件中 call screen 100. 5. 弹出dynpro screen, 用户输入相关值 6. 点击 save 保存到数据库 ,点击back 返回到basic list screen Screen painter 屏幕绘制器 功能:专门绘制 ABAP屏幕的程序,可以绘制dynpro screen 注意:必须在安装GUI的时候选择并安装. 可以通过screen 屏幕上的 LAYOUT 键 ,可以进入 screen painter ,通过Graphical layout editor 布局编辑器 对布局进行编辑 Dynpro Screen 具体操作 1. 根据spfli-carrid字段建立paramters选择屏幕 2. 根据 spfli 建立结构体变量wa_spfli 3. 在start-of-selection事件中 打印Basic list screen屏幕 4. 在 at line-selection 事件中 call screen 100 5. 建立屏幕100 , 填写描述 和next screen 6. 通过 screen painter 编辑screen 100的布局 7. 通过 字典库结构体sdyn_conn 在屏幕上批量加入字段 8. 创建两个 push button,名字分别为 SAVE 和 BACK ,描述以及Fcode 都于按钮名相同 9. 在屏幕的Element list 选项卡中, 在最后一行添加字段 OK_CODE 10. 保存屏幕 并激活 11. 在程序中声明变量OK_CODE与屏幕字段相对应, 注: TYPE ok_code LIKE sy-ucomm. 12. 在屏幕 Flow logic 选项卡中打开PBO注释中的 module ,并且将module创建在主程序内 13. 在主程序中创建结构体变量sdyn_conn, 使内存中的字段变量能够与屏幕中的字段同名对应 注:TABLES sdyn_conn 14. 在PBO module中, 首先清空OK_CODE 通过hide area隐藏域回传的字段到数据库中查找相应的数据,并将数据传递到sdyn_conn结构体变量中. 15. 打开PAI module的注释并将module创建到主程序中. 16. 对OK_CODE进行CASE判断,如果为SAVE则提示message信息,如果为BACK,则通过关键字 SET SCREEN <屏幕编号> 跳转到指定的屏幕中去 17. 保存整个程序 并激活. 重点:在PBO事件中第一步一定要清空OK_CODE (CLEAR ok_code) 1. 假如ok_code没有清空. 2. 当用户第一次进入屏幕并点击保存按钮时(例如:SAVE),这时ok_code 的值为 SAVE, 3. 当用户第二次进入屏幕时, 由于ok_code没有被清空,所以ok_code依然为SAVE, 4. 当屏幕数据还没有输入完整时, 用户可能会通过点击push button 以外的方式 结束屏幕. 5. 这时,程序触发PAI事件, 而PAI事件会进入CASE 中的WHEN ‘SAVE’语句, 此时很可能对数据库产生误操作. 6. 所以,PBO中一定要清空ok_code 以避免以上情况 暂时消息:可以使用 message ‘hello’ type ‘I’. Global modularization 全局模块化 Function module : 属于repositiry 中对对象, 封装了最为常用的代码. Fuction group 1. 是多个function module的集合 2. 拥有组内所有module 可以共享的对象 Function group 工作原理: 1. 当一个Function group中某一个Function module,被程序第一次调用的时候 2. Function group 中所有的组成部分(包括共享对象 和modual) 都会被调入内存. 3. 当第二个程序再一次调用group中的module 时, 就可以直接从内存中调用module了 4. 当程序完成并不再使用module时, funtion group就会在内存中被清除 注意:Function group不能太大,粒度不适合过大. 每一次调用,都会将group所有部分调入到内存, 如果过大 ,则会降低系统运行效率. Function group 共享性 如果group 中的一个module 修改了group 中的属性, 那么当组内的module再次访问该属性时,显示的属性就是已经修改后的属性 Function group 需要通过接口来调用 Function module Fucntion module 类型 1. normal Fucntion module 一般类型 2. Remote-enabled module 可被远程调用类型 3. Update module 更新类型 Function module interface 参数 1. Import 输入参数 2. Export 输出参数 3. Changing 更改参数 重要: 声明module 时, 参数要以 module 内部为参照体, 进来的数据为 import , 出去的数据为 export. 而当程序调用module时, 则需要以程序内部为参照体, 出去的数据为 export, 进来的的数据为inport 注意:Import 和 export 参数都是可选的, 也可以设定为pass value值传, 缺省以及推荐传送方式 是 引用传. 由于调用module 时, 需要调用group的整个数据, 数据量较大, 所以选择引用传能提高效率. Function module 的创建 1. 右键package--- create ----function group 创建function group 注意: function group 不能重名 2. 在function group下创建function module 3. 设定fuction module interface 参数 4. 在source code 中写入执行的代码 5. 建立程序调用function module 6. 点击 Pattern 按钮, 在 CALL FUNCTION 选项中 输入module名,确定 7. 修改参数值 注意: 一定要将程序中的参数 与 module中的参数相对应 8. 当function 调用成功后, 系统变量sy-subrc = 0. Classes and Objects 类和对象 ABAP 可以创建一个引用类型的数据类型 DATA ref1 TYPE REF TO class. 注:Class是数据类型 DATA ref2 TYPE REF TO class. 定义两个能指向 class 的指针 CREATE OBJECT ref1 CREATE OBJECT 相当于java 中的new 方法的调用 CALL METHOD ref1 -> meth1 (方法名) EXPORTING IMPORTING EXCEPTIONS 面向对象中封装了很多组件 1. 一个BOR business object repositiry 包含多个 BO business object 2. 一个商业对象 business object 包含多个BAPI Business API BAPI: 属于全局调用的方法,业务层的函数 Standardlized BAPIs ---标准化的 BAPIs 1. GetList 2. GetDetail 3. Create Change, Delete Cancel 4. Addlem RemoveItem. BAPI 就是 function module , 相当于business function module Calling programs调用程序 程序之间的调用. Insertion(谦让式) 当程序A调用程序B时, 程序B占据栈顶,程序A压在下面, 当程序B执行完毕后,程序A继续执行 Restart(抢占式) 当程序A调用程序B时,程序A在栈顶被移出而被程序B所占据 程序调用语句: 在程序中使用 submit关键字 调用 下一个程序 1) Submit prog_name_2 (restart) 2) Submit prog_name_2 and return (insertion) 3) Submit prog_name_2 via selection-screen and return (insertion) via selection-screen作用: 如果程序2中有选择屏幕,则程序2被调用时 会弹出屏幕 Restart Leave to transaction <T-code>: 功能相当于 输入”/n<T-code>”,当程序执行该语句时,该程序就会在内存被清空,接着转到相应的TCODE程序中去 insertion call transaction <T_CODE> [and skip first screen 忽略被调用程序的第一个屏幕] 执行下一个程序, 当前程序会被压到栈的下一个位置而不会被清空 重点: and skip first screen 忽略被调用程序的第一个屏幕 ,但是 PBO 和 PAI 的Module还会被执行. Memory management内存管理 重要:当R/3 用户登陆系统的时候, 整个系统环境被称作 user terminal session. 其中包含: 1. Internal session. 程序执行窗口 2. External session. 用户的窗口 Session流程 1. 用户登陆系统时的系统环境为terminal session 2. 此时系统开辟了一个External session,用户可以自主创建 , 重要:最大数为6 3. 当一个程序运行的时候,该程序所占的区域为internal session, 相当于程序的内存区域 Memory 1. ABAP memory 属于一个External session 的内存区域 2. SAP memory 属于一个 terminal session 的内存区域 在一个External session中 , 程序A将数据存放至ABAP memory中, 程序B可以从中取出存放的数据. 在同一个terminal session(同一个操作用户)的前提下, 程序A数据存放到 SAP memory中, 程序B可以共享内存中的数据. 在同一个External session 中, (External session相当于一个堆栈) Insertion 程序A 调用 程序B , 程序B 调用 程序C 此时 internal session 从上到下的位置为 C – B -- A Restart 程序A 调用 程序B, 程序A会在栈顶被拿掉, 被程序B占据位置 注意: 例如,在restart情况下,堆栈中已经有程序A , B, C 三个程序, C在栈顶, 此时程序C调用了使用程序D所创建的TCODE,此时程序D将占据整个窗口, 与此同时,堆栈将全部被清空,ABAP memory也会被 clear.