ABAP技巧代码汇总
- 格式:doc
- 大小:235.50 KB
- 文档页数:53
abap bdc代码ABAP BDC代码的应用与实践ABAP(Advanced Business Application Programming)是一种高级商务应用编程语言,它被广泛应用于SAP系统中。
BDC(Batch Data Communication)是ABAP中的一种重要技术,用于批量处理数据的输入和输出。
本文将介绍ABAP BDC代码的应用与实践。
1. BDC的基本原理BDC的基本原理是通过模拟用户的输入和操作,将数据批量输入到SAP系统中。
它可以模拟用户的键盘输入、菜单选择、屏幕操作等,实现批量数据的处理。
2. BDC的实现步骤BDC的实现步骤主要包括以下几个方面:(1)准备数据:首先需要准备好待处理的数据,可以从外部系统导入或者手动输入。
(2)创建BDC表:根据数据结构和处理逻辑,创建相应的BDC表,用于存储待处理的数据。
(3)转换数据:将待处理的数据转换成BDC表的格式,确保数据的准确性和完整性。
(4)执行BDC程序:通过调用BDC程序,将BDC表中的数据批量输入到SAP系统中。
(5)处理返回结果:根据返回结果,进行后续的处理和判断。
3. BDC的应用场景BDC广泛应用于SAP系统中各个模块的数据处理,包括物料管理、销售订单、采购订单、财务会计等。
例如,可以通过BDC实现物料的批量创建、销售订单的批量录入、采购订单的批量更新等。
4. BDC的优势和不足BDC的优势在于可以实现大规模数据的批量处理,提高工作效率和准确性。
同时,BDC还可以避免手工输入和重复劳动。
然而,BDC也存在一些不足之处,例如对于复杂的业务逻辑和屏幕操作,BDC可能无法完全满足需求,需要通过其他方式进行处理。
5. BDC的进一步发展随着技术的不断进步,BDC也在不断发展和完善。
例如,通过与Web 服务、RFC等技术的结合,可以实现更加灵活和高效的数据处理方式。
此外,BDC还可以与其他编程语言进行集成,实现更加复杂和强大的功能。
一些我工作中经常使用的ABAP新语法和函数,关键字,可以提高工作效率我平时工作积累下来的一些代码小片段。
(1) 直接批量生成数据到ABAP内表里:* 2017-05-14 7:17PM in Xun's house, WieslochINSERT demo_join1 FROM TABLE @( VALUE #(( a = 'a1' b = 'b1' c = 'c1' d = 'uu' )( a = 'a2' b = 'b2' c = 'c2' d = 'uu' )( a = 'a3' b = 'b3' c = 'c3' d = 'vv' )( a = 'a4' b = 'b4' c = 'c4' d = 'ww' ) ) ).(2) 采用内联方式遍历ABAP内表:DATA address_annos TYPE STANDARD TABLE OF field_anno-annonameWITH EMPTY KEY.address_annos = VALUE #(( '.FULLNAME' )( 'SEMANTICS.ADDRESS.STREET' )( 'SEMANTICS.ADDRESS.CITY' )( 'SEMANTICS.ADDRESS.ZIPCODE' )( 'SEMANTICS.ADDRESS.COUNTRY' ) ).DATA address_components TYPE STANDARD TABLE OF field_anno-fieldnameWITH EMPTY KEY.address_components = VALUE #(FOR address_anno IN address_annos( VALUE #( fieldannos[ annoname = address_anno ]-fieldnameDEFAULT '---' ) ) ).(3) 两个内表间数据的复制,两个内表的列结构可以不同,开发人员需要额外传入一个映射表,告诉corresponding关键字,源内表的哪一列应该赋到目标内表的哪一列。
ABAP常用事务代码事务代码描述业务部分事物代码SE11字典维护MMBESE48程序分析:调用层次MB03SE49程序分析:表操作ME21NSE16数据浏览器XK01SE80资源库浏览器ME12SE91消息维护信息MB1CSE93维护事物代码VA03SE15ABAP4贮存信息系统VA02SE38ABAP编辑器VA01SE39分屏编辑器:程序比较ME22NSE41菜单编辑器ME23NSE37函数编辑器(功能模块创建)ME21SE51屏幕制作器(屏幕流)MM01SE36逻辑数据库MM02SE71SAP脚本格式MM03SA38ABAP报表ME11SC38启动报表程序(远程)ME01SM35批输入监控ME51N SHDB记录批输入(跟踪流程)ME41 ICON显示图标ME47ST05跟踪请求MIGOSE14数据库实用程序MIROSE30语法执行速度测试MB51SE09释放本地请求,传送程序MB52SP02输出示范ME2LME22显示采购订单MB1BMB03显示物料凭证MI01VA03显示销售订单MI04TZ31显示航班信息MI07 CMOD SAP增强MI08BAPI BAPI浏览器TZ90检测锁定修改数据SM12查看表是否被锁定SE35对话模块SM30自定义表维护SPAD假脱机管理(页格式创建)SE11代码描述查询单个物料库存查看物料凭证建立采购订单创建供应商修改信息记录输入其他收货显示销售订单修改销售订单创建销售订单修改采购订单显示采购订单创建采购订单(初始屏幕)创建物料更改物料显示物料创建信息记录维护货源清单创建采购申请创建询价维护报价收货发票校验物料凭证清单查询所有库存物料查询PO清单转移过帐创建库存盘点凭证输入库存清点过帐库存差异过帐盘点和差异USER02表用户信息。
都是从网上找到的编程技巧,汇总在一起。
1、ABAP CHECKBOX 和LISTBOX使用指南1.什么是checkbox:就是一个复选框,可以用like或者type来定义,为1个字符型变量。
它是parameter的一个选项,parameter xxx as checkbox就可以在选择屏幕上显示一个复选框。
2.什么是listbox:就是一个下拉列表,你可以在这个列表中选择一条记录进行某种操作。
也是parameter的一个选项,parameter xxx as listbox就可以在选择屏幕上显示一个下拉列表。
3.如何使用:下面我们用一个程序来说明这两者的使用方法。
REPORT Z_TEXTTYPE-POOLS: VRM . “存放combobox内容的type poolDATA: NAME TYPE VRM_ID , “ list box的名称LIST TYPE VRM_VALUES , “ list box的值VALUE LIKE LINE OF LIST . “ list box的结构*定义checkbox,指定command,为了能够响应选择屏幕中值的改变PARAMETERS: P_CB1 TYPE C AS CHECKBOX DEFAULT ‘X’ USER-COMMAND CHECK,P_CB2 TYPE C AS CHECKBOX DEFAULT ‘X’USER-COMMAND CHECK.*定义listbox,必须指定visible lengthPARAMETERS: P_LIST1(10) TYPE C AS LISTBOXVI SIBLE LENGTH 15 ,P_LIST2(20) TYPE C AS LISTBOXVI SIBLE LENGTH 25 .*开始执行AT SELECTION-SCREEN OUTPUT .*–〉选择1而没有选择2IF P_CB1 = ‘X’ AND P_CB2 = ”.*—〉向listbox里面添加值REFRESH LIST .VALUE-KEY = ’11′ . “这个就是变量P_LIST的值VALUE-TEXT = ’11′ . “这个是textAPPEND VALUE TO LIST .VALUE-KEY = ’22′ .VALUE-TEXT = ’22′ .APPEND VALUE TO LIST .VALUE-KEY = ’33′ .VALUE-TEXT = ’33′ .APPEND VALUE TO LIST .*—〉调用函数显示listbox里面的值CALL FUNCTION ‘VRM_SET_VALUES’EXPORTINGID = ‘P_LIST1′VALUES = LIST.*—〉把第二个listbox的值清空,并且不能输入 CLEAR P_LIST2 .LOOP AT SCREEN .IF SCREEN-NAME = ‘P_LIST2′ .SCREEN-INPUT = 0 .MODIFY SCREEN .ENDIF .ENDLOOP .*–〉选择2,没有选择1,同上ELSEIF P_CB2 = ‘X’ AND P_CB1 = ”.REFRESH LIST .VALUE-KEY = ‘AAAAAAAAAAAAAAAAAAAA’ .VALUE-TEXT = ‘AAAAAAAAAAAAAAAAAAAA’ .APPEND VALUE TO LIST .VALUE-KEY = ‘BBBBBBBBBBBBBBBBBBBB’ .VALUE-TEXT = ‘BBBBBBBBBBBBBBBBBBBB’ .APPEND VALUE TO LIST .VALUE-KEY = ‘CCCCCCCCCCCCCCCCCCCC’ .VALUE-TEXT = ‘CCCCCCCCCCCCCCCCCCCC’ .APPEND VALUE TO LIST .APPEND VALUE TO LIST .CALL FUNCTION ‘VRM_SET_VALUES’EXPORTINGID = ‘P_LIST2′VALUES = LIST.*—〉清空listbox 1的值CLEAR P_LIST1 .LOOP AT SCREEN .IF SCREEN-NAME = ‘P_LIST1′ .SCREEN-INPUT = 0 .MODIFY SCREEN .ENDIF .ENDLOOP .*–〉都没有选择,都清空且不能输入ELSEIF P_CB1 = ” AND P_CB2 = ” .CLEAR: P_LIST1,P_LIST2 .LOOP AT SCREEN .IF SCREEN-NAME = ‘P_LIST1′ .SCREEN-INPUT = 0 .MODIFY SCREEN .ENDIF .ENDLOOP .LOOP AT SCREEN .IF SCREEN-NAME = ‘P_LIST2′ .SCREEN-INPUT = 0 .MODIFY SCREEN .ENDIF .ENDLOOP .*–〉都选,执行ELSEIF P_CB1 = ‘X’ AND P_CB2 = ‘X’ .REFRESH LIST .VALUE-KEY = ’11′ .VALUE-TEXT = ’11′ .APPEND VALUE TO LIST .VALUE-KEY = ’22′ .VALUE-TEXT = ’22′ .APPEND VALUE TO LIST .VALUE-KEY = ’33′ .VALUE-TEXT = ’33′ .APPEND VALUE TO LIST .CALL FUNCTION ‘VRM_SET_VALUES’EXPORTINGID = ‘P_LIST1′VALUES = LIST.REFRESH LIST .VALUE-KEY = ‘AAAAAAAAAAAAAAAAAAAA’ .VALUE-TEXT = ‘AAAAAAAAAAAAAAAAAAAA’ .APPEND VALUE TO LIST .VALUE-KEY = ‘BBBBBBBBBBBBBBBBBBBB’ .VALUE-TEXT = ‘BBBBBBBBBBBBBBBBBBBB’ .APPEND VALUE TO LIST .VALUE-KEY = ‘CCCCCCCCCCCCCCCCCCCC’ .VALUE-TEXT = ‘CCCCCCCCCCCCCCCCCCCC’ .APPEND VALUE TO LIST .CALL FUNCTION ‘VRM_SET_VALUES’EXPORTINGID = ‘P_LIST2′VALUES = LIST.ENDIF .START-OF-SELECTION .*–〉输出到第二屏幕看看WRITE: P_LIST1 ,/ P_LIST2 .2、ABAP memory中的Export和Import可以用于SUBMIT方式调用其他ABAP程序后,数据只能通过某个透明表暂存,在由主程序查询透明表取得结果的情况,这样做的好处是不用在通过透明表转数据了,先把子程序中的数据EXPORT到一块命名的内存空间,然后在主程序里IMPORT命名的内存空间的值到内表中。
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 [SEPARATED BY sep].如果结果出现被截断的情况,将SY-SUBRC返回4,否则返回0.符号&用于在字字符串换行时的连接.28.根据分隔符号sep拆分字符串:SPLIT s_source AT sep I NTO 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,当自定义Field type时,名称需为Z+…..格式.->设置技术属性(Technical Setting):Logical storage parameters中Data class:APPL1,Sizecategory:4 创建function group:SE80,创建好后将创建的TABLE挂接到function grouph上去:用se11查出table,点utilites->table maintenance generator:Authorization groups:&NC&,Function group中填刚才创建的功能组名称->one step->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 values for->transantion:SM30->DefaultValues->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 duplicatesfrom itab1 COMPARING <f1> <f2> / COMPARING ALL FIELDS.51.spro:后台设定52.输出选择框write:/ itab1-flag as checkbox第四章 ABAP基础4.1.5 程序运行1.程序内部调用,如下表:例: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内置基本数据类型:注意: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.k[TYPE type |LIKE dobj]…,1[TYPE type |LIKE dobj]…,k2…[TYPE type |LIKE dobj]…,knEND 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] 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.算术运算两个结构体的同名字段之间可以整体进行算术运算:ADD-CORRESPONDING struct1 TO struct2.SUBTRACT-CORRESPONDING struct1 FROM struct2.MULTIPLY-CORRESPONDING struct2 BY struct1.DIVIDE-CORRESPONDING struct2 BY struct1.以上将对两个结构体中的同名字段进行相应运算(非数值类型数据会引起错误).2.数学函数任意类型参数的函数列表:注意:函数名与左括号间不能有空格,括号与参数间必须有空格. F类型参数的函数列表(其它类型参数将首先被转换为F类型).4.3.4数据输出输出格式化选项:注:用户主记录System->User profile->Own data(SU01).4.3.5逻辑表达式通用逻辑表达式列表: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 f12OR ...].<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.其它操作语句●SHIT:将字符串整体或子串进行位移.●CONDENSE:删除字符串中的多余空格.●TRANSLATE:字符转换,如将ABC转换为abc.●CONVERT TEXT:创建一个可以排序的格式.●OVERLAY:用一个字符串覆盖另一个字符串.4.5.2字符数据比较(用于判断两个字符串之间的包含关系):注: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 [WITH NON-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.4.6.2操作内表行注: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 [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 [INTOwa|ASSIGNING <fs>].指定所有关键词值,并读取相等时内表行.●READ TABLE itab WITH KEY field1 = v1 ... field2 = v2 [INTO wa|ASSIGNING<fs>].读取内表中字段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 <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.同上1●itab2[] = itab1[].同上2●itab2 = itab1[].同上35.比较内表大小... itab1 <operator> itab2...:其中<operator>可以为=,<>,><,>=,<=,>,<等.4.6.4Extract Datasets●FIELD-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.包含程序包含程序是单纯的代码复用,不是可执行程序,不能单独运行,必须被其它程序调用,包含程序不能调用自身.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功能保存更长时间).第六章数据库操作6.2.1表字段在数据字典中,每创建一个数据库表后,都将同时生成一个同名的结构化数据类型.6.2.2外部关键词外部关键词内容必须在其对应的约束表(check table)中存在,否则无法插入.6.2.3技术设定1.数据类型(data class):●APPL0(Master data),较少需要被修改的系统数据表,如员工个人信息.●APPL1(Transaction data),需要经常被修改的数据表,如产品库存量表. ●APPL2(Organization and customizing),系统定制数据表,在系统安装后很少需要修改,如国家代码等.2.数量级别:0 0 to 6,6001 6,600 to 26,0002 26,000 to 100,0003 100,000 to 420,0004 420,000 to 34,000,0003.缓冲(Buffering)机制如果在缓冲设定中选择了Buffering switched on项,则需要设定其缓冲类型(有Full,Single-record和Generic三种).缓冲机制的意义在于首次查询时将数据表中的数据放入应用服务器缓冲区,以提高后续查询效率,要注意最好不要对经常需要的数据库表设置该机制,对于经常读取但很少更新或者通常只有在60秒后才可能被其它应用服务器程序修改的数据库表,开启缓冲机制可以上百倍地提高效率.4.Log data changes用于设定表中的数据修改时是否在系统日志中记录.6.2.4索引一个数据库表可以包含一个主索引(Primary Index)和多个附属索引(Secondary Indexes).主索引只包含表关键词和指向整个数据条目的指针,由系统自动生成并在添加数据库条目时进行维护.索引中的数据已经排序.6.3.1SELECT语句SELECT <result> FROM <source> INTO <target>[WHERE <condition>] [GROUP BY <fields>][HAVING <cond>] [ORDER BY <fields>].●HAVING子句用于限定ORDER BY子句中数据条目组的选择条件1.选择单行数据:●SELECT SINGLE * FROM tab INTO wa_tab WHERE <condition>.选择单行全部数据.●SELECT SINGLE field1 ... fieldn FROM tab INTO (wa_field1,...,wa_fieldn)WHERE <condition>.选择单行指定字段数据到指定工作区字段.●SELECT SINGLE *|field1 ... fieldn FROM tab INTO CORRESPONDING FIELDS OFwa_tab WHERE <condition>.将选择的值放入工作区中对应的字段中.6.3.3选择多行数据1.循环选择(DISTINCT去掉结果重复的行):SELECT [DISTINCT] ... .<statement block>ENDSELET.系统字段SY-DBCNT给读取的行计数.2.选择至内表:SELECT ... INTO|APPENDING [CORRESPONDING FIELDS OF] TABLE itab.其中INTO选项将复盖itab中的数据,如果不想复盖只想追加则用APPENDING.3.指定选择包大小(一次选择到内表的行数):SELECT * FROM tab INTO|APPENDING TABLE wa_tab PACKAGE SIZE n.<statement block>ENDSELET.6.3.4指定查询条件1.比较运算符:=,<,>,<>,<=,>=.2.范围限定运算符:WHERE ... f [NOT] BETWEEN g1 AND g2 ....3.字符比较运算符:WHERE ... f [NOT] LIKE g [ESCAPE h]...其中g中通配符”_”用于替代单个字符,”%”用于替代任意字符串. ESCAPE选项举例如下: SELECT ... WHERE city LIKE ‘edit#_%’ ESCAPE ‘#’.选择所有以”edit_”开始的城市.4.检查列表值:WHERE ... f [NOT] IN (g1,...gn)...5.检查空值: WHERE ... f IS [NOT] NULL...注:这里的NULL值不等同于初始值INITIAL6.检查选择表.●WHERE ... f [NOT] IN seltab...其中seltab为选择表,如选择屏幕中用户填充数据.●SELECT ... WHERE ( code = ‘01’ OR code = ‘02’ ) AND NOT (country= ‘usa’ ).:AND,OR,NOT可以按照任意顺序组合.●SELECT ... WHERE <condition> AND (itab).内表itab仅包含一个类型为C的字段,且最大长度为72.字段中内容不能使用变量.这种方式查询效率很低.6.3.5多表结合查询1.SELECT语句嵌套DATA:wa_carrid TYPE spfli-carrid,。
① ranges 关键词的使用举例:ranges: s_matnr1 for mara-matnrs_matnr1-low = P_0222.s_matnr1-sign = 'I'.s_matnr1-option = 'EQ'.append s_matnr1.CLEAR s_matnr1.②单位转换函数的使用CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT' EXPORTINGINPUT = g_itab1-meinsIMPORTINGLONG_TEXT = g_itab1-meins_txt.③取某个日期所在月份的最后一天函数CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'EXPORTINGI_DATE = t1IMPORTINGE_DATE = t2.④调用一个自定义的维护视图函数CALL FUNCTION 'VIEW_MAINTENANCE_CALL'EXPORTINGACTION = 'U'VIEW_NAME = 'ZYLPP004'⑤自定义一个函数,取库存信息FUNCTION ZYLFUNMM001.*"----------------------------------------------------------------------*"*"Local interface:*" IMPORTING*" REFERENCE(BUDAT) TYPE BUDAT*" REFERENCE(WERKS) TYPE WERKS_D*" TABLES*" IT_MATNR STRUCTURE MAKT*" IT_RESULT STRUCTURE MARD*"----------------------------------------------------------------------TYPES: BEGIN OF TYP_MSEGMATNR TYPE MSEG-MATNR"物料WERKS TYPE MSEG-WERKS"工厂LGORT TYPE MSEG-LGORT"库存地点MANDT TYPE MKPF-MANDT"clientMBLNR TYPE MKPF-MBLNR"物料凭证ZEILE TYPE MSEG-ZEILE"行项目MJAHR TYPE MKPF-MJAHR"会计年度BLDAT TYPE MKPF-BLDAT"凭证日期BUDAT TYPE MKPF-BUDAT"记账日期SHKZG TYPE MSEG-SHKZG"借贷标识MENGE TYPE MSEG-MENGE"数量END OF TYP_MSEG.TYPES: BEGIN OF TYP_MARDMATNR TYPE MARD-MATNR"物料WERKS TYPE MARD-WERKS"工厂LGORT TYPE MARD-LGORT"库存地点LABST TYPE MARD-LABST"非限制使用INSME TYPE MARD-INSME"质检库存SPEME TYPE MARD-SPEME"冻结库存END OF TYP_MARD.RANGES: S_MATNR FOR MAKT-MATNR.RANGES: S_LGORT FOR T001L-LGORT.DATA: WA_RESULT TYPE MARD.DATA: WA_MARD TYPE TYP_MARDWA_MARD1 TYPE TYP_MARDIT_MARD TYPE STANDARD TABLE OF TYP_MARD. DATA: WA_MSEG TYPE TYP_MSEGIT_MSEG TYPE STANDARD TABLE OF TYP_MSEG."物料代码选择内表LOOP AT IT_MATNR.S_MATNR-SIGN = 'I'.S_MATNR-OPTION = 'EQ'.S_MATNR-LOW = IT_MATNR-MATNR.APPEND S_MATNR.CLEAR:S_MATNRIT_MATNR.ENDLOOP.* "库存地点选择内表* LOOP AT IT_LGORT.* S_LGORT-SIGN = 'I'.* S_LGORT-OPTION = 'EQ'.* S_LGORT-LOW = IT_LGORT-LGORT.* APPEND S_LGORT.* CLEAR: IT_LGORTS_LGORT.* ENDLOOP."获取当前库存SELECT MATNR WERKS SUM( LABST ) AS LABST SUM( INSME ) AS INSMESUM( SPEME ) AS SPEMEINTO CORRESPONDING FIELDS OF TABLE IT_MARDFROM MARDWHERE WERKS = WERKS AND MATNR IN S_MATNR" AND LGORT IN S_LGORTGROUP BY MATNR WERKS."将质检库存和非限制库存汇总LOOP AT IT_MARD INTO WA_MARD.WA_MARD-LABST = WA_MARD-LABST + WA_MARD-INSME + WA_MARD-SPEME. WA_MARD-INSME = 0.MODIFY IT_MARD FROM WA_MARD.CLEAR:WA_MARD.ENDLOOP."获取物料凭证SELECT MKPF~MANDT"clientMKPF~MBLNR"物料凭证MKPF~MJAHR"会计年度MKPF~BLDAT"凭证日期MKPF~BUDAT"记账日期MSEG~MATNR"物料MSEG~WERKS"工厂MSEG~LGORT"库存地点MSEG~SHKZG"借贷标识MSEG~MENGE"数量MSEG~ZEILE"行项目INTO CORRESPONDING FIELDS OF TABLE IT_MSEGFROM MKPF AS MKPF JOIN MSEG AS MSEGON MKPF~MANDT = MSEG~MANDT ANDMKPF~MBLNR = MSEG~MBLNR ANDMKPF~MJAHR = MSEG~MJAHRWHERE MSEG~MATNR IN S_MATNRAND MSEG~WERKS = WERKSAND MSEG~LGORT IN S_LGORTAND MKPF~BLDAT GE BUDAT%_HINTSDB2 '&SUBSTITUTE VALUES&'ORACLE '&SUBSTITUTE VALUES&'."排序SORT IT_MSEG BY MATNR WERKS LGORT.LOOP AT IT_MSEG INTO WA_MSEG.AT NEW WERKS.WA_MARD-MATNR = WA_MSEG-MATNR.WA_MARD-WERKS = WA_MSEG-WERKS."WA_MARD-LGORT = WA_MSEG-LGORT.ENDAT.IF WA_MSEG-SHKZG = 'S'.WA_MARD-LABST = WA_MARD-LABST - WA_MSEG-MENGE.ELSE.WA_MARD-LABST = WA_MARD-LABST + WA_MSEG-MENGE.ENDIF.AT END OF WERKS.READ TABLE IT_MARD INTO WA_MARD1 WITH KEY MATNR = WA_MARD-MATNR WERKS = WA_MARD-WERKS.IF SY-SUBRC = 0."如果能找到数据,则更新数据WA_MARD1-LABST = WA_MARD1-LABST + WA_MARD-LABST.MODIFY IT_MARD FROM WA_MARD1 INDEX SY-TABIX.ELSE."否则追加数据APPEND WA_MARD TO IT_MARD.ENDIF.CLEAR:WA_MARD.ENDAT.CLEAR: WA_MSEG.ENDLOOP.LOOP AT IT_MARD INTO WA_MARD.WA_RESULT-WERKS = WA_MARD-WERKS."WA_RESULT-LGORT = WA_MARD-LGORT.WA_RESULT-MATNR = WA_MARD-MATNR.WA_RESULT-LABST = WA_MARD-LABST.APPEND WA_RESULT TO IT_RESULT.CLEAR: WA_MARDWA_RESULT.ENDLOOP.ENDFUNCTION.。
abap方法使用ABAP(Advanced Business Application Programming)是SAP系统中常用的编程语言。
下面是一个简单的ABAP方法的示例,该方法用于计算两个数字的和。
'''abapMETHOD Z_ADD_TWO_NUMBERS.DATA: lv_num1 TYPE i,lv_num2 TYPE i,lv_sum TYPE i.lv_num1 = 5.lv_num2 = 10.lv_sum = lv_num1 + lv_num2.WRITE: / 'The sum of', lv_num1, 'and', lv_num2, 'is', lv_sum. ENDMETHOD.'''这个方法名为'Z_ADD_TWO_NUMBERS',它接受没有参数,并返回一个整数。
在方法内部,我们定义了三个局部变量:'lv_num1','lv_num2'和'lv_sum',分别用于存储两个数字和它们的和。
然后,我们将'lv_num1'和'lv_num2'分别设置为5和10。
接着,我们将这两个数字相加,并将结果存储在'lv_sum'中。
最后,我们使用'WRITE'语句输出一条消息,显示这两个数字的和。
要调用这个方法,你可以在ABAP代码中的任何位置使用以下语句:'''abapCALL METHOD Z_ADD_TWO_NUMBERS.'''这将执行该方法,并在屏幕上显示输出消息。
abap debug技巧ABAP Debug技巧1. 概述ABAP Debug技巧是在ABAP开发中用于调试和定位错误的重要工具。
本文将介绍几种常用的ABAP Debug技巧,以帮助开发者快速定位问题并进行调试。
2. 断点调试•设置断点: 使用BREAK-POINT语句在代码中设置断点,当程序执行到该断点时会暂停执行。
例如:BREAK-POINT.•条件断点: 可以在断点设置时添加条件,只有满足条件时才会暂停执行。
例如:BREAK-POINT ID 'COND_BREAKPOINT' IFlv_variable = 'ABC'.•动态断点: 使用DYNAMIC BREAK-POINT语句在运行时设置断点。
例如:DYNAMIC BREAK-POINT 'Z_MY_PROGRAM''Z_MY_FORM'.3. 查看变量•使用WATCHPOINT语句: 在代码中设置WATCHPOINT以监视变量的值。
例如:WATCHPOINT lv_variable.当该变量的值发生变化时,程序会暂停执行。
•直接查看变量: 可以在断点暂停执行时,使用鼠标右键点击变量并选择“Display”或“Evaluate”,来查看变量的当前值。
•使用变量监视器: 在调试时,可以使用变量监视器来实时监视变量的值。
在调试视图的“监视”标签页中添加要监视的变量,并可以选择刷新频率。
4. 调试窗口•全局断点视图: 在调试时,可以点击“全局断点”视图查看已设置的断点,并可以控制是否激活或禁用特定的断点。
•断点列表视图: 在调试时,可以点击“断点列表”视图查看已设置的断点,并可以快速跳转到具体的断点位置。
•断点堆栈视图: 在调试时,可以点击“断点堆栈”视图查看当前堆栈的断点信息,并可以跳转到调用堆栈上一层的断点。
5. 运行时间调试•单步执行: 在调试时,可以逐行或逐过程执行代码,以便观察执行过程。
ABAP编程技术与技巧总结1.时间及日期合法性检查FUNCTION:TIME_CHECK_PLAUSIBILITY Time plausibility checkDATE_CHECK_PLAUSIBILITY Date plausibility check说明:当数据合法时SY-SUBRC返回值为0,否则返回1.2.弹出用户交互对话框:CALL FUNCTION 'POPUP_TO_CONFIRM'EXPORTINGtitlebar = 'CHECK'* DIAGNOSE_OBJECT = ' 'text_question = texttext_button_1 = 'YES'icon_button_1 = 'NO'IMPORTINGanswer = answer* TABLES* PARAMETER =EXCEPTIONStext_not_found = 1OTHERS = 2.说明:其中text是用于显示在弹出对话框的中的文本字符.需事先设置好其值. Answer为一位字符型数据,1表示YES,2表示NO.3.根据某年某月某日得到本年本月的最后一天:call function 'RP_LAST_DAY_OF_MONTHS'exportingday_in = sdataimportinglast_day_of_month = sdataexceptionsday_in_no_date = 1others = 2.4.传输请求:STMS(se10)->选择要传输的主机名双击->细节—>Other Requeset->ADD,输入需传输的Request num..刷新->是->登录被传输的系统->查到需要传输的Request num.->import Request(后面的小车)->选择集团->是。
abaper需要知道的一些重要的tcode,使用技巧作为一个ABAP程序员,以下是一些重要的T-code和使用技巧,可以帮助你在日常工作中更高效地开发和调试ABAP代码:1. SE38:用于编辑和执行程序- 使用技巧:可以在SE38中直接输入程序名并按下Enter键来打开程序,并使用Ctrl+F8或F8来执行程序。
2. SE80:ABAP开发工具箱,包含了许多开发者工具- 使用技巧:可以使用SE80来浏览程序包、类、函数组等,并进行源代码编辑和版本管理。
3. SE11:用于创建和维护数据库表- 使用技巧:可以在SE11中创建表、修改表结构、查看表数据和创建表的维护视图。
4. SE16:用于查看和编辑表数据- 使用技巧:可以在SE16中直接输入表名,然后点击"数据浏览"按钮来查看和编辑表数据。
5. SE24:用于查看和编辑类- 使用技巧:可以在SE24中通过输入类名来查看类的定义,并进行编辑和调试。
6. SE37:用于查看和调试函数模块- 使用技巧:可以在SE37中输入函数模块名,并点击"测试函数模块"按钮来调试函数模块。
7. SE51:用于创建、编辑和维护屏幕- 使用技巧:可以在SE51中创建和修改屏幕元素,并生成屏幕的模块池逻辑。
8. SE80:用于查看和编辑数据字典对象- 使用技巧:可以在SE80中选择"字典对象"菜单来查看和编辑数据字典对象,如表、视图、数据元素等。
9. SE09:用于进行项目版本管理- 使用技巧:可以使用SE09来创建和维护SAP项目,并进行版本管理和合并。
10. ST05:用于ABAP性能分析- 使用技巧:可以在ST05中启用性能分析,并对某个事务或程序进行性能测试和优化。
希望以上信息对你有所帮助!。
abap 常用函数用法-回复标题:ABAP常用函数用法详解ABAP(Advanced Business Application Programming)是SAP公司开发的一种高级编程语言,广泛应用于企业资源规划(ERP)系统中。
在ABAP编程中,函数的使用是不可或缺的一部分。
本文将详细介绍一些ABAP常用函数的用法。
1. CONCATENATE函数CONCATENATE函数用于连接两个或更多的字符字段或变量。
其基本语法如下:CONCATENATE expression1 [ INTO target ] [ SEPARATED BY separator ].例如,我们想要连接两个字符串"Hello"和"World":DATA(str1) = 'Hello'.DATA(str2) = 'World'.DATA(result) = CONCATENATE str1 ' ' str2.在上述代码中,'result'的值将会是"Hello World"。
2. SUBSTRING函数SUBSTRING函数用于从字符串中提取一部分子字符串。
其基本语法如下:SUBSTRING string [ OFFSET offset ] [ LENGTH length ].例如,我们想要从字符串"Hello World"中提取"World":DATA(full_str) = 'Hello World'.DATA(sub_str) = SUBSTRING full_str OFFSET 6.在上述代码中,'sub_str'的值将会是"World"。
3. REPLACE函数REPLACE函数用于在字符串中替换某个子字符串。
一数据类型和对象在ABAP中,可以使用与标准数据声明相似的语法处理数据类型,而与数据对象无关。
在程序中必须声明要使用的全部数据对象。
声明过程中,必须给数据对象分配属性,其中最重要的属性就是数据类型。
1.1 基本数据类型对算术运算的非整型结果(如分数)进行四舍五入,而不是截断。
类型 P 数据允许在小数点后有数字。
有效大小可以是从 1 到 16 字节的任何值。
将两个十进制数字压缩到一个字节,而最后一个字节包含一个数字和符号。
在小数点后最多允许 14 个数字。
1.21.3 确定数据对象的属性如果要查明数据对象的数据类型,或者要在程序的运行期间使用其属性,可使用 DESCRIBE 语句。
语法如下:DESCRIBE FIELD <f> [LENGTH <l>] [TYPE <t> [COMPONENTS <n>]][OUTPUT-LENGTH <o>] [DECIMALS <d>][EDIT MASK <m>].将由语句的参数指定的数据对象<f>的属性写入参数后的变量。
DESCRIBE FIELDS 语句具有下列参数:1.3.1 确定字段长度要确定数据对象的长度,利用DESCRIBE FIELD 语句使用 LENGTH 参数,如下所示:DESCRIBE FIELD <f> LENGTH <l>.系统读取字段<f>的长度,并将值写入字段<l>。
1.3.2确定数据类型要确定字段的数据类型,利用DESCRIBE FIELD 语句使用 TYPE 参数,如下所示:DESCRIBE FIELD <f> TYPE <t> [COMPONENTS <n>].系统读取字段<f>的数据类型,然后将值写入字段<t>。
除返回预定义数据类型 C、D、F、I、N、P、T 和 X 外,该语句还返回3 s 对于带前导符号的两字节整型4 b 对于无前导符号的一字节整型4 h 对于内表4 C 对于组件中没有嵌套结构的结构4 C 对于组件中至少有一个嵌套结构的结构要确定字段的输出长度,利用 DESCRIBE FIELD 语句使用 OUTPUT-LENGTH 参数,如下所示:DESCRIBE FIELD <f> OUTPUT-LENGTH <o>.系统读取字段<f>的输出长度,并将值写入字段<o>。
ABAP中关于字符串操作的命令函数汇总ABAP开发中经常会对字符串操作,下⾯列出⼀些相关命令/函数:
SHIFT STRING:左移字符串。
长度减1。
CONCATENATE:连接字符串。
SPLIT:拆分字符串。
SEARCH:查询字符串。
REPLACE:替换字符串。
CONDENSE:删除多余的空格。
TRANSLATE:转换字符格式,如将'ABC'转换为'ABC'
CONVERT TEXT:创建⼀个可排序的字符串。
OVERLAY:⽤⼀个字符串覆盖另⼀个字符串。
STRLEN:字符串长度。
ABS:取绝对值。
COS、SIN、TAN:取三⾓函数值。
ACOS、ASIN、ATAN:反三⾓函数。
COSH、SINH、TANH:双曲函数。
EXP:E的幂函数。
LOG:底数为E的对数。
LOG10:底数为10的对数。
SQRT:平⽅根。
SIGN:返回参数符号。
TRUNC:返回参数的整数部分。
FRAC:输⼊参数的⼩数部分。
CEIL:返回不⼩于参数的最⼩整数。
FLOOR:返回不⼤于参数的最⼩整数。
以上。
插入内表行:DATA: BEGIN OF man,name(20) TYPE c,high TYPE p DECIMALS 2,weight TYPE p DECIMALS 2,END OF man.DATA: man1 LIKE TABLE OF man.man-name = '张参'.man-high = '1.68'.man-weight = 120.INSERT man INTO TABLE man1.man-name = '刘志'.man-high = '1.78'.man-weight = 160.INSERT man INTO TABLE man1.LOOP AT man1 INTO man.WRITE: / man-name,man-high,man-weight. ENDLOOP.ULINE.man-name = '钱华'.man-high = '2.22'.man-weight = 220.INSERT man INTO man1 INDEX 3.LOOP AT man1 INTO man.WRITE: / man-name,man-high,man-weight. ENDLOOP.读放文件DATA: BEGIN OF man,name(20) TYPE c,high TYPE p DECIMALS 2,weight TYPE p DECIMALS 2,END OF man.DATA: man1 LIKE TABLE OF man.* name = 'c:\temp\testa.txt'.* typa = 'dat'.CALL FUNCTION 'UPLOAD'EXPORTINGcodepage = 'test'filename = 'c:\temp\testa.txt'filetype = 'dat'item = '读放文件'TABLESdata_tab = man1EXCEPTIONSinvalid_filesize = 1invalid_table_width = 2invalid_type = 3no_batch = 4unknown_error = 5gui_refuse_filetransfer = 6OTHERS = 7.IF sy-subrc <> 0.* message id sy-msgid type sy-msgty number sy-msgno* with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.LOOP AT man1 INTO man.WRITE: / man-name,man-high,man-weight.ENDLOOP.格式化输出DATA wa LIKE spfli.WRITE:/.WRITE:10'航班承运人',40'航班连接',60'国家代码',80'起飞城市',100'起飞机场'.SELECT * INTO wa FROM spfli.WRITE:/ wa-carrid UNDER '航班承运人',wa-connid UNDER '航班连接',wa-countryfr UNDER '国家代码',wa-cityfrom UNDER '起飞城市',wa-airpfrom UNDER '起飞机场'.ENDSELECT.内表排序DATA: BEGIN OF man,name(20) TYPE c,high TYPE p DECIMALS 2,weight TYPE p DECIMALS 2,END OF man.DATA: man1 LIKE hashed TABLE OF man with unique key name.man-name = '张参'.man-high = '1.68'.man-weight = 120.INSERT man INTO TABLE man1.man-name = '刘志'.man-high = '1.78'.man-weight = 160.INSERT man INTO TABLE man1.man-name = '钱华'.man-high = '2.22'.man-weight = 220.INSERT man INTO table man1.LOOP AT man1 INTO man.WRITE: / man-name,man-high,man-weight. ENDLOOP.ULINE.sort man1 ascending by weight descending .skip.uline.LOOP AT man1 INTO man.WRITE: / man-name,man-high,man-weight. ENDLOOP.内部数据存有文档DATA: BEGIN OF man,name(20) TYPE c,high TYPE p DECIMALS 2,weight TYPE p DECIMALS 2,END OF man.DATA: man1 LIKE TABLE OF man.DATA: name TYPE rlgrap-filename, typa TYPE rlgrap-filetype.man-name = '张参'.man-high = '1.68'.man-weight = 120.INSERT man INTO TABLE man1.man-name = '刘志'.man-high = '1.78'.man-weight = 160.INSERT man INTO TABLE man1.man-name = '钱华'.man-high = '2.22'.man-weight = 220.INSERT man INTO man1 INDEX 2.name = 'c:\temp\testa.txt'.typa = 'dat'.CALL FUNCTION 'download'EXPORTINGcodepage = 'testa'filename = namefiletype = typaitem = '文件测试' TABLESdata_tab = man1 EXCEPTIONSinvalid_filesize = 1invalid_table_width = 2invalid_type = 3no_batch = 4unknown_error = 5gui_refuse_filetransfer=6OTHERS = 7.IFsy-subrc<>0.* message id sy-msgid type sy-msgty number sy-msgno * with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.消息REPORT yth_helloworld.DATA: msg1(20) TYPE c VALUE '测试'.DATA: msg2(20) TYPE c VALUE 'ABAP'. DATA: msg3(20) TYPE c VALUE '消息!'.MESSAGE i006(ymess) WITH msg1 msg2 msg3.data:BEGIN OF man,name(30) TYPE c,high TYPE p DECIMALS 2,weight TYPE p DECIMALS 2,END OF man.FIELD-SYMBOLS <fsa> LIKE man.DATA man1 LIKE man.man-name = '雨荷'.man-high = '1.78'.man-weight = 140.ASSIGN man TO <fsa>.WRITE:/ <fsa>-name,man-high,<fsa>-weight.DATA: msg1(20) TYPE c VALUE '测试'.DATA: msg2(20) TYPE c VALUE 'ABAP'. DATA: msg3(20) TYPE c VALUE '消息!'.MESSAGE i001(00) WITH msg1 msg2 msg3.DATA: c1(2) TYPE c,c2(2) TYPE c,c3(2) TYPE c,c4(2) TYPE c,c5(20) TYPE c VALUE '91* 12*23*344445',c9(2) TYPE c.c9 = '* '.WRITE: / .WRITE c5.SPLIT c5 AT c9 INTO c1 c2 c3 c4 .WRITE: / c1,c2,c3,c4.DATA: msg1(20) TYPE c VALUE '测试'.DATA: msg2(20) TYPE c VALUE 'ABAP'.DATA: msg3(20) TYPE c VALUE '消息!'. MESSAGE i001(00) WITH msg1 msg2 msg3.DATA: BEGIN OF man,name(20) TYPE c,high TYPE p DECIMALS 2,weight TYPE p DECIMALS 2,END OF man.DATA: man1 LIKE TABLE OF man WITH HEADER LINE, man2 LIKE TABLE OF man.man-name = '张参'.man-high = '1.68'.man-weight = 120.APPEND man TO man1.man-name = '刘志'.man-high = '1.78'.man-weight = 160.APPEND man TO man1.MOVE man1[] TO man2.WRITE: / man-name,man-high,man-weight.LOOP AT man1.write: / man1-name,man1-high,man1-weight. ENDLOOP.直接读取文件DATA: BEGIN OF man,name(20) TYPE c,high TYPE p DECIMALS 2,weight TYPE p DECIMALS 2,END OF man.DATA: man1 LIKE TABLE OF man.CALL FUNCTION 'WS_UPLOAD'EXPORTINGcodepage = 'test'filename = 'c:\temp\testa.txt'filetype = 'dat'TABLESdata_tab = man1 EXCEPTIONSinvalid_filesize = 1invalid_table_width = 2invalid_type = 3no_batch = 4unknown_error = 5gui_refuse_filetransfer = 6OTHERS = 7.IF sy-subrc <> 0.* message id sy-msgid type sy-msgty number sy-msgno * with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.LOOP AT man1 INTO man.WRITE: / man-name,man-high,man-weight. ENDLOOP.字符串替换DATA: str1(10) TYPE c VALUE 'AABBCCDDEE'.WRITE / '接着的字符串______________将被替换.'. WRITE AT 14(10) str1.读取数据表*定义工作区DATA a_spfli TYPE spfli.*定义内表,请注意有Header lineDATA ta_spfli TYPE TABLE OF spfli WITH HEADER LINE. *分隔线ULINE.WRITE / '使用工作区'.ULINE.* 将数据表逐行转移至工作区,只读前5行SELECT * INTO CORRESPONDING FIELDS OFa_spfli FROM spfli UP TO 5 ROWS.WRITE: / a_spfli-connid,a_spfli-carrid,a_spfli-cityfrom,a_spfli-cityto.ENDSELECT.ULINE.WRITE / '使用内表'.ULINE.SELECT * INTO CORRESPONDING FIELDS OFTABLE ta_spfli FROM spfli UP TO 5 ROWS.*从数据表读数据至内表,直接从内表输出*如果TA_SPFLI没有定义Header line,会出错LOOP AT ta_spfli.WRITE: / a_spfli-connid,a_spfli-carrid,a_spfli-cityfrom,a_spfli-cityto.ENDLOOP.ULINE.WRITE / '将内表数据转移至工作区'.ULINE.LOOP AT ta_spfli INTO a_spfli.WRITE: / a_spfli-connid,a_spfli-carrid,a_spfli-cityfrom,a_spfli-cityto.ENDLOOP.内连接和外连接*定义结构DATA: BEGIN OF arcd,carrid TYPE spfli-carrid,connid TYPE spfli-connid,fldate TYPE sflight-fldate,END OF arcd.*工作区DATA arcd1 LIKE arcd.*关联数据表,读取前10条记录,写入工作区,并输出SELECT spfli~carrid spfli~connid sflight~fldate INTO arcd1 FROM spfli INNER JOIN sflight ON spfli~carrid = sflight~carridAND spfli~connid = sflight~connid UP TO 10 ROWS. WRITE: / arcd1-carrid,arcd1-connid,arcd1-fldate. ENDSELECT.使用package size 读取数据*定义内表,请注意有Header lineDATA wa_spfli TYPE TABLE OF spfli WITH HEADER LINE.*分隔线ULINE.* 以每次读取5条记录,直到读取所有数据SELECT * INTO TABLE wa_spfli FROM spfli PACKAGE SIZE 5.*输出内表记录LOOP AT wa_spfli.WRITE: / wa_spfli-connid,wa_spfli-carrid,wa_spfli-cityfrom,wa_spfli-cityto.ENDLOOP.*输出5条记录后输出一条横线ULINE.ENDSELECT.交互式列表START-OF-SELECTION.WRITE:'初如列表,sy-lsind = ' ,sy-lsind.AT LINE-SELECTION.IF sy-lsind = 1.WRITE: '第二列表,sy-lsind =',sy-lsind.ENDIF.列表颜色*数据库表spfli相关TABLES spfli.SKIP.*输出表头,背景灰蓝FORMAT COLOR COL_HEADING.ULINE AT /(91).WRITE: / sy-vline,(15) '航线承运人', sy-vline , (15) '航班连接', sy-vline,(15) '国家代码', sy-vline,(15) '起飞城市', sy-vline,(15) '起飞机场',sy-vline.ULINE AT /(91).FORMAT COLOR OFF.*输出内容,输出关键值为‘LH’为红色SELECT * FROM spfli.IF spfli-carrid = 'LH'.FORMAT COLOR COL_NEGATIVE.ELSE.FORMAT COLOR OFF.ENDIF.WRITE: / sy-vline,(15) spfli-carrid,sy-vline,(15) spfli-connid,sy-vline,(15) spfli-countryto, sy-vline,(15) spfli-cityfrom,sy-vline,(15)spfli-airpfrom,sy-vline.ULINE AT /(91).ENDSELECT.输出热点start-of-selection.write '请按'.format hotspot on color 5 inverse on.write '热点'.format hotspot off color off.at line-selection.write 'welcome!'.为列表定义工具条和菜单START-OF-SELECTION.* 设置已使用的状态条SET PF-STATUS 'STA1'.WRITE:'测试工具条按钮'.AT USER-COMMAND.*当单击按钮时输出CASE sy-ucomm.WHEN 'OWNSEL'.WRITE: '已选择!'.ENDCASE.在弹出式窗口中显示列表START-OF-SELECTION.* 设置已使用的状态条SET PF-STATUS 'STA1'.WRITE:'测试工具条按钮'.AT USER-COMMAND.*当单击按钮时输出CASE sy-ucomm.WHEN 'OWNSEL'.IF sy-lsind = 1.SET PF-STATUS 'STA6'.*定义子窗口并输出WINDOW STARTING AT 10 10 ENDING AT 30 20.WRITE '在子窗口输出!'.WRITE: '请注意!'.ENDIF.ENDCASE.隐藏字段技术*数据库表spfli相关TABLES: spfli, sflight.START-OF-SELECTION.SKIP.*输出ULINE AT /(91).WRITE: / sy-vline,(15) '航线承运人', sy-vline , (15) '航班连接', sy-vline,(15) '国家代码', sy-vline,(15) '起飞城市', sy-vline,(15) '起飞机场',sy-vline.ULINE AT /(91).*输出SELECT * FROM spfli.WRITE: / sy-vline,(15) spfli-carrid,sy-vline,(15) spfli-connid,sy-vline,(15) spfli-countryto,sy-vline,(15) spfli-cityfrom,sy-vline,(15) spfli-airpfrom, sy-vline.* 隐藏关键字HIDE: spfli-carrid,spfli-connid.ULINE AT /(91).ENDSELECT.AT LINE-SELECTION.*只输出第一页IF sy-lsind = 1.*根据隐藏字段读取并打印从表SELECT * FROM sflightWHERE carrid = spfli-carrid AND connid = spfli-connid.WRITE: / sflight-carrid,sy-vline,sflight-connid,sy-vline,sflight-fldate,sy-vline,sflight-price.ENDSELECT.ENDIF.使用hide技术从列表读取行*数据库表spfli相关TABLES: spfli.DATA: sela(1) TYPE c,num1 TYPE i.START-OF-SELECTION.SKIP.*输出ULINE AT /(95).WRITE: / sy-vline,'',sy-vline,(15) '航线承运人', sy-vline , (15)'航班连接', sy-vline,(15) '国家代码', sy-vline,(15)'起飞城市', sy-vline,(15) '起飞机场',sy-vline.ULINE AT /(95).*输出SELECT * FROM spfli.WRITE: / sy-vline,sela AS CHECKBOX,sy-vline,(15) spfli-carrid,sy-vline,(15) spfli-connid,sy-vline,(15) spfli-countryto,sy-vline,(15) spfli-cityfrom,sy-vline,(15) spfli-airpfrom,sy-vline.* 隐藏关键字HIDE: spfli-carrid,spfli-connid,spfli-countryto,spfli-cityfrom,spfli-airpfrom.ULINE AT /(95).* 隐藏选择框,使表格行不会选择HIDE sela.ENDSELECT.END-OF-SELECTION.num1 = sy-lsind - 1.AT LINE-SELECTION.*只输出第一页IF sy-lsind = 1.DO num1 TIMES.* 读取行READ LINE sy-index FIELD VALUE sela.* 如果checked,输出隐含字段IF sela = 'X'.WRITE: / spfli-carrid,spfli-connid,spfli-countryto,spfli-cityfrom,spfli-airpfrom.ENDIF.ENDDO.ENDIF.DATA:c1(2) TYPE c,c2(2) TYPE c,c3(2) TYPE c,c5(20) TYPE c,c9(2) TYPE c.c1 = 'AB'.c2 = 'CD'.c3 = 'EF'.c4 = 'GH'.c9 = '+'.CONCATENATE c1 c2 c3 c4 INTO c5.WRITE c5.CONCATENATE c1 c2 c3 c4 INTO c5 SEPARATED BY c9. WRITE / c5.WRITE / text-001.WRITE / text-002.WRITE / text-003.WRITE /.ULINE.DATA: BEGIN OF line,num TYPE i,sqr TYPE i,END OF line,itab LIKE STANDARD TABLEOF line WITH KEY table_line.DO 5 TIMES.line-num = sy-linno.line-sqr = sy-index ** 2.APPEND line TO itab.ENDDO.LOOP AT itab INTO line.WRITE: / line-num, line-sqr.ENDLOOP.CLEAR itab.DATA: c1(2) TYPE c,c2(2) TYPE c,c3(2) TYPE c,c4(2) TYPE c,c5(20) TYPE c VALUE '11 * 22 * 33 * 44',c9 = '* '.WRITE: / .WRITE c5.SPLIT c5 AT c9 INTO c1 c2 c3 c4 .WRITE: / c1,c2,c3,c4.DATA:BEGIN OF man,name(30) TYPE c,high TYPE p DECIMALS 2,weight TYPE p DECIMALS 2,END OF man.FIELD-SYMBOLS <fsa> LIKE man.DATA man1 LIKE man.man-name = '田雨荷'.man-high = '1.78'.man-weight = 140.ASSIGN man TO <fsa>.WRITE:/ <fsa>-name,man-high,<fsa>-weight.DATA: BEGIN OF man,name(20) TYPE c,high TYPE p DECIMALS 2,weight TYPE p DECIMALS 2,END OF man.YTH_HELLOWORLDDATA: man1 LIKE TABLE OF man WITH HEADER LINE, man2 LIKE TABLE OF man.man-name = '张参'.man-high = '1.68'.man-weight = 120.APPEND man TO man1.man-name = '刘志'.man-high = '1.78'.man-weight = 160.APPEND man TO man1.MOVE man1[] TO man2.LOOP AT man2 INTO man.WRITE: / man-name,man-high,man-weight. ENDLOOP.LOOP AT man1.write: / man1-name,man1-high,man1-weight. ENDLOOP.DATA: text1(10) TYPE c VALUE 'Basic list',text2(10) TYPE c VALUE 'Secondary List'.* Processing Block 1 : Event Block - START-OF-SELECTION START-OF-SELECTION.DO 5 TIMES.PERFORM output_line USING sy-index. ENDDO.* Processing Block 2 : Event Block - AT LINE-SELECTION AT LINE-SELECTION.WRITE: text2, sy-lsind.* Processing Block 3 : Procedure - Subroutine output_line FORM output_line USING p_index.WRITE: / text1,p_index.ENDFORM. "output_line。
SAPABAP_4编程语法汇总SAP ABAP(Advanced Business Application Programming)是SAP 系统中使用的一种编程语言。
在ABAP_4编程语法中,有一些重要的概念和语法规则需要了解。
下面是SAP ABAP_4编程语法的汇总。
1.ABAP程序的基本结构:ABAP程序由一系列的模块组成,每个模块由一对关键字BEGIN和END 组成。
一个程序通常由多个模块组成,每个模块都以ENDMODULE关键字结束。
模块可以是一个函数,一个子程序或一个方法。
2.数据类型:ABAP支持多种数据类型,包括整型(INT,INT1,INT2,INT4),浮点型(F,D),字符型(CHAR,STRING),日期型(D),时间型(T),结构型(STRUCTURE),表型(TABLE)等。
3.变量声明和赋值:在ABAP中,可以使用DATA语句声明变量,使用WRITE语句输出变量的值。
变量可以通过赋值语句(如"="和"=")来获得新的值。
另外,可以使用CONSTANTS语句定义常量。
4.控制结构:ABAP支持多种控制结构,包括条件语句(如IF,CASE),循环语句(如DO,WHILE,LOOP),跳转语句(如BREAK,CONTINUE,EXIT)等。
5.内部表和工作区:内部表用于存储和操作数据集。
可以使用内部表的语句(如SORT,READTABLE)对内部表进行排序和检索。
内部表可以是标准表,排序表,散列表或索引表。
6.函数和子程序:在ABAP中,可以使用FUNCTION和FORM语句定义函数和子程序。
函数是可重用的代码块,可以被其他程序调用。
子程序是一个独立的代码块,可以在同一个程序中调用。
7.对象和类:ABAP支持面向对象编程,可以使用CLASS语句定义类。
类包含属性和方法,并且可以实例化为对象。
对象可以使用NEW关键字创建,并且可以使用点号(.)来访问对象的属性和方法。
ABAP技巧总结1.引用類型z_ref數據對象myref在程序中的聲明方式:DATA myref TYPE z_ref.CREATE DA TA 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 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.連接字符串:CONCATENA TE s1 s2 …..sn INTO s_dest [SEPARATED BY sep].如果結果出現被截斷的情況,將SY-SUBRC返回4,否則返回0.符號&用于在字字符串換行時的連接.28.根據分隔符sep拆分字符串:SPLIT s_source AT sep INTO s1 s2 ……sn.使用內表操作可以避免被截斷的情況:SPLIT s_source A T sep INTO TABLE itab.此語句根據子串數目生成n行的內表.29.循環輸出內表的每一行數據:LOOP A T 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:TRANSLA TE34.創建一個可以排序的格式: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 V alues->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 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 程序內部數據定義參照自定義類型或內置類型生成數據的語法格式: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]…,…k n [TYPE type |LIKE dobj]…,END OF structure.參照生成:參照結構生成:TYPES|DA TA structure TYPE str_type |LIKE str_dobj...參照數據庫表生成:TYPES|DA TA 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 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 .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.連接字符串CONCA TENATE 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.t ext = ‘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是用來定義數據對象(實例變量)的,對于用DA TA直接定義的結構體對象(不參照其它結構類型),其同時也是一個結構類型.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] [WHEREcondition]..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.控制級操作(用于總計,縮進,格式控制等)A T FIRST|LAST|NEW f|END OF f.ENDA T.說明:●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 [VALUE(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.可捕捉的錯誤CA TCH SYSTEM-EXCEPTIONS exc1 = rc1 ... excn = rcn....ENDCATCH.其中exci表示一個單一可捕捉錯誤或者一個ERROR類,rci則代表一個數字.如果其中錯誤之一在CA TCH和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 调用类和方法ABAP 调用类和方法ABAP是一种面向对象的编程语言,在实际开发中,我们常常需要调用其他类和方法来实现各种功能。
本文将详细介绍ABAP中调用类和方法的多种方式。
直接调用方法通过创建类的实例,我们可以直接调用类中的方法。
以下是一个示例:DATA: lo_instance TYPE REF TO lcl_my_class.CREATE OBJECT lo_instance.lo_instance->my_method( ).上述代码中,我们首先创建了一个类的实例lo_instance,然后通过箭头运算符(->)调用了该实例的my_method方法。
静态方法调用除了通过实例对象来调用方法,我们还可以直接通过类名来调用静态方法。
静态方法在整个程序中只有一个实例,不需要创建实例即可调用。
示例如下:lcl_my_class=>my_static_method( ).上述代码中,我们通过类名lcl_my_class直接调用了静态方法my_static_method。
接口调用在ABAP中,接口是一种约定,规定了类必须实现的方法。
通过实现接口,我们可以实现多态性,提高代码的灵活性。
以下是一个接口调用的示例:DATA: lo_instance TYPE REF TO zif_my_interface.CREATE OBJECT lo_instance TYPE lcl_my_class.lo_instance->my_interface_method( ).上述代码中,我们首先创建了一个实现了接口zif_my_interface 的类的实例lo_instance,然后通过箭头运算符调用了实例的my_interface_method方法。
调用同一个方法的不同重载在ABAP中,我们可以对同一个方法进行多次重载,即为该方法提供不同的参数列表。
以下是一个重载方法调用的示例:DATA: lv_result TYPE i.lv_result = my_method( ).lv_result = my_method( iv_parameter ).lv_result = my_method( iv_parameter1, iv_parameter2 ).上述代码中,我们分别调用了my_method方法的不同重载。
ABAP (Advanced Business Application Programming) 是SAP系统的编程语言。
在ABAP中进行算术运算非常直接,你可以使用标准的算术运算符来进行加、减、乘、除等操作。
以下是一些基本的算术运算示例:1.加法:abap复制代码DATA: num1 TYPE i VALUE 10,num2 TYPE i VALUE 20,result TYPE i.result = num1 + num2.WRITE: / 'The sum is', result.2.减法:abap复制代码DATA: num1 TYPE i VALUE 30,num2 TYPE i VALUE 10,difference TYPE i.difference = num1 - num2.WRITE: / 'The difference is', difference.3.乘法:abap复制代码DATA: num1 TYPE i VALUE 5,num2 TYPE i VALUE 6,product TYPE i.product = num1 * num2.WRITE: / 'The product is', product.4.除法:abap复制代码DATA: num1 TYPE i VALUE 20,num2 TYPE i VALUE 5,quotient TYPE i.quotient = num1 / num2.WRITE: / 'The quotient is', quotient.5.取余:abap复制代码DATA: num1 TYPE i VALUE 9,num2 TYPE i VALUE 3,remainder TYPE i.remainder = num1 MOD num2. " 使用MOD运算符取余数。
都是从网上找到的编程技巧,汇总在一起。
1、ABAP CHECKBOX 和LISTBOX使用指南1.什么是checkbox:就是一个复选框,可以用like或者type来定义,为1个字符型变量。
它是parameter的一个选项,parameter xxx as checkbox就可以在选择屏幕上显示一个复选框。
2.什么是listbox:就是一个下拉列表,你可以在这个列表中选择一条记录进行某种操作。
也是parameter的一个选项,parameter xxx as listbox就可以在选择屏幕上显示一个下拉列表。
3.如何使用:下面我们用一个程序来说明这两者的使用方法。
REPORT Z_TEXTTYPE-POOLS: VRM . “存放combobox内容的type poolDATA: NAME TYPE VRM_ID , “ list box的名称LIST TYPE VRM_VALUES , “ list box的值VALUE LIKE LINE OF LIST . “ list box的结构*定义checkbox,指定command,为了能够响应选择屏幕中值的改变PARAMETERS: P_CB1 TYPE C AS CHECKBOX DEFAULT ‘X’ USER-COMMAND CHECK,P_CB2 TYPE C AS CHECKBOX DEFAULT ‘X’USER-COMMAND CHECK.*定义listbox,必须指定visible lengthPARAMETERS: P_LIST1(10) TYPE C AS LISTBOXVI SIBLE LENGTH 15 ,P_LIST2(20) TYPE C AS LISTBOXVI SIBLE LENGTH 25 .*开始执行AT SELECTION-SCREEN OUTPUT .*–〉选择1而没有选择2IF P_CB1 = ‘X’ AND P_CB2 = ”.*—〉向listbox里面添加值REFRESH LIST .VALUE-KEY = ’11′ . “这个就是变量P_LIST的值VALUE-TEXT = ’11′ . “这个是textAPPEND VALUE TO LIST .VALUE-KEY = ’22′ .VALUE-TEXT = ’22′ .APPEND VALUE TO LIST .VALUE-KEY = ’33′ .VALUE-TEXT = ’33′ .APPEND VALUE TO LIST .*—〉调用函数显示listbox里面的值CALL FUNCTION ‘VRM_SET_VALUES’EXPORTINGID = ‘P_LIST1′VALUES = LIST.*—〉把第二个listbox的值清空,并且不能输入 CLEAR P_LIST2 .LOOP AT SCREEN .IF SCREEN-NAME = ‘P_LIST2′ .SCREEN-INPUT = 0 .MODIFY SCREEN .ENDIF .ENDLOOP .*–〉选择2,没有选择1,同上ELSEIF P_CB2 = ‘X’ AND P_CB1 = ”.REFRESH LIST .VALUE-KEY = ‘AAAAAAAAAAAAAAAAAAAA’ .VALUE-TEXT = ‘AAAAAAAAAAAAAAAAAAAA’ .APPEND VALUE TO LIST .VALUE-KEY = ‘BBBBBBBBBBBBBBBBBBBB’ .VALUE-TEXT = ‘BBBBBBBBBBBBBBBBBBBB’ .APPEND VALUE TO LIST .VALUE-KEY = ‘CCCCCCCCCCCCCCCCCCCC’ .VALUE-TEXT = ‘CCCCCCCCCCCCCCCCCCCC’ .APPEND VALUE TO LIST .APPEND VALUE TO LIST .CALL FUNCTION ‘VRM_SET_VALUES’EXPORTINGID = ‘P_LIST2′VALUES = LIST.*—〉清空listbox 1的值CLEAR P_LIST1 .LOOP AT SCREEN .IF SCREEN-NAME = ‘P_LIST1′ .SCREEN-INPUT = 0 .MODIFY SCREEN .ENDIF .ENDLOOP .*–〉都没有选择,都清空且不能输入ELSEIF P_CB1 = ” AND P_CB2 = ” .CLEAR: P_LIST1,P_LIST2 .LOOP AT SCREEN .IF SCREEN-NAME = ‘P_LIST1′ .SCREEN-INPUT = 0 .MODIFY SCREEN .ENDIF .ENDLOOP .LOOP AT SCREEN .IF SCREEN-NAME = ‘P_LIST2′ .SCREEN-INPUT = 0 .MODIFY SCREEN .ENDIF .ENDLOOP .*–〉都选,执行ELSEIF P_CB1 = ‘X’ AND P_CB2 = ‘X’ .REFRESH LIST .VALUE-KEY = ’11′ .VALUE-TEXT = ’11′ .APPEND VALUE TO LIST .VALUE-KEY = ’22′ .VALUE-TEXT = ’22′ .APPEND VALUE TO LIST .VALUE-KEY = ’33′ .VALUE-TEXT = ’33′ .APPEND VALUE TO LIST .CALL FUNCTION ‘VRM_SET_VALUES’EXPORTINGID = ‘P_LIST1′VALUES = LIST.REFRESH LIST .VALUE-KEY = ‘AAAAAAAAAAAAAAAAAAAA’ .VALUE-TEXT = ‘AAAAAAAAAAAAAAAAAAAA’ .APPEND VALUE TO LIST .VALUE-KEY = ‘BBBBBBBBBBBBBBBBBBBB’ .VALUE-TEXT = ‘BBBBBBBBBBBBBBBBBBBB’ .APPEND VALUE TO LIST .VALUE-KEY = ‘CCCCCCCCCCCCCCCCCCCC’ .VALUE-TEXT = ‘CCCCCCCCCCCCCCCCCCCC’ .APPEND VALUE TO LIST .CALL FUNCTION ‘VRM_SET_VALUES’EXPORTINGID = ‘P_LIST2′VALUES = LIST.ENDIF .START-OF-SELECTION .*–〉输出到第二屏幕看看WRITE: P_LIST1 ,/ P_LIST2 .2、ABAP memory中的Export和Import可以用于SUBMIT方式调用其他ABAP程序后,数据只能通过某个透明表暂存,在由主程序查询透明表取得结果的情况,这样做的好处是不用在通过透明表转数据了,先把子程序中的数据EXPORT到一块命名的内存空间,然后在主程序里IMPORT命名的内存空间的值到内表中。
REPORT z_barry_export_import .DATA: BEGIN OF itab1 OCCURS 0 ,ff(10) ,END OF itab1.DATA: itab2 LIKE itab1 OCCURS 0 WITH HEADER LINE .DATA: str1 TYPE string ,str2 TYPE string .APPEND '1' TO itab1.APPEND '2' TO itab1.str1 = 'sssssssssss'.***如果是同名的对象,可以这么写:EXPORT itab1 TO MEMORY ID 'M1'.FREE itab1.IMPORT itab1 FROM MEMORY ID 'M1'.LOOP AT itab1.WRITE / itab1-ff.ENDLOOP.***如果不是同名的对象,需要加上一个对象名EXPORT a = itab1 b = str1 TO MEMORY ID 'M2'.IMPORT a = itab2 b = str2 FROM MEMORY ID 'M2'.LOOP AT itab2.WRITE / itab2-ff.ENDLOOP.WRITE / str2.3、ABAP 获得程序的激活次数或者传输次数的方法REPOSRC :Report Source CodeDATA SUM TYPE I.PARAMETERS P_NAME TYPE STRING.SELECT COUNT(*)FROM E070INNER JOIN E071 ON E071~TRKORR = E070~TRKORRINTO SUMWHERE E071~OBJ_NAME = P_NAMEAND E071~LOCKFLAG <> ''AND E070~TRSTATUS = 'R'.REPOSRC 这个表很有意思,它包含任何一个程序的激活次数,即字段VERN(版本)其中的字段R3STATE 如果是A则表明是激活的版本。
如果是I 表明是被修改的状态,如果最新的版本没有被激活,则会出现R3STATE字段有A 和I 的两组数据。
其中I为最新的保存数据的记录,VERN记录修改的次数。
R3STATE字段为A的则是记录前一次被激活的版本数据,VERN对应的版本号。
表REPOSRC对应一个视图这个视图是PROGDIR.使用这个视图对我们的控制会更有帮助,其中这个视图标签SELECITONS CONDITIONS中进行限制如下:TABLE FIELDNAME 操作COMPARISON VALUE AND/ORREPOSRC R3STATE EQ 'A' ORREPOSRC R3STATE EQ 'I'存放变式的表VARI 这是一张数据簇表。
4、ABAP 生成ZIP压缩文件的代码data: izip type ref to cl_abap_zip,cont type xstring ,xzip_file type xstring,binary_tab type standard table of x255 .data: itab type standard table of sdokcntasc .start-of-selection.do 20 times.append 'ABAP开发' to itab.enddo.call function 'SCMS_TEXT_TO_XSTRING'exportingmimetype = 'text/html;charset=gb2312'importingbuffer = conttablestext_tab = itabexceptionsfailed = 1others = 2.create object izip.call method izip->addexportingname = 'ITAB.TXT'content = cont.call method izip->savereceivingzip = xzip_file.call function 'SCMS_XSTRING_TO_BINARY'exportingbuffer = xzip_filetablesbinary_tab = binary_tab.call function 'GUI_DOWNLOAD'exportingfilename = 'C:\sf.zip'filetype = 'BIN'tablesdata_tab = binary_tab.5、ABAP程序打印Spool Request到PDF其实打印到pdf完全不需要程序,只要你装了pdf打印生成软件,打印的时候选择pdf也就行了。