SAP采购订单税码增强检查
sap采购订单税率维护

sap采购订单税率维护
摘要:
1.SAP 采购订单税率维护简介
2.税率维护的具体操作步骤
3.常见问题及解决方法
4.总结和建议
正文:
SAP 采购订单税率维护是一个涉及采购订单中税率设置的过程。
在进行采购订单时,税率设置的正确与否关系到企业成本的核算和税务的合规性。
因此,熟练掌握SAP 采购订单税率维护的方法十分重要。
以下是SAP 采购订单税率维护的具体操作步骤:
1.登录SAP 系统,进入采购订单相关事务代码。
2.选择需要维护税率的采购订单,点击“显示详细信息”。
3.在采购订单详细信息页面,找到“税率”字段,点击“编辑”。
4.在弹出的编辑页面,输入正确的税率值,并保存。
5.如果需要批量维护税率,可以选择多个采购订单,点击“事务代码”菜单下的“批量维护税率”功能。
6.在弹出的批量维护页面,设置好相关参数,点击“执行”按钮,系统将自动维护所选采购订单的税率。
在实际操作过程中,可能会遇到一些常见问题,如税率设置不正确、无法保存等。
针对这些问题,可以采取以下解决方法:
1.检查税率设置的数值是否符合税法规定,如增值税税率、关税税率等。
2.确保采购订单的相关信息填写完整,如采购组织、采购员等。
3.如果无法保存,可能是系统权限问题,请与系统管理员联系。
4.如遇到其他问题,可参考SAP 官方文档或寻求专业人士的帮助。
总之,SAP 采购订单税率维护是企业日常采购活动中不可或缺的一环。
通过对税率的正确设置,有助于企业降低成本、提高运营效率,同时确保税务合规。
SAP采购条件增强功能开发说明

采购条件增强功能开发说明书文档控制⏹版本控制⏹文档审核程序类型:❑报表❑功能性开发❑批处理程序❑打印表单√系统增强❑用户出口√接口❑程序用到的技术:❑ALV√BAPI ❑BDC√RFC❑ALE√其他运行频率:每小时每天每周每月√其它运行方式:√前台手工√后台自动程序名:TCode:1概要说明1.1与此功能开发相关的业务背景采购订单创建时,需要根据用户的需求,对采购订单的单价/总价进行计算调整,扣减相关的折扣或税费。
1.2此功能开发的业务需求描述1.采购订单输入的价格是含税价,需要自动计算成未税价。
2.采购时与供应商会商定一个损耗比例,采购订单的总金额,将扣除该损耗比例所占用的金额。
扣除后的金额将是供应商发票校验的金额。
2功能需求详细说明(1)含税价计算成未税价输入的采购价格是PB00或者PBXX,是一个含税价。
配置中另外一个条件类型ZTAX,把税算出来,作为一个折扣项减去,最后得到的就是净价了。
新建一个calculation formula,编号命名为905.因为这个条件类型需要我们通过税码计算出来。
(2)损耗金额的计算在实际业务中,输入的采购金额为含税价,通过“含税价计算成未税价”,会将税金从中扣除。
如果采购订单类型为:“”,并且“ZSUP-损耗“大于0,则执行损耗金额扣减的功能。
首先,需要获得采购行项目物料的未税单价。
因为输入的PB00或PBXX是含税单价,因此,未税单价的计算公式为“未税单价=含税单价×(1-税率)“。
然后,计算损耗量的未税金额,计算公式为“损耗量未税金额=行项目数量×ZSUP×未税单价最后,计算扣减损耗金额的净金额,计算公式为“扣减后净金额=扣减前净金额-损耗量未税金额”。
2.1相关表及字段2.2选择条件/用户界面可以Excel文件附件的方式在此插入界面设计,Excel中需体现界面样例;也包括用户输入的特殊方式,如文件导入等等;无。
2.3处理逻辑详细描述最重要的一个段落,详细说明处理逻辑;必要时可以copy屏幕。
SAP资料 SAP 税务代码设置 发票校验

税务设置一般pricing(定价)可能会有这样的一系列步骤1.定义condition table->定义condition type->定义存取顺序->最后是定价过程.MM,SD和税务的配置有很多相同情况,甚至共享了很多相同表.税务科目就可以.[1]计算过程包括定义存取顺序,条件类型然后是定义税务计算过程(如图10-2,10-3,10-4)[2]分配计算过程给国家代码[3]定义税码[4]定义税务科目.税务配置步骤.1定义存取顺序如图10-2,以MWST为例.[1]Access name MWST,一般税务定义用它就行.[2]Access No. line在此只一行,记得MM,SD 存取行号有多行.[3]表示Table A003,MMSD的condition table名也是A+自定义table 名.[4]所用到的字段,其实是A003(KOMK亦有)的字段,只有两个,简洁.***Tax IMG的Access Sequences相对简单,多数情况下用户使用MWST就可,读者还可看到一些专门为美国和巴西定制的Access Sequences.2定义条件类型做过MM,SD condition 配置的对此再熟不过了,看看TAXCN(图10-5)的BASB和MWAS吧,一个是计税的Base Amount,一个是计税的百分比.理解了这俩个condition type其它的都一样.如图10-3,为了便于读者理解,只列出5个最主要参数.[1]Condition type名称–BASB,计税的税务基数base amount.[2]存取顺序名(参照图10-2),在此千万不要输入, 税务基数和存取顺序无关.[3]K表示税务基数不含税,另一常用的是P表示税务基数已经包含税务[4]不允许手工更改税务基数,必须系统自动计算.[5]在SD Condition计税中,可使用或修改程序来实现,请参考SD定价配置.接下来再看Condition type BWAS,如图10-4,只截了上面部分.[1]Condition type MWAS[2]Access Seq MSWT,在图10-5可看到MWAS到MWCN都属于此存取顺序.[3]进去可看到Condition type MWAS在各国所定义的税码.[4][5]请读者自己比较和图10-3的不同3定义税务计算过程.读者再次感觉Tax calculation Procedure 和MM,SD的Pricing Procedure简直相同,如图10-5.[1]TAXCN,一般国类企业就用它,其实其他国家的tax calculation procedure特别是在计算进项税和销项税上大致相同,只是税率不同而已,关于税率(码)定义请用FTXP[2]Step是计算步骤[3]Fro. To就是从第几步到第几步(简直就是定价)开始是计税有效行,空表示只使用From 一行计税,比如110 MWAS销项税从100 To空,就是说销项税的计算是从BASB-Base Amount 行开始再乘一个销项税率.再看310 CNSD,从300行To空,而300 CNSC由是从100行 To 空,则CNSD Service Tax 借项将等于100 BASB乘服务税率再乘一个-1.(如图[4]Ac_countkey,也是OB40定义Tax account的Transaction Key***Tcode OBYZ包含了了上面三个配置.4为国家代码分配计税过程.直接为国家代码分配一个计税过程而已,如图10-65定义税码IMG Path:Tcode :FTXP 如图10-7.[1]更改Tax code 属性,总不能input tax写了17 [5],tax code来个13% input tax, china[3]吧.[2]就是接下来OB40定义的税务相关科目,一般是名称类似Purchase-Input Tax,Sales-Output Tax.[4]Base Amount, BASB,下面的Cond. Type实际就是税务计算过程出现的所有的condition type.[6]参考图10-5 [3].[7]计税过程TAXCN所包含的所有Condition Types6定义税务科目IMG Path:Tcode :OB40 ,如图10-8[1]自动记帐科目分配组,对TAX是%TX,再比如MM的自动科目分配(OBYC)的group是RMK,关于更详细的自动科目分配配置(FBKP包含了SAP所有的自动科目分配配置)请参考第例自动记帐科目分配.[2][3]MW2和VS2服务类税通常科目必须是成对配置的.如图10-9(仅做测试).[1]假设定义了一个税码JT,税率是50%(测试用).[2][3]定义服务类税税率借贷是50%,-50%.使用FB60(FB70)在选用此JT税码时,会产生一借一贷的抵消会计分录.如果[3]不设置没有50.000-,则会根据TTax-Based Amount产生amount*50%的Tax amount .税务相关记帐.1 FB00定义Editing Options(图10-9).[1]根据实际需要决定1是否需要选择,前面已经讲过.2FB50总帐记帐只所以将FB50单独提出是因为大都数记帐Tcode (FB60,FB70,FB65,F-02)能找到那个Calculate tax选择框,但是在FB50好象初始界面上没有.1.错误提示2.Double Click3更改科目10010120的金额为1030( 1000*J5税率3%),生成凭证如下.。
sap采购订单税率维护

SAP采购订单税率维护1. 简介在SAP系统中,采购订单是企业进行采购活动的重要工具。
税率是采购订单中一个重要的信息项,它决定了采购物品的税额。
本文将介绍如何在SAP系统中维护采购订单的税率。
2. SAP采购订单税率维护的步骤2.1 进入采购订单维护界面首先,登录SAP系统,进入采购订单维护界面。
可以通过以下路径进入:SAP Easy Access菜单 -> 采购 -> 采购订单 -> 修改2.2 输入采购订单号在采购订单维护界面,输入要维护税率的采购订单号。
系统将自动显示该采购订单的详细信息。
2.3 找到税率字段在采购订单详细信息界面,找到税率字段。
税率字段通常被命名为“税率”、“税率代码”等,具体名称可能因企业而异。
2.4 输入税率值在税率字段中,输入正确的税率值。
税率值通常以百分比表示,例如10%、16%等。
2.5 保存修改在输入税率值后,点击保存按钮保存修改。
系统将自动更新采购订单的税率信息。
3. 注意事项在进行SAP采购订单税率维护时,需要注意以下事项:•税率值必须准确无误,以确保采购订单的税额计算正确。
•税率值通常由企业的财务部门或税务部门提供,采购人员应与相关部门确认税率值。
•如果税率值发生变化,采购人员需要及时更新采购订单的税率信息。
•在维护税率时,应注意选择正确的税率代码,以确保税率的准确计算。
4. 总结本文介绍了在SAP系统中维护采购订单税率的步骤和注意事项。
通过正确维护税率,可以确保采购订单的税额计算准确无误。
在实际操作中,采购人员应注意输入准确的税率值,并及时更新采购订单的税率信息。
同时,与财务部门或税务部门保持沟通,以确保税率值的准确性和一致性。
以上就是关于SAP采购订单税率维护的介绍,希望对您有所帮助!。
SAP采购系统操作手册

采购部分操作手册版本控制1业务描述采购部分包括采购申请的创建,采购申请的确认,采购申请分配货源,采购申请转采购订单,采购订单的审批。
2业务操作说明2.1 采购申请2.1.1 创建标准采购申请在SAP 主界面输入“ME51N的事务代码,点击或回车进入创建采购申请的界面。
在下拉选项框中选择采购申请类型。
在采购申请的项目概览中,输入物料号,输入数量,输入申请工厂,回车,系统会校验并带出物料的其余信息。
点击按钮,对采购订单的完整性进行检查。
点击弹出的消息,进入凭证检查的发布消息界面。
确认无误后点击按钮,对采购申请进行保存。
点击弹出的采购申请被创建的消息号,进入采购信息号被创建的显示界面。
2.1.2 创建服务采购申请在SAP主界面输入“ME51N”的事务代码,进入创建采购申请的主界面。
在创建采购申请的页面,通过按钮去选择采购申请类型。
在项目中输入:科目分配类别U未知的;在项目中输入:项目类别D服务。
输入服务短文本;数量;单位;交货日期;物料组:9002;工厂;采购组:501。
点击回车。
在弹出的物料数据页签中输入服务编号,输入数量与总价,点击回车,系统带出服务短文本。
点击按钮,检查采购申请是否完整。
弹出的消息号提示没有错误后,点击按钮。
进入采购申请被创建的显示界面。
2.1.3 创建资产采购申请在SAP主界面输入“ME51N”事务代码,进入创建采购申请的界面。
在申请类型上选择资产采购申请类型。
通过按钮选择科目分配类别:A资产。
输入短文本;数量;交货日期;物料组:9001;工厂;采购组:301.点击回车按钮,弹出科目分配页签,维护资产编号。
通过按钮弹出资产选择对话框,选中申请的资产后,点击回车。
选择完资产之后,点击回车。
在弹出的评估页签中输入资产的评估价格,点击回车。
在科目分配页签查看,总账科目变为分配状态。
点击按钮。
进入采购申请是否完整的检查界面。
点击保存按钮,进入采购申请已创建的显示页面。
2.1.4 创建委外采购申请在SAP主界面输入“ME51N”事务代码,进入创建采购申请的主界面。
SAP模块常用增强总结

SAP模块常用增强总结SAP系统的模块中有很多可以进行增强的功能和扩展性,用于满足不同行业和企业的特殊需求。
以下是常见的SAP模块的常用增强总结。
1.财务会计模块(FI)增强:-自动支付程序增强:可以根据不同的支付条件和筛选规则对付款进行更精确的控制和管理。
-合并报表增强:可以通过添加自定义报表字段和计算公式来满足企业特定的合并报表需求。
-预算管理增强:可以根据不同的预算情况进行灵活的预算规划和监控。
2.物料管理模块(MM)增强:-供应商采购评估增强:可以根据供应商的绩效评估和供应商风险来调整采购决策和供应商选择。
-基于时间的物料需求计划增强:可以根据历史销售数据和未来需求预测来优化物料采购和库存管理。
-采购订单扩展增强:可以根据企业特定的采购流程需求添加自定义字段和审批规则。
3.销售和分销模块(SD)增强:-销售订单定价增强:可以根据不同的定价策略、折扣活动和促销活动来定价,并自动计算出最佳价格。
-销售订单出货增强:可以根据不同的运输方式和目的地配置出货计划,并根据实际情况进行及时调整。
-订单交付跟踪增强:可以实时跟踪订单的交付情况,并及时通知客户订单的状态和发货信息。
4.生产计划与控制模块(PP)增强:-生产订单调度增强:可以根据不同的优先级、资源可用性和工作中心的负载情况进行生产订单的调度和优化。
-预测和需求管理增强:可以根据历史订单数据和市场需求预测来优化生产计划和需求管理。
-工作中心的作业计划增强:可以根据企业的特定需求添加自定义的工作中心属性和作业计划字段。
5.人力资源模块(HR)增强:-人事招聘管理增强:可以根据不同的招聘渠道和招聘流程来管理和筛选候选人,并对他们的价值和风险进行评估。
-绩效管理增强:可以根据不同的绩效指标和评估标准对员工的绩效进行评估和管理,并制定相应的激励计划。
-员工培训管理增强:可以根据不同的培训计划和培训评估指标来管理和跟踪员工的培训情况。
总的来说,SAP系统的各个模块都可以根据企业的特定需求进行增强和扩展,以满足不同行业和企业的特殊需求。
sap abap查找增强的方法和程序查找增强方法

1、通过程序——查找第二代、第三代增强方法。
找到出口名称,在smod里面查找相应的增强组件,再去cmod里面创建包含多个组件的增强项目,再去实现这些增强(屏幕增强、结构增强字段增强等)。
其他方法:***方法一****************************************通过SE30,运行TCODE后,点Evaluate后,查看运行时间分析评估:命中清单。
找以“exit”开头的SAP程序,如:EXIT_SAPLIE01_007,这个FUNCTION就是TCODE提供的一个出口。
至于如何查看这个增强是属于哪个SMOD,能够查阅MODSAP这个表(SAP Enhancements).***方法二****************************************通过SE37中的:MODX_FUNCTION_ACTIVE_CHECK 函数来找,在函数的最后一行打个断点,再运行TCODE的,如果有增强则会跳入DEBUG界面,在DEBUG界面中,查看L_FUNCNAME字段对应的值,此值就是就是要找的出口,再去SE11中通过MODSAP来查看出口对就的是那个SMOD,接下来就可以在CMOD中创建增强组了,把找到的增强填入,最后根据实际的业务进行处理。
以上的两种方法是用来找第二代增强。
***方法三****************************************找BADI的方法。
先运行SE24,查看类对象CL_EXITHANDLER, 在其方法:GET_INSTANCE的14行(CALL METHOD CL_EXITHANDLER=>GET_CLASS_NAME_BY_INTERFACE)打上一个断点。
接下来运行事务代码,当有BADI是将会被执行,这时在DEBUG模式下,会进入类CL_EXITHANDLER 的GET_INSTANCE 方法,按F6执行这个方法之后,点参数EXIT_NAME查看其对应的值,所有的方法实现都在此类对象中,此时就是我们所要找的BADI。
ABAP增强查找方法

AP 增强已经发展过几代了,可参考 SAP 标准教材 BC425 和 BC427。
简单的说SAP的用户出口总共有四代:1、第一代基于源代码的增强。
SAP提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。
这类增强都需要修改sap的标准代码。
示例:USEREXIT.. in SAPMV45A源代码增强以子程序形式发布,在 SAP 的发行版本中,使用 PERFORM 调用这些子程序,它们在发布时都是空的,集中在一些文件名倒数第二个字符为 Z 的包含程序中。
用户增强时,应首先到 service marketplace 申请对象键,然后才能修改这些子程序,这些子程序可以使用程序中所有的全局数据。
屏幕增强以客户屏幕形式发布,它们包含在标准程序中,没有什么特别规律。
这种源代码增强和屏幕增强的说明可以从事务码 spro 后台配置中相关模块的路径里面找到。
同时使用的针对数据表的增强是 append structure,可以在事务码 se11 中打开透明表,点击应用工具栏最右边的那个 append structure 按钮就能为数据表追加新的字段。
2、第二代基于函数模块的增强。
SAP提供的是CUSTOMER-FUNCTION,它是通过SMOD和CMOD完成实现。
源代码增强以函数模块形式发布,在 SAP 的发行版本中,使用 CALL CUSTOMER-FUNCTION 调用这些函数模块,它们在发布时只有一句代码 INCLUDE xxxxxxx。
用户增强时,无需申请对象键,直接双击这个包含,然后回车,就可以创建相关的包含文件,编写相应的代码了。
这些函数模块中只能使用接口中传递的参数,不能使用调用程序的全局变量。
屏幕增强也包含在函数模块所属的函数组中。
针对数据表的增强是 CI_ 结构,这些结构以 .INCLUDE 结构的形式包含在 SAP 发布的数据表中,用户可以通过向这些结构中添加字段而对数据表进行增强。
SAP采购订单税码增强检查

SAP采购订单税码增强检查2014年09月05日⁄综合⁄共3030字⁄字号⁄评论关闭1、SE18查看ME_PROCESS_PO_CUST相关信息2、SE19创建ME_PROCESS_PO_CUST的BADI实现类注意类名称定义是按照以下规则:ZCL_IM_ + BADI其中CL表示CLASS类的意思,IM表示Implement实现的意思;3、SE24实现ZCL_IM_ME_PROCESS_PO_CUST4、实现PROCESS_ITEM:METHOD IF_EX_ME_PROCESS_PO_CUST~PROCESS_ITEM.*&====================================================== ====*& 对采购订单行项目增加是否有选择税码检查*& Added by liangqh 2010-07-28*&====================================================== ====INCLUDE MM_MESSAGES_MAC.DATA:L_ITEM TYPEMEPOITEM. "采购订单行项目L_ITEM = IM_ITEM->GET_DATA( ).*--> 判断行项目税率是否为空IF L_ITEM-MWSKZ = '' OR L_ITEM-MWSKZ ISINITIAL.MMPUR_MESSAGE 'E' 'ZMM01' '002' L_ITEM-EBELN L_ITEM-EBELP ''''.ENDIF.ENDMETHOD.METHOD IF_EX_ME_PROCESS_PO_CUST~CHECK.*&====================================================== ====*& 对采购订单行项目增加是否有选择税码检查*& Added by liangqh 2010-07-28*&====================================================== ====INCLUDE MM_MESSAGES_MAC.DATA:OBJ_ITEMSTYPE PURCHASE_ORDER_ITEMS,OBJ_ITEMTYPE PURCHASE_ORDER_ITEM,LW_HEADERTYPE MEPOHEADER,LW_ITEM TYPEMEPOITEM.LW_HEADER = IM_HEADER->GET_DATA().OBJ_ITEMS =IM_HEADER->GET_ITEMS( ).LOOP AT OBJ_ITEMS INTO OBJ_ITEM.LW_ITEM =OBJ_ITEM-ITEM->GET_DATA( ).*--> 判断行项目税率是否为空IFLW_ITEM-MWSKZ = '' OR LW_ITEM-MWSKZ IS INITIAL.MMPUR_MESSAGE 'E' 'ZMM01' '002' LW_ITEM-EBELN LW_ITEM-EBELP ''''.ENDIF.ENDLOOP.ENDMETHOD.method IF_EX_ME_PROCESS_PO_CUST~POST.*&====================================================== ====*& 对采购订单行项目增加是否有选择税码检查*& Added by liangqh 2010-07-28*&====================================================== ====INCLUDE MM_MESSAGES_MAC.。
SAP增强讲解

第一代增强:用户增强该增强主要存在于Sales and Distribution查找该增强点有两种方法:以T-CODE:V A02为例第一种方法:打开T-CODE:V A02菜单栏:System->Status 弹出对话框复制Program(screen)进入SE38点击Display 显示程序一般为Module Pool属性的程序,在这样的程序里有很多include程序,一般第一代增强都存在于include程序中,其include程序名特点是程序名倒数第二为为‘Z’。
一般运用搜索功能输入’ userexit*’搜索结果会找到很多以’ userexit’为开头的FORM子程序,以include程序‘MV45AFZZ‘中的增强点’FORM USEREXIT_SA VE_DOCUMENT.‘为例继续往下翻点击‘FORM USEREXIT_SA VE_DOCUMENT.’进入这样我们可以在这个FORM中写相应的代码来进行增强,在做增强选择‘更改’按钮时,需要申请ACCESS KEY然后既可以在这个子程序这个增强点里面写一个相应的代码第二种查找增强点的方法:T-CODE:SPRO选择该按钮进入一下画面找到Sales and Distribution:点击一下图中按钮弹出文本对话框,看到很多INCLUDE程序名我们找到第一种方法找到的INCLUDE程序名进入SE38输入include程序名‘MV45AFZZ’找到第一种方法找到的增强点在增强点输入相关代码后,即可对V A02增强如图中支付条件VBKD- ZTERM行项目类型VBAP- PSTYV行项目数量VBAP- KWMENG If VBAP- PSTYV = ‘tan’.If VBAP- KWMENG > 100.Message ‘数量不能大于100’ TYPE ‘E’.Endif.Endif.进行条件限制,做相关增强。
第二代增强个人理解的介绍:第二代增强是基于FUNCATION的增强,如果把T-CODE在运行时会触发一些SAP预留的没有代码的FUNCATION,可以把这些FUNCA TION称作为CALL FUNCTION-CUSTOMER。
统一SAP财务增强

SAP财务增强的统一规划作者:付鸿杰集团在实施和推广ERP大都会采用统一和集中原则,然而,由于集团业务庞杂,ERP 统一和集中曲折之路往往难以避免,下面以实例简单介绍下SAP财务增强统一规划和管理思路。
一、用户增强简介SAP系统预留有3类增强:菜单增强(Menu ENTRY)、屏幕增强(SubScreen)和功能增强(Function Enhancement),顾名思义,屏幕增强,就是诸如采购订单、资产卡片或内部订单等主数据允许客户化子屏幕和相应辅助字段,扩展分析维度;而功能增强就是在事务码(Transaction Code,简称Tcode)对应标准程序中留下出口,允许用户插入自定义逻辑代码,因此这类增强亦称用户出口(User Exit)。
二、理解FICO增强FICO模块也有自己特定的增强,财务增强分为两类:替代(Substitution)和有效性检查(Validation),替代允许根据用户逻辑替换会计凭证字段的原始内容,例如,当FICO标准凭证生成功能无法满足集团对会计核算的明细需求时,就可使用替代将相应辅助核算信息填充完整,对无法手工干预的自动会计凭证来讲,替代尤为重要;而有效性检查则是根据核算需求对会计凭证内容进行“完整性”检查,预先避免不完整的核算数据进入系统形成垃圾信息。
常用的FICO增强Tcode如下:GGB0(全部有效性检查)/OB28/OKC7 :FI/CO有效性检查GGB1(全部替代)/OBBH/OKC9: FI/CO替代财务增强有特定执行顺序,不妨假设检查某核算字段内容缺失时报告错误,如果检查优先执行,则可能因内容确实报告错误,事务直接终止,而实际上该核算内容是启用替代来填入的,信息并不缺失,不应报告错误,由此推断,替代显然应该优先执行。
无论替代还是有效性检查最后都形成代码,从技术角度来看,任何管理软件无非是代码+数据库表的集合,而从代码角度,替代和有效性检查的区别仅仅在于替代可以替换内容,而检查不能,如果替代代码中只做检查,它就是有效性检查,简单理解,就是替代功能>有效检查功能,因此,财务增强统一只注重替代的统一就足够。
SAP采购订单税码增强检查

SAP采购订单税码增强检查2014年09月05日⁄综合⁄共3030字⁄字号小中大⁄评论关闭1、SE18查看ME_PROCESS_PO_CUST相关信息2、SE19创建ME_PROCESS_PO_CUST的BADI实现类注意类名称定义是按照以下规则:ZCL_IM_ + BADI其中CL表示CLASS类的意思,IM表示Implement实现的意思;3、SE24实现ZCL_IM_ME_PROCESS_PO_CUST4、实现PROCESS_ITEM代码:METHOD IF_EX_ME_PROCESS_PO_CUST~PROCESS_ITEM. *&====================================================== ====*& 对采购订单行项目增加是否有选择税码检查*& Added by liangqh 2010-07-28*&====================================================== ====INCLUDE MM_MESSAGES_MAC.DATA:L_ITEM TYPEMEPOITEM. "采购订单行项目*--> 取得采购订单行项目数据L_ITEM = IM_ITEM->GET_DATA< >.*--> 判断行项目税率是否为空IF L_ITEM-MWSKZ = '' OR L_ITEM-MWSKZ ISINITIAL.MMPUR_MESSAGE 'E' 'ZMM01' '002' L_ITEM-EBELN L_ITEM-EBELP ''''.ENDIF. ENDMETHOD.*&====================================================== ====*& 对采购订单行项目增加是否有选择税码检查*& Added by liangqh 2010-07-28*&====================================================== ====INCLUDE MM_MESSAGES_MAC.DATA:OBJ_ITEMSTYPE PURCHASE_ORDER_ITEMS,OBJ_ITEMTYPEPURCHASE_ORDER_ITEM,LW_HEADERTYPE MEPOHEADER,LW_ITEM TYPEMEPOITEM. *-->取得订单抬头信息与明细数据LW_HEADER =IM_HEADER->GET_DATA<>.OBJ_ITEMS=IM_HEADER->GET_ITEMS< >.LOOP AT OBJ_ITEMS INTO OBJ_ITEM.LW_ITEM =OBJ_ITEM-ITEM->GET_DATA< >.*--> 判断行项目税率是否为空IFLW_ITEM-MWSKZ = '' OR LW_ITEM-MWSKZ IS INITIAL.MMPUR_MESSAGE 'E' 'ZMM01' '002' LW_ITEM-EBELN LW_ITEM-EBELP''''.ENDIF.ENDLOOP.ENDMETHOD.*&====================================================== ====*& 对采购订单行项目增加是否有选择税码检查*& Added by liangqh 2010-07-28*&====================================================== ====INCLUDE MM_MESSAGES_MAC.DATA:OBJ_ITEMSTYPE PURCHASE_ORDER_ITEMS,OBJ_ITEMTYPEPURCHASE_ORDER_ITEM,LW_HEADERTYPE MEPOHEADER,LW_ITEM TYPEMEPOITEM. *-->取得订单抬头信息与明细数据LW_HEADER =IM_HEADER->GET_DATA<>.OBJ_ITEMS=IM_HEADER->GET_ITEMS< >.LOOP AT OBJ_ITEMS INTO OBJ_ITEM.LW_ITEM =OBJ_ITEM-ITEM->GET_DATA< >.*--> 判断行项目税率是否为空IFLW_ITEM-MWSKZ = '' OR LW_ITEM-MWSKZ IS INITIAL.MMPUR_MESSAGE 'E' 'ZMM01' '002' LW_ITEM-EBELN LW_ITEM-EBELP''''.ENDIF.ENDLOOP.endmethod.*********************************************************************************Add by Andrew :在采购订单增强中报消息信息的方法:1.INCLUDE MM_MESSAGES_MAC.MMPUR_MESSAGE 'W' 'ZMM01' '002' ls_mepoitem-EBEln ls_mepoitem-EBELP ls_mepoi tem-reslo '' .2.sy-msgid = 'ZMM01'.sy-msgty = 'W'.sy-msgno = 003.message id sy-msgid type sy-msgty number sy-msgn o WITH ls_mepoitem-EBEln ls_mepoitem-EBELP ls_mepoitem-reslo .set extended chec k off.call method cl_message_mm=>createEXPORTINGim_msgid = sy-msgidim_msgty = sy-msgtyim_msgno = sy-msgnoim_msgv1 = sy-msgv1im_msgv2 = sy-msgv2im_msgv3 = sy-msgv3im_msgv4 = sy-msgv4im_force_collect = mmpur_yesEXCEPTIONSfailure = 01dialog = 02.set extended check off.这两个方法实现方法是一样的,只是第一种是SAP公司已经实现了,包含在include MM_MESSAGES_MAC中,所以直接引用.消息类:SE91建立消息类:ZMM01Message : 002 Item&1 &2 The default issuing storagelocation is &3.Message: 003 Item &1 &2 Thedefaultissuing storage location is &3.。
SAP-BADI-使用增强清单

1、使用BADI的增强清单 (1).ZMB_MIGO_BADI (1)Method: PUBLISH_MATERIAL_ITEM (1).ZMB_RESERVATION_BADI (3)Method: DATA_CHECK (3).ZME_HOLD_PO (6)Method: IS_ALLOWED (6).ZME_PROCESS_PO_CUST (7)Method: PROCESS_ITEM (7).ZME_PROCESS_REQ_CUST (10)%Method: OPEN (10)Method: PROCESS_ITEM (10)Method: PROCESS_ACCOUNT (22).ZME_REQ_POSTED (22)Method: POSTED (22).ZMRM_HEADER_CHECK (23)Method: HEADERDATA_CHECK (23)2、使用USER_EXIT的增强清单 (27).Project:ZMM1 外部采购文件审批的增强处理项目 (27)User Exit: M06E0004 (27).Project:ZMM2 采购申请审批的增强处理项目 (35)^User Exit: M06B0002 (35).Project:ZMM3 (36)User Exit: LMEKO001 (36)User Exit: LMEKO002 (36).Project: ZMM5 采购文件建立的增强 (36)User Exit: MM06E005在采购凭证中的客户字段 (36).Project: ZMM6 (43)User Exit: MBCF0002物料凭证项目中的段文本 (43){1、使用BADI的增强清单1.1.Z MB_MIGO_BADI1.1.1.Method: PUBLISH_MATERIAL_ITEM-method IF_EX_MB_MIGO_BADI~PUBLISH_MATERIAL_ITEM .data abc(40) value '(SAPLMIGO)GODYNPRO-DETAIL_TAKE'.data: text type string,ZGOITEM TYPE GOITEM.DATA zME TYPE C.data: ctr(70).data: p_line type table of TLINE initial size 0.DATA P_INLINES type table of TLINE initial size 0 .field-symbols: <f01> type any.assign (abc) to <f01>.MOVE LS_GOITEM TO ZGOITEM.<*---------------------------------------------------------------* *检查物料的ABC状态*----------------------------------------------------------------* IF ZGOITEM-EKORG = '2000' and ZGOITEM-MATNR is not initialand ( ZGOITEM-BWART = '103' or ZGOITEM-BWART = '101' )AND <f01> = 'X'.CALL FUNCTION 'Z_MIGO_DIS_MAT'EXPORTINGzmatnr = ZGOITEM-MATNRzwerks = ZGOITEM-werks* CHANGING!* DT =EXCEPTIONSCANCELLED = 1NO_VALUES = 2OTHERS = 3.IF sy-subrc <> 0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.ENDIF.!endif.*---------------------------------------------------------------* *对设备备件103收货后是否进行检验结果纪录进行检查*---------------------------------------------------------------*IF zgoitem-bwart = '105' AND zgoitem-ekorg = '2000'AND zgoitem-xdetermination = ' '. "库存确定选择才进行判断IF zgoitem-webre = ' '.MESSAGE w000(zz) WITH '非基于收货的发票校验情况下,不确定是否已有检验结果'. ELSE.* concatenate ZGOITEM-LFBNR ZGOITEM-LFBJA ZGOITEM-LFPOS into ctr.#* CALL FUNCTION 'ZTEXT_READ_CHECK'* EXPORTING* ID = 'F00'* INLINE_COUNT = '1'* LANGUAGE = '1'* NAME = CTR* OBJECT = 'MSEG'** LOCAL_CAT = ' '* IMPORTING** HEADER =* ME = zME^* TABLES* INLINES = P_INLINES* LINES = P_LINE** EXCEPTIONS** ID = 1** LANGUAGE = 2** NAME = 3** NOT_FOUND = 4** OBJECT = 5** REFERENCE_CHECK = 6** OTHERS = 7{* .* IF SY-SUBRC <> 0.** MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO** WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.* ENDIF.* if zme = 1.* message I024(zz) with zGOITEM-LFBNR ZGOITEM-LFBJA ZGOITEM-LFPOS.* LEAVE TO TRANSACTION 'MIGO'.* endif.* clear ctr.*&------------------------------------------------------------*!*&CHANGE THE LOGIC FOR THE RESULT OF QUALITY MAINTAINENCE*&------------------------------------------------------------*SELECT SINGLE * FROM zm01_s_103 INTO wa_zm01_s_103 WHEREzmblnr = zgoitem-lfbnr ANDzmjahr = zgoitem-lfbja ANDzzeile = zgoitem-lfpos.IF sy-subrc NE 0.MESSAGE i024(zz) WITH zgoitem-lfbnr zgoitem-lfbja zgoitem-lfpos. LEAVE TO TRANSACTION 'MIGO'.ENDIF.ENDIF.<ENDIF.*---------------------------------------------------------**&*---------------------------------------------------------*IF zgoitem-bwart = '101' AND zgoitem-ekorg = '2000'AND zgoitem-pstyp = '0'AND zgoitem-knttp = ''.MESSAGE i000(zz) WITH '设备备件正常收货请使用移动类型103/105'.* leave to screen 2000.LEAVE TO TRANSACTION 'MIGO'.}ENDIF.ENDMETHOD.IF_EX_MB_MIGO_BADI~POST_DOCUMENTMETHOD if_ex_mb_migo_badi~post_document.DATA: zit_mseg TYPE LINE OF ty_t_mseg,zis_mkpf TYPE mkpf.DATA: wa_mseg TYPE mseg.DATA: WA_ZMM02 TYPE ZMM02.DATA: MBLNR TYPE MSEG-MBLNR.DATA: ZEILE TYPE MSEG-ZEILE.DATA: MJAHR TYPE MSEG-MJAHR.¥DATA: EBELN TYPE EKPO-EBELN.DATA: EBELP TYPE EKPO-EBELP.BREAK WANGXIANBAO.*****************************************************************/对采购订单已经交货完成标志的不允许继续交货进行判断***************************************************************** DATA: zelikz TYPE ekpo-elikz.* LOOP AT it_mseg INTO zit_mseg WHERE BWART EQ '101'* AND WERKS EQ '6000'.* CLEAR ZELIKZ.* SELECT SINGLE elikz INTO zelikz FROM ekpo WHERE ebeln = ZIT_MSEG-EBELN `* AND ebelp = ZIT_MSEG-EBELP. ** IF zelikz = 'X'.* MESSAGE E044(zz) WITH ZIT_MSEG-EBELN ZIT_MSEG-EBELP.* LEAVE TO TRANSACTION 'MIGO'.* ENDIF.** ENDLOOP.****************************************************/实现让步使用输入采购订单、收货凭证和让步减单价值,**************************************************LOOP AT it_mseg INTO zit_msegWHERE bwart EQ '343'AND grund EQ '0001'AND werks EQ '6000'AND xauto EQ ''.CALL FUNCTION 'ZMM_CALL_ZMM02_MANTAIN'EXPORTINGsmbln = zit_mseg-mblnrsjahr = zit_mseg-mjahrsmblp = zit_mseg-zeile.matnr = zit_mseg-matnrbwart = zit_mseg-bwartmenge = zit_mseg-mengemeins = zit_mseg-meinscharg = zit_mseg-chargIMPORTINGMBLNR = MBLNRZEILE = ZEILEMJAHR = MJAHREBELN = EBELNEBELP = EBELP.$* SELECT SINGLE * INTO WA_ZMM02 FROM ZMM02* WHERE MBLNR = MBLNR* AND MJAHR = MJAHR* AND ZEILE = ZEILE* AND EBELN = EBELN* AND EBELP = EBELP* AND smbln = zit_mseg-mblnr* AND sjahr = zit_mseg-mjahr* AND smblp = zit_mseg-zeile.*#* IF SY-SUBRC NE 0.* MESSAGE E016(ZZ) WITH ZIT_MSEG-MATNR.* ENDIF.ENDLOOP.ENDMETHOD.IF_EX_MB_MIGO_BADI~CHECK_ITEMMETHOD if_ex_mb_migo_badi~check_item.DATA: zelikz TYPE ekpo-elikz.DATA: l_po_number(40) TYPE c VALUE '(SAPLMIGO)GOITEM-EBELN'.DATA: l_po_item(40) TYPE c VALUE '(SAPLMIGO)GOITEM-EBELP'.DATA: l_bwart(40) TYPE c VALUE '(SAPLMIGO)GOITEM-BWART'.、FIELD-SYMBOLS: <fs1> TYPE ANY.FIELD-SYMBOLS: <fs2> TYPE ANY.FIELD-SYMBOLS: <fs3> TYPE ANY.ASSIGN (l_po_number) TO <fs1>.ASSIGN (l_po_item) TO <fs2>.ASSIGN (l_bwart) TO <fs3>.break wangxianbao.*****************************************************************/对采购订单已经交货完成标志的不允许继续交货进行判断****************************************************************IF <fs3> IS NOT INITIAL.]IF <fs3> EQ '101'.IF <fs1> IS NOT INITIAL AND <fs2> IS NOT INITIAL.SELECT SINGLE elikz INTO zelikz FROM ekpo WHERE ebeln = <fs1> AND ebelp = <fs2>. IF zelikz = 'X'.MESSAGE i044(zz) WITH <fs1> <fs2>.LEAVE TO TRANSACTION 'MIGO'.ENDIF.ENDIF.ENDIF.ENDIF.?ENDMETHOD.1.2.Z MB_RESERVATION_BADI1.2.1.Method: DATA_CHECKMETHOD if_ex_mb_reservation_badi~data_check.DATA: zresb TYPE resb,zmarc TYPE marc,zrkpf TYPE rkpf,zmara TYPE mara.DATA: zit_changeable TYPE tdtab_c132.—DATA: zi_new_item TYPE c.DATA: zflag TYPE c.DATA: zbdter TYPE resb-bdter.DATA: p_atinn TYPE cabn-atinn.DATA: zkostl TYPE rkpf-kostl.DATA: wa_zdepb TYPE zdepb.DATA: zusnam TYPE zdepb-usnam.zresb = is_resb.zrkpf = is_rkpf.***********************************************************************/对提报成本中心预留的要料计划,控制用户是否有权提报指定成本中心的预留'**********************************************************************IF zrkpf-bwart EQ 'Z09' OR zrkpf-bwart EQ 'Z11' OR zrkpf-bwart EQ 'Z13'OR zrkpf-bwart EQ 'Z15' OR zrkpf-bwart EQ 'Z17' OR zrkpf-bwart EQ 'Z19' OR zrkpf-bwart EQ 'Z10' OR zrkpf-bwart EQ 'Z12' OR zrkpf-bwart EQ 'Z14' OR zrkpf-bwart EQ 'Z16' OR zrkpf-bwart EQ 'Z18' OR zrkpf-bwart EQ 'Z20'. * break wangxianbao.zkostl = zrkpf-kostl+2(4).zusnam = sy-uname.SELECT SINGLE * INTO wa_zdepb FROM zdepb WHERE usnam = zusnamAND grpname = zkostl.IF sy-subrc <> 0.$* MESSAGE e041(zz) WITH ZUSNAM ZRKPF-KOSTL.ENDIF.ENDIF.***********************************************************************/对成本中心预留的移动类型进行控制**********************************************************************IF zrkpf-bwart EQ 'Z09'. "主体单位成本中心break wangxianbao.zkostl = zrkpf-kostl+2(4).IF zkostl NE '6023' AND Zkostl NE '6024' AND zkostl NE '6025' AND zkostl NE '6026' AND zkostl NE '6027' AND zkostl NE '6028' AND zkostl NE '6029' AND zkostl NE '6030'~AND zkostl NE '6031' AND zkostl NE '6032' AND zkostl NE '6533'.MESSAGE E000(zz) WITH '辅助单位生产以领代耗物资必须用Z11!'.ENDIF.ENDIF.IF zrkpf-bwart EQ 'Z11'. "辅助单位成本中心break wangxianbao.zkostl = zrkpf-kostl+2(4).IF zkostl EQ '6023' OR zkostl EQ '6024' OR zkostl EQ '6025' OR zkostl EQ '6026' OR zkostl EQ '6027' OR zkostl EQ '6028' OR zkostl EQ '6029' OR zkostl EQ '6030' OR zkostl EQ '6031' OR zkostl EQ '6032' OR zkostl EQ '6533'.MESSAGE E000(zz) WITH '主线单位生产以领代耗物资必须用Z09!'.:ENDIF.ENDIF.****************************************************************/对设备备件的预留必须输入计划批次号进行控制***************************************************************SELECT SINGLE * INTO zmarc FROM marc WHERE matnr = zresb-matnr.SELECT SINGLE * INTO zmara FROM mara WHERE matnr = zresb-matnr.IF sy-subrc EQ 0.IF zmarc-xchpf = 'X' AND( zmara-mtart = 'B001' OR zmara-mtart = 'B002' ).IF zresb-charg IS INITIAL AND zresb-xloek IS INITIAL .—MESSAGE e000(zz) WITH '针对设备备件的预留必须输入计划批次号'.ENDIF.IF zresb-lgort IS INITIAL.MESSAGE w000(zz) WITH '没有指定库存地预留对该计划批次的所有库存地有效'.ENDIF.ENDIF.ENDIF.****************************************************************/对使用单位创建原燃材料的预留时不能输入库存地点进行控制***************************************************************IF sy-tcode = 'MB21'.】SELECT SINGLE * INTO zmara FROM mara WHERE matnr = zresb-matnr.IF zmara-mtart = 'A001' OR zmara-mtart = 'A002' OR zmara-mtart = 'A003'.IF zresb-lgort IS NOT INITIAL.MESSAGE e000(zz) WITH '创建原燃材料预留时不能指定库存地点!'.ENDIF.ENDIF.ENDIF.****************************************************************/对需要计量的原燃料在SAP系统中提报预留警告提示**************************************************************** break wangxianbao.(IF zrkpf-umwrk EQ '6000'.SELECT SINGLE * INTO zmara FROM mara WHERE matnr = zresb-matnr.IF zmara-mtart = 'A003'.MESSAGE e036(zz).ENDIF.ENDIF.SELECT SINGLE atinn FROM cabn INTO p_atinn WHERE atnam = 'ZYL-012'.IF sy-subrc = 0.SELECT SINGLE atwrt INTO zflag FROM auspWHERE objek = zresb-matnrAND atinn = p_atinn【AND klart = '001'.IF zflag EQ 'A'.MESSAGE w035(zz) WITH zresb-matnr.ENDIF.ENDIF.*****************************************************************/对原燃料控制不能在SAP系统中提报Z09和Z11的预留***************************************************************IF zrkpf-bwart EQ 'Z09' OR zrkpf-bwart EQ 'Z11'.SELECT SINGLE * INTO zmara FROM mara WHERE matnr = zresb-matnr.IF zmara-mtart EQ 'A001' OR zmara-mtart EQ 'A002'.?MESSAGE w039(zz) WITH zresb-matnr.ENDIF.ENDIF.****************************************************************/对提报要料计划,需求日期不能超过当前日期+11天***************************************************************IF zrkpf-bwart EQ 'Z09' OR zrkpf-bwart EQ 'Z11' OR zrkpf-bwart EQ 'Z13'OR zrkpf-bwart EQ 'Z15' OR zrkpf-bwart EQ 'Z17' OR zrkpf-bwart EQ 'Z19' OR zrkpf-bwart EQ 'Z61' OR zrkpf-bwart EQ '241' OR zrkpf-bwart EQ '301'. * break wangxianbao.zbdter = sy-datum + 11.~IF zresb-bdter > zbdter.MESSAGE e037(zz) WITH zbdter.ENDIF.ENDIF.****************************************************************/对提报退货预留,需求日期不能超过当前日期+3天***************************************************************IF zrkpf-bwart EQ 'Z10' OR zrkpf-bwart EQ 'Z12' OR zrkpf-bwart EQ 'Z14'OR zrkpf-bwart EQ 'Z16' OR zrkpf-bwart EQ 'Z18' OR zrkpf-bwart EQ 'Z20' OR zrkpf-bwart EQ 'Z62' OR zrkpf-bwart EQ '242' OR zrkpf-bwart EQ '302'. * break wangxianbao.[zbdter = sy-datum + 3.IF zresb-bdter > zbdter.MESSAGE e037(zz) WITH zbdter.ENDIF.ENDIF.CLEAR:zresb,zrkpf,zmarc,zmara,zflag,p_atinn.ENDMETHOD.1.3.Z ME_HOLD_PO1.3.1.Method: IS_ALLOWED(method IF_EX_ME_HOLD_PO~IS_ALLOWED.*-----------------------------------------------------------** disable the hold function when any error exists in the document*-----------------------------------------------------------*break wangxianbao.ch_allowed = space.IF im_ekko-bsart IS NOT INITIAL.IF im_bekpo[] IS INITIAL.ch_allowed = space.EXIT.ELSE.(IF im_header_with_error NE space.ch_allowed = space.EXIT.ENDIF.READ TABLE im_bekpo WITH KEY item_with_error = 'X'TRANSPORTING NO FIELDS.IF sy-subrc IS INITIAL.ch_allowed = space.EXIT.ENDIF.READ TABLE im_beket WITH KEY item_with_error = 'X';TRANSPORTING NO FIELDS.IF sy-subrc IS INITIAL.ch_allowed = space.EXIT.ENDIF.READ TABLE im_ekknu WITH KEY item_with_error = 'X'TRANSPORTING NO FIELDS.IF sy-subrc IS INITIAL.ch_allowed = space.EXIT.ENDIF.—ENDIF.ENDIF.IF ch_allowed NE 'X'.break wangxianbao.ch_allowed = space.ENDIF.endmethod.1.4.Z ME_PROCESS_PO_CUST1.4.1.Method: PROCESS_ITEM******************************************************************** :METHOD if_ex_me_process_po_cust~process_item.TYPES: mm1 TYPE komv .DATA: item TYPE mmpur_tkomv.DATA: item1 TYPE mm1.DATA: zwyt3 TYPE wyt3.************************DATA: item2 TYPE mepoitem,header2 TYPE mepoheader,m_header2 TYPE REF TO if_purchase_order_mm.DATA: zkostl TYPE mepoitem-kostl.DATA: zbednr TYPE mepoitem-bednr.-DATA: zbednr1 TYPE mepoitem-bednr.DATA: wa_zdepb TYPE zdepb.DATA: wa_ekko TYPE ekko,wa_ekpo TYPE ekpo,wa_mbew TYPE mbew,wa_ekbe TYPE ekbe,wa_t16fb type t16fb.DATA wa_eban TYPE eban.break wangxianbao.m_header2 = im_item->get_header( ). " 获取采购订单抬头对象header2 = m_header2->get_data( ). " 获取采购订单抬头…item2 = im_item->get_data( ). " 获取采购订单行项目*************************************************************************/针对订单类型YB的各种检查程序段-----开始IF header2-bsart EQ 'YB'.IF NOT item2 IS INITIAL.zbednr = item2-bednr.zkostl = item2-kostl.********************************************************************************* **/控制物料主数据中评估类为3080的只能创建科目分配类别为I的直接为成本中心采购的订单********************************************************************************* SELECT SINGLE * FROM mbew INTO wa_mbew WHERE matnr = item2-matnr?AND bwkey = item2-werksAND bklas = '3080'.IF sy-subrc = 0.IF item2-knttp NE 'I'.MESSAGE e003(zz) WITH item2-matnr.ENDIF.ENDIF.IF item2-knttp EQ 'I'.SELECT SINGLE * FROM mbew INTO wa_mbew WHERE matnr = item2-matnrAND bwkey = item2-werksAND bklas = '3080'.|IF sy-subrc NE 0.MESSAGE e003(zz) WITH item2-matnr.ENDIF.ENDIF.********************************************************************************** *************/控制科目分配类别为H的直接为成本中心的采购订单,其输入的成本中心必须为主体上线单位的成本中心********************************************************************************** ***********IF item2-knttp EQ 'H'.zbednr1 = zkostl+2(4).IF zbednr1 IS NOT INITIAL.CLEAR wa_zdepb.]SELECT SINGLE * FROM zdepb INTO wa_zdepb WHERE grpname = zbednr1AND zflag = 'A'.IF sy-subrc NE 0.MESSAGE e005(zz) WITH item2-knttp.ENDIF.ENDIF.ENDIF.********************************************************************************** *************/控制科目分配类别为J的直接为成本中心的采购订单,其输入的成本中心必须为辅助单位的成本中心********************************************************************************** ***********IF item2-knttp EQ 'J'.`zbednr1 = zkostl+2(4).IF zbednr1 IS NOT INITIAL.CLEAR wa_zdepb.SELECT SINGLE * FROM zdepb INTO wa_zdepb WHERE grpname = zbednr1AND zflag = 'B'.IF sy-subrc NE 0.MESSAGE e005(zz) WITH item2-knttp.ENDIF.ENDIF.ENDIF.~******************************************************************ENDIF.ENDIF.*************************************************************************/针对订单类型YB的各种检查程序段<-----结束**************************************************************************&----------------------------------------------------------------------------------**建立采购订单时将采购申请的批次号(供应商物料字段)传递到采购订单中-设备备件用*-----------------------------------------------------------------------------------*IF item2-charg IS INITIAL AND ( header2-bsart = 'SP01'OR header2-bsart = 'SP02'—OR header2-bsart = 'TB') .* HEADER2-BSART = 'SP01' OR HEADER2-BSART = 'SP02'.if item2-KONNR is initial.SELECT SINGLE * INTO wa_eban FROM eban WHERE banfn = item2-banfn ANDbnfpo = item2-bnfpo.item2-charg = wa_eban-idnlf .CLEAR wa_eban.else.select single * into wa_ekpo from ekpo where ebeln = item2-KONNR andebelp = item2-KTPNR.(SELECT SINGLE * INTO wa_eban FROM eban WHERE banfn = wa_ekpo-banfn AND bnfpo = wa_ekpo-bnfpo.if sy-subrc eq 0.item2-charg = wa_eban-idnlf .CLEAR:wa_eban,wa_ekpo.endif.endif.CALL METHOD im_item->set_dataEXPORTINGim_data = item2.ENDIF.:*********************************************************************** **/根据供应商合作伙伴,自动设定FRE对应的供应商************************************************************************* CALL METHOD im_item->get_conditionsIMPORTINGex_conditions = item.LOOP AT item INTO item1 WHERE kvsl1 = 'FRE'.* and KVSL2 = 'FR1'.SELECT SINGLE * FROM wyt3 INTO zwyt3 WHERE lifnr = item1-lifnr%AND parvw = 'TF'.IF sy-subrc = 0.item1-lifnr = zwyt3-lifn2.MODIFY item FROM item1.ENDIF.ENDLOOP.CALL METHOD im_item->set_conditionsEXPORTINGim_conditions = item.-********************************************************************&----------------------------------------------------------------------------------**建立采购订单时检查询价单是否经过审批*-----------------------------------------------------------------------------------*if item2-ANFNR is not initial.select single * from ekko into wA_ekko where ebeln = item2-ANFNR.if sy-subrc eq 0.select single * from t16fb into wa_t16fb where FRGKE = wA_ekko-FRGKE.if wa_t16fb-KZFRE NE 'X'.MESSAGE E000(ZZ) WITH '询价单未审批,不能建立采购订单'.ENDIF.$endif.endif.CLEAR:wA_ekko,wa_t16fb.*&----------------------------------------------------------------------------------**检查总帐科目是否为空*-----------------------------------------------------------------------------------*if item2-KOSTL is not initial and item2-SAKTO is initial.message e051(zz).endif.ENDMETHOD.,method IF_EX_ME_PROCESS_PO_CUST~CHECK.BREAK WANGXIANBAO.IF SY-TCODE = 'ME21N' AND SY-UCOMM = 'MESAVEPR'.MESSAGE E000(zz) WITH '采购订单不允许暂存!'.ENDIF.endmethod.1.5.Z ME_PROCESS_REQ_CUST1.5.1.Method: OPENMETHOD if_ex_me_process_req_cust~open.|DATA: tf_01 TYPE REF TO zif_ex_me_process_req_me.DATA: zheader TYPE REF TO if_purchase_requisition.DATA: zeban TYPE mereq_item. "结构-采购申请行项目DATA: zmereq TYPE mereq_header."结构-采购申请抬头DATA: zbednr TYPE eban-bednr. "需求跟踪号DATA: wa_zdepb TYPE zdepb, "所在部门与用户对照表(YCL)wa_mbew TYPE mbew. "物料评估DATA:t_eban TYPE TABLE OF eban INITIAL SIZE 0 .DATA: zex_strategy TYPE REF TO if_release_strategy_mm.DATA: zex_state TYPE REF TO if_release_state_mm.DATA: zre_codes TYPE merel_t_codes. "已经审批代码|DATA: zrel_code TYPE frgco. "当前用户授权的审批代码DATA: zre_allowed1 TYPE mmpur_bool. "是否审批标志DATA: zre_allowed2 TYPE mmpur_bool. "是否取消审批标志DATA: zre_allowed3 TYPE mmpur_bool. "点击取消审批按钮DATA: zex_frggr TYPE eban-frggr. "审批组DATA: zex_frgst TYPE eban-frgst. "审批策略DATA: zex_codes TYPE merel_t_codes. "审批代码DATA: zre_codes1 TYPE merel_t_codes.DATA: zex_prerequisites TYPE merel_t_prereq.DATA: zex_final TYPE merel_t_final.DATA: zex_group TYPE frggr.\DATA: wa_re_codes1 LIKE LINE OF zre_codes1.DATA: zre_fgrco TYPE frgco. "已经审批的最后一级审批代码DATA: tmp01 LIKE LINE OF zex_codes.DATA: zbednr1 TYPE eban-bednr.DATA: zint TYPE i.DATA: zbadat TYPE eban-badat.DATA: zunq1 TYPE zscalar-zunq.DATA: zbnfpo TYPE eban-bnfpo.DATA: zbanfn TYPE eban-banfn.DATA: zeban1 TYPE eban.DATA: ztemp1(2) TYPE c.。
sap采购订单税率维护

sap采购订单税率维护【最新版】目录1.SAP 采购订单税率概述2.税率维护的必要性3.税率维护的操作步骤4.注意事项和常见问题正文一、SAP 采购订单税率概述SAP 是一款全球领先的企业资源规划(ERP)软件,广泛应用于企业的财务、生产、采购等管理领域。
在 SAP 中,采购订单模块是企业进行采购管理的重要工具,可以实现采购申请、采购订单和收货等业务流程的自动化管理。
在采购订单中,税率是一个重要的参数,它影响到采购订单的成本和财务核算。
因此,对采购订单税率进行准确的维护是确保企业采购业务正常运行的关键。
二、税率维护的必要性税率维护对于企业的采购管理具有重要意义,主要体现在以下几个方面:1.确保采购成本的准确性:不同的商品和服务可能适用不同的税率,准确的税率维护有助于确保采购订单的成本核算准确无误。
2.符合税收法规要求:税收法规是不断变化的,及时的税率维护可以确保企业的采购业务符合最新的税收政策。
3.提高采购效率:准确的税率信息可以减少企业在采购过程中的沟通成本和时间浪费,提高采购效率。
4.便于财务核算和管理:准确的税率维护有助于企业进行准确的财务核算,便于企业进行经营决策和风险控制。
三、税率维护的操作步骤在 SAP 中进行采购订单税率维护的具体操作步骤如下:1.登录 SAP 系统,进入采购订单模块。
2.选择需要维护税率的采购订单,点击“编辑”按钮。
3.在弹出的窗口中,找到“税率”字段,点击“显示”按钮。
4.在“税率”窗口中,选择需要维护的税率类型,如“增值税”、“消费税”等。
5.在“税率”窗口中,输入或选择正确的税率信息,如税率百分比、税率代码等。
6.点击“保存”按钮,完成税率维护操作。
四、注意事项和常见问题在进行采购订单税率维护时,需要注意以下几点:1.确保税率信息的准确性,避免因税率错误导致的采购成本偏差和财务风险。
2.定期检查和更新税率信息,确保采购订单税率符合最新的税收政策。
3.对于多个税率适用的商品或服务,需要根据实际情况选择正确的税率进行维护。
sap发票校验的一些技巧

sap发票校验的一些技巧
SAP发票校验是SAP系统中采购流程的一步,其目的是验证发票信息的正
确性和完整性。
以下是一些SAP发票校验的技巧:
1. 核对发票信息:确保发票上的商品、数量、价格等信息与采购订单和收货记录一致。
2. 检查税收合规性:使用SAP的税收合规性检查功能,确保发票上的税额、税率等符合当地税法规定。
3. 利用自动化工具:使用SAP的自动化工具,如自动发票处理程序,可以
大大简化发票校验的过程。
4. 保持沟通:与供应商保持良好沟通,确保发票信息准确无误,对于有疑问的信息,及时与供应商核实。
5. 遵循公司流程:确保发票校验过程符合公司的流程和政策,不要跳过任何必要的步骤。
6. 备份和安全:对于已校验的发票,做好备份工作,以防数据丢失。
同时,确保发票信息安全,防止敏感信息泄露。
7. 定期审计:定期对发票校验过程进行审计,检查是否有任何潜在的问题或错误,确保校验过程的准确性和可靠性。
8. 提高效率:通过不断优化校验流程,提高工作效率,减少人工错误和重复工作。
9. 使用SAP最佳实践:参考SAP系统的最佳实践,不断改进和完善发票校验过程。
10. 持续培训:对负责发票校验的员工进行持续的培训和教育,提高他们的技能和知识水平,以确保他们能够准确、高效地完成发票校验工作。
通过遵循这些技巧,可以有效地提高SAP发票校验的准确性和效率,从而确保采购流程的顺利进行。
SAP采购收货批次增强开发需求说明

采购订单收货批次创建增强程序
增强设计规格
签名:
一.初始屏幕:
1. 参考采购订单收货:
2. 质量检验中的检验批的检验结果录入:
二.开发需求
1.对于做批次管理的物料,在参考采购订单收货时(T-Code:MIGO/MIGO_GR, 移动类型为Z05和101),系统自动按照YYMMDD+四位流水码的方式产生流水批次!而且,对于所有的物料,同一日期的四位流水码不能重复)。
2.对于做批次管理的物料,在参考采购订单收货时(T-Code:MIGO/MIGO_GR, 移动类型为Z15),则系统要求全部手工输入批次号码!
3.在针对检验批进行质量检验的初始屏幕:对于批次管理的物料,系统要求输入一个批次号码;系统同样按照1的逻辑自动给出流水批次。
4.请参考批次管理的两个增强出口:EXIT_SAPLV01Z_003/ EXIT_SAPLV01Z_004;增强为:SAPLV1ZE。
采购订单屏幕BADI增强

ME21N/ME22N/ME23N屏幕增强这次的屏幕增强主要用到两个BADI: ME_GUI_PO_CUST和ME_PROCESS_PO_CUST这两个BADI都是有例子的, 可以在se18那里按GoTo->Sample code->Display来查看, 也可以直接在SE24查看类CL_EXM_IM_ME_GUI_PO_CUST和CL_EXM_IM_ME_PROCESS_PO_CUST现在我们对PO header加上自己的subscreen, SAP的例子提供的是对item增加subscreen.Step 1: Create Function Group仿照Function Group MEPOBADIEX建一个Function Group我建的Function Group如下图所示Step 2: 在Function Group里建Screen, screen number随便在TOP里面加入对应屏幕的变量, 这里我是直接用tables.Step 3: 给BADI ME_GUI_PO_CUST建一个implementation在Public Section里加上TYPE-POOLS mmmfd .Step 4: 在MethodIF_EX_ME_GUI_PO_CUST~SUBSCRIBE, 加入custom subscreen的设置代码1.METHOD if_ex_me_gui_po_cust~subscribe.2. DATA: lw_subscribers TYPE mepo_subscribers.3.4.* we want to add a customer subscreen on the Header tab5. CHECK im_application = 'PO'.6. CHECK im_element = 'HEADER'.7.8. CLEAR lw_subscribers.9. lw_subscribers-name = subscreen1.10. lw_subscribers-dynpro = '0100'.11. lw_subscribers-program = 'SAPLZCI_EKKODB'.12. lw_subscribers-struct_name = 'CI_EKKODB'.13. lw_subscribers-label = 'Zero test2'.14. lw_subscribers-position = 11.15. lw_subscribers-height = 8.16. APPEND lw_subscribers TO re_subscribers.17.ENDMETHOD.METHOD if_ex_me_gui_po_cust~subscribe.DATA: lw_subscribers TYPE mepo_subscribers.* we want to add a customer subscreen on the Header tabCHECK im_application = 'PO'.CHECK im_element = 'HEADER'.CLEAR lw_subscribers.lw_subscribers-name = subscreen1.lw_subscribers-dynpro = '0100'.lw_subscribers-program = 'SAPLZCI_EKKODB'.lw_subscribers-struct_name = 'CI_EKKODB'.lw_subscribers-label = 'Zero test2'.lw_subscribers-position = 11.lw_subscribers-height = 8.APPEND lw_subscribers TO re_subscribers.ENDMETHOD.Step 5: 在IF_EX_ME_GUI_PO_CUST~MAP_DYNPRO_FIE LDS, 加入代码, 使field name和它的数字编号关联起来1.FIELD-SYMBOLS: <mapping> LIKE LINE OF ch_mapping.2.3.LOOP AT ch_mapping ASSIGNING <mapping>.4. CASE <mapping>-fieldname.5. WHEN 'LV_TEST1'. <mapping>-metafield = mmmfd_cust_01.6. WHEN 'LV_TEST2'. <mapping>-metafield = mmmfd_cust_02.7. WHEN 'LV_TEST3'. <mapping>-metafield = mmmfd_cust_03.8. ENDCASE.9.ENDLOOP.FIELD-SYMBOLS: <mapping> LIKE LINE OF ch_mapping.LOOP AT ch_mapping ASSIGNING <mapping>.CASE <mapping>-fieldname.WHEN 'LV_TEST1'. <mapping>-metafield = mmmfd_cust_01.WHEN 'LV_TEST2'. <mapping>-metafield = mmmfd_cust_02.WHEN 'LV_TEST3'. <mapping>-metafield = mmmfd_cust_03.ENDCASE.ENDLOOP.Custom的field估计只能加9个, 因为我在TYPE-POOLS mmmfd 看到最大的是mmfd_cust_09,这里也可以把一些standard field弄到custom subscreen上.经过以上五步, 我们可以在ME23N看到custom subscreen, 但在ME21N和ME22N依然是看不到的...这个是为什么, 我还搞不清楚.Step 6: 给BADI ME_PROCESS_PO_CUST建一个implementation在Public Section加入TYPE-POOLS mmmfd .Step 7: 在MethodIF_EX_ME_PROCESS_PO_CUST~FIELDSELECT ION_HEADER加入代码, 改变表ch_fieldselection 的field status'-'代表hidden, '+'或'.'表示editable, '*'代表display1.METHOD if_ex_me_process_po_cust~fieldselection_header.2. DATA: lv_persistent TYPE mmpur_bool.3. FIELD-SYMBOLS: <fs> LIKE LINE OF ch_fieldselection.4.5. DEFINE set_input.6. read table ch_fieldselection assigning <fs> with table key metafield = &1.7. if sy-subrc = 0.8. if im_header->is_changeable( ) = mmpur_yes.9. <fs>-fieldstatus = '+'.10. else.11. <fs>-fieldstatus = '*'.12. endif.13. endif.14. END-OF-DEFINITION.15.16.* if the item is already on the database, we disallow to change field badi_bsgru17. lv_persistent = im_header->is_persistent( ).18.19. set_input mmmfd_cust_01.20. set_input mmmfd_cust_02.21. set_input mmmfd_cust_03.22.23.ENDMETHOD.METHOD if_ex_me_process_po_cust~fieldselection_header.DATA: lv_persistent TYPE mmpur_bool.FIELD-SYMBOLS: <fs> LIKE LINE OF ch_fieldselection.DEFINE set_input.read table ch_fieldselection assigning <fs> with table key metafield = &1.if sy-subrc = 0.if im_header->is_changeable( ) = mmpur_yes.<fs>-fieldstatus = '+'.else.<fs>-fieldstatus = '*'.endif.endif.END-OF-DEFINITION.* if the item is already on the database, we disallow to change field badi_bsgru lv_persistent = im_header->is_persistent( ).set_input mmmfd_cust_01.set_input mmmfd_cust_02.set_input mmmfd_cust_03.ENDMETHOD.这里有两点注意下:1. im_header->is_changeable()可以判断当前这些field是不是处于可编辑状态, 如果是则为'X'. 比如刚进TCODE ME21N, ME22N它们是可编辑的, 但当按save保存成功后, 它们暂时是不可以编辑的, 要再按把它改回编辑状态才可以编辑,这里就实现了这个功能.2. im_header->is_persistent()可以判断当这些field在数据库里有值了, 它就是'X', 当我们把数据写进表里就不想它被修改时, 可以用这个来判断, 比如把某个field设置成ME21N可编辑, ME22N不可编辑.经过这七步, ME21N/ME22N/ME23N都可以看到这个custom subscreen, 但所有自建field都是可编辑状态, 必需做完第八步, 才能正常显示Step 8: 在screen中调用2个module这两个module存放在下图的程序里注意: 如果不调用这两个module, BADI ME_GUI_PO_CUST下面的4个method都不会触发TRANSPORT_FROM_MODELTRANSPORT_TO_DYNPTRANSPORT_FROM_DYNPTRANSPORT_TO_MODELStep 9: 在MethodIF_EX_ME_GUI_PO_CUST~TRANSPORT_FRO M_MODEL加入代码把header的三个自建field传到attribute dynp_data_pho里1.METHOD if_ex_me_gui_po_cust~transport_from_model.2. DATA: lw_header TYPE REF TO if_purchase_order_mm,3. lw_mepoheader TYPE mepoheader,4. lw_customer TYPE ci_ekkodb.5.*--------------------------------------------------------------------*6.* system asks to transport data from the business logic into the view7.*--------------------------------------------------------------------*8.9. IF im_name = subscreen1.10.* is it an Header? im_model can be header or item.11. mmpur_dynamic_cast lw_header im_model.12. CHECK NOT lw_header IS INITIAL.13.* transport standard fields14. lw_mepoheader = lw_header->get_data( ).15.* store info for later use16. MOVE-CORRESPONDING lw_mepoheader TO dynp_data_pbo.17. ENDIF.18.19.ENDMETHOD.METHOD if_ex_me_gui_po_cust~transport_from_model.DATA: lw_header TYPE REF TO if_purchase_order_mm,lw_mepoheader TYPE mepoheader,lw_customer TYPE ci_ekkodb.*--------------------------------------------------------------------** system asks to transport data from the business logic into the view*--------------------------------------------------------------------*IF im_name = subscreen1.* is it an Header? im_model can be header or item.mmpur_dynamic_cast lw_header im_model.CHECK NOT lw_header IS INITIAL.* transport standard fieldslw_mepoheader = lw_header->get_data( ).* store info for later useMOVE-CORRESPONDING lw_mepoheader TO dynp_data_pbo.ENDIF.ENDMETHOD.Step 10: 在MethodIF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_ DYNP加入代码通过调用FM:ZCI_EKKODB_PUSH 把attribute1.METHOD if_ex_me_gui_po_cust~transport_to_dynp.2.3. IF im_name = subscreen1.4. CALL FUNCTION 'ZCI_EKKODB_PUSH'5. EXPORTING6. im_dynp_data = dynp_data_pbo.7. ENDIF.8.ENDMETHOD.METHOD if_ex_me_gui_po_cust~transport_to_dynp.IF im_name = subscreen1.CALL FUNCTION 'ZCI_EKKODB_PUSH'EXPORTINGim_dynp_data = dynp_data_pbo.ENDIF.ENDMETHOD.Step 11: 在IF_EX_ME_GUI_PO_CUST~TRANSPORT_FRO M_DYNP加入代码PAI事件时, 把屏幕的值传到attribute dynp_data_pai, 并且比较dynp_data_pbo和dynp_data_pai, 确定自建field的值有所改变, 把re_changed置为'X', 这样IF_EX_ME_PROCESS_PO_CUST~PROCESS_HEADER就会触发.1.METHOD if_ex_me_gui_po_cust~transport_from_dynp.2. IF im_name = subscreen1.3. CALL FUNCTION 'ZCI_EKKODB_POP'4. IMPORTING5. ex_dynp_data = dynp_data_pai.6.7. ENDIF.8.9. IF dynp_data_pai <> dynp_data_pbo.10.* something has changed therefor we have to notify the framework11.* to transport data to the model12. re_changed = mmpur_yes.13. ENDIF.14.ENDMETHOD.METHOD if_ex_me_gui_po_cust~transport_from_dynp.IF im_name = subscreen1.CALL FUNCTION 'ZCI_EKKODB_POP'IMPORTINGex_dynp_data = dynp_data_pai.ENDIF.IF dynp_data_pai <> dynp_data_pbo.* something has changed therefor we have to notify the framework* to transport data to the modelre_changed = mmpur_yes.ENDIF.ENDMETHOD.Step 12: 在IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_ MODEL加入代码, 把修改后的数据传到bussiness object里1.METHOD if_ex_me_gui_po_cust~transport_to_model.2.3. DATA: lw_header TYPE REF TO if_purchase_order_mm,4. lw_mepoheader TYPE mepoheader,5. lw_customer TYPE ci_ekkodb,6. lw_po_header_handle TYPE REF TO cl_po_header_handle_mm.7.*--------------------------------------------------------------------*8.* data have to be transported to business logic9.*--------------------------------------------------------------------*10. IF im_name = subscreen1.11.12.* is it an item? im_model can be header or item.13. mmpur_dynamic_cast lw_header im_model.14. CHECK NOT lw_header IS INITIAL.15. lw_mepoheader = lw_header->get_data( ).16.* standard fields changed?17. IF dynp_data_pbo-lv_test1 <> dynp_data_pai-lv_test118. OR dynp_data_pbo-lv_test2 <> dynp_data_pai-lv_test219. OR dynp_data_pbo-lv_test3 <> dynp_data_pai-lv_test3.20.* update standard fields21. lw_mepoheader-lv_test1 = dynp_data_pai-lv_test1.22. lw_mepoheader-lv_test2 = dynp_data_pai-lv_test2.23. lw_mepoheader-lv_test3 = dynp_data_pai-lv_test3.24.25. CALL METHOD lw_header->set_data26. EXPORTING27. im_data = lw_mepoheader.28.29. ENDIF.30. ENDIF.31.ENDMETHOD.METHOD if_ex_me_gui_po_cust~transport_to_model.DATA: lw_header TYPE REF TO if_purchase_order_mm,lw_mepoheader TYPE mepoheader,lw_customer TYPE ci_ekkodb,lw_po_header_handle TYPE REF TO cl_po_header_handle_mm.*--------------------------------------------------------------------* * data have to be transported to business logic*--------------------------------------------------------------------* IF im_name = subscreen1.* is it an item? im_model can be header or item.mmpur_dynamic_cast lw_header im_model.CHECK NOT lw_header IS INITIAL.lw_mepoheader = lw_header->get_data( ).* standard fields changed?IF dynp_data_pbo-lv_test1 <> dynp_data_pai-lv_test1OR dynp_data_pbo-lv_test2 <> dynp_data_pai-lv_test2OR dynp_data_pbo-lv_test3 <> dynp_data_pai-lv_test3.* update standard fieldslw_mepoheader-lv_test1 = dynp_data_pai-lv_test1.lw_mepoheader-lv_test2 = dynp_data_pai-lv_test2.lw_mepoheader-lv_test3 = dynp_data_pai-lv_test3.CALL METHOD lw_header->set_dataEXPORTINGim_data = lw_mepoheader.ENDIF.ENDIF.ENDMETHOD.Step 13: 如果要check这些field的值的话, 可以写在IF_EX_ME_PROCESS_PO_CUST~PROCESS_HE ADER, 这里我要check field1必须是PALM.1.METHOD if_ex_me_process_po_cust~process_header.2. DATA: lw_mepoheader TYPE mepoheader,3. lw_customer TYPE ci_ekkodb.4.5. DATA: lv_testflag TYPE c.6.7. INCLUDE mm_messages_mac. "useful macros for message handling8.9. lw_mepoheader = im_header->get_data( ).10.11. IF lw_mepoheader-lv_test1 <> 'PALM'.12.* Place the cursor onto field lv_test1. The metafield was defined in BAdI ME_GUI_PO_CUST,13.* Method MAP_DYNPRO_FIELDS.14.15. mmpur_metafield mmmfd_cust_01.16. mmpur_message_forced 'E' 'ZDEV001' '999' '' '' '' ''.17.* MESSAGE 'This field should be filled ''PALM''' TYPE 'W'.18.19.* CLEAR lv_testflag.20.* lv_testflag = 'X'.21.* EXPORT lv_testflag FROM lv_testflag TO MEMORY ID 'Z_ZERO_ME22N'.22.23.* invalidate the object24. CALL METHOD im_header->invalidate( ).25. ENDIF.26.27.ENDMETHOD.METHOD if_ex_me_process_po_cust~process_header.DATA: lw_mepoheader TYPE mepoheader,lw_customer TYPE ci_ekkodb.DATA: lv_testflag TYPE c.INCLUDE mm_messages_mac. "useful macros for message handlinglw_mepoheader = im_header->get_data( ).IF lw_mepoheader-lv_test1 <> 'PALM'.* Place the cursor onto field lv_test1. The metafield was defined in BAdI ME_GUI_PO_CUST, * Method MAP_DYNPRO_FIELDS.mmpur_metafield mmmfd_cust_01.mmpur_message_forced 'E' 'ZDEV001' '999' '' '' '' ''.* MESSAGE 'This field should be filled ''PALM''' TYPE 'W'.* CLEAR lv_testflag.* lv_testflag = 'X'.* EXPORT lv_testflag FROM lv_testflag TO MEMORY ID 'Z_ZERO_ME22N'.* invalidate the objectCALL METHOD im_header->invalidate( ).ENDIF.ENDMETHOD.如果按回车来check的话, 它会显示error message,一次改变后按一次回车有反应, 第二次就没反应.这里有一个缺陷, 当我们按save里, 这条message是不会显示到message表中的(研究了很久, 没研究出来怎么搞), 幸好这里有个功能十分不错, 选中PO header data still faulty这个message, 按Edit, 就可以定位到error message的field.至此, 增强完成.补充:1. IF_EX_ME_PROCESS_PO_CUST~INITIALIZE: initialize function groupZCI_EKKODB的变量语句可以写在这.1.METHOD if_ex_me_process_po_cust~initialize.2. CALL FUNCTION 'ZCI_EKKODB_INIT'3. .4.ENDMETHOD.METHOD if_ex_me_process_po_cust~initialize.CALL FUNCTION 'ZCI_EKKODB_INIT'.ENDMETHOD.2. IF_EX_ME_PROCESS_PO_CUST~OPEN: 如果要select自建表的东西可以写在这里, 这里有个field IM_TRTYP有一定的控制作用, 具体可以查看它的domain值.3. IF_EX_ME_PROCESS_PO_CUST~POST: update自建表的语句可以写在这里.4. Custom subscreen的field必须引用method IF_EX_ME_GUI_PO_CUST~SUBSCRIBE里的定义的那个structure, from dict要勾上.5. 如果有自建表里面的field, 必须在method IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_MODEL 判断自建表的field改变时, 加上语句CALL METHOD lw_header->set_changed( ), 不这样的话, 你的自建表的field怎么变在保存时都会提示No data changed. 下面代码是例子.1.METHOD if_ex_me_gui_po_cust~transport_to_model.2.3. DATA: lw_header TYPE REF TO if_purchase_order_mm,4. lw_mepoheader TYPE mepoheader,5. lw_customer TYPE ci_ekkodb,6. lw_po_header_handle TYPE REF TO cl_po_header_handle_mm.7.*--------------------------------------------------------------------*8.* data have to be transported to business logic9.*--------------------------------------------------------------------*10. IF im_name = subscreen1.11.12.* is it an item? im_model can be header or item.13. mmpur_dynamic_cast lw_header im_model.14. CHECK NOT lw_header IS INITIAL.15. lw_mepoheader = lw_header->get_data( ).16.* standard fields changed?17. IF dynp_data_pbo-lv_test1 <> dynp_data_pai-lv_test118. OR dynp_data_pbo-lv_test2 <> dynp_data_pai-lv_test219. OR dynp_data_pbo-lv_test3 <> dynp_data_pai-lv_test3.20.* update standard fields21. lw_mepoheader-lv_test1 = dynp_data_pai-lv_test1.22. lw_mepoheader-lv_test2 = dynp_data_pai-lv_test2.23. lw_mepoheader-lv_test3 = dynp_data_pai-lv_test3.24.25. CALL METHOD lw_header->set_data26. EXPORTING27. im_data = lw_mepoheader.28.29. ENDIF.30.31. IF dynp_data_pbo-zdamon <> dynp_data_pai-zdamon.32. CALL FUNCTION 'ZCI_EKKODB_SET_DATA'33. EXPORTING34. im_damon = dynp_data_pai-zdamon.35.36. CALL METHOD lw_header->set_changed( ).37. ENDIF.38.39. ENDIF.40.ENDMETHOD.METHOD if_ex_me_gui_po_cust~transport_to_model.DATA: lw_header TYPE REF TO if_purchase_order_mm,lw_mepoheader TYPE mepoheader,lw_customer TYPE ci_ekkodb,lw_po_header_handle TYPE REF TO cl_po_header_handle_mm.*--------------------------------------------------------------------* * data have to be transported to business logic*--------------------------------------------------------------------* IF im_name = subscreen1.* is it an item? im_model can be header or item.mmpur_dynamic_cast lw_header im_model.CHECK NOT lw_header IS INITIAL.lw_mepoheader = lw_header->get_data( ).* standard fields changed?IF dynp_data_pbo-lv_test1 <> dynp_data_pai-lv_test1OR dynp_data_pbo-lv_test2 <> dynp_data_pai-lv_test2OR dynp_data_pbo-lv_test3 <> dynp_data_pai-lv_test3.* update standard fieldslw_mepoheader-lv_test1 = dynp_data_pai-lv_test1.lw_mepoheader-lv_test2 = dynp_data_pai-lv_test2.lw_mepoheader-lv_test3 = dynp_data_pai-lv_test3.CALL METHOD lw_header->set_dataEXPORTINGim_data = lw_mepoheader.ENDIF.IF dynp_data_pbo-zdamon <> dynp_data_pai-zdamon.CALL FUNCTION 'ZCI_EKKODB_SET_DATA'EXPORTINGim_damon = dynp_data_pai-zdamon.CALL METHOD lw_header->set_changed( ).ENDIF.ENDIF.ENDMETHOD.6.Method IF_EX_ME_GUI_PO_CUST~EXECUTE可以处理function code.1.METHOD if_ex_me_gui_po_cust~execute.2. IF im_fcode = 'ZZZZ'.3. MESSAGE 'Zero test' TYPE 'I'.4. ENDIF.5.ENDMETHOD.METHOD if_ex_me_gui_po_cust~execute.IF im_fcode = 'ZZZZ'.MESSAGE 'Zero test' TYPE 'I'.ENDIF.ENDMETHOD.。
SAP采购申请屏幕增强

SAP采购申请ME51n,ME52n,ME53n屏幕增强使用增强:MEREQ001 购买申请中的客户自有数据1、如果需要向PR中加入自定义字段,事务码se11,打开透明表EBAN,双击include:CI_EBANDB,创建结构CI_EBANDB,维护自定义的字段。
2、事务码CMOD create project:ZMMpr001,在Enhancement assignment中添加增强MEREQ001,保存。
3、事务码smod:MEREQ001,打开如下图,有三个function module,还有screen area,可知screen :0111便是预留的屏幕,可以在其函数组中创建screen 0111,然后在其上画一些需要的字段栏位就ok了。
双击其中一个function module,然后点击display object list按钮,显示如下图在函数组XM02中create screen 0111,然后在其上画一些需要的字段栏位,注意0111设置为subscreen。
激活,CMOD中激活ZMMpr001,此时在事务码ME51n中就能看到多了一个客户数据tab页,相应me52n,me53n等也有。
到此为止,屏幕做好了,但是要在屏幕栏位上输入数据并能保存到透明表,及显示的时候能从透明表读出到屏幕栏位,就需要在上述三个function module中写代码。
4、在函数组XM02中,有include:ZXM02TOP,目前是空的,create it,添加代码:data : gv_trtyp type aktvt.DATA: FL_INPUT TYPE FLAG.激活EXIT_SAPLMEREQ_001中的include添加如下代码:TABLES : ci_ebandb.DATA : i_mereq_item TYPE mereq_item.CALL METHOD im_req_item->get_activityRECEIVINGre_aktvt = gv_trtyp.CASE gv_trtyp.WHEN 'A'.fl_input = space. "Output onlyWHEN 'V'.fl_input = 'X'. "Input/OutputENDCASE.IF im_req_item IS INITIAL.CLEAR: ci_ebandb.ELSE.i_mereq_item = im_req_item->get_data( ).MOVE-CORRESPONDING i_mereq_item TO ci_ebandb.ENDIF.激活EXIT_SAPLMEREQ_003中的include,添加下面代码:DATA : i_mereq_item TYPE mereq_item.IF NOT im_req_item IS INITIAL.i_mereq_item = im_req_item->get_data( ).MOVE-CORRESPONDING ci_ebandb TO i_mereq_item .CALL METHOD im_req_item->set_data( i_mereq_item ).ex_changed = 'X'.ENDIF.最后对上述建立的subscreen 0111添加PBO,如下代码:*----------------------------------------------------------------------****INCLUDE ZXM02O01 .*----------------------------------------------------------------------**&---------------------------------------------------------------------**& Module STATUS_0111 OUTPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*MODULE status_0111 OUTPUT.* SET PF-STATUS 'xxxxxxxx'.* SET TITLEBAR 'xxx'.CHECK fl_input IS INITIAL.LOOP AT SCREEN.screen-input = 0.MODIFY SCREEN.ENDLOOP.ENDMODULE. " STATUS_0111 OUTPUTOK,到此为止,ME51n等的屏幕增强就完成了,屏幕0111上栏位可以保存到eban中,修改,显示等。
SAP ERP系统MM模块常用增强之四采购申请输入字段的校验检查

SAP ERP系统MM模块常用增强之四:采购申请输入字段的校验检查在SAP/ERP项目的实施中采购管理模块(MM)的创建和修改采购申请一般都会有输入字段校验检查的需求,来防止业务人员录入错误或少录入数据,这方面需求部分是可以通过配置实现,比如一些字段是否必输,是否显示等,但是在实际项目中还是会遇到一些特殊的需求,比如需要一定逻辑判断的需求就不能通过配置实现,需要进行增强开发。
下面通过一个项目案例来介绍下如何通过增强实现采购申请创建和修改的字段输入的合规性检查。
业务需求如下:某公司MM模块的业务要求:创建成本中心(K)采购申请时,要求系统检查采购申请行项目输入的物料组代码必须是Z开头的,因为这公司物料组配置已要求成本中心类采购申请必须选择Z开头物料组,因为只有Z开头物料组才配置了能自动带出成本中心。
这需求的业务背景:SAP系统创建成本中心采购申请必须要填写会计科目,但通常需求申请人并不清楚应该填写那个会计科目,SAP标准解决方案通过物料组去关联会计科目,创建采购申请时候,当输入物料组后会自动带出会计科目,不需要用户填写,但是这公司的申请人在创建采购申请时候还是会经常选错物料组,因为选错物料组,带不出会计科目,创建不了采购申请,所以提出这样的增强需求,保证会计科目能自动带出。
下面详细介绍下实施步骤:增强方法:1.二代功能模块增强:MEREQ001功能模块:EXIT_SAPLMEREQ_0102.三代增强BADI:ME_PROCESS_REQ_CUST方法:IF_EX_ME_PROCESS_REQ_CUST~CHECK。
上面两种增强方式都可实现对采购申请保存前的各字段的约束条件的检查。
下面详细介绍下使用二代功能模块增强的详细实施步骤实施操作具体步骤:使用事务码CMOD创建增强实施项目。
备注:如果需要传输选择包保存,不需要传输选择本地对象即可点击本地对象继续按如下步骤操作双击进入如下界面:在上面界面写上增强代码,点击保存->激活,最后激活增强项目。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SAP采购订单税码增强检查
2014年09月05日⁄综合⁄共3030字⁄字号小中大⁄评论关闭
1、SE18查看ME_PROCESS_PO_CUST相关信息
2、SE19创建ME_PROCESS_PO_CUST的BADI实现类
注意类名称定义是按照以下规则:
ZCL_IM_ + BADI
其中CL表示CLASS类的意思,
IM表示Implement实现的意思;
3、SE24实现ZCL_IM_ME_PROCESS_PO_CUST
4、实现PROCESS_ITEM代码:
METHOD IF_EX_ME_PROCESS_PO_CUST~PROCESS_ITEM.
*&====================================================== ====
*& 对采购订单行项目增加是否有选择税码检查
*& Added by liangqh 2010-07-28
*&====================================================== ====
INCLUDE MM_MESSAGES_MAC.
DATA:
L_ITEM TYPEMEPOITEM. "采购订单行项目
L_ITEM = IM_ITEM->GET_DATA( ).
*--> 判断行项目税率是否为空
IF L_ITEM-MWSKZ = '' OR L_ITEM-MWSKZ ISINITIAL.
MMPUR_MESSAGE 'E' 'ZMM01' '002' L_ITEM-EBELN L_ITEM-EBELP ''''.
ENDIF.
ENDMETHOD.
METHOD IF_EX_ME_PROCESS_PO_CUST~CHECK.
*&====================================================== ====
*& 对采购订单行项目增加是否有选择税码检查
*& Added by liangqh 2010-07-28
*&====================================================== ====
INCLUDE MM_MESSAGES_MAC.
DATA:
OBJ_ITEMSTYPE PURCHASE_ORDER_ITEMS,
OBJ_ITEMTYPE PURCHASE_ORDER_ITEM,
LW_HEADERTYPE MEPOHEADER,
LW_ITEM TYPEMEPOITEM.
LW_HEADER = IM_HEADER->GET_DATA().
OBJ_ITEMS =IM_HEADER->GET_ITEMS( ).
LOOP AT OBJ_ITEMS INTO OBJ_ITEM.
LW_ITEM =OBJ_ITEM-ITEM->GET_DATA( ).
*--> 判断行项目税率是否为空
IFLW_ITEM-MWSKZ = '' OR LW_ITEM-MWSKZ IS INITIAL.
MMPUR_MESSAGE 'E' 'ZMM01' '002' LW_ITEM-EBELN LW_ITEM-EBELP ''''.
ENDIF.
ENDLOOP.
ENDMETHOD.
method IF_EX_ME_PROCESS_PO_CUST~POST.
*&====================================================== ====
*& 对采购订单行项目增加是否有选择税码检查
*& Added by liangqh 2010-07-28
*&====================================================== ====
INCLUDE MM_MESSAGES_MAC.
DATA:
OBJ_ITEMSTYPE PURCHASE_ORDER_ITEMS,
OBJ_ITEMTYPE PURCHASE_ORDER_ITEM,
LW_HEADERTYPE MEPOHEADER,
LW_ITEM TYPEMEPOITEM.
*-->取得订单抬头信息及明细数据
LW_HEADER = IM_HEADER->GET_DATA().
OBJ_ITEMS =IM_HEADER->GET_ITEMS( ).
LOOP AT OBJ_ITEMS INTO OBJ_ITEM.
LW_ITEM =OBJ_ITEM-ITEM->GET_DATA( ).
*--> 判断行项目税率是否为空
IFLW_ITEM-MWSKZ = '' OR LW_ITEM-MWSKZ IS INITIAL.
MMPUR_MESSAGE 'E' 'ZMM01' '002' LW_ITEM-EBELN LW_ITEM-EBELP ''''. ENDIF.
ENDLOOP.
endmethod.
*********************************************************************************
Add by Andrew :
在采购订单增强中报消息信息的方法:
1.
INCLUDE MM_MESSAGES_MAC.
MMPUR_MESSAGE 'W' 'ZMM01' '002' ls_mepoitem-EBEln ls_mepoitem-EBELP ls_mepoi tem-reslo '' .
2.
sy-msgid = 'ZMM01'.
sy-msgty = 'W'.
sy-msgno = 003.
message id sy-msgid type sy-msgty number sy-msgno WITH ls_mepoitem-EBEln ls _mepoitem-EBELP ls_mepoitem-reslo .
set extended check off.
call method cl_message_mm=>create
EXPORTING
im_msgid = sy-msgid
im_msgty = sy-msgty
im_msgno = sy-msgno
im_msgv1 = sy-msgv1
im_msgv2 = sy-msgv2
im_msgv3 = sy-msgv3
im_msgv4 = sy-msgv4
im_force_collect = mmpur_yes
EXCEPTIONS
failure = 01
dialog = 02.
set extended check off.
这两个方法实现方法是一样的,只是第一种是SAP公司已经实现了,包含在include
MM_MESSAGES_MAC中,所以直接引用。
消息类:SE91
建立消息类:ZMM01
Message : 002 Item&1 &2 The default issuing storagelocation is &3. Message: 003 Item &1 &2 The defaultissuing storage location is &3.。