ABAP中域(Domain)、数据元素(Data Element)、表(Table)的创建
- 格式:pdf
- 大小:1.38 MB
- 文档页数:23
ABAP/4 DATA ELEMENT一.Data Type (数据类型)C: 字符(串), 长度为1, 最大有65535 BYTES, 初始值为: space,例: ‘M’;D: 日期, 格式为YYYYMMDD, 最大是’9999/12/31’ ,例:’1999/12/03’.F: 浮点数, 长度为8, 例如: 4.285714285714286E-01I: 整数范围 :-2^31 ~ 2^31-1N: 数值组成的字符串: 011, ‘302’.P: packed 数,用于小数点数值,例如: 12.00542;T: 时间, 格式为HHMMSS,例如: ’14:03:00’, ’21:30:39’.X: 16进制数, 例如‘1A03’.二.变量宣告变量宣告包含name, length, type, structur(结构)e等,语法如下:DATA <F> [<length>] <type> [<value>] [<decimals>]其中: <f> :变量名称,最长30个字符,不可含有 + , . , : ( ) 等字符;<length><type>:变量类型及长度;<value>:初值<decimals>:小数字数Example 1:DATA: COUNTER TYPE P DECIMALS 3.NAME (10) TYPE C VALUE ‘Delta’.S_DATE TYPE D VALUE ‘19991203’.Example 2:DATA: BEGIN OF PERSON,NAME(10) TYPE C,AGE TYPE I,WEIGHT TYPE P DECIMALS 2,END OF PERSON.另外,有关DATA宣告的指令还有: CONSTANTS(宣告常数)、STATICS(临时变量宣告).三.系统专用变量说明系统内部专门创建了SYST这个STRUCTURE,里面的字段存放系统变量,常用的系统变量有:SY-SUBRC : 系统执行某指令后,表示执行成功与否的变量,’0’ 表示成功SY-UNAME: 当前使用者登入SAP的USERNAME;SY-DATUM: 当前系统日期;SY-UZEIT: 当前系统时间;SY-TCODE: 当前执行程序的Transaction codeSY-INDEX : 当前LOOP循环过的次数SY-TABIX: 当前处理的是internal table 的第几笔SY-TMAXL: Internal table的总笔数SY-SROWS: 屏幕总行数;SY-SCOLS: 屏幕总列数;SY-MANDT: CLIENT(顾客) NUMBERSY-VLINE: 画竖线SY-ULINE: 画横线附注:1.SAP的全称是: System Application Products in Data Processing;2.ABAP/4的全称是:Advanced Business Application Programming;3.ABAP/4的路径为:Tools ◊ ABAP/4 WorkBench◊ABPA/4 Editor ;4.ABAP/4每条语句以句号结束;5.ABAP/4中象= ,>, <,+,-,*,/等符号左右都需要有至少一个空格;6.整行注释用’*’号, 注释本行后面部分用’”’号;。
abap 常用函数用法ABAP是一种功能强大的SAP开发语言,用于创建和编辑业务应用程序。
在ABAP编程中,函数是一种常用的工具,用于执行特定的任务。
本篇文章将介绍一些常用的ABAP函数及其用法。
一、字符串函数1.LEFT(string,length):返回string字符串左边的length个字符。
2.RIGHT(string,length):返回string字符串右边的length个字符。
3.MID(string,start_position,length):返回string字符串从start_position开始,length个字符的子串。
4.CONCATENATE(string1,string2,...):将多个字符串连接成一个字符串。
5.TRIM(string):去除字符串首尾的空格。
6.LOWER(string):将字符串转换为小写。
7.UPPER(string):将字符串转换为大写。
二、数值函数1.ABS(number):返回number的绝对值。
2.ROUND(number,digits):对number进行四舍五入到digits位小数。
3.FLOOR(number):对number向下取整。
4.CEILING(number):对number向上取整。
5.MOD(number1,number2):返回number1除以number2的余数。
三、日期函数1.CURDATE():返回当前日期。
2.YEAR(date):返回date日期的年份。
3.MONTH(date):返回date日期的月份。
4.DAY(date):返回date日期的天数。
5.ADD_MONTHS(date,months):将date日期增加指定的月份。
6.SUBTRACT_MONTHS(date,months):将date日期减少指定的月份。
四、其他常用函数1.ISNULL(value):检查value是否为空。
2.IS_NOT_NULL(value):检查value是否不为空。
SAPABAP函数总结常用函数解释SAPABAP是一种流行的编程语言,常用于SAP系统开发。
在ABAP中,函数是可重复使用的代码块,用于执行特定的任务或操作。
这些函数可以在ABAP程序中调用,以提高代码的可维护性和重用性。
下面是一些常用的SAPABAP函数以及它们的解释。
1.STRLEN函数:返回一个字符串的长度。
这个函数可以用于计算字符串的字符数,以便于处理和操作字符串。
2.CONCATENATE函数:将多个字符串连接成一个字符串。
这个函数可以用于连接两个或多个字符串,使其成为一个新的字符串。
3.REPLACE函数:替换字符串中指定的内容。
这个函数可以用于替换一个字符串中的一些子串,以实现特定的文本替换需求。
4.SPLIT函数:将一个字符串按照指定的分隔符分割成一个字符串表。
这个函数可以用于将一个长字符串以指定的分隔符分割为多个小字符串,并存储在表中。
5.TRANSLATE函数:替换字符串中的字符。
这个函数可以用于替换一个字符串中的特定字符或字符串,以实现文本的转换或调整。
6.NUMERIC_CHECK函数:检查一个字符串是否为合法的数字。
这个函数可以用于验证一个字符串是否为合法的数字,以确保数据的准确性。
7.DATE_CONVERSION_FUNCTIONS函数:日期转换函数。
这个函数可以用于在不同日期格式之间进行转换,以满足不同日期格式的需求。
8.DYNPRO_NOT_FOUND函数:检查屏幕元素是否存在。
这个函数可以用于检查SAP屏幕中是否存在一个指定的屏幕元素,以便根据结果来决定后续的操作。
9.WRITE函数:向输出窗口或内部表写入数据。
这个函数可以用于将数据写入SAP输出窗口,或写入内部表,以进行后续的数据处理。
10.SY-SUBRC函数:获取最近一次操作的执行状态。
这个函数可以用于获取最近一次操作的执行结果,以便根据结果进行进一步的处理和判断。
11.CONVERSION_EXIT_ALPHA_INPUT函数:输入转换函数。
ABAP开发分为RICEF-WReport开发、Interface开发、Conversion 转换开发、Enhancement开发、Form开发、Workflow工作流开发。
Table: SE111. 建议Field中先定义Data element 不建议先定义field2. 特殊DataType:CLNT:Data element/Domain有MANDTCURR:小数位设定CUKY:Currency:Domain like WAERSDATS:日期 YYYYMMDD Domain like DATUMTIMS:时区管理 hhmmss Domain like UZEIT3. Delivery class A和CA - Application table 业务数据不会经常修改物料供应商客户C - Customizing table 会产生Transport RequestData browser/table view maint.Not allowed 和allowed区别4. Sigh 金额有关打钩支持正负号5. Lowercase 大小写区分6. Value range 取值限制男、女Single val。
单个取值Intervals 一段取值7. Text table 用在master table8. Append structure 只能用在一个地方Include structure 能用多次9. 创建表的时候:设置Technical Setting10. 设置Enhancement category for table missing:Extras - Enhancement category11. Table Maintenance Generator:se11->unitilies->table maintenance generator12. Fixed values——屏幕输入时检查Report:SE381. Tool bar:where-used list 这个程序被什么地方调用过2. Utility-more utility -edit pattern 用户、时间、用途等格式3. 不想让别的公司看到报表1.权限检查 2.select option4. Like [table]-[field] 后加search help,检查field-data element-..5. Type [data element] 后加search help,检查data element-…6. Goto - Text element - selection texts Dictionary打钩则p_name显示为nameLong7. 屏幕分块 Selection-screen begin of block 名字(四位)WITH FRAME TITLE text-002.8. file exist检查的message放在At selection screen 中Select-options 默认参数:1. MEMORY ID 就是在SAP内定义的一段内存区域,方便你从里边读出数据或者往里边写入数据你这里使用的MEMORY ID最明显的现象就是:你在选择画面上输入一个值后,该PARAMETER/SELECT-OPTIONS会将其设为默认值,当你退出程序再进入时,你会发现该PARAMETER/SELECT-OPTIONS保留了你上一次输入的值。
1.引用类型z_ref数据对象myref在程序中的声明方式:DATA myref TYPE z_ref.CREATE DATA myref TYPE z_ref.2.参照数据字典中的表类型生成内表对象或结构体:DATA mytable TYPE z_table,‖数据字典表类型,声明内表.myline TYPE LINE OF z_table.‖表类型的行结构,声明结构体.3.取系统日期:SY-DATUM,4.取系统时间:SY-UZEIT.05.系统字段定位:SY-FDPOS.字符比较结果为真时,此字段将给出偏移量信息.6.系统字段SY-FDPOS给出字符的位置信息.(P109)7.系统字段SY-INDEX记录循环语句中的循环次数8.操作内表行结束后系统字段SY-TABIX返回该行索引.对于所有行操作,如果操作成功,系统变量SY-SUBRC返回0,否则返回非0值.9.系统用户名:SY-UNAME.10. SY-HOST?屏幕序号:sy-dynnr.11. OK代码:SY-UCOMM或SYST-UCOMM12.屏幕组ID:SY-DYNGR.13.常量声明:CONSTANT const(len) TYPE type|LIKE dobj [DECIMALS dec] [VALUE val].14.确定数据对象属性:DESCRIBE FIELD f [LENGTH l] [TYPE t [CONPONENTS n]] [OUTPUT-LENGTH o] [DECIMALS d] [EDIT MASK m] [HELP-ID h].15.数据赋值:MOVE source TO destination.或destination = source.16.设定初始值:CLEAR F.17.检查字段是否为初始值:f IS INITIAL….18.检查字段是否被分配:fs IS ASSIGNED…..19.检查过程中的参数是否被实参填充:p IS [SUPPLIED|REQUESTED]….20.检查数据对象的值是否属于某范围之间:f1 BETWEEN f2 AND f3…..21.检查数据对象f的内容是否遵从某个选择表的逻辑条件:f in seltab….22. WRITE: /10 g,‖在10个空格后输出变量g/(8) time using edit mask ‗__:__:__‘.‖输出的变量time保持8位的长度.23.将光标移动到下一行:SKIP.24.强制结束循环:EXIT,STOP或REJECT.25.循环的中止:CONTINUE无条件中止当前循环并开始下一轮循环,CHECK条件为真时循环,为假时结束本次循环并开始下一轮循环,EXIT无条件中止并退出整个循环.26.将字符串左移:SHIFT string.27.连接字符串:CONCATENATE s1 s2 …..sn INTO s_dest [SEP ARATED BY sep].如果结果出现被截断的情况,将SY-SUBRC返回4,否则返回0.符号&用于在字字符串换行时的连接.28.根据分隔符sep拆分字符串:SPLIT s_source AT sep INTO s1 s2 ……sn.使用内表操作可以避免被截断的情况:SPLIT s_source AT sep INTO TABLE itab.此语句根据子串数目生成n行的内表.29.循环输出内表的每一行数据:LOOP AT itab INTO text.ENDLOOP.30.替换字段内容:REPLACE str1 WITH str2 INTO s_dest [LENGTH len].字段SY-SUBRC的返回值为0时表示己成功替换.31.确定字段长度:[COMPUTE] n = STRLEN( str ).32.删除字符串中的多余空格:CONDENSE33.字符转换,如将ABC转换为abc:TRANSLATE34.创建一个可以排序的格式:CONVERT TEXT.35.用一个字符串覆盖另一个字符串:OVERLAY36. WRITE TO赋值时将忽略数据对象的类型,而将其视为字符类型数据.37.字符串比较中的换码字符:#,用于转换比较时使用的通配符:*或+.及进行区分大小写,空格的比较,如#A表示比较大写的A.38.定位操作子串:strName[+0][(1)].39.字段符号,数据引用:动态数据对象.40.子程序定义:FORM subroutine_name USING parameters1 parameters2…. ….ENDFORM.41.子程序调用:PERFORM subroutine_name USINGactual_parameters1 p2…. (其中USING可换成CHANGING)42. ULINE.输出下划线.43.错误查看:ST2244.程序打包release:SE01:找到对应的程序,点开后点上面小汽车,再选中上面的后再点小汽车.点check.程序修改后需要重新打包.45.制作T-CODE:SE93,TCODE应按顺序编号:ZMF+流水号,我的程序名46.创建table:t-code:se11,attributes:Delivery class:C.开发类别:ZFI,当自定义Field type时,名称需为Z+…..格式.->设置技术属性(Technical 创建function Setting):Logical storage parameters 中Data class:APPL1,Size category:4 group:SE80,创建好后将创建的TABLE挂接到function grouph上去:用se11查出table,点utilites->table maintenance generator:Authorization groups: &NC&,Function group中填刚才创建的功能组名称->onestep->overview screen中必须填未使用的number,此处screen number 与table是一一对应的关系,也可让点系统上面的按钮:find screen number 来自动搜索适合的scr. Number.->create,成功后,找到对应的function group中的screen number双击即可看到生成的代码.需要修改栏位名称可在function group中的element list或layout中.-->se93创建t-code,start object选transaction with parameters(parameter transaction)->default valuesfor->transantion:SM30->Default Values->name of screen field:viewname\update,value:table name\X.47. field-sign:,field—option:,field-low:表示选择条件中起始值48.在where子句中如果只有一个表的话,可以不用指定表名.49.获取用户IP地址及用户名:call function 'TH_USER_INFO' " Get user IP,hostnameimportinghostaddr = iporg‖转化前的IP地址terminal = host‖电脑名exceptionsothers = 1."Conv.IP addr to format 'xxx.xxx.xxx.xxx'call function 'ZGJ_IPADR2STRING' "Conv.IP addrexportingipadr = iporg‖转化前的IP地址importingstring = ipdec.‖转化后的最终需要的IP地址50.删除内表中数据完全相同的行,只保留一行: delete adjacent duplicates from itab1 COMPARING <f1> <f2> / COMPARING ALL FIELDS.51. spro:后台设定52.输出选择框write:/ itab1-flag as checkbox第四章ABAP基础4.1.5程序运行1.程序内部调用,如下表:功能报表调用语句事务调用语句无返回调用SUBMIT LEAVE TO TRANSACTION调用并返回SUBMIT AND RETURN CALL TRANSACTION例:REPORT z_calling_program.START-OF-PROGRAM.WRITE ‗This program calls another program.‘.‖此内容在输出界面看不到SUBMIT z_simple_program.‖上面的输出被此程序覆盖.如果改用SUBMIT AND RETURN来调用则可以输出以上内容.2.结束程序:LEAVE PROGRAM.可在任意点强制结束当前运行的程序.4.1.6内存管理SAP程序同一个用户和系统可进行最多6个SAPGUI主会话.4.2.1数据定义TYPES:BEGIN OF t_staff,S_no(3) type n,Name(20),END OF t_staff.DATA staff TYPE t_staff.上例中定义了一个结构类型t_staff,并根据其声明了一个结构体对象staff. 数据类型中的扁平结构与纵深结构:扁平类型:运行时长度固定的类型.纵深类型:运行时长度可峦的类型.4.2.2 ABAP内置基本数据类型:数据类型默认大小有效大小初始值说明示例C 1 1-65535 SPACE文本字符(串) ‗name‘N 1 1-65535 ‘00…0‘数字文本‗0123‘T 6 6 ‗000000‘时间(HHMMSS) ‗123010‘D 8 8 ‗00000000‘日期(YYYYMMDD) ‗20080101‘I 4 4 0整型(整数) 99F 8 8 0浮点数5E+04P 8 1-16 0压缩数12.91X 1 1-65535X ‗0‘十六进制数‗3A‘String 1无限定SPACE字符串(长度可峦) ‗A String‘XString 1无限定SPACE十六进制字符串‗A3FF‘注意:1.其中C,N,T,D,I,F,P,X为定长类型,即在运行期间长度不能改变.2.类型T,D,I,F的数据存储长度是固定的,不能指定参照其生成的数据对象占用的内存字节数.3.基于类型C,N,P,X生成的数据对象需要在声明时指定其长度.否则取默认值.4.如果在声明一个数据对象时未指明其数据类型,则该数据默认为C类型.5.类型I的数值范围:-231到231-1的整数.如果运算时出现非整型结果则进行四舍五入取值.而不是截断小数.6.类型P用于声明小数位固定的压缩数,其占据内存字节数和数值范围取决于定义时指定的整个数据的大小和小数点后位数,如果不指定小数位,则将其视为I类型数据.有效大小可以是从1~16字节的任意值,小数点后最多允许14个数字.7,类型F为浮点数,浮点意思是数字在内存中以字节形式表示,数值范围:1*10-307到1*10308,因系统将F类型转换为二进制数,所以可能出现舍入误差,若用户要求较高精度且数值较大时,应使用P类型数据.8.长度可峦的内置类型String, XString是通过引用实际动态的数据对象的固定内存地址来操作.4.2.3程序内部数据定义参照自定义类型或内置类型生成数据的语法格式:TYPES|DATA …TYPE l_type…参照程序中已经声明的数据对象生成新数据语法:TYPES|DATA …LIKE dobj…3.结构类型和结构体参照结构类型生成的数据对象称为结构体.TYPES|DATA:BEGIN OF structure.k1 [TYPE type |LIKE dobj]…,k2 [TYPE type |LIKE dobj]…,…kn [TYPE type |LIKE dobj]…,END OF structure.参照生成:参照结构生成:TYPES|DATA structure TYPE str_type |LIKEstr_dobj...参照数据库表生成:TYPES|DATA structure TYPE dbtab.4.表类型和内表表类型的对象称为内表.4.2.4数据字典中的类型数据元素(Data elements),相当于ABAP中的基本类型和引用类型. 结构(Structures),由数据元素字段构成,对应ABAP中的结构类型. 表类型(Table types),对应ABAP中的表类型.数据字典中的数据类型与ABAP中的中数据类型对应关系:数据字典类型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)DECIMAL m 1~17货币金额DATS D(8) 8日期DEC n,m P((n+1)/2)DECIMAL m 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)DECIMAL m 1~17数量RAW n X(n) 1~255位字串TIMS T(6) 6时间VARC n C(n) 255~最大值长字符(仅V3.0前可用)STRING STRING 1~最大值字符串RAWSTRING XSTRING 1~最大值位字符串UNIT C(n) 2~3单位4.2.5程序中的数据对象1.文字对象当字符文字长度超过编辑器的一行时,可以使用‖&‖进行连接,避免因换行而产生的多余空格,如:long = ‗This is ‗&‗a long sentence‘.如果需要输出―‘‖,则需要在前面多加一个―‘‖转回愿意.2.有名称的数据对象常量声明:CONSTANT: const(len) TYPE|LIKE dobj [DECIMALS dec] VALUE val. 结构体常量声明(每个组件必须指定初始值):CONSTANT:BEGIN OF structure,str1 TYPE|LIKE dobj [DECIMALS dec] VALUE val,str2 TYPE|LIKE dobj [DECIMALS dec] VALUE val,...,strn TYPE|LIKE dobj [DECIMALS dec] VALUE val,END OF structure.3.系统数据对象(见附表)4.查明数据对象属性DESCRIBE FIELD f LENGTH len.此语句将字段f的长度写入变量len. LENGTH:确定数据对象长度.TYPE:确定数据对象类型.OUTPUT-LENGTH:确定实际输出长度.DECIMALS:确定P类型小数位长.EDIT MASK:确定在数据字典中定义转换例程.HELP-ID:确定在数据字典中定义的F1帮助信息.4.3基本数据操作4.3.1数据赋值MOVE source TO incept.等介于:incept = source.CLEAR dobj.将数据对象dobj还原为初始值.结构体间赋值:struct2 = struct1.(组件结构相同).MOVE-CORRESPONDING struct1 TO struct2.(部分组件结构相同).4.3.2类型转换(见附表).4.3.3数值运算1.算术运算运算数学表达式语句关键字语句加法n = x + y. ADD y TO x.减法n = x – y. SUBTRACT y FROM x.乘法n = x * y. MULTIPLY x BY y.除法n = x / y. DIVIDE x BY y.整除n = x DIV y.无取余n = x MOD y.无幂(乘方) n = x ** y.无两个结构体的同名字段之间可以整体进行算术运算:ADD-CORRESPONDING struct1 TO struct2.SUBTRACT-CORRESPONDING struct1 FROM struct2.MULTIPLY-CORRESPONDING struct2 BY struct1.DIVIDE-CORRESPONDING struct2 BY struct1.以上将对两个结构体中的同名字段进行相应运算(非数值类型数据会引起错误).2.数学函数任意类型参数的函数列表:函数名说明ABS( dobj )返回参数绝对值SIGN( dobj )返回参数符号:正数返回1,0返回0,负数返回-1.TRUNC( dobj )返回参数的整数部分FRAC( dobj )返回参数的小数部分CEIL( dobj )返回不小于输入参数的最小整数值FLOOR( dobj )返回不大于输入参数的最大整数值注意:函数名与左括号间不能有空格,括号与参数间必须有空格.F类型参数的函数列表(其它类型参数将首先被转换为F类型).函数名说明COS,SIN,TAN三角函数ACOS,ASIN,ATAN反三角函数COSH,SINH,TANH双曲函数EXP底数为e(2.7182818285)的幂函数LOG底数为e的自然对数LOG10底数为10的对数SQRT平方根4.3.4数据输出输出格式化选项:选项应用类型说明LEFT-JUSTIFIED所有类型左对齐CENTERED所有类型居中RIGHT-JUSTIFIED所有类型右对齐UNDER g所有类型输出直接开始于字段gNO-GAP所有类型忽略输出时字段后的一位空格USING EDIT MASK m所有类型指定数据字典中定义的格式模板mUSING NO EDIT MASK所有类型撤消对格式模板的激活NO-ZERO所有类型用空格替代所有有前导零NO-SIGN数值类型不输出前导符号DECIMALS d数值类型输出d定义小数点后的数字位数,如需截断,则四舍五入EXPONENT e数值类型对F类型字段在e>定义幂指数ROUND r数值类型用10的负r次方乘P类型字段,然后取整CURRENCY c数值类型按系统表格TCURX中定义的格式将货币c格式化DD/MM/YY|MM/DD/YY时间日期格式调整,‖/‖为用户主记录中定义的分隔符DD/MM/YYYY,...(同上)时间日期格式调整,‖/‖为用户主记录中定义的分隔符DDMMYY...(同上)时间日期格式调整,无分隔符注:用户主记录System->User profile->Own data(SU01).4.3.5逻辑表达式通用逻辑表达式列表:运算符意义EQ或=等于NE或<>或><不等于LT或<小于LE或<=小于等于GT或>大于GE或>=大于等于3.IS操作符...f IS INITIAL...:检查字段f是否为初始值....fs IS ASSIGNED...:检查字段符号是否被分配....p IS [SUPPLIED|REQUESTED]...:检查过程中的参数是否被实参填充.4.BETWEEN操作符...f1 BETWEEN f2 AND f3...:检查数据对象的值是否属于特定范围之间.5.IN操作符(P110)...f IN seltab...:检查一个数据对象的内容是否遵从某个选择表的逻辑条件.6.组合逻辑表达式AND:与.OR:或.NOT:非.注:括号与操作数间至少要有一个空格,如:IF ( c > n ) AND ( c < f ).4.4结构控制程序代码分三种结构:顺序结构:语句逐行执行.分支结构:根据不同的条件执行不同语句块.循环结构:反复执行某个语句.4.4.1分支控制1.IF/ENDIF结构:IF <condition1>.<statement block>ELSEIF <condition2>.<statement block>......ELSE.<statement block>ENDIF.注:可嵌套.2.CASE/ENDCASE结构:CASE f.WHEN f11 [OR f12 OR ...].<statement block>......[WHEN OTHERS.]<statement block>ENDCASE.其中,f为变量,fij可以是变量或者固定值.4.4.2循环控制1.无条件循环DO [n TIMES].<statement block>ENDDO.说明:n为循环次数,可以是文字或变量,如果没有限定n值,则必须用EXIT,STOP或REJECT等语句强制结束循环.DO循环可嵌套,SY-INDEX为当前循环次数.2.条件循环WHILE <condition>.<statement block>ENDWHILE.注:可嵌套,其它同上.3.循环中止CONTINUE:无条件中止当前本轮循环,开始下一轮循环.CHECK:条件中止当前本轮循环(条件为假时),开始下一轮循环.EXIT:无条件完全中止当前循环,继续循环结束语句(ENDDO,ENDWHILE等)后面的代码,如果在嵌套循环中,系统仅退出当前循环.4.5处理字符数据4.5.1字符数据1.连接字符串CONCATENATE s1 s2 ... sn INTO s_dest [SEPARATED BY sep]. 注:所有字串操作将忽略s1....sn中的尾部空格(如需保留空格,可使用指定偏移量).如果出现截断情况,将SY-SUBRC设为4,否则返回0.2.拆分字符串SPLIT s_source AT sep INTO s1 s2 ... sn.如果所有子串足够长且不必截断任何部分,则将SY-SUBRC设为0,否则返回4, 如果源字符串能够拆分的子串多过指定的数目,则源子串最后的剩余部分包括其后的分隔符都将写入最后一个子串,要避免这种情况,需要使用内表进行操作: SPLIT s_source AT sep INTO TABLE itab.在该形式中,根据子串数目生成n行的内表.例如:DATA:text type string,itab TYPE TABLE OF string.text = ‗ABAP is a programming language‘.SPLIT text AT space INTO TABLE itab.LOOP AT itab INTO text.WRITE / text.ENDLOOP.3.查找子串模式SEARCH c FOR str.在字段c中查找字符串str.如果找到,则将SY-SUBRC 返回0,SY-FDPOS返回字段c中该字符串的位置(从左算起的字节偏移量),否则SY-SUBRC返回4,查找模式有以下几种:str搜索str并忽略尾部空格..str.搜索str,但不忽略尾部空格.*str搜索以str结尾的单词.str*搜索以str开始的单词.REPORT z_string_search.DATA string(30) TYPE c VALUE 'This is a testing sentence.'. WRITE: / 'searched','sy-subrc','sy-fdpos'.SEARCH string FOR 'X'.WRITE: / 'X', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.SEARCH string FOR 'itt '.WRITE: / 'itt ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER 'sy-fdpos'.SEARCH string FOR '.e.'.WRITE: / '.e.', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.SEARCH string FOR '*e '.WRITE: / '*e ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.SEARCH string FOR 's* '.WRITE: / 's* ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.输出结果如下:searched sy-subrc sy-fdposX 4 0itt 4 0.e . 4 0*e 0 18s* 0 184.替换字段内容.REPLACE str1 WITH str2 INTO s_dest [LENGTH len].搜索s_dest 中前len个字符中的子串str1,用str2来替换它,如果成功,SY-SUBRC返回0,否则还回非0值.REPORT z_replace.DATA name TYPE string.name = 'Michael-Cheong'.WHILE sy-subrc = 0.REPLACE '-' WITH ' ' INTO name.ENDWHILE.WRITE / name.输出结果: Michael Cheong5.确定字段长度n = STRLEN( str ).函数将str作为字符数据类型处理,不考虑其实际类型,也不进行转换.计算其首字符到最后一个非空字符的长度,不包括结尾空格.6.其它操作语句SHIFT:将字符串整体或子串进行位移.CONDENSE:删除字符串中的多余空格.TRANSLATE:字符转换,如将ABC转换为abc.CONVERT TEXT:创建一个可以排序的格式.OVERLAY:用一个字符串覆盖另一个字符串.4.5.2字符数据比较(用于判断两个字串之间的包含关系):运算符含义s1 CO s2如果s1仅包含s2中的字符,逻辑表达式为真s1 CN s2如果s1还包含s2之外的字符,逻辑表达式为真s1 CA s2如果s1包含任何一个s2中的字符,逻辑表达式为真s1 NA s2如果s1不包含s2的任何字符,逻辑表达式为真s1 CS s2如果s1包含字符串s2,逻辑表达式为真s1 NS s2如果s1不包含字符串s2,逻辑表达式为真s1 CP s2如果s1包含模式s2,逻辑表达式为真s1 NP s2如果s1不包含模式s2,逻辑表达式为真注:CO,CN,CA,NA比较时区分大小写,且尾部空格也在比较范围之内,CS,NS,CP,NP比较时忽略尾部空格且不区分大小写,比较结束后,如果结果为真,SY-FDPOS将给出s2在s1中的偏移量信息.模式表示可以使用通配符,‖*‖用于替代任何字符串,‖+‖用于替代单个字符.换码字符使用:指定大小写(如#A,#b).通配符‖*‖(输入#*),将其转回原义.通配符‖+‖(输入#+),将其转回原义.换码符本身‖#‖(输入##),将其转回原义.字符串结尾空格(输入#__),指定比较结尾空格.4.5.3定位操作子串str[+position][(len)].从字符串str中的position位开始取出长度为len的子串.可动态指定偏移量及长度的情况(即position及len可为变量):用MOVE语句或赋值运算符给字段赋值时.用WRITE TO语句向字段写入值时.用ASSIGN将字段分配给字段符号时.用PERFORM将数据传送给子程序时.off = 6.len = 2.date+off(len) = ‗01‘.4.6使用内表types定义的并不是结构体对象,只是结构类型,不能作为工作区,当定义的内表没有表头行(工作区)时,必须为其定义一个结构体作为工作区,否则无法使用此内表.如果没有给内表定义工作区,则在定义内表时必须声明表头行(with header line).DATA:BEGIN OF line, "work area(structure)结构类型且结构体对象 num TYPE i,sqr TYPE i,END OF line,"无表头行内表,内表定义都使用data关键字.itab TYPE(LIKE) STANDARD TABLE OF line WITH KEY table_line. DATA DIRTAB LIKE CDIR OCCURS 10 WITH HEADER LINE.定义标准内表DO 5 TIMES.line-num = sy-index.line-sqr = sy-index ** 2.APPEND line TO itab.ENDDO.LOOP AT itab INTO line.WRITE:/ line-num,line-sqr.ENDLOOP.CLEAR itab.注:1.TYPES与DATA区别:TYPES是用来定义某种类(型)的,需(用DATA语句)实例化以后才可以使用,而DATA是用来定义数据对象(实例变量)的,对于用DATA直接定义的结构体对象(不参照其它结构类型),其同时也是一个结构类型.2.TYPE与LIKE区别:TYPE后面跟随的只能是某种类(型),而LIKE后面可以跟随类型或实例对象,参照结构体对象生成内表时只能用LIKE,不能用TYPE,因为结构体对象不是类型,只是一种实例对象,参照结构类型生成内表时可以用LIKE也可以用TYPE.其中通过LIKE定义的内表直接拥有参照结构类型的元素结构,而通过TYPE定义的内表只能间接拥有被参照结构类型的元素结构,结构类型不能作为内表的工作区,只有结构体对象才可以.内表定义语法:1.标准表:可指定或不指定关键字,可重复.逻辑索引,操作数据时数据内存位置不峦,系统只重排数据行的索引值.DATA itab TYPE|LIKE [STANDARD] TABLE OF structure [WITH KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n].2.排序表:可指定唯一或不唯一的关键字,也可不指定,逻辑索引,按关键字升序存储.DATA itab TYPE|LIKE SORTED TABLE OF structure [WITHNON-UNIQUE(UNIQUE) KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n].3.哈希表:必须指定唯一关键字.无索引DATA itab TYPE|LIKE HASHED TABLE OF structure WITH UNIQUE KEY comp1 ... compn(DEFAULT KEY) [WITH HEADER LINE INITIAL SIZE n].注:如果n值为0或不指定的话,程序会为内表对象分配8KB大小内存,所以,如果内表比较小,不要把该值设为0,以避免内存浪费.旧版标准表定义语法:DATA itab TYPE|LIKE [STANDARD] TABLE OF structure OCCURS n.或者DATA:BEGIN OF itab OCCURS n,...,fi...,END OF itab.动态创建内表:REPORT zmaschl_create_data_dynamic .TYPE-POOLS: slis.DATA: it_fcat TYPE slis_t_fieldcat_alv,is_fcat LIKE LINE OF it_fcat.DATA: it_fieldcat TYPE lvc_t_fcat,is_fieldcat LIKE LINE OF it_fieldcat.DATA: new_table TYPE REF TO data.DATA: new_line TYPE REF TO data.FIELD-SYMBOLS: <l_table> TYPE ANY TABLE,<l_line> TYPE ANY,<l_field> TYPE ANY.* Build fieldcatCALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'EXPORTINGi_structure_name = 'SYST'CHANGINGct_fieldcat = it_fcat[].LOOP AT it_fcat INTO is_fcat WHERE NOT reptext_ddic IS initial.MOVE-CORRESPONDING is_fcat TO is_fieldcat.is_fieldcat-fieldname = is_fcat-fieldname.is_fieldcat-ref_field = is_fcat-fieldname.is_fieldcat-ref_table = is_fcat-ref_tabname.APPEND is_fieldcat TO it_fieldcat.ENDLOOP.* Create a new TableCALL METHOD cl_alv_table_create=>create_dynamic_tableEXPORTINGit_fieldcatalog = it_fieldcatIMPORTINGep_table = new_table.* Create a new Line with the same structure of the table. ASSIGN new_table->* TO <l_table>.CREATE DATA new_line LIKE LINE OF <l_table>.ASSIGN new_line->* TO <l_line>.* Test it...DO 30 TIMES.ASSIGN COMPONENT 'SUBRC' OF STRUCTURE <l_line> TO <l_field>.<l_field> = sy-index.INSERT <l_line> INTO TABLE <l_table>.ENDDO.LOOP AT <l_table> ASSIGNING <l_line>.ASSIGN COMPONENT 'SUBRC' OF STRUCTURE <l_line> TO <l_field>.WRITE <l_field>.ENDLOOP.4.6.2操作内表行标准表排序表哈希表索引访问允许允许不允许关键字访问允许允许允许相同值关键字行可重复可重复或不可重复不可重复推荐访问方式主要通过索引主要通过关键字只能通过关键字注:CLEAR itab[].表示操作的是内表对象.而CLEAR itab.当itab有表头行时表示操作表头行,如无表头行时表示操作内表对象.当一个操作语句结束后,SY-TABIX返回该行的索引值,对于所有行操作,如果访问成功,SY-SUBRC返回0,否则返回非0值.4.插入行—INSERTINSERT structure INTO itab INDEX idx.无表头行索引表,itab的行数应大于或等于idx-1.否则失败INSERT itab INDEX idx.有表头行索引表.对于哈希表,系统按关键字将新行插入特定位置.INSERT structure INTO|INITIAL LINE INTO TABLE itab.此语句对于标准表来说与append效果相同,对于排序表来说,插入的行不可以打乱按照关键字排序的顺序,否则插入不成功,对于哈希表来说,插入过程中系统按照关键字对行进行定位.INITIAL关键字是用于向内表中插入结构中各类型的初始值的.INSERT LINES OF itab1 [FROM n1] [TO n2] INTO [TABLE] itab2 [INDEX idx].将内表中部分或全部数据行整体插入到另一内表中,指定行数时itab1,itab2必须为索引表,指定TABLE关键字时,itab2可以是任意内表.此方式比其它方式快20倍左右.5.附加行—APPEND(只能操作索引表)APPEND [structure TO|INITIAL LINE TO] itab.APPEND LINES OF itab1 [FORM n1] [TO n2] TO itab2.6.聚集附加—COLLECTCOLLECT line INTO itab.对于需要附加的数据,如果在内表中存在关键字内容与其相同的数据行,则此语句将需要附加的数据累加到内表中的这一行上,而不会另外再添加一行,操作成功后,SY-TABIX返回被处理过的行的索引. 注:关键字以外的所有字段必须是数字类型7.读取行—READ(可用于任何类型内表)READ TABLE itab [INTO wa|ASSIGNING <fs>] INDEX idx.通过索引读取内表中的单行数据. ASSIGNING表表示指派给字段符号.READ TABLE itab FROM structure [INTO wa|ASSIGNING <fs>].读取与结构相同的工作区中的关键字内容全部相同的内表数据.READ TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2 [INTO wa|ASSIGNING <fs>].指定所有关键字值,并读取相等时内表行.READ TABLE itab WITH KEY field1 = v1 ... field2 = v2 [INTO wa|ASSIGNING <fs>].读取内表中字段fieldn(不一定是表关键字段)与值vn相同时的内表行.8.修改行—MODIFYMODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1 f2 ...].如果内表包含的行数少于idx,则不更改任何行.MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2 ...].根据工作区wa中关键字修改内表行, TRANSPORTING表示修改指定字段值.MODIFY itab FROM wa TRANSPORTING f1 f2 ... WHERE condition.修改符合WHERE子句中条件的内表中的指定字段值.9.删除行—DELETEDELETE itab INDEX idx.根据索引删除内表行.DELETE TABLE itab FROM wa.根据工作区关键字删除行.DELETE TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2.根据指定关键字值删除行.DELETE itab [FROM n1] [TO n2] [WHERE <condition>].10.循环处理--LOOPLOOP AT itab [INTO wa] [FROM n1] [TO n2] [WHERE condition]. <statement block>.ENDLOOP.4.6.3操作整个内表1.排序SORT itab [ASCENDING|DESCENDING] [AS TEXT] [STABLE][BY f1 [ASCENDING|DESCENDING] [AS TEXT]......f1 [ASCENDING|DESCENDING] [AS TEXT]]说明:ASCENDING|DESCENDING:升序或降序.默认升序.AS TEXT:根据当前语言按字母顺序排序字符字段,否则按字符平台相关内部编码进行排序.STABLE:保持排序前后不需要改变的数据行的相对顺序.2.控制级操作(用于总计,缩进,格式控制等)AT FIRST|LAST|NEW f|END OF f.<statement block>ENDAT.说明:FIRST:当循环为内表的第一行时,执行语句块中语句.在工作区中,系统用*填充所有关键字内容.LAST:当循环为内表的最后一行时,执行语句块中语句.在工作区中,系统用*填充所有关键字内容.NEW f:字段f前面(即左边)的全部字段内容之一不同于上一行时,执行语句块中语句.在工作区中,系统用*填充f后面所有关键字内容.END OF f:如果下一行行组中的任何字段内容不同于上一行,执行语句块中语句.在工作区中,系统用*填充f后面所有关键字内容.注:在控制级操作期间,在工作区中,对于非标准关键字段,将全部进行初始化,在执行完控制操作后(即ENDAT语句后)工作区中的数据将全部还原到进入控制级操作语句前(即进入AT前)状态.3.初始化内表CLEAR itab.:带表头行时只清空表头行,不带表头行时清空整个内表.CLEAR itab[].:只清空整个内表对象数据.不清空表头行.REFRESH itab或REFRESH itab[].:只清空整个内表对象数据.不清空表头行.FREE itab.或FREE itab[].:只清空整个内表对象数据.不清空表头行,同时释放内存.......itab IS INITIAL....:检查内表是否为空.4.整体复制内表MOVE itab1 TO itab2.:如果两表都存在表头行,则此语句只复制了表头行. MOVE itab1[] TO itab2[].:指定表体复制.MOVE itab1[] TO itab2.:表itab2无表头行时才成立.itab2 = itab1.同上1itab2[] = itab1[].同上2itab2 = itab1[].同上35.比较内表大小... itab1 <operator> itab2...:其中<operator>可以为=,<>,><,>=,<=,>,<等.4.6.4Extract DatasetsFIELD-GROUP fg.行结构分配.INSERT f1 f2 ... INTO fg.生成字段组fg的具体字段结构.EXTRACT fg.将字段组填充给EXTRACT.SORT.排序.LOOP. <statement block> ENDLOOP.循环输出EXTRACT.4.7动态数据对象4.7.1字段符号FIELD-SYMBOLS <fs> [TYPE type|LIKE dobj].声明字段符号.ASSIGN f TO <fs>.静态分配数据对象给字段符号.ASSIGN f[+i] [(j)] TO <fs>.指定偏移量和长度.ASSIGN (f) TO <fs>.动态分配,先找到字段f的内容,然后将该内容分配给<fs>.4.7.2数据引用TYPES t_dref TYPE REF TO DATA.DATA dref TYPE REF TO DATA.4.8模块化技术4.8.2子程序1.定义:FORM subr [[USING [VALUE(p1)]... ] [TYPE t|LIKE f]...] [TYPE ANY][CHANGING [VALUE(p1)] ... ] [TYPE t|LIKE f]...] [TYPE ANY]. <subr codes>ENDFORM.注:VALUE参数表未示值传递,此方式在子程序调用后实参的值不会被改变.无VALUE参数时表示引用传递,会改变实参的值.USING与CHANGING无任何区别.位于两个子程序间的代码不属于任何事件块.参数传递时不存在类型转换,要求必须兼容.2.调用:PERFORM subr [USING p1 ... pn] [CHANGING pi ... pj].4.8.3功能模块(p153)4.8.5源代码复用1.包含程序。
ABAP基础ABAP简介ABAP语言也称作ABAP/4,它的全称是Advanced Business Application Programming - 4 th generation LanguageABAP是SAP的支柱所有的R/3应用程序和部分的Basis 系统都是用ABAP语言开发的数据字典编辑器函数库SAP事务码ABAP字典在商业应用软件开发时,部分实际世界必须被描述成数据形式。
商业应用软件的作用在于接收业务数据,并将其用一定的形式储存起来。
这些业务数据在储存后,还可以随时读取出来,再次利用。
例如:财务人员向SAP系统中输入会计凭证,保存之后还可以随时把凭证调出来查看。
无论是接收数据、储存数据、读取数据、使用数据,其核心都是数据。
在SAP R/3系统中,基本上所有的数据都是存在数据库表里面的。
数据库表,以及与其相关的视图、结构等构成了ABAP字典ABAP字典SE11ABAP字典所包含的要素表(Table)视图(View)结构(Structure)数据元素(Data Element)域(Domain)表类型(Table Type)搜索帮助(Search Help)锁对象(Lock Object)ABAP字典-表:SAP R/3 中看到的表并不是真正在数据库中物理上储存数据的表。
SAP中的表和数据库中的物理表是对应起来的。
ABAP 字典中的表分为3种透明表(Transparent Table)和数据库中的物理表一一对应,在SAP中激活透明表时,会在数据库中创建一个同名的物理表。
我们用到的绝大多数表都是透明表。
簇表(Cluster Table)大,多个簇表存在一个物理表中。
无索引共享表(Pooled Table)小,多个共享表存在一个物理表中。
无索引ABAP字典-视图ABAP 字典中的视图分为4种数据库视图投影视图维护视图直接向数据库表中维护数据帮助视图对表中内容进行筛选,用来提供搜索帮助ABAP字典–数据元素和域数据元素(Data Element)域(Domain)在SAP字典中,数据库表是有一个一个的字段组成的,每一个字段代表着一个需要储存的现实中的数据。
ABAP内表用法小结第一篇:ABAP 内表用法小结ABAP 内表用法小结ABAP中的内表相当于其他程序设计语言中的二维数组,存储多行结构相同的数据不同于二维数组,内表在创建后,列结构与列数是固定不变的,而行数是动态增长的内表支持循环对每行数据进行操作,也支持整体操作内表是具有行和列的表结构,然而,不同于数据库表,内表仅在程序运行期间在内存中存储数据ABAP中有三种内表类型:标准表,哈希表,排序表– ABAP内表数据类型内表数据对象是实际的内表,可以用数据进行填充内表数据类型是用于定义内表数据对象的抽象数据类型(ADT)可以使用的内表数据类型有: Structure 数据库表用户自定义数据类型–ABAP内表声明 1> TYPES: BEGIN OF line, field1 TYPE i, field2 TYPE i, END OF line.* 声明一个数据类型DATA: ITAB_WA TYPE(LIKE)line.“声明一个内表工作区DATA: ITAB TYPE(LIKE)line OCCURS 0.“声明一个无工作区的内表 DATA: ITAB TYPE(LIKE)STANDARD TABLE OF line INITIAL SIZE 0.“声明一个有工作区的内表 DATA: ITAB TYPE(LIKE)line OCCURS 0 WITH HEADER LINE.DATA: ITAB TYPE(LIKE)STANDARD TABLE OF line INITIAL SIZE 0 WITH HEADER LINE.2> DATA: BEGIN OF line, field1 TYPE i, field2 TYPE i, END OF line.* 声明一个line对象,该对象可以作为工作区使用* 用DATA定义的line本身也是一个结构类型,也可再声明一个工作区DATA: ITAB_WA TYPE(LIKE)line.“声明一个工作区DATA: ITAB TYPE(LIKE)line OCCURS 0 WITH HEADER LINE.“声明一个带工作区的内表DATA: ITAB TYPE(LIKE)STANDARD TABLE OF line INITIAL SIZE0 WITH HEADER LINE.“声明一个带工作区的内表 3>直接定义内表,这个内表是有工作区的 DATA: BEGIN OF ITAB OCCURS 0 , CARR1 LIKE SPFLI-CARRID, CONN1 LIKE SPFLI-CONNID, END OF ITAB.* DATA: ITAB1 TYPE ITAB.(错误的,实践证明,定义出来的什么都不是)。
§. ABAP/4 DATA ELEMENT一.Data Type (數据類型)C: 字符(串), 長度為1, 最大有65535 BYTES, 初始值為: space,例: ‘M’;D: 日期, 格式為YYYYMMDD, 最大是’9999/12/31’ ,例:’1999/12/03’.F: 浮點數, 長度為8, 例如: 4.285714285714286E-01I: 整數范圍:-2^31 ~ 2^31-1N: 數值組成的字符串: 011, ‘302’.P: packed 數,用于小數點數值,例如: 12.00542;T: 時間, 格式為HHMMSS,例如: ’14:03:00’, ’21:30:39’.X: 16進制數, 例如‘1A03’.二.變數宣告變數宣告包含name, length, type, structure等,語法如下:DATA <F> [<length>] <type> [<value>] [<decimals>]其中: <f> :變數名稱,最長30個字元,不可含有+ , . , : ( ) 等字元;<length><type>:變數類型及長度;<value>:初值<decimals>:小數位數Example 1:DATA: COUNTER TYPE P DECIMALS 3.NAME (10) TYPE C V ALUE ‘Delta’.S_DATE TYPE D V ALUE ‘19991203’.Example 2:DATA: BEGIN OF PERSON,NAME(10) TYPE C,AGE TYPE I,WEIGHT TYPE P DECIMALS 2,END OF PERSON.另外,有關DATA宣告的指令還有: CONSTANTS(宣告常數)、STATICS(臨時變數宣告).三.系統專用變數說明系統內部專門創建了SYST這個STRUCTURE,里面的欄位存放系統變數,常用的系統變數有:SY-SUBRC : 系統執行某指令后,表示執行成功与否的變數,’0’表示成功SY-UNAME: 當前使用者登入SAP的USERNAME;SY-DATUM: 當前系統日期;SY-UZEIT: 當前系統時間;SY-TCODE: 當前執行程式的Transaction codeSY-INDEX : 當前LOOP循環過的次數SY-TABIX: 當前處理的是internal table 的第几筆SY-TMAXL: Internal table的總筆數SY-SROWS: 屏幕總行數;SY-SCOLS: 屏幕總列數;SY-MANDT: CLIENT NUMBERSY-VLINE: 畫豎線SY-ULINE: 畫橫線附注:1.SAP的全稱是: System Application Products in Data Processing;2.ABAP/4的全稱是:Advanced Business Application Programming;3.ABAP/4的路徑為:Tools → ABAP/4 WorkBench→ABPA/4 Editor ;4.ABAP/4每條語句以句號結束;5.ABAP/4中象= ,>, <,+,-,*,/等符號左右都需要有至少一個空格;6.整行注釋用’*’號, 注釋本行后面部分用’”’號;§OUTPUTTING DATA TO SCREEN一. WRITE 語句ABAP/4用來在屏幕上輸出資料的指令是WRITE指令,例如:WRITE: ‘USER NAME IS:’, SY-UNAME.二. 指定屏幕輸出位置指定輸出位置的語句格式為:WRITE: [AT] [ / ] [<pos>] [(<len>)] 資料項[<par>]其中: / : 在下一行輸出<pos>: 指定輸出的行號;(<len>):指定輸出位數(長度)<par>: 指定顯示格式參數,參數有:LEFT-JUSTIFIED 資料靠左對齊CENTERED 資料靠中間對齊RIGHT-JUSTIFIED 資料靠右對齊UNDER <g> 正對在資料項<g>的下面顯示NO-GAP 緊接著顯示,不留空格USING EDIT MASK <m>: 使用內嵌子元顯示, 如12:03:20USING NO EDIT MASK: 不使用內嵌子元NO-ZERO: 數字前面0 的部分不顯示NO-SIGN: 不顯示正負號DECIMALS <d>: 顯示<d> 位小數EXPOENT <e>: F(浮點數)指數的值ROUND <r>: 四舍五入至小數點后<r>位CURRENCY <c>: 幣別顯示DD/MM/YY : 日期顯示格式MM/DD/YY:YY/MM/DD:YY/DD/MMMM/DD/YYYY:DD/MM/YYYYYYYY/MM/DD:YYYY/DD/MM:例如1: WRITE: /10(6) ‘ABCDEFGHIJK’.輸出結果為: ABCDEF例如2: DA TA: X TYPE I VALUE ’11:20:30’,A(5) TYPE C VALUE ‘AB CDE’.WRITE: / X USING EDIT MASK ‘__:__:__’.WRITE: / X USING EDIT MASK ‘$___,___’.WRITE: / Y NO-GAP.輸出結果為:11:20:30$112,030ABCDEF四.顯示圖示:語法: WRITE: <symbol-name> AS SYMBOL.WRITE: <icon-name> AS ICON.例如: INCLUDE <SYMBOL>.INCLUDE <ICON>.WRITE: / ‘Phone symbol:’, SYM_PHONE AS SYMBOL.WRITE: / ‘Alarm Icon:’, ICON_VOICE_OUTPUT AS ICON.要查看系統所提供有那些符號及圖示,可選擇’EDIT’下的’Insert Statement’,選擇’Write’,接下來選擇要查看的群組,如SYMBOL 或ICON, 接下來按’Display’即可.§INTERNAL TABLE一.Internal Table 的宣告ABAP/4中的Internal Table是一种Data Structure,類似于其他語言中的STRUTURE,它可以由几個不同類型的欄位(field)組成,用來表示具有不同屬性的某一事物,單獨一筆資料表示某個事物,多筆資料表示具有相同屬性的多個事物.例如:為了存取或記錄某班的同學資料,我們創建如下的internal table:DATA: BEGIN OF STUDENT OCCURS 20,STD_ID TYPE N,NAME(10) TYPE C,AGE TYPE I,BIRTH TYPE D,SCORE TYPE P DECIMALS 2,END OF STUDENT.此時我們已經創建了名叫STUDENT的internal table,并且為它預先申請了能夠存放20筆資料的Buffer(當然,如果存取資料不止20筆,程式執行時,會自動申請系統Buffer)Internal table 的定義有以下几种格式:格式一. DATA: BEGIN OF <internal table> OCCURS <n>,<field 1> TYPE <type1>,[<field 2> TYPE <type 2>,<field 3> TYPE <type 3>,…]END OF <internal table>.格式二. TYPES: BEGIN OF <work area>,<field 1> TYPE <type1>,[<field 2> TYPE <type 2>,<field 3> TYPE <type 3>,…]END OF <work area>.TYPES <internal table> TYPE <work area> OCCURS <n>.格式三. DATA: BEGIN OF <work area>.INCLUDE STRUCTURE <table name>.DATA: END OF <work area>.DATA: <internal table> LIKE <work area> OCCURS <n>.二.APPEND LINE格式: APPEND [<work area> TO ] <internal table>.舉例一. (使用work area)DATA: BEGIN OF LINE,COL1 TYPE I,COL2 TYPE I,END OF LINE.DATA ITAB LIKE LINE OCCURS 10.DO 2 TIMES.LINE-COL1 = SY-INDEX.LINE-COL2 = SY-INDEX ** 2.APPEND LINE TO ITAB.ENDDO.LOOP AT ITAB INTO LINE.WRITE: / LINE-COL1, LINE-COL2.ENDLOOP.執行結果為:1 12 4舉例二. (不使用work area)DATA: BEGIN OF ITAB OCCURS 10,COL1 TYPE I,COL2 TYPE I,END OF ITAB.DO 2 TIMES.ITAB-COL1 = SY-INDEX.ITAB-COL2 = SY-INDEX ** 2.APPEND ITAB.ENDDO.LOOP AT ITAB.WRITE: / ITAB-COL1, ITAB-COL2.ENDLOOP.執行結果与舉例一相同.舉例三. (加入另一個Internal table的元素)格式: APPEND LINES OF <itab1> [FROM <n1> ] [TO <n2>] TO <itab2>.將<itab1>的元素加入至<itab2>中,可選取自<n1>至<n2>的范圍.APPEND LINES OF ITAB TO JTAB.三.COLLECT LINECOLLECT 指令也是將元素加入Internal table中,与APPEND 的區別是: COLLECT指令在非數值欄位相同的情況下,將數值欄位匯總.格式: COLLECT [<work area> INTO ] <itab>DATA: BEGIN OF ITAB OCCURS 3,COL1(3) TYPE C,COL2 TYPE I,END OF ITAB.ITAB-COL1 = ‘ABC’. ITAB-COL2 = 10.COLLECT ITAB.ITAB-COL1 = ‘XYZ’. ITAB-COL2 = 20.COLLECT ITAB.ITAB-COL1 = ‘ABC’. ITAB-COL2 = 80.COLLECT ITAB.此時, internal table中放的是2筆數据, 分別為:ITAB-COL1 ITAB-COL2‘ABC’90‘XYZ’20四.INSERT LINE將元素插入在指定的internal table位置之前.格式: INSERT [<wa> INTO] [INITIAL LINE INTO ] <itab> [INDEX <idx>] 或者: INSER T LINES OF <itab1> [FROM <n1> T O <n2>] INTO <itab2> INDEX <idx>其中: <wa>即work area,工作區中的元素.[INITIAL LINE INTO] :插入一筆初始化的記錄.<itab>: internal table[INDEX <idx>]: internal table 的記錄號.(新加入的元素放在此記錄前面) 五.讀取internal table格式一:LOOP A T <itab> [INTO <wa>][FROM <n1> TO <n2>][WHERE <conditions>] <statement>ENDLOOP.格式二:READ TABLE <itab> [INTO <wa>] [INDEX <idx> / WITH KEY <conditions>]舉例. (格式二)DA TA: BEGIN OF ITAB OCCURS 10,COL1 TYPE I,COL2 TYPE I,END OF ITAB.DO 10 TIMES.ITAB-COL1 = SY-INDEX.ITAB-COL2 = SY-INDEX * 2.APPEND IT AB.ENDDO.READ TABLE IT AB INDEX 3.(或者: READ TABLE IT AB WITH KEY COL1 = 3.)WRITE: / ‘ITAB-COL1 = ‘, ITAB-COL1, ‘IT AB-COL2 = ‘, ITAB-COL2.執行結果同樣是:ITAB-COL1 = 3ITAB-COL2 = 6.六.修改internal table 中的值格式: MODIFY<itab> [FROM <wa>][INDEX <idx>][TRANSPORTING <f1><f2>…][WHERE <conditions>]舉例一. READ TABLE ITAB INDEX 3.LINE-COL1 = 29.MODIFY ITAB FROM LINE TRANSPORTING COL1.將第三筆記錄的COL1欄位的值修改為29.舉例二. T_SALARY– salary = 50.MODIFY T_SA LARY TRANSPORTING salary WHERE birthday = ‘1999/12/06’.七.DELETE internal table中的欄位格式: DELETE <itab> INDEX <idx>.或: DELETE <itab>[FROM <n1> TO <n2>] [WHERE <conditions>]八.Internal table 排序SORT <itab> [<order way>][BY <f1><f2>…]其中:<order way> 有DESCENDING 和ASCENDING, Default 為ASCENDING.<f1>: 為指定排序的欄位.九.加總SUM.總和計算存放与work area中,但只能在LOOP 中使用.例: LOOP A T ITAB INTO LINE.SUM.ENDLOOP.WRITE: / LINE-COL1, LINE-COL2.十.初始化internal tableREFRESH <itab>. 清空<itab>中的值.CLEAR <itab>. 清空<itab>的Header Line.FREE <itab>. 釋放記憶体空間.。
ABAP内表详解内表⽼式的内表类型定义⽼式内表只有标准内表⼀种,使⽤OCCURS选项来定义了标准内表,这是ABAP3.0之前的定义内表的做法了,在新版的ABAP不建议使⽤,因为在新的版本中有三种内表类型(标准、排序、哈希)。
TYPES <t><type> OCCURS <n>.内表中⾏的数据类型在<type>中指定。
要指定⾏的数据类型,可以使⽤ TYPE 或 LIKE 参数。
基于基本类型内表类型"如果去掉了 OCCURS 则表⽰是普通类型⽽不是内表类型了vector TYPE i OCCURS 10."如果要带隐藏表头则⼀定要加上WITH HEADER LINE,否则默认没有,⽽且只能在声明内表变量时加,⽽不能在上⾯定义内表类型时加DATA vector TYPE vector WITH HEADER LINE.vector = 1.APPEND vector.上⾯的TYPES与下⾯语句等效:TYPES vector TYPE STANDARD TABLE OF iWITH NON-UNIQUE DEFAULT KEYINITIAL SIZE 10.本⽰例创建内表数据类型 vector,其⾏包含基本类型 I 字段。
注:WITH HEADER LINE只能与DATA关键字⼀起使⽤,⽽不能与TYPES⼀起使⽤,这也就是说,只有在分配了存储空间时才有隐藏⼯作区这⼀说,在定义内表类型时是没有的。
下⾯这样也可以:vector TYPE i.DATA vector TYPE vector OCCURS 0 WITH HEADER LINE.vector = 1.APPEND vector.基于结构体类型内表类型"由于没有加 occurs 选项,所以定义的是⼀结构类型TYPES: BEGIN OF line,column1 TYPE i,column2 TYPE i,column3 TYPE i,END OF line."定义⼀内表类型⽽不是普通类型TYPES itab TYPE line OCCURS 10.本⽰例创建内表数据类型itab,其⾏与字段串line结构相同。
Abap内表什么是内表:内表是内存中建立的一个临时表,你可以在程序运行时对表中的数据进行,插入,修改,删除等操作,程序跑完了,就会被释放。
--内表定义1内表有三种类型:标准表,哈希表,排序表(主要用标准表)。
2预定义的基本数据类型有:C(文本型数据)、N(数字型)、T(时间型)、X(十六进制)、D(日期型)、F(浮点型)、I(整数型)、P(压缩号)。
注意:在abap中要用data定义数据对象,也就是定义变量(内表也是一种变量)。
后面再用type或like来定义变量的类型,这里要要注意type和like的用法,一般能用like的地方都能用type。
当用type的不一定能用like。
因为type一般定义的预定义和自定义的类型,而like用于定义词典对象和已经存在的对象。
其中types直接定义的数据类型与结构,是没有分配内存空间的。
3内表定义三个步骤:1)定义类型2)参考类型定义结构、工作区域、变量3)参考类型定义内表定义类型:通过types开头定义TYPES: BEGIN OF line,field1 TYPE i,field2 TYPE i,END OF line.参考类型定义结构、工作区域、变量:定义结构通过data开头定义DA TA: WA _ITAB TYPE(LIKE) line. “ 声明一个内表工作区参考类型定义内表:定义内表通过data开头定义DA TA: ITAB TYPE(LIKE) line OCCURS 0. “ 声明一个无工作区的内表DA TA: ITAB TY PE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0. “ 声明一个有工作区的内表DA TA: ITAB TYPE(LIKE) line OCCURS 0 WITH HEADER LINE.DA TA: ITAB TYPE(LIKE) STANDARD TABLE OF line INITIAL SIZE 0 WITH HEADER LINE.直接定义内表,这个内表是有工作区的DA TA: BEGIN OF ITAB OCCURS 0 ,CARR1 LIKE SPFLI-CARRID,CONN1 LIKE SPFLI-CONNID,END OF ITAB.[* DATA: ITAB1 TYPE ITAB.(错误的,定义出来的什么都不是)。
abap方法ABAP是一种在SAP系统中广泛使用的开发语言,它提供了强大的编程功能,可以帮助开发人员创建自定义的应用程序。
本文将向您介绍ABAP的基本概念和方法,以帮助您更好地理解和掌握这种语言。
一、ABAP简介ABAP(Advanced Business Application Programming)是一种面向对象的编程语言,主要用于开发SAP系统中的业务应用程序。
它提供了许多功能,如数据访问、流程控制、界面设计、事务处理等,使开发人员能够快速构建高效、可靠的应用程序。
二、ABAP开发环境要开始ABAP开发,您需要了解ABAP开发环境。
这个环境包括了一个集成开发环境(IDE),它提供了许多有用的工具和功能,如代码编辑器、调试器、报表设计器等。
您可以使用这个IDE来创建、编辑和调试ABAP代码,以及设计用户界面和数据模型。
三、ABAP编程基础ABAP编程涉及许多基本概念,如对象、类、方法和变量。
了解这些概念将帮助您更好地理解和使用ABAP。
1. 对象:在ABAP中,对象是具有属性和方法的数据实体。
例如,一个员工对象可能具有姓名、职位和工资等属性,以及一些方法,如工资计算等。
2. 类:类是对象的模板,它定义了对象的属性和方法。
在ABAP 中,类是抽象的,不能直接创建。
您可以使用类定义自己的对象类型,并创建该类型的实例。
3. 方法:方法是一段可以由对象调用的代码。
在ABAP中,方法可以是内联的(定义在类中)或外部的(定义在其他位置)。
4. 变量:变量是存储数据的容器。
在ABAP中,变量可以是基本数据类型(如整数、浮点数、字符串等)或复合数据类型(如数组、记录等)。
四、ABAP编程技巧掌握ABAP编程基础后,您可以开始学习一些实用的编程技巧,以提高您的开发效率和质量。
1. 数据库操作:ABAP提供了强大的数据库访问功能,您可以轻松地查询、插入、更新和删除数据。
了解如何使用ABAP的SQL语句和高级查询功能将大大提高您的开发效率。
ABAP基础了解ABAPSAP的三层体系结构ABAP语法概述ABAP语⾔的基本元素ABAP的语法格式结构类型和结构体内表数据库操作ABAP:(Advanced business application program),是⼀种⾼级企业应⽤编程语⾔,它⽀持封装性和继承性,封装性是⾯向对象的基础,⽽继承性是建⽴在封装性基础上的重要特性。
它适合⽣成报表,⽀持对数据库的操作,如:SQLServer,Oracle,DB2等主流数据库系统。
SAP三层体系结构:表现层(Presentation Layer):这是SAP⽤户和R/3系统交流的接⼝,⽤户在这⼀层对SAP系统进⾏操作。
这层将⽤户的命令或者操作传送给R/3系统,然后系统进⾏相应的处理后把数据返还给⽤户。
应⽤层(Application Layer):这层包括⼀个或者多个应⽤服务器和⼀个消息服务器。
每⼀个应⽤服务器包括⼀系列服务以便运⾏应⽤程序。
所有的服务分置在这些应⽤服务器之中,其实⽤户需要的只是其中的⼀个应⽤服务器,多个服务器之间传递信息以决定⽤户到底需要的是哪个服务器的服务。
数据库层(Database Layer):这⾥是SAP系统的核⼼,存放了所有SAP系统的数据。
语法概述:ABAP基本语法特点:由各⾃独⽴的语句构成;每个语句的第⼀个单词必须是ABAP关键字;单词之间⾄少要⽤⼀个空格分隔;每个语句结束必须要⽤句号;⽀持分块缩进,便于阅读;⼀个语句可以跨多⾏,只要不遇到句号,就认为是⼀个延续的语句;可以把多个语句放在⼀⾏;ABAP不区分⼤⼩写,关键字和⽤户操作数都⼀样,为了便于阅读,⼀般把关键字⼤写,⽽操作数⼩写;由于编程的时候随时切换⼤⼩写⽐较⿇烦,可以在ABAP编辑器中⽤“规范化打印机”按钮来⾃动转换;如果连续多⾏的第⼀关键字相同,可以使⽤链语句,链语句的⽅式减少输⼊。
注释:注释⾏由第⼀列的星号(*)开头,并且必须写在第⼀列,前⾯不能有空格;编译器忽略注释⾏,不会执⾏;在⾏末的注释⽤双引号(”)作为前导。
Abap 内表的定义。
1.在abap中要data定义数据对象,也就是定义变量(内表也是一种变量)。
后面再用type 或like来定义变量的类型,这里要要注意type和like的用法,一般能用like的地方都能用type。
当用type的不一定能用like。
因为type一般定义的预定义和自定义的类型,而like用于定义词典对象和已经存在的对象。
其中types直接定义的数据类型与结构,是没有分配内存空间的。
2.预定义的基本数据类型有:C(文本型数据)、N(数字型)、T(时间型)、X(十六进制)D(日期型)、F(浮点型)、I(整数型)、P(压缩号)。
3.例:TYPE: BEGIN OF i_tab,Name(8 ) TYPE C,Age TYPE I ,END OF i_tab.这一段代码是定义的i_tab这一个数据类型,还有这个数据类型中的结构。
是没有内存和数据的。
Data:BEGIN OF i_tab,Name(8) TYPE C,age TYPE I,END OF i_tab.这一段定义了内表i_tab和其中的数据类型和结构。
Data wa type i_tab,这里是声明一个工作区 wa 它的数据结构类型都是来源于i_tab中。
定义内表是还要注意有没有header line(标题行)。
上面这一段时没有header line的如果要有要这样定义。
Data:begin of i_tab OCCURS 0 with header line,已经隐式声明了一个与内表同名的header line.(1)wa-name = ‘a’.wa-age = 5.APPEND wa TO itab.(2)i_tab-name= 'a'.I_tab-age = 5.APPEND i_tab.这里wa就是上面那个已经定义的work area.有header line的时候,这两种都可以.无header line的时候,只能用第1种.第2种里,itab的意义是一个header line,而不是内表这里面就把header line当成一个work area来看所以OCCURS用来声明内表可能造成二义性(ambiguous).于是,OCCURS被认为是old的东西,采用一下方式声明一个内表比较好:DA TA itab TYPE STANDARD TABLE OF line.还有一种声明内表的方法:DA TA: BEGIN OF itab OCCURS 0,field1 TYPE i,field2 TYPE i,END OF itab.这样的itab就自动有了一个同名的header line.好像不会有WITHOUT HEADER LINE 或者NOT WITH HEADER LINE 这样的用法...如果没有OCCURS 0,比如这样:DA TA: BEGIN OF itab,field1 TYPE i,field2 TYPE i,END OF itab.那么这个itab就不是内表咯,只是一个结构,可以作为itab的work area.TABLES <dbtab>.<dbtab> 是ABAP/4词典对象的名称,同时也是创建的表工作区的名称。
ABAP总结1.引用类型z_ref数据对象myref在程序中的声明方式:DATA myref TYPE z_ref.CREATE DATA myref TYPE z_ref.2.参照数据字典中的表类型生成内表对象或结构体:DATA mytable TYPE z_table,”数据字典表类型,声明内表.myline TYPE LINE OF z_table.”表类型的行结构,声明结构体.3.取系统日期:SY-DATUM,4.取系统时间:SY-UZEIT.05.系统字段定位:SY-FDPOS.字符比较结果为真时,此字段将给出偏移量信息.6.系统字段SY-FDPOS给出字符的位置信息.(P109)7.系统字段SY-INDEX记录循环语句中的循环次数8.操作内表行结束后系统字段SY-TABIX返回该行索引.对于所有行操作,如果操作成功,系统变量SY-SUBRC返回0,否则返回非0值.9.系统用户名:SY-UNAME.10.SY-HOST?屏幕序号:sy-dynnr.11.OK代码:SY-UCOMM或SYST-UCOMM12.屏幕组ID:SY-DYNGR.13.常量声明:CONSTANT const(len) TYPE type|LIKE dobj [DECIMALS dec][V ALUE val].14.确定数据对象属性:DESCRIBE FIELD f [LENGTH l] [TYPE t [CONPONENTSn]] [OUTPUT-LENGTH o] [DECIMALS d] [EDIT MASK m] [HELP-ID h].15.数据赋值:MOVE source TO destination.或destination = source.16.设定初始值:CLEAR F.17.检查字段是否为初始值:f IS INITIAL….18.检查字段是否被分配:fs IS A SSIGNED…..19.检查过程中的参数是否被实参填充:p IS [SUPPLIED|REQUESTED]….20.检查数据对象的值是否属于某范围之间:f1 BETWEEN f2 AND f3…..21.检查数据对象f的内容是否遵从某个选择表的逻辑条件:f in seltab….22.WRITE: /10 g,”在10个空格后输出变量g/(8) time using edit mask ‘__:__:__’.”输出的变量time保持8位的长度.23.将光标移动到下一行:SKIP.24.强制结束循环:EXIT,STOP或REJECT.25.循环的中止:CONTINUE无条件中止当前循环并开始下一轮循环,CHECK条件为真时循环,为假时结束本次循环并开始下一轮循环,EXIT无条件中止并退出整个循环.26.将字符串左移:SHIFT string.27.连接字符串:CONCATENATE s1 s2 …..sn INTO s_dest [SEPARATED BY sep].如果结果出现被截断的情况,将SY-SUBRC返回4,否则返回0.符号&用于在字字符串换行时的连接.28.根据分隔符sep拆分字符串:SPLIT s_source AT sep INT O s1 s2 ……sn.使用内表操作可以避免被截断的情况:SPLIT s_source AT sep INTO TABLE itab.此语句根据子串数目生成n行的内表.29.循环输出内表的每一行数据:LOOP AT itab INTO text.ENDLOOP.30.替换字段内容:REPLACE str1 WITH str2 INTO s_dest [LENGTH len]. 字段SY-SUBRC的返回值为0时表示己成功替换.31.确定字段长度:[COMPUTE] n = STRLEN( str ).32.删除字符串中的多余空格:CONDENSE33.字符转换,如将ABC转换为abc:TRANSLATE34.创建一个可以排序的格式:CONVERT TEXT.35.用一个字符串覆盖另一个字符串:OVERLAY36.WRITE TO赋值时将忽略数据对象的类型,而将其视为字符类型数据.37.字符串比较中的换码字符:#,用于转换比较时使用的通配符:*或+.及进行区分大小写,空格的比较,如#A表示比较大写的A.38.定位操作子串:strName[+0][(1)].39.字段符号,数据引用:动态数据对象.40.子过程定义:FORM subroutine_name USING parameters1parameters2…. ….ENDFORM.41.子程序调用:PERFORM subroutine_name USING actual_parameters1 p2…. (其中USING可换成CHANGING)42.ULINE.输出下划线.43.错误查看:ST2244.程序打包release:SE01:找到对应的程序,点开后点上面小汽车,再选中上面的后再点小汽车.点check.程序修改后需要重新打包.45.制作T-CODE:SE93,TCODE应按顺序编号:ZMF+流水号,我的程序名46.创建table:t-code:se11,attributes:Delivery class:C.开发类别:ZFI,当自定义Fieldtype时,名称需为Z+…..格式.->设置技术属性(TechnicalSetting):Logicalstorage parameters中Data class:APPL1,Size category:4 创建functiongroup:SE80,创建好后将创建的TABLE挂接到function grouph 上去:用se11查出table,点utilites->table maintenance generator:Authorizationgroups:&NC&,Function group中填刚才创建的功能组名称->onestep->overview screen中必须填未使用的number,此处screen number与table 是一一对应的关系,也可让点系统上面的按钮:find screen number来自动搜索适合的scr. Number.->create,成功后,找到对应的function group中的screen number双击即可看到生成的代码.需要修改字段名称可在function group中的element list或layout中.-->se93创建t-code,start object选transaction with parameters(parameter transaction)->default valuesfor->transantion:SM30->Default Values->name of screenfield:viewname\update,value:table name\X.47.field-sign:,field—option:,field-low:表示选择条件中起始值48.在where子句中如果只有一个表的话,可以不用指定表名.49.获取用户IP地址及用户名:call function 'TH_USER_INFO' " Get user IP,hostnameimportinghostaddr = iporg”转化前的IP地址terminal = host”计算机名exceptionsothers = 1."Conv.IP addr to format 'xxx.xxx.xxx.xxx'call function 'ZGJ_IPADR2STRING' "Conv.IP addrexportingipadr = iporg”转化前的IP地址importingstring = ipdec.”转化后的最终需要的IP地址50.删除内表中数据完全相同的行,只保留一行: delete adjacent duplicatesfrom itab1 COMPARING / COMPARING ALL FIELDS.51.spro:后台设定52.输出选择框write:/ itab1-flag as checkbox第四章ABAP基础4.1.5 程序运行例:REPORT z_calling_program.START-OF-PROGRAM.WRITE ‘This program calls another program.’.”此内容在输出界面看不到SUBMIT z_simple_program.”上面的输出被此程序覆盖.如果改用SUBMIT AND RETURN来调用则可以输出以上内容.2.结束程序:LEA VE PROGRAM.可在任意点强制结束当前运行的程序.4.1.6 内存管理SAP程序同一个用户和系统可进行最多6个SAPGUI主会话.4.2.1 数据定义TYPES:BEGIN OF t_staff,S_no(3) type n,Name(20),END OF t_staff.DATA staff TYPE t_staff.上例中定义了一个结构类型t_staff,并根据其声明了一个结构体对象staff.数据类型中的扁平结构与纵深结构:扁平类型:运行时长度固定的类型.纵深类型:运行时长度可峦的类型.注意:1.其中C,N,T,D,I,F,P,X为定长类型,即在运行期间长度不能改变.2.类型T,D,I,F的数据存储长度是固定的,不能指定参照其生成的数据对象占用的内存字节数.3.基于类型C,N,P,X生成的数据对象需要在声明时指定其长度.否则取默认值.4.如果在声明一个数据对象时未指明其数据类型,则该数据默认为C类型.5.类型I的数值范围:-231到231-1的整数.如果运算时出现非整型结果则进行四舍五入取值.而不是截断小数.6.类型P用于声明小数字固定的压缩数,其占据内存字节数和数值范围取决于定义时指定的整个数据的大小和小数点后位数,如果不指定小数字,则将其视为I类型数据.有效大小可以是从1~16字节的任意值,小数点后最多允许14个数字. 7,类型F为浮点数,浮点意思是数字在内存中以字节形式表示,数值范围:1*10-307到1*10308,因系统将F类型转换为二进制数,所以可能出现舍入误差,若用户要求较高精度且数值较大时,应使用P类型数据.8.长度可峦的内置类型String, XString是通过引用实际动态的数据对象的固定内存地址来操作.4.2.3 程序内部数据定义参照自定义类型或内置类型生成数据的语法格式:TY PES|DATA …TYPE l_type…参照程序中已经声明的数据对象生成新数据语法:TYPES|DATA …LIKE dobj…3.结构类型和结构体参照结构类型生成的数据对象称为结构体.TYPES|DATA:BEGIN OF structure.k1[TYPE type |LIKE dobj]…,k2[TYPE type |LIKE dobj]…,…k n[TYPE type |LIKE dobj]…,END OF structure.参照生成:参照结构生成:TYPES|DATA structure TYPE str_type |LIKE str_dobj...参照数据库表生成:TYPES|DATA structure TYPE dbtab.4.表类型和内表表类型的对象称为内表.4.2.4 数据字典中的类型●数据元素(Data elements),相当于ABAP中的基本类型和引用类型.●结构(Structures),由数据元素字段构成,对应ABAP中的结构类型.表类型(Table types),对应ABAP中的表类型.数据字典中的数据类型与ABAP中的中数据类型对应关系:4.2.5 程序中的数据对象1.文字对象当字符文字长度超过编辑器的一行时,可以使用”&”进行连接,避免因换行而产生的多余空格,如:long = ‘This is ‘&‘a long sentence’.如果需要输出“’”,则需要在前面多加一个“’”转回愿意.2.有名称的数据对象常量声明:CONSTANT: const(len) TYPE|LIKE dobj [DECIMALS dec] V ALUE val.结构体常量声明(每个组件必须指定初始值):CONSTANT:BEGIN OF structure,str1 TYPE|LIKE dobj [DECIMALS dec] V ALUE val,str2 TYPE|LIKE dobj [DECIMALS dec] V ALUE val,...,strn TYPE|LIKE dobj [DECIMALS dec] V ALUE val,END OF structure.3.系统数据对象(见附表)4.查明数据对象属性DESCRIBE FIELD f LENGTH len.此语句将字段f的长度写入变量len.●LENGTH:确定数据对象长度.●TYPE: 确定数据对象类型.●OUTPUT-LENGTH:确定实际输出长度.●DECIMALS:确定P类型小数位长.●EDIT MASK:确定在数据字典中定义转换例程.●HELP-ID:确定在数据字典中定义的F1帮助信息.4.3 基本数据操作4.3.1数据赋值●MOVE source TO incept.等介于:incept = source.●CLEAR dobj.将数据对象dobj还原为初始值.●结构体间赋值:struct2 = struct1.(组件结构相同).●MOVE-CORRESPONDING struct1 TO struct2.(部分组件结构相同).4.3.2类型转换(见附表).4.3.3数值运算两个结构体的同名字段之间可以整体进行算术运算:ADD-CORRESPONDING struct1 TO struct2.SUBTRACT-CORRESPONDING struct1 FROM struct2.MULTIPLY-CORRESPONDING struct2 BY struct1.DIVIDE-CORRESPONDING struct2 BY struct1.以上将对两个结构体中的同名字段进行相应运算(非数值类型数据会引起错误).2.数学函数任意类型参数的函数列表:注意:函数名与左括号间不能有空格,括号与参数间必须有空格.4.3.4数据输出输出格式化选项:注:用户主记录System->User profile->Own data(SU01).4.3.5逻辑表达式通用逻辑表达式列表:3.IS操作符●...f IS INITIA L...:检查字段f是否为初始值.●...fs IS ASSIGNED...:检查字段符号是否被分配.●...p IS [SUPPLIED|REQUESTED]...:检查过程中的参数是否被实参填充.4.BETWEEN操作符●...f1 BETWEEN f2 AND f3...:检查数据对象的值是否属于特定范围之间.5.IN操作符(P110)●...f IN seltab...:检查一个数据对象的内容是否遵从某个选择表的逻辑条件.6.组合逻辑表达式●AND:与.●OR:或.●NOT:非.注:括号与操作数间至少要有一个空格,如:IF ( c > n ) AND ( c < f ).4.4结构控制程序代码分三种结构:●顺序结构:语句逐行执行.●分支结构:根据不同的条件执行不同语句块.●循环结构:反复执行某个语句.4.4.1分支控制1.IF/ENDIF结构:IF .ELSEIF .......ELSE.ENDIF.注:可嵌套.2.CASE/ENDCASE结构:CASE f.WHEN f11 [OR f12 OR ...].......[WHEN OTHERS.]ENDCASE.其中,f为变量,f ij可以是变量或者固定值.4.4.2循环控制1.无条件循环DO [n TIMES].ENDDO.说明:n为循环次数,可以是文字或变量,如果没有限定n值,则必须用EXIT,STOP 或REJECT等语句强制结束循环.DO循环可嵌套,SY-INDEX 为当前循环次数.2.条件循环WHILE .ENDWHILE.注:可嵌套,其它同上.3.循环中止●CONTINUE:无条件中止当前本轮循环,开始下一轮循环.●CHECK:条件中止当前本轮循环(条件为假时), 开始下一轮循环.●EXIT:无条件完全中止当前循环,继续循环结束语句(ENDDO,ENDWHILE等)后面的代码,如果在嵌套循环中,系统仅退出当前循环.4.5处理字符数据4.5.1字符数据1.连接字符串CONCATENATE s1 s2 ... sn INTO s_dest [SEPARATED BY sep].注:所有字符串操作将忽略s1....sn中的尾部空格(如需保留空格,可使用指定偏移量).如果出现截断情况,将SY-SUBRC设为4,否则返回0.2.拆分字符串SPLIT s_source AT sep INTO s1 s2 ... sn.如果所有子串足够长且不必截断任何部分,则将SY-SUBRC设为0,否则返回4, 如果源字符串能够拆分的子串多过指定的数目,则源子串最后的剩余部分包括其后的分隔符都将写入最后一个子串,要避免这种情况,需要使用内表进行操作: SPLIT s_source AT sep INTO TABLE itab.在该形式中,根据子串数目生成n行的内表.例如:DATA:text type string,itab TYPE TABLE OF string.text = ‘ABAP is a programming language’.SPLIT text AT space INTO TABLE itab.LOOP AT itab INTO text.WRITE / text.ENDLOOP.3.查找子串模式SEARCH c FOR str.在字段c中查找字符串str.如果找到,则将SY-SUBRC返回0,SY-FDPOS返回字段c中该字符串的位置(从左算起的字节偏移量),否则SY-SUBRC返回4,查找模式有以下几种:●str搜索str并忽略尾部空格.●.str. 搜索str,但不忽略尾部空格.●*str 搜索以str结尾的单词.●str* 搜索以str开始的单词.REPORT z_string_search.DATA string(30) TYPE c VALUE 'This is a testing sentence.'. WRITE: / 'searched','sy-subrc','sy-fdpos'.SEARCH string FOR 'X'.WRITE: / 'X', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.SEARCH string FOR 'itt '.WRITE: / 'itt ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.SEARCH string FOR '.e .'.WRITE: / '.e .', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.SEARCH string FOR '*e '.WRITE: / '*e ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.SEARCH string FOR 's* '.WRITE: / 's* ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER 'sy-fdpos'.输出结果如下:searched sy-subrc sy-fdposX 4 0itt 4 0.e . 4 0*e 0 18s* 0 184.替换字段内容.REPLACE str1 WITH str2 INTO s_dest [LENGTH len].搜索s_dest中前len个字符中的子串str1,用str2来替换它,如果成功,SY-SUBRC返回0,否则还回非0值. REPORT z_replace.DATA name TYPE string.name = 'Michael-Cheong'.WHILE sy-subrc = 0.REPLACE '-' WITH ' ' INTO name.ENDWHILE.WRITE / name.输出结果: Michael Cheong5.确定字段长度n = STRLEN( str ).函数将str作为字符数据类型处理,不考虑其实际类型,也不进行转换.计算其首字符到最后一个非空字符的长度,不包括结尾空格.6.其它操作语句●SHIT:将字符串整体或子串进行位移.●CONDENSE:删除字符串中的多余空格.●TRANSLATE:字符转换,如将ABC转换为abc.●CONVERT TEXT:创建一个可以排序的格式.●OVERLAY:用一个字符串覆盖另一个字符串.注:CO,CN,CA,NA比较时区分大小写,且尾部空格也在比较范围之内,CS,NS,CP,NP比较时忽略尾部空格且不区分大小写,比较结束后,如果结果为真,SY-FDPOS将给出s2在s1中的偏移量信息.模式表示可以使用通配符,”*”用于替代任何字符串,”+”用于替代单个字符.换码字符使用:●指定大小写(如#A,#b).●通配符”*”(输入#*),将其转回原义.●通配符”+”(输入#+),将其转回原义.●换码符本身”#”(输入##),将其转回原义.●字符串结尾空格(输入#__),指定比较结尾空格.4.5.3定位操作子串str[+position][(len)].从字符串str中的position位开始取出长度为len的子串.可动态指定偏移量及长度的情况(即position及len可为变量):●用MOVE语句或赋值运算符给字段赋值时.●用WRITE TO语句向字段写入值时.●用ASSIGN将字段分配给字段符号时.●用PERFORM将数据传送给子程序时.off = 6.len = 2.date+off(len) = ‘01’.4.6使用内表types定义的并不是结构体对象,只是结构类型,不能作为工作区,当定义的内表没有表头行(工作区)时,必须为其定义一个结构体作为工作区,否则无法使用此内表.如果没有给内表定义工作区,则在定义内表时必须声明表头行(with header line). DATA:BEGIN OF line, "work area(structure)结构类型且结构体对象num TYPE i,sqr TYPE i,END OF line,"无表头行内表,内表定义都使用data关键词.itab TYPE(LIKE) STANDARD TABLE OF line WITH KEY table_line. DATA DIRTAB LIKE CDIR OCCURS 10 WITH HEADER LINE.定义标准内表DO 5 TIMES.line-num = sy-index.line-sqr = sy-index ** 2.APPEND line TO itab.ENDDO.LOOP AT itab INTO line.WRITE:/ line-num,line-sqr.ENDLOOP.CLEAR itab.注:1.TYPES与DATA区别:TYPES是用来定义某种类(型)的,需(用DATA语句)实例化以后才可以使用,而DATA是用来定义数据对象(实例变量)的,对于用DATA直接定义的结构体对象(不参照其它结构类型),其同时也是一个结构类型.2.TYPE与LIKE区别:TYPE后面跟随的只能是某种类(型),而LIKE后面可以跟随类型或实例对象,参照结构体对象生成内表时只能用LIKE,不能用TYPE,因为结构体对象不是类型,只是一种实例对象,参照结构类型生成内表时可以用LIKE也可以用TYPE.其中通过LIKE定义的内表直接拥有参照结构类型的元素结构,而通过TYPE定义的内表只能间接拥有被参照结构类型的元素结构,结构类型不能作为内表的工作区,只有结构体对象才可以.内表定义语法:1.标准表:可指定或不指定关键词,可重复.逻辑索引,操作数据时数据内存位置不峦,系统只重排数据行的索引值.DATA itab TYPE|LIKE [STANDARD] TABLE OF structure [WITH KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n].2.排序表:可指定唯一或不唯一的关键词,也可不指定,逻辑索引,按关键词升序存储.DATA itab TYPE|LIKE SORTED TABLE OF structure [WITHNON-UNIQUE(UNIQUE) KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n].3.哈希表:必须指定唯一关键词.无索引DATA itab TYPE|LIKE HASHED TABLE OF structure WITH UNIQUE KEY comp1 ... compn(DEFAULT KEY) [WITH HEADER LINE INITIAL SIZE n].注:如果n值为0或不指定的话,程序会为内表对象分配8KB大小内存,所以,如果内表比较小,不要把该值设为0,以避免内存浪费.旧版标准表定义语法:DATA itab TYPE|LIKE [STANDARD] TABLE OF structure OCCURS n.或者DATA:BEGIN OF itab OCCURS n,...,fi...,END OF itab.注:CLEAR itab[].表示操作的是内表对象.而CLEAR itab.当itab有表头行时表示操作表头行,如无表头行时表示操作内表对象.当一个操作语句结束后,SY-TABIX返回该行的索引值,对于所有行操作,如果访问成功,SY-SUBRC返回0,否则返回非0值.4.插入行—INSERT●INSERT structure INTO itab INDEX idx.无表头行索引表,itab的行数应大于或等于idx-1.否则失败●INSERT itab INDEX idx.有表头行索引表.●对于哈希表,系统按关键词将新行插入特定位置.●INSERT structure INTO|INITIAL LINE INTO TABLE itab.此语句对于标准表来说与append效果相同,对于排序表来说,插入的行不可以打乱按照关键词排序的顺序,否则插入不成功,对于哈希表来说,插入过程中系统按照关键词对行进行定位.INITIAL关键词是用于向内表中插入结构中各类型的初始值的.●INSERT LINES OF itab1 [FROM n1] [TO n2] INTO [TABLE] itab2 [INDEXidx].将内表中部分或全部数据行整体插入到另一内表中,指定行数时itab1,itab2必须为索引表,指定TABLE关键词时,itab2可以是任意内表.此方式比其它方式快20倍左右.5.附加行—APPEND(只能操作索引表)APPEND [structure TO|INITIAL LINE TO] itab.APPEND LINES OF itab1 [FORM n1] [TO n2] TO itab2.6.聚集附加—COLLECTCOLLECT line INTO itab.对于需要附加的数据,如果在内表中存在关键词内容与其相同的数据行,则此语句将需要附加的数据累加到内表中的这一行上,而不会另外再添加一行,操作成功后,SY-TABIX返回被处理过的行的索引.注:关键词以外的所有字段必须是数字类型7.读取行—READ(可用于任何类型内表)●READ TABLE itab [INTO wa|ASSIGNING ] INDEX idx.通过索引读取内表中的单行数据. ASSIGNING表表示指派给字段符号.●READ TABLE itab FROM structure [INTO wa|ASSIGNING ].读取与结构相同的工作区中的关键词内容全部相同的内表数据.●READ TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2 [INTOwa|ASSIGNING ].指定所有关键词值,并读取相等时内表行.●READ TABLE itab WITH KEY field1 = v1 ... field2 = v2 [INTOwa|ASSIGNING ].读取内表中字段fieldn(不一定是表关键词段)与值vn 相同时的内表行.8.修改行—MODIFY●MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1 f2 ...].如果内表包含的行数少于idx,则不更改任何行.●MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2 ...].根据工作区wa中关键词修改内表行, TRANSPORTING表示修改指定字段值.●MODIFY itab FROM wa TRANSPORTING f1 f2 ... WHERE condition.修改符合WHERE子句中条件的内表中的指定字段值.9.删除行—DELETE●DELETE itab INDEX idx.根据索引删除内表行.●DELETE TABLE itab FROM wa.根据工作区关键词删除行.●DELETE TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2.根据指定关键词值删除行.●DELETE itab [FROM n1] [TO n2] [WHERE ].10.循环处理--LOOPLOOP AT itab [INTO wa] [FROM n1] [TO n2] [WHERE condition]..ENDLOOP.4.6.3操作整个内表1.排序SORT itab [ASCENDING|DESCENDING] [AS TEXT] [STABLE] [BY f1 [ASCENDING|DESCENDING] [AS TEXT]......f1 [ASCENDING|DESCENDING] [AS TEXT]]说明:●ASCENDING|DESCENDING:升序或降序.默认升序.●AS TEXT:根据当前语言按字母顺序排序字符字段,否则按字符平台相关内部编码进行排序.●STABLE:保持排序前后不需要改变的数据行的相对顺序.2.控制级操作(用于总计,缩进,格式控制等)AT FIRST|LAST|NEW f|END OF f.ENDAT.说明:●FIRST:当循环为内表的第一行时,执行语句块中语句.在工作区中,系统用*填充所有关键词内容.●LAST: 当循环为内表的最后一行时,执行语句块中语句. 在工作区中,系统用*填充所有关键词内容.●NEW f:字段f前面(即左边)的全部字段内容之一不同于上一行时,执行语句块中语句.在工作区中,系统用*填充f后面所有关键词内容.●END OF f:如果下一行行组中的任何字段内容不同于上一行, 执行语句块中语句.在工作区中,系统用*填充f后面所有关键词内容.注:在控制级操作期间,在工作区中,对于非标准关键词段,将全部进行初始化,在执行完控制操作后(即ENDAT语句后)工作区中的数据将全部还原到进入控制级操作语句前(即进入AT前)状态.3.初始化内表●CLEAR itab.:带表头行时只清空表头行,不带表头行时清空整个内表.●CLEAR itab[].:只清空整个内表对象数据.不清空表头行.●REFRESH itab或REFRESH itab[].:只清空整个内表对象数据.不清空表头行.●FREE itab.或FREE itab[].:只清空整个内表对象数据.不清空表头行,同时释放内存.●......itab IS INITIAL....:检查内表是否为空.4.整体复制内表●MOVE itab1 TO itab2.:如果两表都存在表头行,则此语句只复制了表头行.●MOVE itab1[] TO itab2[].:指定表体复制.●MOVE itab1[] TO itab2.:表itab2无表头行时才成立.●itab2 = itab1.同上1●itab2[] = itab1[].同上2●itab2 = itab1[].同上35.比较内表大小... itab1 itab2...:其中可以为=,<>,><,>=,<=,>,<等.4.6.4Extract Datasets●FIELD-GROUP fg.行结构分配.●INSERT f1 f2 ... INTO fg.生成字段组fg的具体字段结构.●EXTRACT fg.将字段组填充给EXTRACT.●SORT.排序.●LOOP. ENDLOOP.循环输出EXTRACT.4.7动态数据对象4.7.1字段符号●FIELD-SYMBOLS [TYPE type|LIKE dobj].声明字段符号.●ASSIGN f TO .静态分配数据对象给字段符号.●ASSIGN f[+i] [(j)] TO .指定偏移量和长度.●ASSIGN (f) TO .动态分配,先找到字段f的内容,然后将该内容分配给.4.7.2数据引用TYPES t_dref TYPE REF TO DATA.DATA dref TYPE REF TO DATA.4.8模块化技术4.8.2子程序1.定义:FORM subr [[USING [V ALUE(p1)]... ] [TYPE t|LIKE f]...] [TYPE ANY][CHANGING [V ALUE(p1)] ... ] [TYPE t|LIKE f]...] [TYPE ANY].ENDFORM.注:●V ALUE参数表未示值传递,此方式在子程序调用后实参的值不会被改变.●无V ALUE参数时表示引用传递,会改变实参的值.●USING与CHANGING无任何区别.●位于两个子程序间的代码不属于任何事件块.●参数传递时不存在类型转换,要求必须兼容.2.调用:PERFORM subr [USING p1 ... pn] [CHANGING pi ... pj].4.8.3功能模块(p153)4.8.5源代码复用1.包含程序包含程序是单纯的代码复用,不是可执行程序,不能单独运行,必须被其它程序调用,包含程序不能调用自身.INCLUDE incl.包含程序调用,此语句必须独占一行.2.宏:(语句块中最多只能包含9个占位符&1...&9).例:DATA:result TYPE i,int1 TYPE i VALUE 1,int2 TYPE i VALUE 2.DEFINE operation.result = &1 &2 &3.output &1 &2 &3 result.END-OF-DEFINITION.DEFINE output.write: / 'The result of &1 &2 &3 is',&4.END-OF-DEFINITION.operation 1 + 2.operation int2 - int1.4.9.1静态错误检查1.语法检查:用Check键.2.扩展语法检查(SLIN):在ABAP初台界面输出程序名后,选择Program->Check->Extended Syntax Check. Standard.4.9.2运行时错误控制1.可捕捉的错误CATCH SYSTEM-EXCEPTIONS exc1 = rc1 ... excn = rcn....ENDCATCH.其中exci表示一个单一可捕捉错误或者一个ERROR类,rci则代表一个数字.如果其中错误之一在CATCH和ENDCATCH语句之间出现,程序就不会中止,而是直接跳至ENDCATCH后,把系统指定的错误代码rci赋给字段SY-SUBRC.此语句可嵌套.例如:DATA:result1 TYPE p DECIMALS 3,number TYPE i VALUE 11.CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 5.DO.number = number - 1.result1 = 1 / number.WRITE: / number,result1.ENDDO.ENDCATCH.IF sy-subrc = 5.WRITE / 'division by zero!'.ENDIF.2.不可捕捉的错误(通过ST22查看,在SAP系统中保存14天,可通过Keep功能保存更长时间).。
ABAP中域(Domain)、数据元素(Data Element)、表(Table)的创建一、基本概念 (2)1.域Domain (2)2.数据元素Data Element (2)3.字段Field (2)4.表Table (2)二、域、数据元素、字段、表的关系 (2)三、建表准备 (3)四、维护数据库表 (4)1.创建域:ZXB (4)2.创建数据元素 (7)(1)创建引用域的数据元素Z_GENDER (7)(2)创建不引用域的数据元素Z_GRADE (9)3.创建表——学生信息表ZTT_STUDENT (11)(1)维护表格基础信息:描述、提交类、是否允许维护等 (11)(2)维护表格的字段信息——参照数据元素 (12)(3)维护表格的字段信息——不参照数据元素 (12)(4)维护表格的主键 (13)(5)维护表格的技术信息 (14)(6)维护数据类型为QUAN或者CURR的字段的参照 (15)(7)激活保存表格 (16)(8)设置表格的增强类别 (18)(9)维护字段的搜索帮助、索引以及表格维护生成器等其他 (19)4.维护表的数据记录 (19)(1)通过表格数据浏览器进行维护 (19)(2)通过表格维护的实用程序进行数据记录维护 (20)(3)通过表格维护工具的数据浏览器进行维护 (21)5.创建表——学生成绩表ZTT_SCORE (23)一、基本概念1.域Domain域是用来描述一个字段的技术属性的集合,包括数据类型,数据长度,小数点位数以及取值范围等。
具有以上技术属性的相同定义的字段可以包含进一个域,那么当域的属性定义发生改变时,一旦域被激活,所有引用它的字段的属性都会对应进行更改。
2.数据元素Data Element数据元素是一个数据的类型,包含了这个元素的语义属性,它包含了一些非结构化的数据对象(如表的字段、结构的字段和变量等)的技术属性(域)、屏幕信息(比如字段长、中、短、头标签等),是能够被引用的数据类型的最小单元,比如表或者结构的字段可以参考数据元素,这样可以保证这类特性的数据一致性,同时在ABAP中,数据元素也可以直接用关键字TYPE进行引用,从数据定义的角度来看,数据元素与ABAP最基本的数据类型(如C、I、F等)是同一个层面上。
3.字段Field字段就是表的列信息,它是物质对象的某一类特征的描述,包含了数据类型信息(数据元素)、字段名、字段描述信息等。
ABAP中的字段名只能以字母开始,不能以数字或者汉字开始(中间可以)。
ABAP中的字段也可以是一个附属结构的名字,附属结构下的所有字段本身可以作为表格的字段。
4.表Table表是物质对象一系列特征的集合体,既包含特征类(字段)、关键特征(主键),也包含这些特征具体的数据(数据记录)。
表是数据库的基础,承载实际数据的最小单元。
是对现实物质对象的数据抽象,即数字化。
二、域、数据元素、字段、表的关系域(Domain)‐》数据元素(Data Element)‐》字段(Field)‐‐》表(Table)前面三个都是后面一个的继承前面一个所有的属性,而字段则是表的构成部分。
域和数据元素最大的作用是增加了数据类型的重用性,并且域的取值范围还能起到数据一致性检查的作用,在维护数据记录的时候,能够起到提示的作用。
前三个虽然是继承关系,当时并非必要条件。
字段可以引用数据元素,也可以不引用,而直接定义数据字典的基本类型(如CHAR、NUMC、CURR等,和ABAP的基本数据类型还不完全一样,也不能在ABAP代码中直接进行TYPE式引用);数据元素的定义也引用域,也可以不引用域,而直接定义数据字典的基本类型。
另外,SAP中所有的数据字典对象,只有被激活过才能够被其他对象进行引用,此原则也适合SAP其他开发对象。
三者之间关系大致如下图所示:三、建表准备创建两个自定义表,表的提交类为G,其中自定义两个数据元素,一个引用域,一个不引用,其他详细信息参看下表学生信息表ZTT_STUDENT字段名主键参考字段数据类型数据长度小数点描述MANDT√MANDT CLNT30客户端SID√NUMC70学号NAME CHAR80姓名GRADE Z_GRADE NUMC20年级GENDER Z_GENDER CHAR20性别AGE INT130年龄ADDRESS CHAR400地址WEIGHT QUAN61体重TZDW MSEHI UNIT30体重单位HEIGHT QUAN60身高SGDW MSEHI UNIT30身高单位学生成绩表ZTT_SCORE字段名主键参考字段数据类型数据长度小数点描述MANDT√MANDT CLNT30客户端SID√NUMC70学号TERM√NUMC80学期MATH QUAN61数学CHN QUAN61语文NG QUAN61英语四、维护数据库表1.创建域:ZXB运行T‐code SE11,进入ABAP数据字典维护界面,先选择域,然后输入域名,点击新建按钮进入下一页面。
【注意】这里的域名必须是字母Y或者Z开头,一般自定义的默认使用Z。
在域详细信息维护界面,先维护域的描述信息,然后在定义页签Definition下,分别维护数据类型(Data Type)、字符总数(No.Characters)、小数位数(Decimal Places)以及输出长度(Output Length),其他信息可根据需要进行维护。
点击取值范围页签Value Range,维护进去固定和相应的短文本。
这里的“固定值”即以后引用该对象的字段能够存储的有效值,“短文本”则表示改值对应的描述信息,在一些选择屏幕上能够起到提示作用。
维护完固定值后,点击激活按钮,进行保存和激活。
第一次激活会弹出开发类确认信和传输请求号。
选择本地对象的时候就不会有传输请求,但是数据只会保留在本机上。
我们这里选择保存按钮,会带出传输请求确认。
这里会自动带出上一次的传输请求号,如需更改,可以点击旁边的点选按钮进行更改,如果想新建,则可以直接在此界面上,点击新建按钮进行新建,就可以生成新的传输请求了。
点击确认后,会弹出待确认对象的窗口,点击确认即可。
2.创建数据元素(1)创建引用域的数据元素Z_GENDER运行T‐Code SE11,进入数据字典维护界面,选择数据类型,输入数据类型名称Z_GENDER,(【注意】SAP系统约定自建数据字典对象都需要以字母Z或者Y开始,一般采用Z。
)点击创建按钮,在弹出来的类型框中选择Data Element,继续。
Type下,选择Domain,引入上一步骤中创建的Domain:ZXB,回车,就会带出数据类型信息。
在字段标签页签Field Label下,维护数据元素的短、中、长、头部标签信息,这里的标签信息长度要符合Length的定义,建议至少维护以下短和头部标签信息。
嫌麻烦的这四个信息可以维护成一样的。
然后点击激活按钮,将该数据元素进行保存和激活。
(2)创建不引用域的数据元素Z_GRADE前面几步和后面几步与创建数据元素Z_GENDER一样,这里不再赘述,这里重点说明下此处。
这里的Z_GRADE不引用域进行创建,因此数据类型中要选择预定义类型“Predefined Type”,输入相应的基础数据字典类型以及长度信息后,再维护一下字段标签进行激活即可。
3.创建表——学生信息表ZTT_STUDENT(1)维护表格基础信息:描述、提交类、是否允许维护等通过T‐code SE11进入数据字典维护界面,选择数据库表,然后输入自定义数据表的名称(需要以字母Y或者Z开头),点击创建按钮,进入表格细节维护界面。
在表格详细信息维护界面,先维护表格的描述信息“短文本”,然后在提交和维护页签Delivery and Maintenance页签下,弹选提交类为G(定制表,不受SAP更新影响),数据维护下拉选择为允许通过标准表格维护工具进行维护。
(2)维护表格的字段信息——参照数据元素在表格详细信息维护界面,在字段Field页签下,默认进入的模式为可引用数据元素模式,这里在第一栏中输入字段名自己要定义的字段名,这里设置为GENDER,数据元素设置可输入或者弹窗选择之前创建的数据元素Z_GENDER,回车,即可带出所有的该数据元素对应的数据类型定义信息。
(3)维护表格的字段信息——不参照数据元素由于字段界面默认为引用数据元素界面,要想自定义字段的数据类型,需要点击图上的预定类型“Predefined Type”按钮,这样一来,原来不可编辑的栏位“数据类型”、“长度”、“小数位”、“短文本”都变成了可编辑状态,而数据元素一列则变成了不可编辑状态,这样可以保证数据定义的一致性(防止数据元素定义被手工篡改,如果非要更改引用过数据元素的数据类型,就只能倒回去修改数据元素或者其引用的域的数据类型),如下图所示:在这里输入要维护的字段名、数据类型、长度、小数位、短文本信息后,就完成了非引用数据元素字段的定义。
点击图上的数据元素Data Element按钮,即可返回到引用数据元素的编辑界面。
(4)维护表格的主键先按照(3)或者(4)的办法把余下的所有字段创建完毕。
如下图所示:这里将客户端和学号作为主键,一般不夸客户端的时候,客户端都是作为主键的。
(5)维护表格的技术信息在表格详细信息维护界面,点击菜单栏中的“技术设置”,进入技术设置信息界面。
维护技术设置中的逻辑存储参数:数据类‐APPL0,大小范畴‐0,其他保持默认,然后保存即可。
点击保存按钮旁边的返回按钮,可以返回到表的详细信息界面。
(6)维护数据类型为QUAN或者CURR的字段的参照SAP中,数据类型为QUAN表示的是数量,CURR表示的金额,如果这两个字段不和度量单位进行关联的话,字段本身的准确性就有问题,比如身高1米8,如果单位为CM的话,这数值为180,如果单位为M的话,则数值为1.8,因此必须要设置这个关联,否则无法激活。
我们这里选择一个系统表AUSP相应的字段ATAWE进行参照,参照的字段必须要是数据元素为单位的字段。
(7)激活保存表格返回表格信息维护界面后,点击激活按钮,会弹出以下提示从上面可以看到表格在激活的时候发生了警告信息,警告信息意味着不影响表格被激活,但它提示了表格的增强类信息没有维护,所以才发生了此警告,可以忽略此警告,但以后每次对表格作出修改再激活的时候都会提示这个问题,只要维护了表格的增强类别,此警告信息就会消除。
具体解决办法看下一步。
(8)设置表格的增强类别在表格详细信息维护界面,点击主菜单栏上的附件(Extras)‐》增强类别..(Enhancement Category..),点击后会弹出提示信息,说明表格暂时没有选择增强类别,如下2图所示。
默认情况下表格的增强类别是没有被维护的,这里可根据需要选择是否允许增强,我们这里选择第二个:可以增强,字符或者数字型(Can be Enhanced,Character‐Type or Numeric‐Type)。