ABAP中,SELECT-OPTIONS:s_ekorg FOR eine-ekorg MEMORY ID eko.
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABAP中,SELECT-OPTIONS:s_ekorg FOR eine-ekorg MEMORY ID eko.相关的知识,希望对你有一定的参考价值。
定义选择屏幕的时候,MEMORY ID是做什么的?起到什么作用?
MEMORY ID 就是在SAP内定义的一段内存区域,方便你从里边读出数据或者往里边写入数据你这里使用的MEMORY ID最明显的现象就是:你在选择画面上输入一个值后,该PARAMETER/SELECT-OPTIONS会将其设为默认值,当你退出程序再进入时,你会发现该PARAMETER/SELECT-OPTIONS保留了你上一次输入的值。 参考技术A MEMORY ID pid 使用内存默认值。从SAP内存(该内存是用户相关的公有内存区域,可以在一个用户使用的不同会话之间传递)中给参数字段分配默认值,SAP/GPA参数是SAP将屏幕元素填充初始数据的一种通用技术,其中pid是公用的SAP内存ID,最多20字节,通过SET/GET语句进行设定和读取。
当你用FB01创建一张document时,成功创建后会产生document number,当你使用tcode /OFB03时,这个document number会自动显示在界面对应的字段上。这就是这种技术的使用例子! 参考技术B 表示 eine-ekorg 的数据是从eko这个数据簇里面读取的(而不是数据库)。可以提高读取速度。追问
这里的数据簇eko是事先建好的,还是系统本来就有?我双击eko没什么反应啊。程序中还要这样一句 : SET PARAMETER ID 'EKO' FIELD hd_itab-ekorg. 这个又怎么解释呢?谢谢!!
ABAP基础:数据类型
数据类型-Data Type:定义程序中可以使用的数据类型,使用前要先定义
数据变量-Data Variable:参照数据类型定义的、可以存储值的变量,就是变量嘛
数据类型
- 数据类型在ABAP程序中用于定义变量类型
- 数据类型和数据对象是单独声明的,数据对象则参照数据类型定义
- 在程序中利用TYPES语句声明数据类型,只能在该程序中使用,也成为本地数据类型
- 本地数据类型可以参照ABAP数据类型进行声明
数据变量
- 数据变量是在程序中参照数据类型定义的值。
- 常用方法是用Data语句定义变量
注意:变量实际指数据对象,数据对象在程序执行期间占用内存空间
三种数据类型
1.ABAP基本数据类型
- 系统内部定义的数据类型 https://www.cnblogs.com/zhaorp/p/6925301.html
-
类型
允许最大长度(字符数)
默认长度(省略时采用)
说明
初始值
C
1~262143个字符
1 字符
如果未在 DATA 语句中指定参数<length>和<type>,则创建长度为 1 的字符
每个位置都是空格
N
1~262143个字符
1 字符
0到9之间字符组成的数字字符串
如果未在 DATA 语句中指定参数<length>,则创建长度为 1
"0"每个位置都是阿拉伯数字0
D
8 个字符
日期格式必须为 YYYYMMDD 取值范围:YYYY (year): 0001 to 9999, MM(month): 01 to 12, DD (day): 01 to 31
"00000000"
T
6 个字符
格式为 24-hour的 HHMMSS
HH:00 to 23
MM: 00 to 59
SS: 00 to 59
"000000"
I
4 bytes
-2.147.483.648 to +2.147.483.647(.点号为千分位分隔符,不是小数点,而,逗号则表示是小数点)
如果运算出现非整型的结果(如小数)则进行四舍五入,而不是截断
0
F
8 bytes
小数位最大可以到17位,即可精确到小数点后17位
取值范围:-1,7976931348623157EE+308 to -2,2250738585072014EE-308 for the negative area, the value zero, and +2,2250738585072014EE-308 to +1,7976931348623157EE+308 for the positive area.
如果要求高精度,则不应该使用类型 F 数据。而应代之以类型 P 数据
F赋值时,会转换为标准形式:<±尾数部分>E±<指数部分>,且尾数部分的小数位最多为17位
0
如果值是小数,则要将值使用引号引起来
P
1 to 16 bytes
8 bytes
有效长度为1到16个字节。
两个数字位压缩后才占一个字节,由于0-9的数字只需要4Bit位,所以一个字节实质上允许存储二位数字,这就是P数据类型为压缩数据类型的由来,因为定义的的数据长度比存储于内存中要长。并借用最后半个字节,即字面上的一位来存储小数点、正号、负号、或者是这三种中间的组合————存储的可能是通过将小数点与正负号经过某种位运算后的结果,因为半个字节不可能存储小数或正负号的所对应的ASCII码(都比15大)
P类型最多允许14位小数位,即可以精确到小数点后14,再除开小数点与正负号占半个字节,即字面上1位4Bit,此时最大整数位最长可达16*2 = 32 – 1 = 31 -14 = 17位
Depending on the field length len(len表示定义时P的整个长度) and the number of decimal places dec(dec表示小数位), the following applies for the value area: (-10^(2len -1) +1) / (10^(+dec)) to (+10^(2len -1) -1) /(10^(+dec)) in steps of 10^(-dec). Values in between this range are rounded off.
在计算过程中如果小数部分过长,则进行四舍五入
0
若小数部分超过长度,则自动按四舍五入将多余的小数除掉;如果整数部分超过长度,则系统运行出错
如果值是小数,则要将值使用引号引起来
X
1~524,287 bytes
1 byte
十六进制字符 0-9, A-F具体的范围为:00~FF
类型X是十六进制类型,可表示内存字节实际内容,使用两个十六制字符表示一个字节中所存储的内容。但直接打印输出时,输出的还是赋值时字面意义上的值,而不是Unicode解码后的字符
如果未在 DATA 语句中指定参数<length>,则创建长度为 1
注:如果值是字母,则一定要大写,否则赋值不进
DATA: x2(2) TYPE x.
x2 = \'3AA\'.
WRITE : / x2."输出赋值时字面上的值:3AA0十六进制的00
string
不限定
在系统内部,长度可变的内置类型(String、XString)是通过引用实际动态的数据对象的固定内存地址来进行操作,因而这两种内置类型和引用类型一样,属于纵深类型。
长度为0的空字符串\'\'
xstring
不限定
由十六进制字符 0-9, A-F组成字符串。直接打印输出时,输出的还是赋值时字面意义上的值,而不是Unicode解码后的字符串
注:如果值是字母,则一定要大写,否则赋值不进
DATA : xs TYPE xstring .
xs = \'303132\'."表示字符串 012
WRITE :/ xs."但输出的还是303132长度为0的空字符串\'\'
b
1 Byte
0 to 255属于ABAP内部类型,在ABAP程序中不能直接使用
0
s
2 bytes
-32.768 to +32.767属于ABAP内部类型,在ABAP程序中不能直接使用
0
2.局部数据类型-存在于程序内部
3.全局数据类型-存在于数据字典中
- 全局数据类型是指所有程序都可以使用的数据类型
- 可以用TYPE语句参照ABAP数据字典里的数据类型定义变量
声明数据类型
1.参考基本数据类型定义变量
DATA:gv_num TYPE i, gv_deci TYPE f.
TYPE后面是ABAP基本数据类型
2.参照局部数据类型定义变量
将程序中常用的数据及结构声明为一个数据类型,定义变量时可以参考此数据类型定义,但此数据类型只能在改程序内容使用
TYPES: BEGIN OF t_struct, col1 TYPE c, col2 TYPE i, col3 TYPE d, END OF t_struct. DATA: gs_struct TYPE t_struct, gv var LIKE gs struct-col1.
3.参照全局数据类型定义变量
利用ABAP数据字典(表/结构体/数据元素等)定义变量的方法,此数据类型在所有程序都可以使用
DATA: gv_carrid TYPE s_carr_id, gv_connid TYPE sflight-carrid, gv_matnr TYPE mara-matnr.
DATA语句
用于定义数据变量,变量名可以包含_, 长度最长30位
1. TYPE type
定义变量的数据类型
DATA: gv_num TYPE i.
冒号是一个命令从逗号开始, 遇到句号结束
下面的命令效果等同
DATA gv_num1 TYPE I. DATA gv_num2 TYPE I. DATA: gv_num1 TYPE I, gv_num2 TYPE I.
2. LIKE num
定义与前一个变量相同类型的变量, num可以是任何一种数据类型(字段/参数.结构体/系统变量)
DATA: GV_NUM3 LIKE GV_NUM1.
3.VALUE INT
所有数据类型都存在初始值
DATA语句可以用VALUE选项设置初始值INT
DATA: GV_NUM TYPE I VALUE 123, GV_FLAG VALUE \'X\', GV_VAL VALUE IS INITIAL GV_IDX LIKE SY-TABIX VALUE 45.
VALUE IS INITIAL 变量的初始值为所参照的数据类型的初始值,可以省略,效果一样
4. LENGTH N
LENGTH N用于指定字段长度, 仅适用数据类型: C/N/P/X
DATA: GV_NUM TYPE N LENGTH 2.
5. DECIMALS N
用于指定1-14位小数,仅适用于数据类型P
DATA: GV_NUM TYPE P DECIMALS 3.
第一个helloworld
REPORT Z_YZW_HELLOWORLD. "报表名称 TYPES T_VAR TYPE C LENGTH 20. "声明一个局部数据类型为C,长度为20 DATA GV_VAR TYPE T_VAR. "声明一个变量,类型使用上面定义的数据类型 GV_VAR = \'HELLOW ABAP\'. "给变量赋值 WRITE GV_VAR. "打印变量
- .号表示一行代码结束
- 字符串用单引号
- =号前后要留空格, 和SHELL一样
- *号表示一行注释, "号表示右边注释
命名规则
全局变量以G开头
局部变量以L开头
一个好的命名包括:作用范围/数据类型/含义
数据基本运算中, 浮点数需要调用function FLTP_CHAR_CONVERSION转换成char类型
DATA GV_F1 TYPE F VALUE \'2.22\'. DATA GV_F2 TYPE F VALUE \'3.33\'. DATA GV_FRESULT TYPE F. DATA GV_CRESULT TYPE C LENGTH 16. GV_FRESULT = GV_F1 * GV_F2. WRITE / GV_FRESULT. CALL FUNCTION \'FLTP_CHAR_CONVERSION\' exporting DECIM = 2 INPUT = GV_FRESULT importing FLSTR = GV_CRESULT. WRITE / GV_CRESULT .
数字运算用函数
- ABS, 返回绝对值, ABS(-100)renturn 100
- SIGN, 返回符号, 负数return -1, 0 return 0, 整数return 1
- CEIL, 返回不小于该值的最小整数, ceil*1.3) ceil(1.7) 返回最小整数2
- FLOOR, 返回不大于该值的最大整数, floor(1.3) ceil(1.7) 返回整数1
- TRUNC取整, trunc(1.3) trunc(1.7)返回整数1
- FRAC取小数, frac(\'2.9\') 返回0.9
浮点函数
- ACOS/ASIG/ATAN/COS/SIN/TAN三角函数
- COSH/SIGNH/TANH 双曲线函数
- EXP 指数函数
- LOG 自然对数函数, 以e为底
- LOG10 常用对数函数, 以10为底
- SQRT 平方根函数, 开方
字符串类型
字符串类型也成为字符串字段, 分为4种
- C 用于定义文字/数字/特殊文件, 需显式指定字段长度, 不指定默认长度为1, data g_char(3) type C. 或者data g_char type C length 3.
- N 用于显示C类性数字,以字符串形式显示整数, 长度不够时前置补零
- D 日期类型
- T 时间类型
日期时间
- sy-datum, 输出当前日期格式YYYYMMDD, sy-datum+3 当前日期加三天, 单位是天
- sy-uzeit, 输入当前系统时间格式HHMMSS, sy-uzeit-60, 当前时间减60秒, 即1分钟前, 单位是秒
sy-datum sy-datlo
- sy-datum在stzac设置, 默认到su01的用户时区
- sy-datlo可以覆盖su01用户时区
string类型
与C类型类似, 用于定义不固定长度的变量, 常用于定义长文本,执行是生成动态内存
- FIND, 查找索引位, find \'查找内容\' in 字符串
-
REPORT Z_YZW_STRING. data: gv_str type string, gv_chr(4) type c. gv_str = \'ABAP\'. gv_chr = \'B\'. FIND \'D\' in \'ABAP\'. write: / \'sy-subrc\', sy-subrc. if sy-subrc eq 0. write / \'b was found\'. endif.
判断结果sy-subrc为0, 则为真, 4, 则为假
- REPLACE, 替换指定字符串, replace \'被替换内容\' in 原字符串 with 替换内容.
-
gv_str = \'abapasdfasdfasdf\'. gv_chr = \'BBAP\'. write: / \'before replace gv_str is\', gv_str. replace \'abap\' in gv_str with gv_chr. write: / \'after replace gv_str is\', gv_str.
- TRANSLATE, 大小写转换, 大写变小写, 小写变大写
-
gv_str = \'ABCdefGHI\'. translate gv_str to upper case. write / gv_str.
upper/lower, 不能同时转换, 只能转换大写或者小写
- SHIFT, 字符串左移
-
gv_str = \'12345\'. shift gv_str. write / gv_str. "默认左移1位, 输出2345 gv_str = \'12345\'. shift gv_str by 3 places. write / gv_str. "左移3位, 输出45 gv_str = \'12345\'. shift gv_str up to \'3\'. write / gv_str. "截止3为止, 前面字符被弹出, 输出345
- CONDENSE, 去除空格并左对齐, 常与NO-GAPS一起使用去掉空格
-
gv_str = \' aa bb cc \'. condense gv_str. write / gv_str. "前后空格剪掉 gv_str = \' aa bb cc \'. condense gv_str no-gaps. "所有空格剪掉 write / gv_str.
- OVERLAY, 填充空格, 原有字符串不覆盖
-
gv_str = \'B B B\'. gv_chr = \'AAAA\'. overlay gv_str with gv_chr. write / gv_str.
输出:BABAB
- CONCATENATE, 字符串链接
-
gv_str = \'123\'. gv_chr = \'456\'. concatenate gv_str gv_chr into gv_str. write / gv_str.
输出:123456
- SPLIT, 分裂
-
gv_str = \'123\'. split gv_str at \'2\' into gv_str gv_chr. write: / gv_str, gv_chr.
输出:1 3
看帮助, 按F1
定义结构体类型
types begin of struc_type.
types dtype.
types end of struc_type.
REPORT Z_YZW_STRUC. *这里声明结构体类型,结构体里面定义变量类型和长度 types: begin of t_ren, name type c length 20, country type c length 15, city type c length 10, age type i, end of t_ren. *这里给结构体变量赋值 data gs_people type t_ren. gs_people-name = \'yzw\'. gs_people-country = \'CHINA\'. gs_people-city = \'guangzhou\'. gs_people-age = 18. write: / gs_people-name, gs_people-country, gs_people-city, gs_people-age.
有点像python的类构造方法
- 嵌套结构体
REPORT Z_YZW_STRUC. *这里声明结构体类型,结构体里面定义变量类型和长度 types: begin of t_ren, name type c length 20, country type c length 15, city type c length 10, age type i, end of t_ren. *这里定义嵌套结构体类型 types: begin of t_info. include type t_ren as ren. "定义另一个结构体t_info,同时包含上面的结构体t_ren, 达到t_info里面嵌套t_ren types: phone type c length 10, end of t_info. *这里给结构体变量赋值 data gs_people type t_info. "这里使用最外层结构体类型, 也就是t_info gs_people-name = \'yzw\'. gs_people-country = \'CHINA\'. gs_people-city = \'guangzhou\'. gs_people-phone = \'123456\'. write: / gs_people-name, gs_people-country, gs_people-city, gs_people-phone.
结构体与变量之间用短-连接: 结构体-变量
- 直接定义变量
*不参照结构体,直接在data里定义变量和指定变量类型 data: begin of gs_people, name type c length 20, country type c length 15, city type c length 10, phone type c length 10, end of gs_people. gs_people-name = \'yzw\'. gs_people-country = \'CHINA\'. gs_people-city = \'guangzhou\'. gs_people-phone = \'123456\'. write: / gs_people-name, gs_people-country, gs_people-city, gs_people-phone.
- include structure, 可以把data语句定义的结构体或者ABAP数据字典存在的结构体包含到嵌套结构体中
REPORT Z_YZW_STRUC. *定义数据类型,前缀是gs_ren data: begin of gs_ren, name type c length 20, country type c length 15, city type c length 10, end of gs_ren. *定义另一个数据类型gs_people,包含内层gs_ren,内层嵌套可以是data语句结构体或者ABAP数据数据字典已存在结构体 data: begin of gs_people. include structure gs_ren as ren. data: phone type c length 10, end of gs_people. gs_people-ren-name = \'yzw\'. gs_people-ren-country = \'CHINA\'. gs_people-ren-city = \'guangzhou\'. gs_people-phone = \'123456\'. write: / gs_people-ren-name, gs_people-ren-country, gs_people-ren-city, gs_people-phone.
- 不使用as关键字
*定义数据类型,前缀是gs_ren data: begin of gs_ren, name type c length 20, country type c length 15, city type c length 10, end of gs_ren. *定义另一个数据类型gs_people,包含内层gs_ren,内层嵌套可以是data语句结构体或者ABAP数据数据字典已存在结构体 data: begin of gs_people. include structure gs_ren. "去掉 as ren data: phone type c length 10, end of gs_people. *如果不使用as关键字,访问变量均需要使用外层嵌套变量名作为前缀 gs_people-name = \'yzw\'. gs_people-country = \'CHINA\'. gs_people-city = \'guangzhou\'. gs_people-phone = \'123456\'. write: / gs_people-name, gs_people-country, gs_people-city, gs_people-phone.
ABAP数据字典数据类型
abap数据字典中的数据类型为全局数据类型. abap数据字典(表/结构体/数据元素)实在所有程序中都可以用来声明变量的因素
abap数据字典类型大致分为3种:
- 表及视图: type dbtab, type dbtab-comp
- 数据类型: 数据元素, 结构体, 表类型
- 类型组: type groups
根据数据表定义数据类型:
data: gs_sflight type sflight. "fliaght是一个数据表 select single * from sflight into gs_sflight where carrid = \'001\'. write: / gs_sflight-CARRID, gs_sflight-connid, gs_sflight-fldate, gs_sflight-price, gs_sflight-currency, gs_sflight-planetype.
根据数据库表的字段定义数据类型:
data: gv_carrid type sflight-carrid, gv_connid type sflight-connid, gv_fldate type sflight-fldate. gv_carrid = \'aa\'. gv_connid = \'018\'. gv_fldate = sy-datum. write: / gv_carrid, gv_connid, gv_fldate.
参照基本数据类型定义变量
SE11中创建数据类型可选项:
数据元素, 参照域定义, 一个域可以在多个数据元素中使用, 一个数据元素可以在多个数据表中使用
- 参照数据元素定义变量
data gs_carrid type s_carr_id. "s_carr_id是一个系统数据元素, 可以用type关键字直接参考 gs_carrid = \'AA\'. write: / gs_carrid.
- 参照结构体的type定义
types dtype type structure.
先创建一个struct的数据类型zstruct
,再根据这个结构类型进行数据声明
data gs_str type ZSTRUCT. gs_str-col1 = \'1\'. gs_str-col2 = \'structure\'. gs_str-col3 = \'abap dictionary test\'. write: / gs_str-col1, gs_str-col2, gs_str-col3.
ABAP数据字典类型与ABAP基本数据类型
ABAP数据字典类型, 指在ABAP数据字典中将经常使用的数据类型事先定义的实例 http://blog.csdn.net/szlaptop/article/details/8125920
数据字典预置类型 | ABAP类型 | 运行长度 | 说明 |
ACCP | N(6) | 6 | 会计计算周期 |
CHAR | C(n) | 1-255 | 字符 |
CLNT | C(3) | 3 | 集团,数据区域代码 |
CUKY | C(5) | 5 | 货币代码 |
CURR(n,m) | P((n+1)/2)DECIMALm | 42736 | 货币金额 |
DATS | D(8) | 8 | 日期 |
DEC n,m | P((n+1)/2)DECIMALm | n(1-31)m(1-17) | 数值计算 |
FLTP | F(8) | 18 | 浮点数 |
INT1 | X(1)(类型b) | 3 | 单字节整形数 |
INT2 | X(2)(类型s) | 5 | 双字节整形数 |
INT4 | X(4)(类型i) | 10 | 四字节整形数 |
LANG | C(1) | 内部1位外部2位 | 语言代码 |
LCHR | C(n) | 256-最大值 | 长字符 |
LRAW | X(n) | 256-最大值 | 长位字串 |
NUMC n | N(n) | 1-255 | 数值文字 |
PREC | X(2) | 16 | 精确度 |
QUAN n,m | P((n+1)/2)DECIMALm | 42736 | 数量 |
RAW n | X(n) | 1-255 | 位字串 |
TIMS | T(6) | 6 | 时间 |
VARC n | C(n) | 255-最大值 | 长字符(仅3.0前可用) |
STRING | STRING | 1-最大值 | 字符串 |
RAWSTRING | XSTRING | 1-最大值 | 位字符串 |
UNIT | C(n) | 2~3 | 单位 |
变量赋值
- MOVE value to variable, 隐式转换类型为variable, D与T类型不可以互相转换
- variable = value
- write value to variable1, 还可以输出报表list
- MOVE-CORRESPONDING 用于两个不同结构体或内标之间相互赋值, 赋值时与先后顺序无关, 自动查找同名变量进行赋值
data: begin of gs_ren, name(20) value \'yzw\', country(10) value \'china\', city(20) value \'guangzhou\', end of gs_ren. data: begin of gs_info, name(20), city(20), phone(10) value \'12345\', end of gs_info. move-corresponding gs_ren to gs_info. "自动匹配变量名相同的变量并赋值 write: / gs_info-name, gs_info-city, gs_info-phone.
offset截取赋值
data: f1(8) value \'abcdefgh\', f2(8). move f1+2(3) to f2. "从f1变量的第2+1位开始,截取3个字符赋值给f2 write: f1, f2.
结果是cde
结构体之间的计算操作
- ADD-CORRESPONDING
- SUBTRACT-CORRESPONDING
- MULTIPLY-CORRESPONDING
- DIVIDE-CORRESPONDING
data: begin of gs_rate, peng type f value \'0.8\', zhou type f value \'1.0\', end of gs_rate. data: begin of gs_result, peng type i value 95, zhou type i value 70, end of gs_result. multiply-corresponding gs_result by gs_rate. "两个结构体的相同变量相乘 write: / gs_result-peng, gs_result-zhou.
常量
constants c value [val | is initial]. constants: begin of crec, ... end of crec.
constants: c_company(10) value \'lg cns\'. "一般常量 constants: begin of c_people, "结构体常量 name(20) value \'yzw\', country(10) value \'china\', end of c_people. write: c_company, c_people-name, c_people-country.
静态常量
The "STATICS" statement can only be used in FORMs, FUNCTIONs, and CLASS-METHODs. .
在from语句块内用statics定义的局部变量的值可以保持到程序结束
statics f.
statics: begin of struc,
...
end of struc.
DO 3 TIMES. PERFORM call_subr. endDO. FORM CALL_SUBR. statics lv_val type i. lv_val = lv_val + 1. write: / lv_val. "每次调用输出1 2 3, 直到程序结束 ENDfORM.
DO 3 TIMES. PERFORM call_subr. endDO. FORM CALL_SUBR. data lv_val type i. lv_val = lv_val + 1. write: / lv_val. "每次调用初始化为1 ENDfORM. "CALL_SUBR
TABLES
使用tables语句定义的ABAP数据字典中的数据表/视图/结构体, 会生成与ABAP数据字典具有相同结构的数据对象
tables: scarr. select * from scarr. " into scarr被省略,因为表与结构体名称相同 write: / scarr-carrid, scarr-carrname. endselect.
以上是关于ABAP中,SELECT-OPTIONS:s_ekorg FOR eine-ekorg MEMORY ID eko.的主要内容,如果未能解决你的问题,请参考以下文章