ABAP开发三月通基础篇.docx
《ABAP开发三月通基础篇.docx》由会员分享,可在线阅读,更多相关《ABAP开发三月通基础篇.docx(17页珍藏版)》请在冰豆网上搜索。
ABAP开发三月通基础篇
ABAP开发三月通-基础篇
更新时间:
2015-01-1523:
38:
30编辑:
SAP中文学习网点击:
19发表评论
本文标签:
基础
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(Advanced Business Application Programming->高级业务应用编程语言)现在用于编写SAP AG的几乎全部产品源代码.
严格地讲,ABAP/4不仅仅是一个开发工具,而且是一套完整的client/server开发环境,这很好理解,微软的Visiual Studio是一开发环境,VB,VC++等是开发工具.ABAP开发环境包含支持程序开发的一些函数和包等.
如图1-1,是SAP开发环境的一个三层架构的例图,三层(多层)的概念也不新鲜,比如在安装SAP时也可将DB instance安在一台server, Central instance在另一台所谓的Application server(我想这应是相关SAP基础系统包括各种应用程序所在),而通常客户端安装的SAP Logon Front End,SAP会话管理器等是所谓的表示层,它通过TCP/IP,SAP演示协议或RFC和应用服务器进行数据传输,用户看到的只是处理后的数据返回.
和Delphi的三层逻辑相近,在应用层包含多个组件象ABAP开发平台,身份验证,系统管理维护等用以处理会话,更新,排队,网关,数据层处理native 和Open SQL等(这是从内部机制方面看),SAP各模块应用的业务逻辑都在应用层被处理(从用户角度)然后结果被返回.
图1-2是SAP Logon的一个截图,[1]表示应用服务器(通常企业为了节省成本和方便管理可能会将应用服务器和数据库安装在同一起),[2]System number,举个实例,开发和测试服务共用一台服务器,开发使用system number00,而测试使用system number 01,通过system number逻辑地将一台physical server逻辑地分成了两台application server.
学习ABAP并不难,有人说SAP系统重在管理思想,不在技术,通常对有编程经验的读者不用任何培训参考一些相关资料就可立即上手.
简单介绍下ABAP/4的一些特征:
1.和SAP紧密结合,尤其在开发报表方面,坦率地讲,除了和SAP集成的好处,.我定认为ABAP在报表开发上比Crystal reportTool要高效简单.
2.和VB一样 ,ABAP是解释形的,如读者精通VB,学习ABAP应该豪不费力,倒是既然SAP是企业管理解决方案,ABAPer必须对企业管理流程熟悉.
解释性的另一好处是可以很好跟踪程序逻辑(使用/H),这对了解业务逻辑的实和追踪错误很有效. 和VB不同的是,VB跟踪时允许程序运行指针随意往回或往全拉而ABAP程序去不行, 但是ABAP程序允许在运行时修改变量的值,这是编译程序不能做到的. 当然通常编译比解释执行的速度会更快.
ABAP程序执行并不直接读取源代码,而是执行内部经过“生成”的描述,对于ABAP/4字典的修改激活后将触发内部描述的重新生成,如程序并没激活就执行原版本,或者出现错误(程序没激活可能造成ABAP Dumping ABAP).
3.在对数据库处理方面,除了可直接执行SQL(使用native sql,缺点是错误处理很难控制,相当于有开发环境将SQL 语句直接传给DB去执行),SAP在ABAP开发环境层还提供了一套Open SQL访问底层数据库.
4. 程序员都知道Windows平台下开发都支持事件驱动,Windows系统本身也支持事件驱动,ABAP也提供了事件驱动,这表现在Dialog编程方面,但是ABAP在此方面并不强,而且相对讲也比较难于掌握(在后面会讨论).
5.基于面向对象的风靡,ABAP在此方面也有相当反应,在SAP强大的软件包中提供了大量可重复使用的程序,读者也可定义类并使用它快速建立新的对象.
6.类似Java,ABAP开发的程序能运行于任何操作系统(Java有Java虚拟机,ABAP也有ABAP processor),多种数据库(比如在ABAP字典中实现了透明表对各种底层数据库表的映射,这样在ABAP层看到的透明表就和具体数据库无关),各种网络系统.
图1-3是一个ABAP开发和运行环境的图例.
1 使用C|C++建立ABAP开发工具,数亿行ABAP source code组成SAP AG多个产品.
姑且不论国内ERP产品设计在解决企业流程上的局限性,在大多数国外的ERP产品中我们都可看到结合自身ERP自带的开发工具,在技术上这也是落后人家.所以建议国内ERP界能少谈点象什么”不上ERP等死,上ERP找死”,”百分之百的企业上ERP都失败”诸如的空洞口号(实际上我并不知道他们是凭什么得出这样的结论的),多干点实际的事情.
2 既然ABAP是解释型的,运行速度会有影响吗我想多少会有的,为了解决这个问题,除了要加大相关服务器内存外(相对日新月异的硬件技术这已非主要瓶颈)
),SAP本身在提高性能也提供了相当的ABAP技术,比如使用Cluster table, Pooled table和Logical database ,在接下来会有详细介绍.
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.获得Access Key .
4.ABAP workbench和ABAP dictionary
5.第一个程序-Hello World.
如何进行ABAP开发呢本节使用老套的做法,介绍如何建立一个”Hello World”的ABAP程序, 为了让读者尽快掌握ABAP开发熟悉ABAP开发环境是必须的,请看图1.5-1.
程序的原代码如下:
Report ZHELLO.
Write ‘Hello World!
’.
按F8运行,运行成功在屏幕上显示Hello World!
的字样,恭喜你,第一个程序运行成功.
6.ABAP语法简介
数据类型
控制流程
文本摘要
输出格式
程序调试
7.Open SQL和Native SQL
8.内表和工作区
9.使用字段符号
10.模块化程序
11.文件处理
12.簇数据库和逻辑消息和错误处理数据库
13.
尽管消息这词还用在其他地方比如PO,SO打印传真等所谓的output message(请看ABAP百夜谈),系统出现异常,在这里消息只谈在程序运行逻辑异常处理时的消息.
1定义消息(参考图7-7).
使用Tcode SE91可自定义包含多消息号的消息类,在图7-7中就定义了一个消息类ZFIMSG,同时消息号017 中使用了俩&消息变量
2运用消息.
1.可在程序Title中使用MESSAGE-ID加入消息类.
REPORT ZMSGTEST MESSAGE-ID ZFIMSG .
MESSAGE I017.
使用消息IMG有这样的画面,[1][2]的appl和work area实际上对应的就是程序的message_id(SE91:
message class).
2.在程序Title中定义直接在语句中使用.
REPORT ZMSGTEST .
MESSAGE I017(ZFIMSG).
1.将变量赋给消息.
REPORT ZMSGTEST .
MESSAGE I017(ZFIMSG) with ‘Var1’ ‘Var2’ ‘Var3’ .
或者
MESSAGE ID ' ZFIMSG ' TYPE 'I' NUMBER '0171' with ‘Var1’ ‘Var2’ ‘Var3’ .
尽管017只定义了两消息变量,但是可With多个值,当然只有前俩生效.
4.SAP程序消息类型有下列几种.
I:
信息窗口 W:
警告 E:
错误 S:
成功 A:
终止程序或Tcode X:
未知.
5.和标准SAP一样,你可配置消息,比如你需要由用户决定消息类型,使用下面程序.
PROGRAM ZMSGTEST .
CALL FUNCTION 'READ_CUSTOMIZED_MESSAGE'
EXPORTING
I_ARBGB = 'ZFIMSG'
I_DTYPE = ''
I_MSGNR = '017'
IMPORTING
E_MSGTY = SY-MSGTY.
假设你做了Tcode和OBA5一样可配置消息类型,在程序中你就可根据返回值SY-MSGTY判断下步工作,E停止处理,A退出程序等.
在标准程序中,接下来会PERFORM MESSAGE_SEND来决定发送消息类型.
3常用消息表格和各模块常用消息配置Tcode.
在消息配置中,Application Area和SE91的Message Class实际上是同一概念.
1消息相关最常用的table:
T100:
SAP能用到的消息都应该在此表中找到.
T160M :
MM模块相关消息表,此表可完全直接维护.就是说只要记住它,MM的消息配置直接使用SE16就可以.
T100C:
FI模块中用户自定义的消息,比如使用OBA5, OFMG等自定义的消息会写入此表,CO配置消息不在此表.
T100S:
此表保存着允许用户更改的应用区域和消息号,举例假设你删除了KI 005则在OBA5中再不能配置此消息.(对MM模块有些例外,M7不在此表,使用OMCQ依旧可设置,M3不在此表,OMT4依旧可设置)
此表也可直接维护.和T160M不同的是,你必须在SE16输入T100S按新建按钮
才可维护.查询时只可Display.
T100U:
哪个用户最后更改了消息,从此表能找到.
T100W:
For Workflow
2常用Tcode(部分):
FI:
OBA5|OFMG|OFPM
MM:
OMRM|OKZZ|OMT4|OMCQ |O04C|
SD:
OVAH
CO:
OPR4_ACT|OPR4_CK|OPR4_CKML|OPR4_CKPF|OPR4_KKA|OPR4_KKP|OPR4_KKS|
OPR4_KKS1|OPR4_PPCOPP
Others:
OPR5|OPR1|OPR3|OPR6|OPR7|OPR8|OPR9|OPRCMFE|MSW1|MSW2
3应用举例.
物料价格维护问题
[Case 1]如何在物料价格未维护时依旧可估算成本.
比如在CK11N(CK40N)计算成品标准成本时,其中有一些Component没维护价格.就可使用
OPR4_CK将默认的错误消息Switch Off掉(从Tcode OKKN->Misc.->Error Management按钮也可).
***另外临时处理方法一是将相关component的物料Cost 1View选上Do not Costing.
对需要计算标准成本的材料选上它就不再允许计算标准成本,不妥,但是对原材料无所谓,因为系统会这样处理,如此材料没维护价格,BOM用到它的成品不计算其成本,但是如此物料维护了价格后,还是以物料价格为先的.(当然CK11N去估算此原材料是不行的,用户也不需如此做).二是按SAP推荐的如果将price设成0.01,price unit设置成100.
[Case 2]如何限定物料价格必须维护.
(1)对采用S price control的.SAP默认是Warning(Tcode :
OMT4 M3-132,如需要限定必须维护价格,将其改成W就可.
(2)对采用V price control的,OMT4找不到其消息号M3-131,但系统默认是Warning,如果用户认为也有相关配置就有犯了认为SAP万能的错误,再次强调SAP只是一堆代码并不神秘.好让我们看看其逻辑.
***实际上直接使用SE16:
T160M可直接配置MM相关.
如图:
[1]SE38找到程序LMG11F01 [2]在此处设置断点 [3]如价格为0(空格)
写死的,当然配置无效.
再看S Price control(如下图,显然从T160M表读了IMG数据).
4灵活运用消息.
对于消息的运用,除了可配置消息类别外,另外一个重要用处就在于,可根据消息找到程序弹出消息的确切行,然后稍微花点时间看看程序逻辑就可大概知道异常发生的根本原因. 从某种程度来讲,即使对某模块很陌生,只要掌握得好,依旧可排除一些问题.
5 配置自定义的消息.
俩方法可模妨SAP的消息配置
1从上我们已经知道既然T160M是可直接使用SE16维护的,我们就可直接将相关设置写入T160M.然后就可根据相关设置取得消息类别(如上图我们使用函数ME_CHECK_T160M),这样比类似MESSAGE E017(ZFIMSG)—Hard code要安全得多,假设不管三七二十一就给出错误消息,除非在程序中确信已考虑了所有情况,否则还是在T160M这样设置比较好(万一在生产环境还可更改E成W什么的).
2我们知道T100C是所谓的可配置消息表,我们可使用SE16:
T100C和V_T100C.
(1)SE16:
T100S定义消息可配置信息.
如图[1]在此新建.(进去browse数据似乎不可新建)
设置消息.如下图.
[1]Appl Area消息类ZFIMSG. [2]表示允许配置的消息类型 [3]没选则表示不能关闭消息.
(2)SE16:
V_T100C配置消息.
如图:
[1]表示直接使用程序(Tcode)的消息类型[2]当当程序以BDC方式运行时的消息类型
[3]就是上图设置的允许的消息类型,可看到警告和关闭都没出现(T100C没允许)
同样在程序中避免使用泪水MESSAGE E017(ZFIMSG)而采用
CALL FUNCTION 'READ_CUSTOMIZED_MESSAGE'
EXPORTING
I_ARBGB = 'ZFIMSG'
I_DTYPE = ''
I_MSGNR = '017'
IMPORTING
E_MSGTY = SY-MSGTY.
根据返回的SY-MSGTY去判断消息类型将更好些.
6实例介绍
PO在有发票校验后禁止修改价格,假设无PO release策略,使用User-exit步骤如下:
(1)找合适的用户出口
发现EXIT_SAPMM06E_017比较合适,SMOD 输入enhancement name :
MM06E005
(2)编写代码.
*&---------------------------------------------------------------------*
*& Include ZXM06U42 *
*&---------------------------------------------------------------------*
DATA :
ZWATEKPO like BEKPO ,
ZIEINFO LIKE EINFO OCCURS 0 WITH HEADER LINE,
ZERMSG(73) TYPE C.
TABLES EKBE .
***TEKPO records all the old PO item date .
*** I_EKPO records currently processed PO item .
READ TABLE TEKPO INTO ZWATEKPO WITH KEY EBELP = I_EKPO-EBELP .
***只对ME22N才生效.
CHECK SY-TCODE = 'ME22N '.
***EKBE是PO history 表,如有Q,R表示有发票校验历史,不允许更改价##
SELECT SINGLE * FROM EKBE
WHERE EBELN = I_EKPO-EBELn
AND EBELP = I_EKPO-EBELP
AND ( BEWTP = 'Q' OR BEWTP = 'R').
CHECK SY-SUBRC = 0 .
***如果SY-SUBRC =0表示发票已经校验,不允许更改价格,否则还是可更改价格##
IF I_EKPO-NETPR <> ZWATEKPO-NETPR .
*** Change e017(ZFIMSG) accordingly
* MESSAGE e017(ZFIMSG)."使用下面函数代替.
CALL FUNCTION 'READ_CUSTOMIZED_MESSAGE'
EXPORTING
I_ARBGB = 'ZFIMSG'
I_DTYPE = ''
I_MSGNR = '017'
IMPORTING
E_MSGTY = SY-MSGTY.
CHECK SY-MSGTY NE '-' .
REFRESH ZIEINFO.
ZIEINFO-MSGID = 'ZFIMSG'.
ZIEINFO-MSGNO = '017' .
ZIEINFO-MSGV1 = 'VAR1'.
ZIEINFO-MSGV2 = 'VAR2'.
APPEND ZIEINFO .
CALL FUNCTION 'MESSAGE_GET_TEXT'
EXPORTING
IEINFO = ZIEINFO
ILANGU = SY-LANGU
IMPORTING
ETEXT = ZERMSG .
MESSAGE ZERMSG TYPE SY-MSGTY .
ENDIF.
***在大多数情况下追踪消息能发现问题所在,然而在一些特定情况下,SAP显示的消息似乎和实际业务并不符合.好比一个人咳嗽的厉害,以为是感冒结果其实不过是有写异物进入其喉咙而已.
14.使用用户授权
15.调用外部程序和程序动态生产
16.选择屏幕
17.使用程序运行变式
18.制作Tcode