




已阅读5页,还剩55页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ABAPABAP 三月通三月通 前 言 2 一 基础篇 2 1 什么是 ABAP 2 2 ABAP 开发环境的建立 2 3 获得 Access Key 3 4 ABAP workbench 和 ABAP dictionary 3 5 第一个程序 Hello World 3 6 ABAP 语法简介 3 7 Open SQL 和 Native SQL 4 8 内表和工作区 4 9 使用字段符号 4 10 模块化程序 4 11 文件处理 4 12 簇数据库和逻辑数据库 4 13 消息和错误处理 4 14 使用用户授权 4 15 调用外部程序和程序动态生产 4 16 选择屏幕 4 17 使用程序运行变式 4 18 制作 Tcode 4 二 加强篇 5 1 CATT 5 2 BDC 5 3 制作 background job 5 4 SapScript 5 5 Smartform 5 6 SAP Query 5 7 ALV 5 8 ALE iDoc 5 9 Report painter 和 Drilldown Report 5 10 RFC BAPI 5 11 编写用户增强 5 12 深入 ABAP 工作台 5 三 实战篇 5 MM 模块开发实例 5 SD 模块开发实例 5 PP 模块开发实例 5 FI 模块开发实例 6 CO 模块开发实例 6 开发项目流程简介 6 附录 6 ABAP Basis Transaction Codes 6 前前 言言 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 1 什么是什么是 ABAPABAP 了解一下 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 report Tool 要高效简单 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 ABAP2 ABAP 开发环境的建立开发环境的建立 一个 ABAP 顾问和我讨论说 大学毕业我做 ABAP 开发不久做了顾问 薪资相当 可观 最要好同学在 unix 平台下写 Cobar 组件 薪资却并不理想 从技术角度 我认为使用 C 写组件肯定比 ABAP 开发难度要高 用其人话说他 是坐的庙好 是的 SAP 行业特别是早些年是个被异化的行业 人们可看到某些人出于 经济目的铺天盖地的对 ERP 不正确的宣传 这同样反应在 IT 各行业 拿到 XX 牌 Route 认证 拿到 XX 网络认证 拿到 XX 数据库认证 拿到 XX 管理学位年薪基本的 都在十几万以上 现在人们发现实际不是这回事 从现在 SAP 也已经开始降温了 我 想这趋势还会持续 和学习其它语言唯一不同的是 ABAP 是集成在 SAP 基础平台系统中的 为了学 习 ABAP 你必须安装一套 SAP 可选择可选择 R 3 miniSAP 或或 IDES 而通常的情况是安装光 盘渠道比较难找 只有一些大企业实施了只有一些大企业实施了 SAPSAP 才可能有才可能有 而且还必须注意版权问题而且还必须注意版权问题 其他开发其他开发 工具随便都可找到安装程序工具随便都可找到安装程序 对想学习 ABAP 的程序员这是个主要门槛 掌握基本的 ABAP 开发环境对 ABAPer 是有益的 似乎多数 ABAPer 对底层并不感 兴趣 3 3 获得获得 AccessAccess KeyKey 4 ABAP4 ABAP workbenchworkbench 和和 ABAPABAP dictionarydictionary 5 5 第一个程序第一个程序 Hello Hello World World 如何进行 ABAP 开发呢 本节使用老套的做法 介绍如何建立一个 Hello World 的 ABAP 程序 为了让读者尽快掌握 ABAP 开发熟悉 ABAP 开发环境是必须的 请看 图图 1 5 1 程序的原代码如下 ReportReport ZHELLO ZHELLO WriteWrite Hello Hello World World 按 F8 运行 运行成功在屏幕上显示 Hello World 的字样 恭喜你 第一个程序运行成功 6 ABAP6 ABAP 语法简介语法简介 数据类型 控制流程 文本摘要 输出格式 程序调试 7 Open7 Open SQLSQL 和和 NativeNative SQLSQL 8 8 内表和工作区内表和工作区 9 9 使用字段符号使用字段符号 10 10 模块化程序模块化程序 11 11 文件处理文件处理 12 12 簇数据库和逻辑数据库簇数据库和逻辑数据库 13 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 1消息相关最常用的消息相关最常用的table 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 2常用常用Tcode 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 3应用举例应用举例 物料价格维护问题 Case 1 如何在物料价格未维护时依旧可估算成本 比如在CK11N CK40N 计算成品标准成本时 其中有一些Component没维护价格 就可使用 OPR4 CK将默认的错误消息Switch Off掉 从Tcode OKKN Misc Error Management按钮也 可 另外临时处理方法一是将相关一是将相关componentcomponent的物料的物料CostCost 1 1 ViewView选上选上DoDo notnot CostingCosting 对需要计算标准成本的材料选上它就不再允许计算标准成本 不妥 但是对原材料无所谓 因 为系统会这样处理 如此材料没维护价格 BOM用到它的成品不计算其成本 但是如此物料维 护了价格后 还是以物料价格为先的 当然CK11N去估算此原材料是不行的 用户也不需如此 做 二是按二是按SAPSAP推荐的如果将推荐的如果将priceprice设成设成0 01 price0 01 price unitunit设置成设置成100100 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 4灵活运用消息灵活运用消息 对于消息的运用 除了可配置消息类别外 另外一个重要用处就在于 可根据消息找到程序弹 出消息的确切行 然后稍微花点时间看看程序逻辑就可大概知道异常发生的根本原因 从某 种程度来讲 即使对某模块很陌生 只要掌握得好 依旧可排除一些问题 5 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 就是上图设置的允许的消息类型 可看到警告和关闭都没出现 T100CT100C没允许没允许 同样在程序中避免使用泪水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 6实例介绍实例介绍 PO在有发票校验后禁止修改价格 假设无PO release策略 使用User exit步骤如下 1 找合适的用户出口找合适的用户出口 发现EXIT SAPMM06E 017比较合适 SMOD 输入enhancement name MM06E005 2 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 SAP显示的消息似乎和实际业务并显示的消息似乎和实际业务并 不符合不符合 好比一个人咳嗽的厉害好比一个人咳嗽的厉害 以为是感冒结果其实不过是有写异物进入其喉咙而已以为是感冒结果其实不过是有写异物进入其喉咙而已 14 14 使用用户授权使用用户授权 15 15 调用外部程序和程序动态生产调用外部程序和程序动态生产 16 16 选择屏幕选择屏幕 17 17 使用程序运行变式使用程序运行变式 18 18 制作制作 TcodeTcode 二二 加强篇加强篇 1 CATT1 CATT 2 BDC2 BDC 3 3 制作程序的制作程序的 backgroundbackground jobjob 4 SapScript4 SapScript 5 Smartform5 Smartform 6 SAP6 SAP QueryQuery 7 ALV7 ALV 编程编程 8 ALE iDoc8 ALE iDoc 9 Report9 Report painterpainter 和和 DrilldownDrilldown ReportReport 10 RFC BAPI10 RFC BAPI 11 11 编写用户增强编写用户增强 12 12 深入深入 ABAPABAP 工作台工作台 在这章将深入介绍各种 ABAP 对象的操作 13 13 传输请求传输请求 这节并不是侧重介绍如何配置传输请求和其运行机制的 这通常是 basis 的工作和 ABAPer 并无关系 还是那句话 了解点大概是必要的 通常企业起码会有两个系统 开发 测试 系统和生产系统 有些企业开发任务相对少 开发和测试使用同一台 server 甚至同一 client 开发和测试也都有 ABAPer 完成 如 果要严格开发流程 开发 测试必须是分开的 为了节省当然可使用同一 server 不同的 Client 甚至用不同 System Number 逻辑分成两 Server 在此不深入讨论 熟悉几个名词 1 开发类开发类 Development Class 开发类可简单理解为逻辑上相关的一组 ABAP 对象 在将来传输时将使用同一 传输层 实际上开发类本身也可看做是一个 ABAP 对象 可使用 SE80 建立 TMP 是本地开发类 属于此开发类的任何 ABAP 对象 包括自定义的表 编写的程序 等都只能在 Client 做测试用而不能被传输到其他 Client 包现在被用来代退开发类 2 包包 Package 相关的 ABAP 对象被组合在一个包内 SE16 TADIR 可看到被分配到某包的所有 的 ABAP 对象 包决定了这些对象的传输层 所有的包被存在表 TDEVC 中 建立包可使用 SE80 或直接使用 SM30 V TDEVC 包作为开发类的退代和前身有这么几个加强特征 1 包可嵌套使用 这点类似 Java package 2 包类可包含最多本包中可见的对象 这些对象在包外不可见 这点类似私有对象 Private object 在 OOP 中也很常见 3 包可为包接口定义使用访问授权 4 通常自定义包必须是 Y 或 Z 前坠 这点和其他 ABAP 对象相同 包其实也可看做 ABAP 对象 其他一些包前坠 A S U X 表示 SAP 标准包 T 私有测试包 本地临 时包 名字空间前坠 3 传输层传输层 Transport Layer 传输层决定包内对象是分配给本地还是可产生传输请求 通常 开发系统都被分配了一个标准的传输层 当包被建立时 它就被分配了一个标准 传输层 包内对象也立即自动获得相关传输属性 相关 IMG 配置使用的是标准的传输层 通常由 basis 使用 Tcode STMS 配置传输管理系统维护传输曾和路由 图 2 13 1 显示的是从 DVU 开发的程序传输到 QAS 和 PRD 的传输路由 在图中程序 在 DVU server 的 client 210 100 开发后被传输到 QAS Client 310 测试 成功后被分别 传入 PRD Client 800 810 和 820 4 传输请求传输请求 程序是究竟保存在 server 的什么地方 程序是如何在不同 client 和 server 之间进行 传输的 要明白这问题 首先让我们看看什么是传输程序和传输控制程序 传输控制程序 TP 和 R3TRANS 传输程序 R3TRANS 被用来实现 SAP 各 Client 间的 数据传输和不同版本迁移 TP 传输控制程序根据传输参数 Transport Profile 调用 R3TRANS 传输程序 14 14 和其它语言的交互和其它语言的交互 VB Delphi Java 其实开发工具使用都简单 别人都弄出开发环境都给弄出了 学用还 会难吗 三三 实战篇实战篇 在这一篇将介绍企业常用模块开发实例 其中可能还涉及一些辅助相关后台配置 每个模块的 8 个实例是经过精心挑选出的具有相当代表性 由于篇幅原因和各个企 业实际需求可能不一样 有的可能在本书只描述了设计思路和部分源代码 希望读者 在实际运用中能自行完善并能举一反三 除非必要 尽量使用 SAP 标准的报表少自行 开发 另外 如有可能 使用信息结构 1 MM1 MM 模块开发实例模块开发实例 一一 MM MM 常用表格及其关联关系图常用表格及其关联关系图 二二 开发实例开发实例 下面是一个企业的参考 MM 开发需求清单 并不包括用户出口等 供应商列表供应商列表 信息记录信息记录 PR PO 打印打印 Scrip 或或 Smartform MRB 物料清单物料清单 物料报废报表物料报废报表 物料入库物料入库 报表报表 物料运输申请单物料运输申请单 物料主数据查询报表物料主数据查询报表 收货单打印收货单打印 IQC 报表报表 Pull List 发料单发料单 生产定单生产定单 物物 料转移单料转移单 Delivery notes Packing List RMA 发料单发料单 库存分析报告库存分析报告 PO 分析报告分析报告 GR IR 分析报分析报 告告 物料盘点单物料盘点单 盘点物料报告等盘点物料报告等 如项目紧急而开发人手不足 有些中小企业专职的 ABAPer 可能只有一个或各模 块的 SAP 内部支持顾问兼做开发 必须排定开发优先次序 除了比如 PO 套打收货单 打印等必须在项目正式上线前完成的开发任务 相关查询报表可在上线后开发 如果是专职负责开发 依旧需要很好理解业务 最好和负责业务支持的多沟通 一 个最有效的方法就是将相关模块的业务流程 通常在业务蓝图阶段会有非常详细的 相关资料 在测试系统走一遍 这样对以后开发是大有益处的 1 MM1 MM 相关单据打印相关单据打印 PO 和收货单打印开发 NACE MB04 外协 PO 2 PO2 PO 增强编程增强编程 PO change history 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 自动建立 PO 和 SO 一 SE11 建立一记录表 ZPOSO 1 二 使用 PO User exit 1 本程序思路同样适合从建立 Sales order 时自动建立 PO 只是调用的 function 是 BAPI CREATE PO 和使用 creating SO 时的 User exit 而已 一一 SE11 建立一记录表建立一记录表 ZPOSO 如图建立一个表 ZPOSO 俩个用途 1 保存 PO 到 SO 的联系以方便将来查询 2 判断 PO 是 create 还是 change 比如 ME22N update PO qty or delete PO line 3 判断 注意 EBELN 和 EBELP 合起来才是 key fields 相当于 DB 层的 Primary key 二二 使用使用 PO User exit EXIT SAPMM06E 001 002 004 006 007 009 006 是 PO 还未 create 前检查的 EXIT SAPMM06E 016 017 此时虽然有 PO item 数据但是 PO No 还没有给出 EXIT SAPMM06E 009 PO 已经建立并且数据已经 refresh 所以使用 EXIT SAPMM06E 013 在使用之前必须 update TFDIR 表将 MAND 设置成 C 程序如下 REPORT Zupdate data ztfdir like tfdir occurs 0 with header line select from tfdir into table ztfdir where FUNCNAME EXIT SAPMM06E 013 loop at ztfdir ztfdir MAND C modify ztfdir index sy tabix TRANSPORTING MAND endloop update tfdir from ztfdir 由于只有一笔使用 Work area 就可搞定 所以要这样霸王强上弓是没有找到配置 在哪里 REPORT ZTEST11 data ztfdir like tfdir select single from tfdir into ztfdir where FUNCNAME EXIT SAPMM06E 013 ztfdir MAND C update tfdir from ztfdir 通过在 LSMODU23 Function MODX FUNCTION ACTIVE CHECK 设置 断点很容易找出已经有 PO 的 user exit SE37 MODX FUNCTION ACTIVE CHECK 在如下图中设置断点 你就会发现 TFDIR Function Module 表 的 MAND 必须 AKTIV FLAG 值就是 C 才会 call 相应的 User exit 函数 用户增强 所有的Enhancement在表MODSAPMODSAP 用户增强大概有三类 MODSAP是Enhancement表 而TFDIR是看是否此enhancement被激活 就看字段MAND是 否是 C 而已 1 E Enhancement exits 就是常说的写 User exit 2 C GUI codes 没用过 3 3 S Subscreens 屏幕增强 OK 其实上面不用 coding 通过 search MODSAP 发现 EXIT SAPMM06E 013 在 Enhancement MM06E005 中 使用 T code SMOD F8 test 运行然后可激活 EXIT SAPMM06E 013 如果你确实找不到 enhancement name 和 exit 函数对应关系 也没关系 使用 SMOD 自己建立一个 Enhancement 比如叫 ZPOSO 然后你将 function 加入 它也会有错误提示告诉你它属于的 enhancement 还有就是使用上面的 code 直接 update 你自己可写个 code 将所有的 user exit 找出来 很容易的哟 如你完全明白这篇文 章 我想你就理解了 user exit 和 BAPI 的使用 建立 BAPI 并使用其它语言 call 同 样很简单 EXIT SAPMM06E 013 include 程序 ZXM06U44 在 coding 前使用 SE37 test BAPI BAPI SALESORDER CREATEFROMDATA 注意各企业因为设置的 fields status 不同可能有所不同 对 ORDER HEADER IN 只需下面几个参数 ORDER ITEMS IN 只需要 MATERIAL REQ QTY Order qty in sales units 00009001 corresponds to 9 001 就是说 call BAP REQ QTY 测试时 actual qty 1000 COND TYPE COND VALUE 即对应到 price 很奇怪必须 10 不知其他系统是 否这样 此是注意点 PO METH S Ship to party purchase order type 如果设置了必须输入的话 ORDER PARTNERS 如果 SP 和 SH 相同的话 只要一条 SP 然后输入 customer No 就可 如果 ship to party 不同多家一条 SH customer No 吧 还有一样要注意 AG SP RE BP SH SAP 经常有这样的 case 就是 save 在 DB 中的数据和 display 出来的数据 有所不同 为什么要这样 不得而知 难怪 SAP 不推荐直接使用 DB table 做报表 或者这是 SAP AG 的一个策略 测试 OK 开始 coding on ZXM06U44 Source code 如下 log 写在 ZPOSO 表中 测试使用 BAPI SALESORDER CHANGE 就是说它实际是 call BAPI SALESDOCUMENT CHANGE 的 你可知道 ORDER HEADER INX UPDATEFLAG 为 U 时是 update 为 D 时是 Delete sales order 不选还不行 好了下面是 Source Code 仅供参考 大体框架 OK 可能根据你的 SAP 实际情况做些 调整 INCLUDE ZXM06U44 在company 1000建立PO时同时建立SO in 1000和PO in 2000 注意此程序会反复call data ZORDER HEADER IN like BAPISDHEAD ZORDER ITEMS IN like BAPIITEMIN occurs 0 with header line ZORDER PARTNERS like BAPIPARTNR occurs 0 with header line ZSALESDOCUMENT like BAPIVBELN VBELN ZRETURN like BAPIRETURN Data ZPOHEADER like BAPIEKKOC ZPOITEMS like BAPIEKPOC occurs 0 with header line ZPO ITEM SCHEDULES like BAPIEKET occurs 0 with header line ZPURCHASEORDER like BAPIEKKOC PO NUMBER tables ZPOSO data zposolog like zposo occurs 0 with header line data Zrepcall 1 type C 防止反复调用BAPI PO CREATE Refresh ZORDER ITEMS IN 实际应用根据I EKKO EBELN 其实从EBELN PO No 可判断出plant 1 I EKKO EBELN前面5位用case语句判断 2 根据I EKKO BUKRS comp code 和XEKPO WERKS plant 判断 company code 2000是专门用来采购的HK 公司 if I EKKO BUKRS 1000 exit endif check I EKKO BUKRS eq 1000 只对comp 1000适用 判断表ZPOSO有无PO no 无call BAPI SALESORDER CREATEFROMDATA create SO 如果存在call BAPi BAPI SALESORDER CHANGE change SO 注意在ME22N change PO时间XEKPO内表中只保留了被改变line item的数据 select single from ZPOSO where EBELN eq I EKKO EBELN if sy subrc eq 0 Change Sales Order Purchase Order留给你自己写不告诉你 CALL FUNCTION BAPI SALESORDER CHANGE CALL FUNCTION BAPI PO CHANGE else 建立Purchase Order 和Sales Order 从ZFLAG表中读取Zrepcall看是否是T 不管使用什么方法总之不要反复 在此处设置断点在第二次调用时将Zrepcall设成T退出 好象无法设置到那种真正的全局变量只好使用一个表罗 你就会发现当在comp 1000建立PO同时也建立了SO并且comp 2000也有PO select single Zrepcall into Zrepcall from zflag if Zrepcall T exit endif 注意使用PO另一个user exit 001将Zflag的zrepcall设置成F 接下来的语句立即update zflag将zrepcall设置成T 开始建立Purchase Order in company 2000 开始建立Sales Order in same company 1000 根据公司实际更改ZOR是标准Sales order Sales Order Header ZORDER HEADER IN DOC TYPE ZOR ZORDER HEADER IN SALES ORG 1100 ZORDER HEADER IN DISTR CHAN 11 ZORDER HEADER IN DIVISION 11 ZORDER HEADER IN CURRENCY I EKKO WAERS Order currency ZORDER HEADER IN PURCH NO I EKKO EBELN Purchase Order Header ZPOHEADER PURCH ORG I EKKO EKORG 正式使用换2000的采购组织 ZPOHEADER PUR GROUP I EKKO EKGRP 正式使用换comp2000的采购组 ZPOHEADER CO CODE 2000 ZPOHEADER VENDOR I EKKO LIFNR ZPOHEADER DOC TYPE NB I EKKO BSART 根据PO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六盘水幼儿师范高等专科学校《医药拉丁语》2023-2024学年第二学期期末试卷
- 广州番禺职业技术学院《细胞生物学与分子生物学》2023-2024学年第二学期期末试卷
- 武汉理工大学《数字逻辑基础》2023-2024学年第二学期期末试卷
- 工业信息安全与数据保护策略
- 工业化住宅建筑的设计与生产实践
- 工业厂房设计与施工要点
- 工业互联网的发展现状及前景预测
- 工业互联网与智能车间的融合发展
- 嵌入式系统在智慧零售中的应用
- 工业4.0背景下的人才培养
- 养老护理员四级考试题库及答案
- 2025年大学生创业培训考试试卷及答案
- 2025江苏盐城燕舞集团有限公司招聘58人笔试参考题库附带答案详解析
- 车祸现场急救护理规范
- 2025年天津市武清区等5地中考二模历史试题(含答案)
- 2024-2025 学年七年级英语下学期期末模拟卷 (深圳专用)原卷
- 浙江省浙南名校联盟2024-2025学年高二下学期4月期中生物试卷(含答案)
- 2025公需课《新质生产力与现代化产业体系》考核试题库及答案
- 湖南2024生地会考试卷及答案
- 公司适用职业健康安全法律法规标准清单
- 种子萌发过程中的生物化学动态研究
评论
0/150
提交评论