当前位置:首页 >> 电脑基础知识 >>

ABAP开发三月通-基础篇


ABAP 开发三月通-基础篇 更新时间:2015-01-15 23: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


赞助商链接
相关文章:
更多相关文章: