课前复习:
Enter 键 和 运行(F8)键的区别
当点击ENTER 按钮时 , 因该只验证而不能继续运行
Function module与Subroutine 的区别
Function module 是全局的
Subroutine 局部的
Passing data between grograms 程序之间的数据传输
两个程序之间的数据传输可以使用一下方式
1. 可以使用被调用程序的调用接口
2. 标准的选择屏幕
3. 在同一个external session 使用Abap memory
4. 在同一 terminal session 中使用SAP memory
5. 通过数据库表传输
6. 存储到本地文件
Passing data using the program Interface使用程序接口传送数据
如果一个被调用的程序中有标准的选择屏幕.你可以在调用时将数据传送到屏幕的字段中
有两种调用方式
1. 为被调用程序的屏幕指定一个 variant 变式
2. 通过编程实现, 指定一个值并在调用程序时传递到字段中
例题程序. 程序之间的数据调用
REPORT ZMY_zsy_PROG2.
DATA wa TYPE spfli.
PARAMETERS carrid TYPE spfli-carrid.
SELECT-OPTIONS so_carr FOR wa-carrid.
DATA wa_head LIKE LINE OF so_carr.
WRITE : / 'carrid: ' , carrid.
LOOP AT so_carr INTO wa_head.
WRITE : / so_carr-sign,so_carr-option,so_carr-low,so_carr-high.
ENDLOOP.
激活程序并编写程序1
REPORT zmy_zsy_prog1.
DATA: set TYPE RANGE OF spfli-carrid,
wa_set LIKE LINE OF set.
WRITE : / 'I am prog 1, now i want to invoke prog 2......1111'.
wa_set-sign = 'E'.
wa_set-option = 'BT'.
wa_set-low = 'HR'.
wa_set-high = 'SD'.
APPEND wa_set TO set.
SUBMIT zmy_zsy_prog2 VIA SELECTION-SCREEN AND RETURN
WITH carrid = 'AA'
WITH so_carr IN set.
WRITE : / 'I have returned from prog 2......222'.
激活程序
分析:
1. 在程序2中建立一个 select-options内表so_carr.
2. 通过so_carr内表建立结构体
3. 通过循环对so_carr进行打印
4. 建立程序1 调用程序2
5. 根据spfli-carrid 字段建立 range 范围内表set 注意: set 是不具有head line的
6. 为set填充一行记录
7. 在调用程序2之前 使用write1语句
8. submit 调用程序2 ,insertion 并返回屏幕
9. 在调用语句后 写write2语句
10. 对程序2进行参数传递
11. 运行结果中, 先出现程序2屏幕, 当屏幕结束后,write1 和 write2都被打印.
原因: 因为当调用程序2之前,write1语句被放入内存,当程序2执行结束后,继续执行程序1,并执行了write2语句,当程序1结束后, 内存中的write1 和writr2都会被打印出来.
SAP memory and ABAP memory
Internal session 中的程序可以通过 SAP 和 ABAP memory 进行数据传递,且SAP memory和 ABAP memory都是user-specific 用户依赖的memory area 内存区域.
两者区别:
1) SAP memory : 属于一个user’s termial session.只有在一个terminal seesion中才能共享数据,
2) ABAP memory 属于一个external session , 当退出external session时(使用 /I 指令),对应的ABAP memory 将会被初始化或释放.
网络帮助文档 是用户依赖吗?
使用ABAP memory 传输数据.
Data cluster : ABAP memory 中的小内存,每一个cluster都有一个memory id, 在cluster中可以储存任意数量的 abap 数据对象.
Export 和 Import 传输语句
Export: 向ABAP内存中传递数据对象
语法格式
EXPORT
Wa_fli FROM p1_spfli 将程序中的p1_spfli 传递到 claster 的Wa_fli中
It_spfli 经程序中的It_spfli 同名传递到 claster中的It_spfli
TO MEMORY ID ‘MY_ID’. 指定特定的内存名为”MY_ID”的 cluster
注意:如果使用一个新的memory ID传送数据时,旧的memory ID就会被覆盖
Import: 从ABAP内存中取出数据对象
语法格式
IMPORT
Wa_fli TO p2_spfli 将claster 的Wa_fli传递给程序中的p2_spfli
It_spfli ABAP内存中的It_spfli 同名传递到程序中的It_spfli
FROM MEMORY ID ‘MY_ID’. 指定特定的内存名为”MY_ID”的 cluster
重要:使用 FREE MEMORY ID 语句 可以清空MEMORY ID.
Cluster中的数据类型 必须与 调用以及被调用程序的数据类型保持一致
当使用 call transaction code 并且是 intertion 调用程序时, 只能使用abap memory
在SAP memory中使用parameters 参数进行传递
使用SAP memory 的两种传递方式
1. 使用屏幕的input/output fields 输入输出字段进行传输
2. 在程序中 使用 set / ge t parameter ID 进行传输
使用屏幕的input/output fields 输入输出字段进行传输
1. 通过拥有parameter id 的Data element 定义相应的屏幕字段
2. 设置屏幕字段属性 为 set/get
3. 通过SAP memory parameter id 进行字段的传输
在程序中 使用 set / ge t parameter ID 进行传输
1. 根据拥有parameter id 的Data element 定义相应的字段
2. 通过 SET PARAMETER ID 将 字段 传送到sap memory相应的parameter id中,并调用程序
3. 通过GET PARAMETER ID 语句,将sap memory 中的parameter id 取出.
备注:
Bc400_200_08 有错误..
不使用GET 方法.
屏幕字段自动去取,
由于在layout 中的 field 参数中 复选框 get 和 set parameter 没有选中
Passing Data using an internal table 通过内表传递程序
传递过程
1. 首先根据系统结构体bdcdata 建立一个 内表和一个 结构体变量,
1) Bdcdata 的组成字段
2) Program: 所调用的程序名
3) Dynpro: 启动的screen 编号
4) Dynbegin: 在程序调用的开始,是否调用新屏幕 (取值, ‘X’:是 ’’:不是)
5) Fnam:屏幕的字段名
6) Fval:屏幕的字段值
2. 在建立的内表中插入数据 (注意:第一行只有 program,dynpro,dynbegin三个字段被插入, 后几行只用插入 fnam 和 fval字段)
3. 通过call transaction 调用程序, 并将内表通过using 关键字 传入, 并可用MODE关键字,指定字段是否全部显示
(取值:’A’ :全部显示,缺省 ‘E’:错误指针 ‘N’:不全显示)
Data types and data objects. 数据类型 和 数据对象
Type groups
功能: type group 是一个存放全局变量的集合, 它属于ABAP dictionary,其中包含的 常量以及类型,可以被所有程序使用.
重要: type group 中的 常量以及类型 必须以 “<type group name>_”开头
Type group 的使用:
1. 声明: type-pool <name>.
2. 使用:type-pools: <name>.
Integers and Integer Arithmetic 整形以及整形运算
优点: 使用 整形 进行数学运算, 速度要优于 fixed point 定点运算 以及 floating point 附点型运算
重点: 在除法运算中, “/” 运算 与 DIV 运算 是不同的, “/” 包含小数的四舍五入, 而DIV则没有
Packed numbers and fixed point arithmetic 压缩数 以及定点运算
P类型(重点)
1. 采用BCD编码,长度单位为byte 字节, 长度范围为1-16 bytes,
2. 每一个十进制数字 占用 half-byte 半字节, 由于plus or minus sign正负号 占用半字节,所以数字的最大个数为 n*2-1 (假设n 为类型长度)
3. 可以指定decimals 小数, 后面跟 保留的位数, 由于p类型中 必须包含1位整数和一个符号位, 所以保留的最大字节数为 16-1 = 15, 保留数字最大个数为 15*2= 30
定点运算概念: 将小数位对齐后进行运算, 尤其针对于 pcaked number P 压缩数字 P类型.能够保证精确性(重要:虽然该功能是可选项,但强烈建议开启,否则会影响数据精确度)
Float附点型 (了解便可)
浮点型:
1. 附点运算, 是用一系列二进制片断运算的
2. 采用IEEE: 双精度浮点数运算标准
浮点型float 于 压缩数字型 P 比较
Float
优点:存储范围大 缺点:运算精度低,不适合做商务运算
P
优点:运算精确 缺点:储存范围较小
重要:在select 中的 使用聚集函数时 (例如:sum() average() ) 只能使用 F类型.
建议在运算中使用类型的顺序: I整形 , P 压缩数字型 , 浮点型
多类型混合运算
1. 当两个类型不一致的变量进行运算时,运算结果会转化为储存结果的变量类型.
2. 当一个混合运算中至少有一个为F浮点类型, 结果将转化为浮点类型
Character String 字符串
Code page:多个国家语言的字符集.
字符类型 c string 的 取值范围 取决于 code page.
重点: c 的长度是固定的, 而string 的长度是动态扩展的
C: 固定字符串类型 , 缺省值为 space character空格字符串
String: 动态字符串 缺省值为space character空格字符串
T: 表示时间 HHMMSS 缺省值 000000 注意: HH 为24小时制
D: 表示日期 YYYYMMDD 缺省值 00000000
N: 数值型字符串 缺省值 ‘0’ , 当n类型参与运算时, 会按照数字类型进行运算
重点: 从系统性能考虑,只有在选择屏幕的字段中 系统才能够对 t d 类型进行有效性校验
Accessing parts of fields访问字段的一部分
语句: <field 字段>+<off起始位置>(<len访问长度>)
注意: 在ABAP中的字符串类型中,第一位的编号为1, 所取结果是从起始位置的后一位开始取的,只能对 x c n d t string 进行截断.
Defining Structures with Local Types局部类型结构体的定义
两种定义方式
1. 首先定义一个自定义结构体类型, 然后通过该类型,定义结构体变量
2. 直接用data语句定义结构体变量
Defining Nested Structure 定义嵌套的局部结构体
1. 可以使用dynamic类型 string 和 xstring 作为component字段.
2. 可以使用structure结构体以及internal table 结构体
调用嵌套结构体的变量 需要使用’-’, 例如s_1-s_2-d1
如果一个扁平结构体都是字符串组成的,就可以看成一个大字符串,并进行相应操作(例如:偏移量)
重要: 在使用select into 访问数据库时, 不能够使用deep structer.
Unicode
多种语言字符集的混合,不同数据的交换会出现字符不兼容问题
Unicode : 世界的字符集, 每一个字符 在unicode 中只有一个编码.
缺点:性能慢,内存占据大,.
字符类型 和 字节类型的操作
注意:东软的系统不是Unicode
1) Strlen() 取string变量长度 多少个字符
2) Xstrlen() 取xstring长度 多少个字节
Xstring 类型 的长度代表一个字节, half-byte半个字节存储两个数字
Compatibility and conversion 兼容性转换
1. 简单类型兼容: 类型 长度相同, 当类型为P 时 decimal 小数位 也需要相同
2. 结构体 : 字段相同并按照顺序兼容.
3. 内表:行类型 table key 以及 内表类型 相同
Unicode 下的转换
扁平结构体之间的互相兼容
条件:大结构体的无间隔字段组合 与 小结构体的所有字段 类型以及顺序匹配,长度相等
当move 大结构体 to 小结构体时, 数据将从大结构体中赋值到小结构体中
反之, 大结构体的字段组合被赋值 , 而其余的字段 将会赋为初始值
C类型字段与结构体的兼容
前提条件: 字段必须为c类型 , 结构体的字段必须都是字符类型字段 , 结构体的长度要大于字段长度
当move 结构体 到字段 , 与字段长度相等的结构体数据就会赋值给字段
反之, 结构体被字段赋值,其余部分 被赋初始值
内表是结构体的连续,然而内存是连续的
如果字段可以和结构体匹配, 则字段因该可以和内表相匹配.
练习: 将字符串 赋值 到 内表中 ,
定义一个 长字符串 和一个结构体匹配
定义一个结构体 和一个内表进行匹配.
结构体的偏移 可以当成大的字符串来偏移. 只能在unicode 中进行(推荐不使用)
转自: http://blog.sina.com.cn/s/blog_5cdacb630100ce96.html~type=v5_one&label=rela_nextarticle