ABAP技巧代码汇总
abap bdc代码

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新语法和函数,关键字,可以提高工作效率

一些我工作中经常使用的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常用事_代_码

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表用户信息。
ABAP技巧代码汇总

都是从网上找到的编程技巧,汇总在一起。
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命名的内存空间的值到内表中。
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][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,。
ABAP源代码:ranges赋值、单位转换、月末日期取值、自定义视图调用、库存取值代码

① 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方法使用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技巧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. 运行时间调试•单步执行: 在调试时,可以逐行或逐过程执行代码,以便观察执行过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
都是从网上找到的编程技巧,汇总在一起。
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也就行了。