ABAP快速入门.docx
《ABAP快速入门.docx》由会员分享,可在线阅读,更多相关《ABAP快速入门.docx(148页珍藏版)》请在冰豆网上搜索。
ABAP快速入门
ABAP快速入门
前言
SAP进入中国已经有些年头,在近年,实施SAP的公司越来越多,尽管SAP本身提供了相当强大的可配置功能,但是由于企业复杂的业务背景,特别是对各种报表的需求,依旧免不了二次开发.
长期以来,特别是受各种媒体和某些机构不正确的宣传,大家对SAP心存诸多疑虑,编写本套丛书的目的就是在于解除大家的疑虑,揭开SAP神秘的棉纱.
经常有用户感叹SAP博大精深,的确如此,但是本人认为那应该指SAP的设计理念,能融合诸多先进管理思想并可动态配置,确实是难能可贵,但是学习SAP并不难,甚至可算是很容易,设计手机芯片难吗?
难,但是没有手机用户反应其不会使用手机,设计办公软件难吗?
微软办公软件据说光从97版到2000版几千程序员花了两年时间,但是没有听说用户反映学习办公软件难的.学习SAP也是如此,如果要说难,难就难在国内市场上极少哪怕是介绍一个模块详细操作释疑的书籍,广大的SAP用户只能是自己摸索学习,即使参加了一些培训,可能起到的作用依旧有限,毕竟各培训教师自编的教材参差不齐水平也不一.
SAP顾问行业一度也是高薪标志,做SAP顾问需要什么条件究竟需要多长时间磨练,这是广大立志于SAP行业的读者经常困惑的问题.就本人的经验,如读者有一定的编程数据库和企业运作经验,做ABAP顾问三个月就足够,视具体情况而言,可能更长,甚至更短,事实上有相当部分朋友做到了这点.
本书分三部分,基础篇,以简短的篇幅介绍最基本的语法,增强篇介绍了常用的ABAP技术,最后的实战篇以五大模块(MM|SD|PP|FI|CO)最常见开发为实例介绍ABAPer可能要面临的开发任务.
本人有近10年的各种ERP系统分析开发和技术管理经验,在多家跨国公司担任过(迎合时下风气,在此吹牛皮N下).从2004年下年开始接触SAP,在不到一年时间参与或主持了多个项目的实施,愿意将经验和各位读者分享,同时希望此书对想从事ABAP开发的读者有相当帮助,本书就达到目的.
由于本人水平有限,错误难免,欢迎专家指正.
一.基础篇
如果读者已经有一定ABAP经验,可不看此篇,在此篇中,花了很少篇幅回顾ABAP编程的基本常识,读者如有其他开发工具的知识,花很少时间就可理解这些常识.
1.什么是ABAP?
了解一下ABAP的发展历史是必要的,ABAP产生的最初的目的是用以生成简单打印报表程序,我们知道SAP最初是为解决财务实时数据处理问题的,ABAP(AdvancedBusinessApplicationProgramming->高级业务应用编程语言)现在用于编写SAPAG的几乎全部产品源代码.
严格地讲,ABAP/4不仅仅是一个开发工具,而且是一套完整的client/server开发环境,这很好理解,微软的VisiualStudio是一开发环境,VB,VC++等是开发工具.ABAP开发环境包含支持程序开发的一些函数和包等.
如图1-1,是SAP开发环境的一个三层架构的例图,三层(多层)的概念也不新鲜,比如在安装SAP时也可将DBinstance安在一台server,Centralinstance在另一台所谓的Applicationserver(我想这应是相关SAP基础系统包括各种应用程序所在),而通常客户端安装的SAPLogonFrontEnd,SAP会话管理器等是所谓的表示层,它通过TCP/IP,SAP演示协议或RFC和应用服务器进行数据传输,用户看到的只是处理后的数据返回.
和Delphi的三层逻辑相近,在应用层包含多个组件象ABAP开发平台,身份验证,系统管理维护等用以处理会话,更新,排队,网关,数据层处理native和OpenSQL等(这是从内部机制方面看),SAP各模块应用的业务逻辑都在应用层被处理(从用户角度)然后结果被返回.
图1-2是SAPLogon的一个截图,[1]表示应用服务器(通常企业为了节省成本和方便管理可能会将应用服务器和数据库安装在同一起),[2]Systemnumber,举个实例,开发和测试服务共用一台服务器,开发使用systemnumber00,而测试使用systemnumber01,通过systemnumber逻辑地将一台physicalserver逻辑地分成了两台applicationserver.
学习ABAP并不难,有人说SAP系统重在管理思想,不在技术,通常对有编程经验的读者不用任何培训参考一些相关资料就可立即上手.
简单介绍下ABAP/4的一些特征:
1.和SAP紧密结合,尤其在开发报表方面,坦率地讲,除了和SAP集成的好处,.我定认为ABAP在报表开发上比CrystalreportTool要高效简单.
2.和VB一样,ABAP是解释形的,如读者精通VB,学习ABAP应该豪不费力,倒是既然SAP是企业管理解决方案,ABAPer必须对企业管理流程熟悉.
解释性的另一好处是可以很好跟踪程序逻辑(使用/H),这对了解业务逻辑的实和追踪错误很有效.和VB不同的是,VB跟踪时允许程序运行指针随意往回或往全拉而ABAP程序去不行,但是ABAP程序允许在运行时修改变量的值,这是编译程序不能做到的.当然通常编译比解释执行的速度会更快.
ABAP程序执行并不直接读取源代码,而是执行内部经过“生成”的描述,对于ABAP/4字典的修改激活后将触发内部描述的重新生成,如程序并没激活就执行原版本,或者出现错误(程序没激活可能造成ABAPDumpingABAP).
3.在对数据库处理方面,除了可直接执行SQL(使用nativesql,缺点是错误处理很难控制,相当于有开发环境将SQL语句直接传给DB去执行),SAP在ABAP开发环境层还提供了一套OpenSQL访问底层数据库.
4.程序员都知道Windows平台下开发都支持事件驱动,Windows系统本身也支持事件驱动,ABAP也提供了事件驱动,这表现在Dialog编程方面,但是ABAP在此方面并不强,而且相对讲也比较难于掌握(在后面会讨论).
5.基于面向对象的风靡,ABAP在此方面也有相当反应,在SAP强大的软件包中提供了大量可重复使用的程序,读者也可定义类并使用它快速建立新的对象.
6.类似Java,ABAP开发的程序能运行于任何操作系统(Java有Java虚拟机,ABAP也有ABAPprocessor),多种数据库(比如在ABAP字典中实现了透明表对各种底层数据库表的映射,这样在ABAP层看到的透明表就和具体数据库无关),各种网络系统.
图1-3是一个ABAP开发和运行环境的图例.
1使用C|C++建立ABAP开发工具,数亿行ABAPsourcecode组成SAPAG多个产品.
姑且不论国内ERP产品设计在解决企业流程上的局限性,在大多数国外的ERP产品中我们都可看到结合自身ERP自带的开发工具,在技术上这也是落后人家.所以建议国内ERP界能少谈点象什么”不上ERP等死,上ERP找死”,”百分之百的企业上ERP都失败”诸如的空洞口号(实际上我并不知道他们是凭什么得出这样的结论的),多干点实际的事情.
2既然ABAP是解释型的,运行速度会有影响吗?
我想多少会有的,为了解决这个问题,除了要加大相关服务器内存外(相对日新月异的硬件技术这已非主要瓶颈)
),SAP本身在提高性能也提供了相当的ABAP技术,比如使用Clustertable,Pooledtable和Logicaldatabase,在接下来会有详细介绍.
2.ABAP开发环境的建立
一个ABAP顾问和我讨论说,大学毕业我做ABAP开发不久做了顾问,薪资相当可观,最要好同学在unix平台下写Cobar组件,薪资却并不理想.
从技术角度,我认为使用C++写组件肯定比ABAP开发难度要高,用其人话说他是坐的庙好.是的,SAP行业特别是早些年是个被异化的行业,人们可看到某些人出于经济目的铺天盖地的对ERP不正确的宣传,这同样反应在IT各行业,”拿到XX牌Route认证,拿到XX网络认证,拿到XX数据库认证,拿到XX管理学位年薪基本的都在十几万以上”,现在人们发现实际不是这回事,从现在,SAP也已经开始降温了,我想这趋势还会持续.
和学习其它语言唯一不同的是,ABAP是集成在SAP基础平台系统中的,为了学习ABAP,你必须安装一套SAP(可选择R/3,miniSAP,或IDES),而通常的情况是安装光盘渠道比较难找(只有一些大企业实施了SAP才可能有,而且还必须注意版权问题,其他开发工具随便都可找到安装程序),对想学习ABAP的程序员这是个主要门槛.
掌握基本的ABAP开发环境对ABAPer是有益的,似乎多数ABAPer对底层并不感兴趣,
3.第一个程序-HelloWorld.
如何进行ABAP开发呢?
本节使用老套的做法,介绍如何建立一个”HelloWorld”的ABAP程序,为了让读者尽快掌握ABAP开发熟悉ABAP开发环境是必须的,请看图1.5-1.
程序的原代码如下:
ReportZHELLO.
Write‘HelloWorld!
’.
按F8运行,运行成功在屏幕上显示HelloWorld!
的字样,恭喜你,第一个程序运行成功.
4.ABAP语法简介
DataType
ABAP/4的资料型态可分成:
TypeLengthRangeInitialValueDescription
C11-65535ByteSpace字符串数据,如’Program’
D88Byte‘00000000’日期资料,格式为YYYYMMDD
F88Byte0浮点数
I4-2^31至2^31-10整数
N11-65535Byte‘00…0’数值所组成的字符串
P81-16Byte0Packed数,用在小数点数
T66Byte‘000000’时间资料,格式为HHMMSS
X11-65535ByteX’00’16进位数
变量宣告
变量宣告包含name,type,length和structure四个部分,使用DATA指令,如
DATA:
S1TYPEI,
SUMTYPEI.
常数宣告
常数宣告使用CONSTANTS指令,如宣告PI是一个小数点5位的值3.14159,
CONSTANTSPITYPEPDECIMALS5VALUE‘3.14159’.
系统所定义资料
这是由系统所定义的专有名辞,如
SPACE空白字符串
SY-SUBRC系统执行传回值,0表示成功
SY-UNAMElogon帐号
SY-DATUM系统日期
SY-UZEIT系统时间
SY-TCODE目前的transactioncode
TYPE叙述
用来指定资料型态或宣告自定资料型态
Example:
TYPES:
BEGINOFMYLIST,
NAME(10)TYPEC,
NUMBERTYPEI,
ENDOFMYLIST.
DATALISTTYPEMYLIST.
LIKE叙述
跟TYPE叙述使用格式相同,如
DATATRANSCODELIKESY-TCODE.
不同的是LIKE用在已有值的资料项,如系统变量,而TYPE叙述则是用
在指定资料型态。
DATA叙述
语法:
DATA[][][]
:
变量名称,最长30个字符,不可含有+.,:
()等字符
:
资料型态及长度,如LINE(20)TYPEC.MYNAMELIKESY-UNAME.
:
初值
:
小数字数
Example:
DATA:
COUNTERTYPEPVALUE1,
FLAGTYPECVALUEISINITIAL,
WEIGHTTYPEPDECIMALS2VALUE‘1.25’.
字段变量的宣告:
DATA:
BEGINOFADDRESS,
NAME(10)TYPEC,
NUMBERTYPEP,
ENDOFADDRESS.
使用时用字段变量加上组件名称,如ADDRESS-NAME
CONSTANTS叙述
用来宣告常数
语法:
CONSTANTS[][][]
Example:
CONSTANTS:
CNAME(10)VALUE‘周庆日’,
BIRTH_DAYTYPEDVALUE‘19650201’.
STATICS叙述
宣告的变量仅在目前的程序中使用,结束后会自动释放
语法:
STATICS[][][]
TABLES叙述
用来宣告TableWorkArea的资料,对映至ABAP/4资料文件(DictionaryObject),
由SQL指令加载所需数据
语法:
TABLES
Example:
TABLES:
SPFL.
SELECT*FROMSPFL.
WRITE:
SPFL-MANDT,SPFL-CARRID,SPFL-CONNECTION.
ENDSELECT.
从ABAP/4Dictionary的SPFL档加载MANDT,CARRID,CONNECTION三个字段至
SPFL此TableWorkArea
Write叙述
ABAP/4用来在屏幕上输出资料的指令是Write指令
语法:
Write资料项
数据项可以是常数或变量,如:
WRITE‘Thisissample’.
WRITE:
‘COMPANY:
’,STFL-CARRID.
指定屏幕位置显示
语法:
WriteAT[/][][()]资料项
/:
先往下一列
pos:
屏幕X轴坐标
(len):
显示资料的长度
Example:
WRITE‘FirstLine’.
WRITE/6‘SecondLine’.
输出结果:
FirstLine
SecondLine
DATA:
NUMBERTYPEIVALUE‘1234567890’.
TEXT(10)VALUE‘ABCDEFGHIJ’.
WRITE:
(5)NUMBER,/(6)TEXT.
输出结果:
*7890
ABCDEF
指定显示格式
语法:
WRITE资料项<显示格式参数>
显示格式参数:
LEFT-JUSTIFIED资料靠左显示
CENTERED资料靠中间显示
RIGHT-JUSTIFIED资料靠右显示
UNDER在资料项的X轴开始坐标显示
NO-GAP紧接着显示,不留空格
USINGEDITMASK使用内嵌字符显示,如11:
20:
30
USINGNOEDITMASK不使用内嵌字符
NO-ZERO数字前面0的部分不显示
NO-SIGN不显示正负号
DECIMALS显示d位小数字数
EXPONENTF(浮点数)exponent的值
ROUND四舍五入至小数字数下r位
CURRENCY币别显示
DD/MM/YY日期显示格式
MM/DD/YY
DD/MM/YYYY
MM/DD/YYYY
DDMMYY
MMDDYY
YYMMDD
Example:
DATA:
XTYPEIVALUE‘112030’,
A(5)VALUE’ABCDE’.
WRITEXUSINGEDITMASK‘__:
__:
__’.
输出结果为11:
20:
30
WRITEXUSINGEDITMASK‘$___,___’
输出结果为$112,030
产生空白列
产生n个空白列
语法:
SKIP[]
Example:
WRITE‘PASS1’.
SKIP.
WRITE‘PASS2’.
输出结果为:
PASS1
PASS2
显示图标
可以显示R/3系统所提供的符号或图标
语法:
WRITEASSYMBOL
WRITEASICON
Example:
INCLUDE
INCLUDE
WRITE:
/‘PhoneSymbol:
’,SYM_PHONEASSYMBOL.
WRITE:
/‘AlarmIcon:
’,ICON_ALARMASICON.
执行结果:
要查看系统所提供有那些符号及图标,可选择“Edit”下的“InsertStatement”,选择
“WRITE”
接下来选择要查的群组,如SYMBOL或ICON,按下“Display”即可.
跳至指定列坐标
将坐标跳至指定的Y轴列坐标
语法:
SKIPTOLINE[]
Example:
SKIPTOLINE5.
WRITE‘PASS1’.
显示CHECKBOX资料
以字符串资料内容的第一个字符为CHECKBOX的输出,如果是空白,CHECKBOX显示
为空白,相反则显示X,可用在逻辑判断检查
语法:
WRITE<资料项>ASCHECKBOX.
Example:
DATA:
FLAG1VALUE‘‘.
FLAG2VALUE‘X’.
WRITE:
/‘CHECKFLAG1:
’,FLAG1ASCHECKBOX.
WRITE:
/‘CHECKFLAG2:
’,FLAG2ASCHECKBOX.
执行结果:
2.4ProcessingData
AssignValue
语法:
MOVETO
将F1的值存至变量F2中,也可写成F2=F1
Example:
M_NAME=‘CHER’.
使用Offset
语法:
MOVE[+]TO[+]
Example:
DATA:
F1(10)VALUE‘ABCDEFGHIJ’.
F2(5).
F2=F1+3(5).“自第4个位置开始取出5个字符
F2的内容会变成DEFGH
FieldString组件的复制
语法:
MOVE–CORRESPONDINGTO.
将Strings1中的field组件的资料复制至String2中,仅复制相同名称的组件
Example:
DATA:
BEGINOFADDRESS,
FIRSTNAME(10)VALUE‘LULU’,
LASTNAME(10)VALUE‘CHOU’,
TEL(12)VALUE‘4660570’,
ENDOFADDRESS.
DATA:
BEGINOFNAME,
FIRSTNAME(10),
LASTNAME(10),
E_MAIL(30),
ENDOFNAME.
MOVE-CORRESPONDINGADDRESSTONAME.
NAME-FIRSTNAME变成‘LULU’,NAME-LASTNAME变成‘CHOU’,
而NAME-E_MAIL则不变
变量CALLBYVALUE的使用
在变量的使用上,可以使用类似CallByValue的方法
语法:
WRITE()TO
Example:
DATA:
NAME(20)VALUE‘SOURCE’,
SOURCE(10)VALUE‘LILY’,
TARGET(10).
WRITE(NAME)TOTARGET.
WRITE/TARGET.
屏幕可印出LILY
清除变量内容
语法:
CLEAR
清除变量现在内容,恢复成初值
Example:
DATANTYPEIVALUE100.
CLEARN.
变量N的内容变成0
算术符号
**乘幂
*乘
/除
+加
-减
DIV整数除法
MOD余数除法
数值函数
1.ABS(N):
传回数值N的绝对值
2.SIGN(N):
1ifN>0
1ifN=0
-1ifN<0
3.CEIL(N):
传回大于数值N的最小整数
Example:
WRITECEIL(-5.65)印出–5.00
WRITECELL(4.54)印出5.00
4.FLOOR(N):
传回小于数值N的最大整数
Example:
WRITEFLOOR(-5.65)印出–6.00
WRITEFLOOR(4.54)印出4.00
5.TRUNC(N):
传回数值N的整数部分
Example:
WRITETRUNC(5.65)印出5.00
6.FRAC(N):
传回数值N的小数部分
Example:
WRITEFRAC(5.65)印出0.65
7.COS(A),SIN(A),TAN(A):
传回三角函数cosA,sinA,tanA的值,A为弪度量
8.EXP(N):
传回e^N值
8.LOG(N):
传回logeN值
9.LOG10(N):
传回logN值
10.SQRT(N):
传回N的平方根值
日期与时间运算
1.日期资料的运算
日期资料可以直接运算,如加法与减法的运算
Example:
DATA:
MdataTYPED.
Mdate=SY-DATUM.“如传回19971015
Mdate+6
(2)=‘01’“Mdate变成19971001
Mdate=Mdate-1“Mdate变成19970931
2.时间资料的运算
时间格式为‘hhmmss’,如‘212030’表’21:
20:
30’
Example:
DATA:
HOURSTYPEI,
MINUTESTYPEI,
T2TYPETVALUE‘200000’,
T1TYPETVALUE‘1