14.使用用户授权
15.调用外部程序和程序动态生产
16.选择屏幕
17.使用程序运行变式
18.制作Tcode
二.加强篇.
1.CATT
2.BDC
3.制作程序的background job
4.SapScript
5.Smartform
6.SAP Query
7.ALV编程
8.ALE/iDoc
9.Report painter和Drilldown Report
10.RFC/BAPI
11.编写用户增强
12.深入ABAP工作台
在这章将深入介绍各种ABAP对象的操作.
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.和其它语言的交互
VB,Delphi,Java其实开发工具使用都简单,别人都弄出开发环境都给弄出了,学用还会难吗?
三.实战篇
在这一篇将介绍企业常用模块开发实例,其中可能还涉及一些辅助相关后台配置,每个模块的8个实例是经过精心挑选出的具有相当代表性,由于篇幅原因和各个企业实际需求可能不一样,有的可能在本书只描述了设计思路和部分源代码,希望读者在实际运用中能自行完善并能举一反三.除非必要,尽量使用SAP标准的报表少自行开发,另外,如有可能,使用信息结构. |
1.MM模块开发实例.
一.MM常用表格及其关联关系图
二.开发实例
下面是一个企业的参考MM开发需求清单(并不包括用户出口等). 供应商列表 | 信息记录 |PR,PO 打印 (Scrip 或 Smartform)|MRB 物料清单 | 物料报废报表 | 物料入库报表 | 物料运输申请单 | 物料主数据查询报表 | 收货单打印 |IQC 报表 |Pull List| 发料单 ( 生产定单 )| 物料转移单 |Delivery notes|Packing List|RMA 发料单 | 库存分析报告 |PO 分析报告 |GR/IR 分析报告 | 物料盘点单 | 盘点物料报告等 . 如项目紧急而开发人手不足(有些中小企业专职的ABAPer可能只有一个或各模块的SAP内部支持顾问兼做开发),必须排定开发优先次序,除了比如PO套打收货单打印等必须在项目正式上线前完成的开发任务,相关查询报表可在上线后开发. 如果是专职负责开发,依旧需要很好理解业务,最好和负责业务支持的多沟通,一个最有效的方法就是将相关模块的业务流程(通常在业务蓝图阶段会有非常详细的相关资料)在测试系统走一遍,这样对以后开发是大有益处的. |
1.MM相关单据打印
PO和收货单打印开发
NACE,MB04外协PO.
2.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
***本程序思路同样适合从建立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函数