sapABAP开发入门到进阶.docx

上传人:b****4 文档编号:11988010 上传时间:2023-04-16 格式:DOCX 页数:21 大小:115.93KB
下载 相关 举报
sapABAP开发入门到进阶.docx_第1页
第1页 / 共21页
sapABAP开发入门到进阶.docx_第2页
第2页 / 共21页
sapABAP开发入门到进阶.docx_第3页
第3页 / 共21页
sapABAP开发入门到进阶.docx_第4页
第4页 / 共21页
sapABAP开发入门到进阶.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

sapABAP开发入门到进阶.docx

《sapABAP开发入门到进阶.docx》由会员分享,可在线阅读,更多相关《sapABAP开发入门到进阶.docx(21页珍藏版)》请在冰豆网上搜索。

sapABAP开发入门到进阶.docx

sapABAP开发入门到进阶

SAP-A

BAP开发入门到进阶

基础篇-以简短的篇幅介绍最基本的语法增强篇-介绍了常用的ABAP技术

希望此书对想从事ABAF开发的读者有相当帮助

一.基础篇

如果读者已经有一定ABAP经验,可不看此篇,在此篇中,花了很少篇幅回顾ABAP编程的基本常识,读者如有其他开发工具的知识,花很少时间就可理解这些常识•

1.什么是ABAP

了解一下ABAP的发展历史是必要的,ABAP产生的最初的目的是用以生成简单打印报表程序,我们知道SAP最初是为解决财务实时数据处理问题

的,ABAP(AdvaneedBusinessApplicationProgramming->高级业务应用编程语言)

现在用于编写SAPAG的几乎全部产品源代码.

严格地讲,ABAP/4不仅仅是一个开发工具,而且是一套完整的client/server开发环境,这很好理解,微软的VisiualStudio是一开发环境,VB,VC++等是开发工具.ABAP开发环境包含支持程序开发的一些函数和包等.

如图1-1,是SAP开发环境的一个三层架构的例图,三层(多层)的概念也不新鲜比如在安装SAP时也可将DBinstanee安在一台server,Centralinstanee在另

一台所谓的Applieationserver(我想这应是相关SAP基础系统包括各种应用程序所在),而通常客户端安装的SAPLogonFrontEnd,SAP会话管理器等是所谓的表示层,它通过TCP/IP,SAP演示协议或RFC和应用服务器进行数据传输,用户看到的只是处理后的数据返回.

和Delphi的三层逻辑相近,在应用层包含多个组件象ABAF开发平台,身份验证,系统管理维护等用以处理会话,更新,排队,网关,数据层处理native和OpenSQL等(这是从内部机制方面看),SAP各模块应用的业务逻辑都在应用层被处理(从用户角度)然后结果被返回.

Sl-l

图1-2是SAPLogon的一个截图:

1]表示应用服务器(通常企业为了节省成本和方便管理可能会将应用服务器和数据库安装在同一起),[2]Systemnumber,举个实例,

开发和测试服务共用一台服务器,开发使用systemnumberOO,而测试使用systemnumber01,通过systemnumber逻辑地将一台physicalserver逻辑地分成了两台

applicationserver.

学习ABAP并不难,有人说SAP系统重在管理思想,不在技术,通常对有编程经验的读者不用任何培训参考一些相关资料就可立即上手•

简单介绍下ABAP/4的一些特征:

1.和SAP紧密结合,尤其在开发报表方面,坦率地讲,除了和SAP集成的好处,.我定

认为ABAP在报表开发上比CrystalreportTool要高效简单.

2.和VB一样,ABAP是解释形的,如读者精通VB,学习ABAF应该豪不费力,倒是既然SAP是企业管理解决方案,ABAPer必须对企业管理流程熟悉.

解释性的另一好处是可以很好跟踪程序逻辑(使用/H),这对了解业务逻辑的实和追踪错误很有效.和VB不同的是,VB跟踪时允许程序运行指针随意往回或往全拉而ABAF程序去不行,但是ABAF程序允许在运行时修改变量的值,这是编译程序不能做到的•当然通常编译比解释执行的速度会更快•

ABAR1序执行并不直接读取源代码,而是执行内部经过“生成”的描述,对于ABAP/4字典的修改激活后将触发内部描述的重新生成,如程序并没激活就执行原版本,或者出现错误(程序没激活可能造成ABAPDumpingABAP).

3.在对数据库处理方面,除了可直接执行SQL使用nativesql,缺点是错误处理很难控制,相当于有开发环境将SQL语句直接传给DB去执行),SAP在ABAF开发环境层还提供了一套OpenSQL访问底层数据库.

4.程序员都知道Windows平台下开发都支持事件驱动,Windows系统本身也支持事件驱动,ABAP也提供了事件驱动,这表现在Dialog编程方面,但是ABAP在此方面并不强,而且相对讲也比较难于掌握(在后面会讨论).

5.基于面向对象的风靡,ABAP在此方面也有相当反应,在SAP强大的软件包中提供了大量可重复使用的程序,读者也可定义类并使用它快速建立新的对象•

6.类似Java,ABAP开发的程序能运行于任何操作系统(Java有Java虚拟机,ABAP也有ABAPprocessor),多种数据库(比如在ABAP字典中实现了透明表对各种底层数据库表的映射,这样在ABAP层看到的透明表就和具体数据库无关),各种网络系统•

图1-3是一个ABAP开发和运行环境的图例.

ABBF开发坏境图丄—3

甲岂卄—

ABAP/4

IaJ:

Screen~

ARAP1

Menu

Dictionary

Painter

H口峠1厂F

Painter

 

DialogprocessorABAP/4processor

1使用C|C++建立ABAP开发工具,数亿行ABAPsourcecode组成SAPAG多个产品.

姑且不论国内ERP产品设计在解决企业流程上的局限性,在大多数国外的ERP

产品中我们都可看到结合自身ERP自带的开发工具,在技术上这也是落后人家•所以建议国内ERP界能少谈点象什么”不上ERP等死,上ERP找死””百分之百的企业上ERP都失败”诸如的空洞口号(实际上我并不知道他们是凭什么得出这样的结论的),

多干点实际的事情.

2既然ABAP是解释型的,运行速度会有影响吗?

我想多少会有的,为了解决这个问题,除了要加大相关服务器内存外(相对日新月异的硬件技术这已非主要瓶颈)

),SAP本身在提高性能也提供了相当的ABAP技术,比如使用Clustertable,Pooledtable和Logicaldatabase,在接下来会有详细介绍.

2.ABAP开发环境的建立

一个ABAP顾问和我讨论说,大学毕业我做ABAF开发不久做了顾问,薪资相当可观,最要好同学在unix平台下写Cobar组件,薪资却并不理想.

从技术角度,我认为使用C++写组件肯定比ABAP开发难度要高,用其人话说他是坐的庙好.是的,SAP行业特别是早些年是个被异化的行业,人们可看到某些人出于经济目的铺天盖地的对ERP不正确的宣传,这同样反应在IT各行业,”拿到XX牌Route认证,拿到XX网络认证,拿到XX数据库认证,拿到XX管理学位年薪基本的都在十几万以上”现在人们发现实际不是这回事,从现在,SAP也已经开始降温了,我想这趋势还会持续.

和学习其它语言唯一不同的是,ABAP是集成在SAP基础平台系统中的,为了学习ABAP你必须安装一套SAP(可选择R/3,miniSAP,或IDES),而通常的情况是安装光盘渠道比较难找(只有一些大企业实施了SAP才可能有,而且还必须注意版权问题,其他开发工具随便都可找到安装程序),对想学习ABAP的程序员这是个主要门槛.

掌握基本的ABAF开发环境对ABAPer是有益的,似乎多数ABAPer对底层并不感兴趣

3.获得AccessKey.

4.ABAPworkbench和ABAPdictionary

 

①(kg^g®WtthV^ntVariants

5.第一个程序-HelloWorld.

6.

SUntijecU

Tftie

Thefirstpro^^mHaloWorld

fTl

LI

CrWt«l

STOSZT

Lastcha-oadby

06/29/2005

STfMtEF

JJ

曲CvpUy

Atvtoute?

TmM

Status8jApokaucn

UI

AuthB血呵®M汕

lo$C4l站Jb^e

Setectmscreen

53TPFRCGZHELLO

MLocalCbHCt上LockOverwew雷X

^rtriutes3J

JjJiX'.r广日『询foi

SUtus

cb>ect

PS呻

E9V5-1

ABAPEditor;InitialScreen

如何进行ABAP开发呢?

本节使用老套的做法,介绍如何建立一个”HelloWorld”的ABAP程序,为了让读者尽快掌握ABAP开发熟悉ABAP开发环境是必须的,请看图1.5-1.

程序的原代码如下

ReportZHELLO.

Write'HelloWorld!

'.

按F8运行,运行成功在屏幕上显示HelloWorld!

的字样,恭喜你,第一个程序运行成功

7.ABAP语法简介

数据类型

控制流程

文本摘要

输出格式

程序调试

7.0penSQL和NativeSQL

8.内表和工作区

9.使用字段符号

10.模块化程序

11.文件处理

12.簇数据库和逻辑数据库

13.消息和错误处理

尽管消息这词还用在其他地方比如PO,SO打印传真等所谓的outputmessage(请看ABAP百夜

谈),系统出现异常,在这里消息只谈在程序运行逻辑异常处理时的消息

1定义消息(参考图7-7).

使用TcodeSE91可自定义包含多消息号的消息类,在图7-7中就定义了一个消息类ZFIMSG同时消息号017中使用了俩&消息变量

2运用消息.

1.可在程序Title中使用MESSAGE-加入消息类.

REPORTZMSGTESTMESSAGE-IDZFIMSG.

MESSAGEI017.

使用消息IMG有这样的画面,[1][2]的appl和workarea实际上对应的就是程序的messageid(SE91:

messageclass).

2.在程序Title中定义直接在语句中使用.

REPORTZMSGTEST.

MESSAGEIO17(ZFIMSG).

1.将变量赋给消息.

REPORTZMSGTEST.

MESSAGEI017(ZFIMSG)withVar1'Var2'Var3'.

或者

MESSAGEID'ZFIMSG'TYPE'I'NUMBER'0171'withVar1'Var2'Var3'

尽管017只定义了两消息变量,但是可With多个值,当然只有前俩生效.

4.SAP程序消息类型有下列几种.

I:

信息窗口W:

警告E:

错误S:

成功A:

终止程序或TcodeX:

未知.

5.和标准SAP-样,你可配置消息,比如你需要由用户决定消息类型,使用下面程序

PROGRAMZMSGTEST.

CALLFUNCTION'READ_CUSTOMIZED_MESSAGE'

EXPORTING

I_ARBGB='ZFIMSG'

I_DTYPE=''

I_MSGNR='017'

IMPORTING

E_MSGTY=SY-MSGTY.

假设你做了Tcode和OBAL样可配置消息类型,在程序中你就可根据返回值SY-MSGTY判断下步工作,E停止处理,A退出程序等.

在标准程序中,接下来会PERFORMMESSAGES来决定发送消息类型.

3常用消息表格和各模块常用消息配置Tcode.

在消息配置中‘ApplicationArea和SE91的MessageClass实际上是同一概念

1消息相关最常用的table:

T100:

SAP能用到的消息都应该在此表中找到.

T160M:

MM模块相关消息表,此表可完全直接维护•就是说只要记住它,MM的消息配置直接使用SE16就可以.

T100C:

FI模块中用户自定义的消息,比如使用OBA5,OFM等自定义的消息会写入此表,CO配置消息不在此表•

T100S:

此表保存着允许用户更改的应用区域和消息号,举例假设你删除了KI005则在OBA5

中再不能配置此消息•(对MMI块有些例外,M7不在此表,使用OMC依旧可设置,M3不在此表,OMT4依旧可设置)

此表也可直接维护•和T160M不同的是,你必须在SE16俞入T100S按新建按钮

才可维护•查询时只可Display.

T100U:

哪个用户最后更改了消息,从此表能找到.

T100W:

ForWorkflow

2常用Tcode(部分):

FI:

OBA5|OFMG|OFPM

MM:

OMRM|OKZZ|OMT4|OMC(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应用举例.

物料价格维护问题

[Case1]如何在物料价格未维护时依旧可估算成本

比如在CK11N(CK40N计算成品标准成本时,其中有一些Component没维护价格.就可使用

OPR4_C将默认的错误消息SwitchOff掉(从TcodeOKKN->Misc.->ErrorManagement按钮也可).

***另外临时处理方法一是将相关component的物料Cost1View选上DonotCosting.

对需要计算标准成本的材料选上它就不再允许计算标准成本,不妥,但是对原材料无所谓,因

为系统会这样处理,如此材料没维护价格,BOM用到它的成品不计算其成本,但是如此物料维护了价格后,还是以物料价格为先的.(当然CK11N去估算此原材料是不行的,用户也不需如此做).二是按SAP推荐的如果将price设成0.01,priceunit设置成100.

[Case2]如何限定物料价格必须维护.

(1)对采用Spricecontrol的.SAP默认是Warning(Tcode:

OMT4M3-132,如需要限定必须维

护价格,将其改成W就可.

⑵对采用Vpricecontrol的,OMT4找不到其消息号M3-131,但系统默认是Warning,如果用

户认为也有相关配置就有犯了认为SAP万能的错误,再次强调SAP只是一堆代码并不神秘.

好让我们看看其逻辑.

***实际上直接使用SE16:

T160M可直接配置MM目关.

如图:

[1]SE38找到程序LMG1仆01[2]在此处设置断点[3]如价格为0(空格)写死的,当然配置无效.

再看SPricecontrol(如下图,显然从T160M表读了IMG数据).

IFSTP_VPRSV=SAMDSTF_STPRS=0,

MESSAGEE132RAISINGWO_OTRS.*uhzu3.Od(->lautMHzulassig/"istauchLnMR21erlaubt)

WegenAuiwartskoiipatibil1tatMessagecustomizbargemacht^55/111296CALLFUNCTIONJME_CHECK_T160M'[|

EXPORTING

I_ARBGB=

IJSGNR=J132J

I_MSGVS='00*"Messagevariantedefault"00J

EXCEPTIONS

恥THING=00

WARNING=01

ERROR=02.

CASESY-SUBRC,

WHEN1.

CASEF_MESSAGE.

WHENSPACE.MESSAGEVI32*

WHENJIJ.

MESSAGE1132,WHENJNJ・

ENDCASE.

WHEN£

MESSAGEE132RAISINGNO_STPRS.

ENDCASE.

4灵活运用消息.

对于消息的运用,除了可配置消息类别外,另外一个重要用处就在于,可根据消息找到程序弹

出消息的确切行,然后稍微花点时间看看程序逻辑就可大概知道异常发生的根本原因•从某

种程度来讲,即使对某模块很陌生,只要掌握得好,依旧可排除一些问题•

5配置自定义的消息.

俩方法可模妨SAP勺消息配置

1从上我们已经知道既然T160M是可直接使用SE16维护的,我们就可直接将相关设置写入T160M.然后就可根据相关设置取得消息类别(如上图我们使用函数ME_CHECK_T160M这样比类似MESSAGEE017(ZFIMSG)Hardcode要安全得多,假设不管三七二^一就给出错误消息,除非在程序中确信已考虑了所有情况,否则还是在T160M这样设置比较好(万一在生产环境还可更改E成W什么的).

DataBrowser:

TableT16OMSelectEntries200□捻如SS3®HCheckTable,..

Table:

T160M

Displayedfields:

6of6Fixedcoltunns:

4

MANDT

KSGVS

ARBGB

HSGHR

MSGTF

MSGTYWS

J

220

220

220

220

220

00

00

00

00

00

!

?

£

L3

L3

L9

ZFIMSG

438

711

040

017

$

W

E

2我们知道T100C是所谓的可配置消息表,我们可使用SE16:

T100C和V_T100C.

(1)SE16:

T100S定义消息可配置信息.

如图[1]在此新建.(进去browse数据似乎不可新建)

设置消息•如下图.

[1]ApplArea消息类ZFIMSG.[2]表示允许配置的消息类型[3]没选则表示不能关闭消息•

ChangeView''Configurablemessages11:

Overview

?

NewEntries®JH

鳳H

3

[ApplicationArea

Msgfdo

Allowed

Standard

Switchoff

E

11

WY

178

WE

W

0

*

179

-

WY

1S2

KE

ZFIMSG11

017

EIAS2i

□31

J

(2)SE16:

V_T100C配置消息.

如图:

[1]表示直接使用程序(Tcode)的消息类型[2]当当程序以BD(方式运行时的消息类型

[3]就是上图设置的允许的消息类型,可看到警告和关闭都没出现(T100C没允许)

i.

Ms^fo

017

Messagetext

UserName

OnlineBatchiStandard

ESSD

•E3闔囲阳

A

S

3^—

MsgTDescription

呂1

TEKT2

Errors

NoteInwindow

Termination

Noteinfooler

回2

MessageControlbyUser

同样在程序中避免使用泪水MESSAGEE017(ZFIMS而采用

CALLFUNCTION'READ_CUSTOMIZED_MESSAGE'

EXPORTING

I_ARBGB='ZFIMSG'

I_DTYPE=''

I_MSGNR='017'

IMPORTING

E_MSGTY=SY-MSGTY.

根据返回的SY-MSGT去判断消息类型将更好些.

6实例介绍

P(在有发票校验后禁止修改价格,假设无POrelease策略,使用User-exit步骤如下:

(1)找合适的用户出口

发现EXIT_SAPMM06E_01比较合适,SMOD输入enhancementname:

MM06E005

(2)编写代码.

*&*

*&IncludeZXM06U42*

*&*

DATA:

ZWATEKPOlikeBEKPO,

ZIEINFOLIKEEINFOOCCURS0WITHHEADERLINE,

ZERMSG(73)TYPEC.

TABLESEKBE.

***TEKPOrecordsalltheoldPOitemdate.

***I_EKPOrecordscurrentlyprocessedPOitem.

READTABLETEKPOINTOZWATEKPOWITHKEYEBELP=I_EKPO-EBELP.***只对ME22才生效.

CHECKSY-TCODE='ME22N'.

***EKBE是POhistory表,如有Q,R表示有发票校验历史,不允许更改价##

SELECTSINGLE*FROMEKBE

WHEREEBELN=I_EKPO-EBELn

ANDEBELP=IEKPO-EBELP

AND(BEWTP='Q'ORBEWTP='R').

##

CHECKSY-SUBRC=0.

***如果SY-SUBRC二表示发票已经校验,不允许更改价格,否则还是可更改价格

IFl_EKPO-NETPR<>ZWATEKPO-NETPR.

***ChangeeO17(ZFIMSG)accordingly

*MESSAGEe017(ZFIMSG)."使用下面函数代替.

CALLFUNCTION'READ_CUSTOMIZED_MESSAGE'

EXPORTING

I_ARBGB='ZFIMSG'

I_DTYPE=''

I_MSGNR='017'

IMPORTING

E_MSGTY=SY-MSGTY.

CHECKSY-MSGTYNE'-'.

REFRESHZIEINFO.

ZIEINFO-MSGID='ZFIMSG'.

ZIEINFO-MSGNO='017'.

ZIEINFO-MSGV1='VAR1'.

ZIEINFO-MSGV2='VAR2'.

APPENDZIEINFO.

CALLFUNCTION'MESSAGE_GET_TEXT'

EXPORTING

IEINFO=ZIEINFO

ILANGU=SY-LANGU

IMPORTING

ETEXT=ZERMSG.MESSAGEZERMSGTYPESY-MSGTY.

ENDIF.

***在大多数情况下追踪消息能发现问题所在,然而在一些特定情况下,SAP显示的消息似乎和实际业务并

不符合.好比一个人咳嗽的厉害,以为是感冒结果其实不过是有写异物进入其喉咙而已

14.使用用户授权

15.调用外部

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1