ABAP三月通项目介绍_第1页
ABAP三月通项目介绍_第2页
ABAP三月通项目介绍_第3页
ABAP三月通项目介绍_第4页
ABAP三月通项目介绍_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ABAP三月通TOC\o"1-4"\h\z\u前言2一.根底篇21.什么是ABAP?22.ABAP开发环境的建立23.获得AccessKey.34.ABAPworkbench和ABAPdictionary35.第一个程序-HelloWorld.36.ABAP语法简介37.OpenSQL和NativeSQL48.内表和工作区49.使用字段符号410.模块化程序411.文件处理412.簇数据库和逻辑数据库413.消息和错误处理414.使用用户授权415.调用外部程序和程序动态生产416.选择屏幕417.使用程序运行变式418.制作Tcode4二.加强篇.51.CATT52.BDC53.制作backgroundjob54.SapScript55.Smartform56.SAPQuery57.ALV58.ALE/iDoc59.Reportpainter和DrilldownReport510.RFC/BAPI511.编写用户增强512.深入ABAP工作台5三.实战篇5MM模块开发实例.5SD模块开发实例.5PP模块开发实例.5FI模块开发实例.6CO模块开发实例.6开发工程流程简介.6附录:6ABAP/BasisTransactionCodes6前言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下).从2023年下年开始接触SAP,在不到一年时间参与或主持了多个工程的实施,愿意将经验和各位读者分享,同时希望此书对想从事ABAP开发的读者有相当帮助,本书就到达目的.由于本人水平有限,错误难免,欢送专家指正.一.根底篇如果读者已经有一定ABAP经验,可不看此篇,在此篇中,花了很少篇幅回忆ABAP编程的根本常识,读者如有其他开发工具的知识,花很少时间就可理解这些常识.1.什么是ABAP?了解一下ABAP的开展历史是必要的,ABAP产生的最初的目的是用以生成简单打印报表程序,我们知道SAP最初是为解决财务实时数据处理问题的,ABAP(AdvancedBusinessApplicationProgramming->高级业务应用编程语言)现在用于编写SAPAG的几乎全部产品源代码.严格地讲,ABAP/4不仅仅是一个开发工具,而且是一套完整的client/server开发环境,这很好理解,微软的VisiualStudio是一开发环境,VB,VC++等是开发工具.ABAP开发环境包含支持程序开发的一些函数和包等.如图1-1,是SAP开发环境的一个三层架构的例图,三层(多层)的概念也不新鲜,比方在安装SAP时也可将DBinstance安在一台server,Centralinstance在另一台所谓的Applicationserver(我想这应是相关SAP根底系统包括各种应用程序所在),而通常客户端安装的SAPLogonFrontEnd,SAP会话管理器等是所谓的表示层,它通过TCP/IP,SAP演示协议或RFC和应用效劳器进行数据传输,用户看到的只是处理后的数据返回.和Delphi的三层逻辑相近,在应用层包含多个组件象ABAP开发平台,身份验证,系统管理维护等用以处理会话,更新,排队,网关,数据层处理native和OpenSQL等(这是从内部机制方面看),SAP各模块应用的业务逻辑都在应用层被处理(从用户角度)然后结果被返回.图1-2是SAPLogon的一个截图,[1]表示应用效劳器(通常企业为了节省本钱和方便管理可能会将应用效劳器和数据库安装在同一起),[2]Systemnumber,举个实例,开发和测试效劳共用一台效劳器,开发使用systemnumber00,而测试使用systemnumber01,通过systemnumber逻辑地将一台physicalserver逻辑地分成了两台applicationserver.学习ABAP并不难,有人说SAP系统重在管理思想,不在技术,通常对有编程经验的读者不用任何培训参考一些相关资料就可立即上手.简单介绍下ABAP/4的一些特征:1.和SAP紧密结合,尤其在开发报表方面,坦率地讲,除了和SAP集成的好处,.我定认为ABAP在报表开发上比CrystalreportTool要高效简单.2.和VB一样,ABAP是解释形的,如读者精通VB,学习ABAP应该豪不费力,倒是既然SAP是企业管理解决方案,ABAPer必须对企业管理流程熟悉.解释性的另一好处是可以很好跟踪程序逻辑(使用/H),这对了解业务逻辑的实和追踪错误很有效.和VB不同的是,VB跟踪时允许程序运行指针随意往回或往全拉而ABAP程序去不行,但是ABAP程序允许在运行时修改变量的值,这是编译程序不能做到的.当然通常编译比解释执行的速度会更快.ABAP程序执行并不直接读取源代码,而是执行内部经过“生成〞的描述,对于ABAP/4字典的修改激活后将触发内部描述的重新生成,如程序并没激活就执行原版本,或者出现错误(程序没激活可能造成ABAPDumpingABAP).3.在对数据库处理方面,除了可直接执行SQL(使用nativesql,缺点是错误处理很难控制,相当于有开发环境将SQL语句直接传给DB去执行),SAP在ABAP开发环境层还提供了一套OpenSQL访问底层数据库.4.程序员都知道Windows平台下开发都支持事件驱动,Windows系统本身也支持事件驱动,ABAP也提供了事件驱动,这表现在Dialog编程方面,但是ABAP在此方面并不强,而且相对讲也比拟难于掌握(在后面会讨论).5.基于面向对象的风行,ABAP在此方面也有相当反响,在SAP强大的软件包中提供了大量可重复使用的程序,读者也可定义类并使用它快速建立新的对象.6.类似Java,ABAP开发的程序能运行于任何操作系统(Java有Java虚拟机,ABAP也有ABAPprocessor),多种数据库(比方在ABAP字典中实现了透明表对各种底层数据库表的映射,这样在ABAP层看到的透明表就和具体数据库无关),各种网络系统.图1-3是一个ABAP开发和运行环境的图例.1使用C|C++建立ABAP开发工具,数亿行ABAPsourcecode组成SAPAG多个产品.姑且不管国内ERP产品设计在解决企业流程上的局限性,在大多数国外的ERP产品中我们都可看到结合自身ERP自带的开发工具,在技术上这也是落后人家.所以建议国内ERP界能少谈点象什么〞不上ERP等死,上ERP找死〞,〞百分之百的企业上ERP都失败〞诸如的空洞口号(实际上我并不知道他们是凭什么得出这样的结论的),多干点实际的事情.2既然ABAP是解释型的,运行速度会有影响吗?我想多少会有的,为了解决这个问题,除了要加大相关效劳器内存外(相对日新月异的硬件技术这已非主要瓶颈)),SAP本身在提高性能也提供了相当的ABAP技术,比方使用Clustertable,Pooledtable和Logicaldatabase,在接下来会有详细介绍.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.获得AccessKey.4.ABAPworkbench和ABAPdictionary5.第一个程序-HelloWorld.如何进行ABAP开发呢?本节使用老套的做法,介绍如何建立一个〞HelloWorld〞的ABAP程序,为了让读者尽快掌握ABAP开发熟悉ABAP开发环境是必须的,请看图1.5-1.程序的原代码如下:ReportZHELLO.Write‘HelloWorld!’.按F8运行,运行成功在屏幕上显示HelloWorld!的字样,恭喜你,第一个程序运行成功.6.ABAP语法简介数据类型控制流程文本摘要输出格式程序调试7.OpenSQL和NativeSQL8.内表和工作区9.使用字段符号10.模块化程序11.文件处理12.簇数据库和逻辑数据库13.消息和错误处理尽管消息这词还用在其他地方比方PO,SO打印等所谓的outputmessage(请看ABAP百夜谈),系统出现异常,在这里消息只谈在程序运行逻辑异常处理时的消息.1定义消息(参考图7-7).使用TcodeSE91可自定义包含多消息号的消息类,在图7-7中就定义了一个消息类ZFIMSG,同时消息号017中使用了俩&消息变量2运用消息.1.可在程序Title中使用MESSAGE-ID参加消息类.REPORTZMSGTESTMESSAGE-IDZFIMSG.MESSAGEI017.使用消息IMG有这样的画面,[1][2]的appl和workarea实际上对应的就是程序的message_id(SE91:messageclass).2.在程序Title中定义直接在语句中使用.REPORTZMSGTEST.MESSAGEI017(ZFIMSG).将变量赋给消息.REPORTZMSGTEST.MESSAGEI017(ZFIMSG)with‘Var1’‘Var2’‘Var3’.或者MESSAGEID'ZFIMSG'TYPE'I'NUMBER'0171'with‘Var1’‘Var2’‘Var3’.尽管017只定义了两消息变量,但是可With多个值,当然只有前俩生效.4.SAP程序消息类型有以下几种.I:信息窗口W:警告E:错误S:成功A:终止程序或TcodeX:未知.5.和标准SAP一样,你可配置消息,比方你需要由用户决定消息类型,使用下面程序.PROGRAMZMSGTEST.CALLFUNCTION'READ_CUSTOMIZED_MESSAGE'EXPORTINGI_ARBGB='ZFIMSG'I_DTYPE=''I_MSGNR='017'IMPORTINGE_MSGTY=SY-MSGTY.假设你做了Tcode和OBA5一样可配置消息类型,在程序中你就可根据返回值SY-MSGTY判断下步工作,E停止处理,A退出程序等.在标准程序中,接下来会PERFORMMESSAGE_SEND来决定发送消息类型.3常用消息表格和各模块常用消息配置Tcode.在消息配置中,ApplicationArea和SE91的MessageClass实际上是同一概念.1消息相关最常用的table:T100:SAP能用到的消息都应该在此表中找到.T160M:MM模块相关消息表,此表可完全直接维护.就是说只要记住它,MM的消息配置直接使用SE16就可以.T100C:FI模块中用户自定义的消息,比方使用OBA5,OFMG等自定义的消息会写入此表,CO配置消息不在此表.T100S:此表保存着允许用户更改的应用区域和消息号,举例假设你删除了KI005那么在OBA5中再不能配置此消息.(对MM模块有些例外,M7不在此表,使用OMCQ依旧可设置,M3不在此表,OMT4依旧可设置)此表也可直接维护.和T160M不同的是,你必须在SE16输入T100S按新建按钮才可维护.查询时只可Display.T100U:哪个用户最后更改了消息,从此表能找到.T100W:ForWorkflow2常用Tcode(局部):FI:OBA5|OFMG|OFPMMM:OMRM|OKZZ|OMT4|OMCQ|O04C|SD:OVAHCO:OPR4_ACT|OPR4_CK|OPR4_CKML|OPR4_CKPF|OPR4_KKA|OPR4_KKP|OPR4_KKS|OPR4_KKS1|OPR4_PPCOPPOthers:OPR5|OPR1|OPR3|OPR6|OPR7|OPR8|OPR9|OPRCMFE|MSW1|MSW23应用举例.物料价格维护问题[Case1]如何在物料价格未维护时依旧可估算本钱.比方在CK11N(CK40N)计算成品标准本钱时,其中有一些Component没维护价格.就可使用OPR4_CK将默认的错误消息SwitchOff掉(从TcodeOKKN->Misc.->ErrorManagement按钮也可).***另外临时处理方法一是将相关component的物料Cost1View选上DonotCosting.对需要计算标准本钱的材料选上它就不再允许计算标准本钱,不妥,但是对原材料无所谓,因为系统会这样处理,如此材料没维护价格,BOM用到它的成品不计算其本钱,但是如此物料维护了价格后,还是以物料价格为先的.(当然CK11N去估算此原材料是不行的,用户也不需如此做).二是按SAP推荐的如果将price设成0.01,priceunit设置成100.[Case2]如何限定物料价格必须维护.(1)对采用Spricecontrol的.SAP默认是Warning(Tcode:OMT4M3-132,如需要限定必须维护价格,将其改成W就可.(2)对采用Vpricecontrol的,OMT4找不到其消息号M3-131,但系统默认是Warning,如果用户认为也有相关配置就有犯了认为SAP万能的错误,再次强调SAP只是一堆代码并不神秘.好让我们看看其逻辑.***实际上直接使用SE16:T160M可直接配置MM相关.如图:[1]SE38找到程序LMG11F01[2]在此处设置断点[3]如价格为0(空格)写死的,当然配置无效.再看SPricecontrol(如以下图,显然从T160M表读了IMG数据).4灵活运用消息.对于消息的运用,除了可配置消息类别外,另外一个重要用处就在于,可根据消息找到程序弹出消息确实切行,然后稍微花点时间看看程序逻辑就可大概知道异常发生的根本原因.从某种程度来讲,即使对某模块很陌生,只要掌握得好,依旧可排除一些问题.5配置自定义的消息.俩方法可模妨SAP的消息配置1从上我们已经知道既然T160M是可直接使用SE16维护的,我们就可直接将相关设置写入T160M.然后就可根据相关设置取得消息类别(如上图我们使用函数ME_CHECK_T160M),这样比类似MESSAGEE017(ZFIMSG)—Hardcode要平安得多,假设不管三七二十一就给出错误消息,除非在程序中确信已考虑了所有情况,否那么还是在T160M这样设置比拟好(万一在生产环境还可更改E成W什么的).2我们知道T100C是所谓的可配置消息表,我们可使用SE16:T100C和V_T100C.(1)SE16:T100S定义消息可配置信息.如图[1]在此新建.(进去browse数据似乎不可新建)设置消息.如以下图.[1]ApplArea消息类ZFIMSG.[2]表示允许配置的消息类型[3]没选那么表示不能关闭消息.(2)SE16:V_T100C配置消息.如图:[1]表示直接使用程序(Tcode)的消息类型[2]当当程序以BDC方式运行时的消息类型[3]就是上图设置的允许的消息类型,可看到警告和关闭都没出现(T100C没允许)同样在程序中防止使用泪水MESSAGEE017(ZFIMSG)而采用CALLFUNCTION'READ_CUSTOMIZED_MESSAGE'EXPORTINGI_ARBGB='ZFIMSG'I_DTYPE=''I_MSGNR='017'IMPORTINGE_MSGTY=SY-MSGTY.根据返回的SY-MSGTY去判断消息类型将更好些.6实例介绍PO在有发票校验后禁止修改价格,假设无POrelease策略,使用User-exit步骤如下:(1)找适宜的用户出口发现EXIT_SAPMM06E_017比拟适宜,SMOD输入enhancementname:MM06E005(2)编写代码.*&**&IncludeZXM06U42**&*DATA:ZWATEKPOlikeBEKPO,ZIEINFOLIKEEINFOOCCURS0WITHHEADERLINE,ZERMSG(73)TYPEC.TABLESEKBE.***TEKPOrecordsalltheoldPOitemdate.***I_EKPOrecordscurrentlyprocessedPOitem.READTABLETEKPOINTOZWATEKPOWITHKEYEBELP=I_EKPO-EBELP.***只对ME22N才生效.CHECKSY-TCODE='ME22N'.***EKBE是POhistory表,如有Q,R表示有发票校验历史,不允许更改价##SELECTSINGLE*FROMEKBEWHEREEBELN=I_EKPO-EBELnANDEBELP=I_EKPO-EBELPAND(BEWTP='Q'ORBEWTP='R').CHECKSY-SUBRC=0.***如果SY-SUBRC=0表示发票已经校验,不允许更改价格,否那么还是可更改价格##IFI_EKPO-NETPR<>ZWATEKPO-NETPR.***Changee017(ZFIMSG)accordingly*MESSAGEe017(ZFIMSG)."使用下面函数代替.CALLFUNCTION'READ_CUSTOMIZED_MESSAGE'EXPORTINGI_ARBGB='ZFIMSG'I_DTYPE=''I_MSGNR='017'IMPORTINGE_MSGTY=SY-MSGTY.CHECKSY-MSGTYREFRESHZIEINFO.ZIEINFO-MSGID='ZFIMSG'.ZIEINFO-MSGNO='017'.ZIEINFO-MSGV1='VAR1'.ZIEINFO-MSGV2='VAR2'.APPENDZIEINFO.CALLFUNCTION'MESSAGE_GET_TEXT'EXPORTINGIEINFO=ZIEINFOILANGU=SY-LANGUIMPORTINGETEXT=ZERMSG.MESSAGEZERMSGTYPESY-MSGTY.ENDIF.***在大多数情况下追踪消息能发现问题所在,然而在一些特定情况下,SAP显示的消息似乎和实际业务并不符合.好比一个人咳嗽的厉害,以为是感冒结果其实不过是有写异物进入其喉咙而已.14.使用用户授权15.调用外部程序和程序动态生产16.选择屏幕17.使用程序运行变式18.制作Tcode二.加强篇.1.CATT2.BDC3.制作程序的backgroundjob4.SapScript5.Smartform6.SAPQuery7.ALV编程8.ALE/iDoc9.Reportpainter和DrilldownReport10.RFC/BAPI11.编写用户增强12.深入ABAP工作台在这章将深入介绍各种ABAP对象的操作.13.传输请求这节并不是侧重介绍如何配置传输请求和其运行机制的,这通常是basis的工作和ABAPer并无关系,还是那句话,了解点大概是必要的.通常企业起码会有两个系统,开发(测试)系统和生产系统(有些企业开发任务相对少,开发和测试使用同一台server甚至同一client,开发和测试也都有ABAPer完成),如果要严格开发流程,开发,测试必须是分开的(为了节省当然可使用同一server,不同的Client甚至用不同SystemNumber逻辑分成两Server),在此不深入讨论.熟悉几个名词:1开发类(DevelopmentClass).开发类可简单理解为逻辑上相关的一组ABAP对象,在将来传输时将使用同一传输层.实际上开发类本身也可看做是一个ABAP对象,可使用SE80建立.$TMP是本地开发类,属于此开发类的任何ABAP对象(包括自定义的表,编写的程序等都只能在Client做测试用而不能被传输到其他Client.包现在被用来代退开发类.2.包(Package)相关的ABAP对象被组合在一个包内,SE16:TADIR可看到被分配到某包的所有的ABAP对象,包决定了这些对象的传输层.所有的包被存在表TDEVC中,建立包可使用SE80或直接使用SM30:V_TDEVC.包作为开发类的退代和前身有这么几个加强特征.1.包可嵌套使用(这点类似Javapackage)2.包类可包含最多本包中可见的对象,这些对象在包外不可见这点类似私有对象(Privateobject),在OOP中也很常见.3.包可为包接口定义使用访问授权.4.通常自定义包必须是Y或Z前坠,这点和其他ABAP对象相同(包其实也可看做ABAP对象).其他一些包前坠A-S,U-X表示SAP标准包,T私有测试包,$本地临时包,/***名字空间前坠.3.传输层(TransportLayer)传输层决定包内对象是分配给本地还是可产生传输请求.通常,开发系统都被分配了一个标准的传输层,当包被建立时,.它就被分配了一个标准传输层.包内对象也立即自动获得相关传输属性.相关IMG配置使用的是标准的传输层.通常由basis使用TcodeSTMS配置传输管理系统维护传输曾和路由.图2.13-1,显示的是从DVU开发的程序传输到QAS和PRD的传输路由,在图中程序在DVUserver的client210,100开发后被传输到QASClient310测试,成功后被分别传入PRDClient800,810和820.4.传输请求程序是究竟保存在server的什么地方?程序是如何在不同client和server之间进行传输的?要明白这问题,首先让我们看看什么是传输程序和传输控制程序.传输控制程序TP和R3TRANS传输程序,R3TRANS被用来实现SAP各Client间的数据传输和不同版本迁移,TP传输控制程序根据传输参数(TransportProfile)调用R3TRANS传输程序.14.和其它语言的交互VB,Delphi,Java其实开发工具使用都简单,别人都弄出开发环境都给弄出了,学用还会难吗?三.实战篇在这一篇将介绍企业常用模块开发实例,其中可能还涉及一些辅助相关后台配置,每个模块的8个实例是经过精心挑选出的具有相当代表性,由于篇幅原因和各个企业实际需求可能不一样,有的可能在本书只描述了设计思路和局部源代码,希望读者在实际运用中能自行完善并能举一反三.除非必要,尽量使用SAP标准的报表少自行开发,另外,如有可能,使用信息结构.1.MM模块开发实例.一.MM常用表格及其关联关系图二.开发实例下面是一个企业的参考MM开发需求清单(并不包括用户出口等).供给商列表|信息记录|PR,PO打印(Scrip或Smartform)|MRB物料清单|物料报废报表|物料入库报表|物料运输申请单|物料主数据查询报表|收货单打印|IQC报表|PullList|发料单(生产定单)|物料转移单|Deliverynotes|PackingList|RMA发料单|库存分析报告|PO分析报告|GR/IR分析报告|物料盘点单|盘点物料报告等.如工程紧急而开发人手缺乏(有些中小企业专职的ABAPer可能只有一个或各模块的SAP内部支持参谋兼做开发),必须排定开发优先次序,除了比方PO套打收货单打印等必须在工程正式上线前完成的开发任务,相关查询报表可在上线后开发.如果是专职负责开发,依旧需要很好理解业务,最好和负责业务支持的多沟通,一个最有效的方法就是将相关模块的业务流程(通常在业务蓝图阶段会有非常详细的相关资料)在测试系统走一遍,这样对以后开发是大有益处的.1.MM相关单据打印PO和收货单打印开发NACE,MB04外协PO.2.PO增强编程POchangehistory*&**&IncludeZXM06U42**&*DATA:ZWATEKPOlikeBEKPO,ZIEINFOLIKEEINFOOCCURS0WITHHEADERLINE,ZERMSG(73)TYPEC.TABLESEKBE.***TEKPOrecordsalltheoldPOitemdate.***I_EKPOrecordscurrentlyprocessedPOitem.READTABLETEKPOINTOZWATEKPOWITHKEYEBELP=I_EKPO-EBELP.***只对ME22N才生效.CHECKSY-TCODE='ME22N'.***EKBE是POhistory表,如有Q,R表示有发票校验历史,不允许更改价##SELECTSINGLE*FROMEKBEWHEREEBELN=I_EKPO-EBELnANDEBELP=I_EKPO-EBELPAND(BEWTP='Q'ORBEWTP='R').CHECKSY-SUBRC=0.***如果SY-SUBRC=0表示发票已经校验,不允许更改价格,否那么还是可更改价格##IFI_EKPO-NETPR<>ZWATEKPO-NETPR.***Changee017(ZFIMSG)accordingly*MESSAGEe017(ZFIMSG)."使用下面函数代替.CALLFUNCTION'READ_CUSTOMIZED_MESSAGE'EXPORTINGI_ARBGB='ZFIMSG'I_DTYPE=''I_MSGNR='017'IMPORTINGE_MSGTY=SY-MSGTY.CHECKSY-MSGTYREFRESHZIEINFO.ZIEINFO-MSGID='ZFIMSG'.ZIEINFO-MSGNO='017'.ZIEINFO-MSGV1='VAR1'.ZIEINFO-MSGV2='VAR2'.APPENDZIEINFO.CALLFUNCTION'MESSAGE_GET_TEXT'EXPORTINGIEINFO=ZIEINFOILANGU=SY-LANGUIMPORTINGETEXT=ZERMSG.MESSAGEZERMSGTYPESY-MSGTY.ENDIF.自动建立PO和SOTOC\o"1-3"\h\z一.SE11建立一记录表ZPOSO1二.使用POUser_exit1***本程序思路同样适合从建立Salesorder时自动建立PO只是调用的function是BAPI_CREATE_PO和使用creatingSO时的User_exit而已SE11建立一记录表ZPOSO如图建立一个表ZPOSO俩个用途,保存PO到SO的联系以方便将来查询判断PO是create还是change(比方ME22NupdatePOqty,ordeletePOline.)判断***注意EBELN和EBELP合起来才是keyfields相当于DB层的Primarykey使用POUser_exitEXIT_SAPMM06E_001(002,004,006,007,009)006是PO还未create前检查的.EXIT_SAPMM06E_016,017此时虽然有POitem数据但是PONo.还没有给出.EXIT_SAPMM06E_009,PO已经建立并且数据已经refresh.所以使用EXIT_SAPMM06E_013在使用之前必须updateTFDIR表将MAND设置成〞C〞.程序如下:REPORTZupdate.dataztfdirliketfdiroccurs0withheaderline.select*fromtfdirintotableztfdirwhereFUNCNAME='EXIT_SAPMM06E_013'.loopatztfdir.ztfdir-MAND='C'.modifyztfdirindexsy-tabixTRANSPORTINGMAND.endloop.updatetfdirfromztfdir.***由于只有一笔使用Workarea就可搞定,所以要这样霸王强上弓是没有找到配置在哪里.REPORTZTEST11.dataztfdirliketfdir.selectsingle*fromtfdirintoztfdirwhereFUNCNAME='EXIT_SAPMM06E_013'.ztfdir-MAND='C'.updatetfdirfromztfdir.***通过在LSMODU23(Function:MODX_FUNCTION_ACTIVE_CHECK设置断点很容易找出已经有PO的user_exit)SE37:MODX_FUNCTION_ACTIVE_CHECK在如以下图中设置断点.你就会发现TFDIR(FunctionModule表)的MAND必须=AKTIV_FLAG(值就是C)才会call相应的User_exit函数用户增强:所有的Enhancement在表MODSAP,用户增强大概有三类MODSAP是Enhancement表,而TFDIR是看是否此enhancement被激活,就看字段MAND是否是〞C〞而已EEnhancementexits:就是常说的写User_exitCGUIcodes没用过3.SSubscreens屏幕增强OK,其实上面不用coding,通过searchMODSAP发现EXIT_SAPMM06E_013在EnhancementMM06E005中.使用T-code:SMODF8test运行然后可激活EXIT_SAPMM06E_013,如果你确实找不到enhancementname和exit函数对应关系,也没关系.使用SMOD自己建立一个Enhancement比方叫ZPOSO,然后你将function参加,它也会有错误提示告诉你它属于的enhancement,还有就是使用上面的code直接update.你自己可写个code将所有的user_exit找出来,很容易的哟.如你完全明白这篇文章,我想你就理解了user_exit和BAPI的使用.建立BAPI并使用其它语言call同样很简单.EXIT_SAPMM06E_013include程序ZXM06U44在coding前使用SE37testBAPI:BAPI_SALESORDER_CREATEFROMDATA***注意各企业因为设置的fieldsstatus不同可能有所不同.对ORDER_HEADER_IN只需下面几个参数ORDER_ITEMS_IN只需要MATERIAL,REQ_QTY—(Orderqtyinsalesunits-00009001correspondsto9.001,就是说callBAPREQ_QTY测试时=actualqty*1000),COND_TYPE,COND_VALUE,(即对应到price很奇怪必须/10,不知其他系统是否这样,此是注意点)PO_METH_S(Ship-topartypurchaseordertype,如果设置了必须输入的话),ORDER_PARTNERS如果SP和SH相同的话,只要一条SP然后输入customerNo就可,如果ship-to-party不同多家一条SH+customerNo.吧.还有一样要注意.AG—SP,RE—BP—SH(SAP经常有这样的case,就是save在DB中的数据和display出来的数据有所不同,为什么要这样,不得而知,难怪SAP不推荐直接使用DBtable做报表,或者这是SAPAG的一个策略)测试OK.开始codingonZXM06U44,Sourcecode如下,log写在ZPOSO表中.测试使用BAPI_SALESORDER_CHANGE就是说它实际是callBAPI_SALESDOCUMENT_CHANGE的你可知道ORDER_HEADER_INX-UPDATEFLAG为U时是update,为D时是Deletesalesorder,不选还不行.好了下面是SourceCode(仅供参考,大体框架OK,可能根据你的SAP实际情况做些调整).***INCLUDEZXM06U44*在company1000建立PO时同时建立SOin1000和POin2000**注意此程序会反复call.**data:ZORDER_HEADER_INlikeBAPISDHEAD,ZORDER_ITEMS_INlikeBAPIITEMINoccurs0withheaderline,ZORDER_PARTNERSlikeBAPIPARTNRoccurs0withheaderline,ZSALESDOCUMENTlikeBAPIVBELN-VBELN,ZRETURNlikeBAPIRETURN.Data:ZPOHEADERlikeBAPIEKKOC,ZPOITEMSlikeBAPIEKPOCoccurs0withheaderline,ZPO_ITEM_SCHEDULESlikeBAPIEKEToccurs0withheaderline,ZPURCHASEORDERlikeBAPIEKKOC-PO_NUMBER.tables:ZPOSO.datazposologlikezposooccurs0withheaderline.data:Zrepcall(1)typeC."防止反复调用BAPI_PO_CREATE.Refresh:ZORDER_ITEMS_IN.***实际应用根据I_EKKO-EBELN(其实从EBELN-PONo.可判断出plant)***1.I_EKKO-EBELN前面5位用case语句判断***2.根据I_EKKO-BUKRS(comp.code)和XEKPO-WERKS(plant)判断***companycode2000是专门用来采购的HK公司.*ifI_EKKO-BUKRS<>'1000'.*exit.*endif.checkI_EKKO-BUKRSeq'1000'."只对comp1000适用.***判断表ZPOSO有无POno.无callBAPI_SALESORDER_CREATEFROMDATAcreateSO***如果存在callBAPiBAPI_SALESORDER_CHANGEchangeSO.***注意在ME22NchangePO时间XEKPO内表中只保存了被改变lineitem的数据.selectsingle*fromZPOSOwhereEBELNeqI_EKKO-EBELN.ifsy-subrceq0.*ChangeSalesOrder,PurchaseOrder留给你自己写不告诉你*CALLFUNCTION'BAPI_SALESORDER_CHANGE'*CALLFUNCTION'BAPI_PO_CHANGE'else."建立PurchaseOrder和SalesOrder***从ZFLAG表中读取Zrepcall看是否是T,不管使用什么方法总之不要反复**在此处设置断点在第二次调用时将Zrepcall设成T退出.**好象无法设置到那种真正的全局变量只好使用一个表罗**你就会发现当在comp1000建立PO同时也建立了SO并且comp2000也有PO*selectsingleZrepcallintoZrepcallfromzflag.ifZrepcall='T'.exit.endif.***注意使用PO另一个user_exit001将Zflag的zrepcall设置成F***接下来的语句立即updatezflag将zrepcall设置成T.*********开始建立PurchaseOrderincompany2000******************开始建立SalesOrderinsamecompany1000************根据公司实际更改ZOR是标准Salesorder***SalesOrderHeader***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."OrdercurrencyZORDER_HEADER_IN-PURCH_NO=I_EKKO-EBELN.***PurchaseOrderHeader***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.***根据POitem写入SOitem和另家公司的POitemsloopatXEKPO.***写SOitems***ZORDER_ITEMS_IN-ITM_NUMBER=XEKPO-EBELP.*使POitemNO和SOitemNo完全相对应,PO,SOitem可manualinput.ZORDER_ITEMS_IN-MATERIAL=XEKPO-MATNR."'08K2555'.ZORDER_ITEMS_IN-REQ_QTY=XEKPO-MENGE.ZORDER_ITEMS_IN-REQ_QTY=ZORDER_ITEMS_IN-REQ_QTY*1000.*CallSOBAPI时Qty测试时间必须乘上1000.ABAP中那么不用ZORDER_ITEMS_IN-COND_TYPE='ZPR1'."ZPR1是EST定义的pricecond.ZORDER_ITEMS_IN-COND_VALUE=XEKPO-NETPR.ZORDER_ITEMS_IN-COND_VALUE=ZORDER_ITEMS_IN-COND_VALUE/10.*CallSOBAPItest时Price必须/10ZORDER_ITEMS_IN-PO_METH_S='010'."表示是维修期,EST设置成必输字段.AppendZORDER_ITEMS_IN.***写另公司的POitems,如果有必要让俩公司PO外部给号PONo可一致***ZPOITEMS-PUR_MAT=XEKPO-MATNR.ZPOITEMS-PLANT=XEKPO-WERKS.ZPOITEMS-NET_PRICE=XEKPO-NETPR.***仅仅是test,注意XEKET,shedulesdeliverydate没item不同哟.自己去加强吧ZPO_ITEM_SCHEDULES-DELIV_DATE=SY-DATUM."XEKET-EINDTZPO_ITEM_SCHEDULES-QUANTITY=XEKPO-MENGE.appendZPOITEMS.appendZPO_ITEM_SCHEDULES.endloop.***为了简单就将SP-Sold_to_Party和SH-Ship_to_Party设置成相同.***AG-SP:sold_toWE:SHShipping-to,BAPI测试只要SP,call时那么要求俩者***下面假设POvendorno就是SO的customerno,如非就建立对应关系.ZORDER_PARTNERS-PARTN_ROLE='AG'.ZORDER_PARTNERS-PARTN_NUMB=I_EKKO-LIFNR.***实际应用时HK开PO时产生的SOcustomer当然只有一个就是SZ公司.AppendZORDER_PARTNERS.ZORDER_PARTNERS-PARTN_ROLE='WE'.ZORDER_PARTNERS-PARTN_NUMB=I_EKKO-LIFNR.AppendZORDER_PARTNERS.CALLFUNCTION'BAPI_SALESORDER_CREATEFROMDATA'EXPORTINGORDER_HEADER_IN=ZORDER_HEADER_INIMPORTINGSALESDOCUMENT=ZSALESDOCUMENT*SOLD_TO_PARTY=*SHIP_TO_PARTY=*BILLING_PARTY=RETURN=ZRETURNTABLESORDER_ITEMS_IN=ZORDER_ITEMS_INORDER_PARTNERS=ZORDER_PARTNERS*ORDER_ITEMS_OUT=*ORDER_CFGS_REF=*ORDER_CFGS_INST=*ORDER_CFGS_PART_OF=*ORDER_CFGS_VALUE=*ORDER_CFGS_BLOB=*ORDER_CCARD=.ifZSALESDOCUMENT<>''.loopatXEKPO.zposolog-ebeln=I_EKKO-EBELN."PONo.zposolog-ebelp=XEKPO-EBELP."POitemNo.zposolog-vbeln=ZSALESDOCUMENT."SONo.zposolog-posnr=XEKPO-EBELP."SOItemNO.zposolog-waers=I_EKKO-WAERS."Currencyzposolog-matnr=XEKPO-MATNR."Materialzposolog-kwmeng=XEKPO-MENGE."PO/SOqtyzposolog-netpr=XEKPO-netpr."PO/SOpricezposolog-bapimsg='CreationOK'."ZRETURN-MESSAGE.zposolog-flag='T'."Failureappendzposolog.insertZPOSOfromzposolog.endloop.else.zposolog-ebeln=I_EKKO-EBELN.*zposolog-bapimsg=ZRETURN-MESSAGE.***为了好SE91查找message合并messagetype,messgecode,和messagetextconcatenateZRETURN-TYPE'--'ZRETURN-CODE'--:'ZRETURN-MESSAGEintozposolog-bapimsg.zposolog-flag='F'."Failureappendzposolog.insertZPOSOfromzposolog.endif.***PO可能会反复调用吗***不管如何做到call一次就退出.***建立一表ZFLAG,可只有一个字段,Zrepcall,default是F,CALLFUNCTION'BAPI_PO_CREATE'EXPORTINGPO_HEADER=ZPOHEADER*PO_HEADER_ADD_DATA=*HEADER_ADD_DATA_RELEVANT=*PO_ADDRESS=*SKIP_ITEMS_WITH_ERROR='X'*ITEM_ADD_DATA_RELEVANT=IMPORTINGPURCHASEORDER=ZPURCHASEORDER"好瞧瞧TABLESPO_ITEMS=ZPOITEMS*PO_ITEM_ADD_DATA=PO_ITEM_SCHEDULES=ZPO_ITEM_SCHEDULES*PO_ITEM_ACCOUNT_ASSIGNMENT=*PO_ITEM_TEXT=*RETURN=*PO_LIMITS=*PO_CONTRACT_LIMITS=*PO_SERVICES=*PO_SRV_ACCASS_VALUES=*PO_SERVICES_TEXT=*PO_BUSINESS_PARTNER=*EXTENSIONIN=*POADDRDELIVERY=.Endif."结束建立PurchaseOrder和SalesOrder下面是使用VBCallBAPI_CREATE_PO建立PO的例子的局部,首先使用SE37测试,根本上建立PO最简单只需要以下参数.注意vendor必须是10位数,如果长度缺乏,请加0tvendor=Mid("0000000000",1,10-Len(Trim(VENDOR.Text)))+Trim(VENDOR.Text)‘保证如果vendorlength<10补充到10位,否那么就会出错poheader.Value("VENDOR")=tvendorpoheader.Value("PURCH_ORG")="1000"'Trim(Text2.Text)poheader.Value("PUR_GROUP")="111"'Trim(Text3.Text)poheader.Value("DOC_TYPE")="NB"'Trim(Text4.Text)poitems.Value(1,"PUR_MAT")="C-010"'Trim(Text5.Text)poitems.Value(1,"PLANT")="1100"'Trim(Text6.Text)poitems.Value(1,"NET_PRICE")="222"'Trim(Text7.Text)poitemschedule.Value(1,"DELIV_DATE")="2023/08/16"'Text8.Textpoitemschedule.Value(1,"QUANTITY")="888"'Text9.Text3.物料主数据编程使用物料主数据4.供给商列表分析5.收货检测增强物料移动报表6.库存分析报表7.GR/IR报表8.报废流程增强LIS系统简介2.SD模块开发实例.企业SD的一般流程汇总:典型的SD开发有(不包含SD模块增强).发票打印|销售分析报表|CreditNote申请Form|ShippingNote|SalesForecast|DunningLetter|ShipmentStatus|PackingList|产品批次和系列号报表等.由于SD可能有大量的用户增强,在实例中有几个典型的案例.1.读取销售文本2.销售订单审批.7.8.3.PP模块开发实例.企业PP的一般流程汇总:典型的SD开发有(不包含SD模块增强).发票打印|销售分析报表|CreditNote申请Form|ShippingNote|SalesForecast|DunningLetter|ShipmentStatus|PackingList|产品批次和系列号报表等.由于SD可能有大量的用户增强,在实例中有几个典型的案例.1.MD04save的Prod极其素原的PR..FI模块开发实例.1.编写财务报表2.财务凭证确实定(Validation)在HR,AP,AP,GL,Consolidation,RealEstate,SpecialPurposeLedger等多模快都能发现有效性检查(Validation)配置,所谓Validation不过是在凭证保存前根据设置条件判断此凭证是否有效,再根据Validation设置的消息类型(关于消息请参考第例消息控制)决定凭证是否允许保存(顺利保存的),对稍微了解ABAP开发根底的用户是很容易理解的.凭证Validation,Substitution和UserExit的使用保证了凭证能成功通过某些企业实际的自订复杂业务检测最后保存在数据库中.***可使用Validation检测在记帐时某些costcenter只能对应到具体某FunctionalArea(如上了FunctionalArea的话),某些费用类科目只能记到某具体Costcenter等.比拟实用的ValidationIMGT-code有:OB28:AP/AR/GLDoc.|OAZ1:AMPosting|GCVW:GlobalValidation(InSPL,CompanyLevel)|GCVV:LocalValidation(InSPL,CompanycodeLevel).下面以OB28为例,详细说明Validation的用法.(IMGPath如图7-1标号1)[1]定义记帐确认.[2]定义会计凭证退代.建立Validation步骤:下面以LineValidationSTLINE只允许用户STONEF在5100(本位币HKD)记帐时本位货币金额不超过1000HKD为例子,详细介绍Validation的配置步骤.***当然使用其他配置也能到达相同效果.1.选择CallupPoint建立ValidationName(如图7-2).[1]1.在凭证抬头触发2.凭证行工程触发3.整个凭证触发,触发通常发生在用户按Enter键和保存之时.[2]新建Validation时按F2进入详细画面(如图7-3)[3]1表示激活,只有选择激活后Validation才真正起作用.2.Validation建立步骤详解(如图7-3).[1]新建Validation,如在此新建Validation要回到图7-2按Newentries然后激活.[2]新建Step,一个Step包含先决条件,检查和消息.图7-3Step001表示的是在Companycode5100(LocalCurrencyHKD)下如果User是STONEF,如记帐本位币超过1000HKD,就弹出错误消息ZFIMSG017(关于消息剖析请参考第例消息控制).***Validation触发的条件是满足先决条件但是不满足检查条件.[3]Rule可用在Validation,Substitution,ReportWriteSelection甚至ATPcheck,简单理解,经常用到的一些判断条件可建立成Rule,将Prerequisite和check建立俩Rule-ZRULE1(图7-4)和ZRULE2(图略.BSEG-DMBTR<='1000.00'),和图7-2效果一样,不同的是此俩rule还可用在Substitution等中(请看第8例凭证的退代),可重复使用.重复性的好处还表现在你只要修改rule(比方现在STONEF允许最大记帐金额是2000),所有用到此rule的Validation,Substitution全部生效.图7-5使用Rule和图7-3直接使用ABAPcode效果一样.***Rule做为一个条件可用在定义其它Rule,比方ZRULE3包含ZRULE1and其他条件.[4]HeaderValidation只可选BKPF字段和只在凭证头回车或保存凭证触发.[5]ItemValidation先决条件可选BKPF和BSEG,但是Check只能选BSEG字段,否那么不被触发.***比方先决条件条件是BKPF-BUKRS,Check是BKPF-USNAM,很明显这是无效的Val

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论