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

一.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函数

posted on 2009-07-27 09:31  vibratea  阅读(756)  评论(0编辑  收藏  举报