abap三月通.doc_第1页
abap三月通.doc_第2页
abap三月通.doc_第3页
abap三月通.doc_第4页
abap三月通.doc_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

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 codes6 前前 言言 一一. .基础篇基础篇 如果读者已经有一定 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表示应用服务器(通常企业为了节省成本和方便 管理可能会将应用服务器和数据库安装在同一起),2system 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 hellohello 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 有这样的画面,12的 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相关. 如图:1se38找到程序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数据似乎不可新建) 设置消息.如下图. 1appl 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. 自动建立 po 和 so 一.se11 建立一记录表 zposo1 二.使用 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.吧. 还有一样要注意. agsp, rebp 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 . loop at xekpo . zposolog-ebeln = i_ekko-ebeln. “po no. zposolog-ebelp = xekpo-ebelp. “po item no. zposolog-vbeln = zsalesdocument.“so no. zposolog-posnr = xekpo-ebelp . “so item no. zposolog-waers = i_ekko-waers . “currency zposolog-matnr = xekpo-matnr . “material zposolog-kwmeng = xekpo-menge. “po/so qty zposolog-netpr = xekpo-netpr. “po/so price zposolog-bapimsg = creation ok . “zreturn-message . zposolog-flag = t. “failure append zposolog . insert zposo from zposolog. endloop. else. zposolog-ebeln = i_ekko-ebeln. * zposolog-bapimsg = zreturn-message . *为了好se91查找message合并message type, messge code,和message text concatenate zreturn-type - zreturn-code -: zreturn-message into zposolog-bapimsg . zposolog-flag = f. “failure append zposolog . insert zposo from zposolog. endif. *-po可能会反复调用吗- * 不管如何做到call一次就退出. * 建立一表zflag, 可只有一个字段, zrepcall,default是f, call function bapi_po_create exporting po_header = zpoheader * po_header_add_data = * header_add_data_relevant = * po_address = * skip_items_with_error = x * item_add_data_relevant = importing purchaseorder = zpurchaseorder “好瞧瞧 tables po_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. “结束建立purchase order 和sales order 下面是使用 vb call bapi_create_po 建立 po 的例子的部分,首先使用 se37 测试,基本上建立 po 最简单只需要以下参数. 注意 vendor 必须是 10 位数,如果 长度不足,请加 0 tvendor = mid(“0000000000“, 1, 10 - len(trim(vendor.text) + trim(vendor.text) 保证如果 vendor length1000 时出现的错误(validation zstline 生效,消息的俩&参数被 bkpf-usnam 和 bseg-dmbtr 代替),出现的错误消息,由于凭证俩行 amount 都1000,此消息将弹 出俩次. 1.zstline 显然对 user stonef 操作所产生的任何会计凭证都有效,比如只想限制 stone 在 使用 fb50 记帐但是 f-53 付款时却允许超过 1000hkd,请在先决条件上再加上 tcode fb50 则 validationi 就只对 fb50 有效. 2.想用 tcode 比如 fb50 测试新建 validation,起码要求退出当前操作再进入,否则 sap 会 从缓冲中读数据认为还是上次的配置,结果拥护却认为配置失败,最保证的方法是从 validation img 窗口使用/o fb50(或其它 tcode). 3.这种方法同样适用于任何其它相同情况的测试. 3.再谈建立再谈建立 validation 操作操作.(图图 7-9) 1删除 prerequisite 和 check 代码. 2合并字符字段 3比如对 line validation,bkff,bseg,syst(如想 by tcode 选 syst-tcode 做条件)三 对象可使用. 4选择 rule 做 prerequisite 和 check(参考图 7-5). 5可使用 user exit 做 prerequisite 和 check.(参考第第 8 例凭证的退代例凭证的退代). 6一些常用逻辑表达式. 7通常使用的是 constant(常量). 1.读者也许有这样的疑问,validation 究竟是怎么工作的? 很好,使用 se37se37 在 function fi_validation_headerfi_validation_header 和 fi_validation_itemfi_validation_item 合适位置设置断点,就可知道更详细的程序 逻辑. 另外,相关 table t001d|和相关程序 gbtdmfi0|rgugbr00,有兴趣的读者不妨研究一下. 2.另一个留给读者的疑问是,一个 validation 可有多个 steps,不妨假设一 line validation 有俩 steps-step1 和 step2,它们的 prerequisite 都是:bkpf-bukrs = 5100,但 是 check 却不同甚至是矛盾的,step1 check 是 bseg-dmbtr 1000,结果会如何? 3.3.财务凭证的退代财务凭证的退代(substitution)(substitution) 和 validation 一样,凭证的退代在多个模块中能找到,img path(img path 如图 7-1 标 号 2). 比较实用的 substitution img t-code 有: obbhobbh:ap/ar/gl doc.| oacsoacs:am create assets|oa02oa02:mass change assets|gcvygcvy:global substitution(in spl,company level)|gcvxgcvx:local substitution(in spl,company code level). 和 validation 不同的是,validation 只做检测,一般不做相应数据的修改,substitution 弥 补了这反面的缺陷,甚至允许和 user_exit 相结合. 假设用户希望在产生 apar 凭证能将 vendor,customer 或其它信息比如写入 assignment(bseg-zuonr)字段,或者希望某些 p&l 科目在记入某些特定成本中心 时将些分析信息写入 text(bseg-sgtxt)字段,可使用退代. 下面举一个最简单实例假设在公司代码下面举一个最简单实例假设在公司代码 51005100 中中, ,如使用现金类科目如使用现金类科目 1001012010010120 记帐记帐, ,在在 text(bseg-sgtxt)text(bseg-sgtxt)写入信息写入信息, ,同时在期初同时在期初, ,可能会将一些凭证可能会将一些凭证 postpost 到上期间到上期间, ,使用退代假设是使用退代假设是 postpost 到上期间的凭证到上期间的凭证 postingposting datedate 换成上期间最后一天换成上期间最后一天. . 此简单实例是为了说明问题,其中有些步骤和第 7 例 validation 相同,就不再一一讲 解,希望读者在实际业务中能举一反三,发挥退代作用. 1. 自定义的退代程序自定义的退代程序. 相关 tcode:gcx2. (图 9-2) 1app. area 选择 gbls 2输入自定义程序名 zstsub(copy 并取代 sap 默认的标准程序 rggbs000) *自定义的程序名称最好不超过自定义的程序名称最好不超过 8 8 位位, ,在在 obbhobbh 似乎只能显示程序名的前似乎只能显示程序名的前 8 8 位位. . 相关表格函数和程序. 相关表格 gb01|t001q|t80d|gb03|gb03t|gb31|gb31t|gb907|gb90|gb92|gb922|gb901 |oxt_genobjdtl|,相关函数 fi_substitution_active|fi_substitution_doc |fi_substitution_header|fi_substitution_item.相关程序 zstsub(自定义)| gbtdmfi0| gbtdmfij|rgugbr00 *使用使用 gcx2 退换标准的退换标准的 rggbs000 这样就无需申请这样就无需申请 access key,另外一个另外一个 gcx1 是跨是跨 client 端的端的,一般用于特殊总帐一般用于特殊总帐 spl 中给中给 field movement 定义用户出口定义用户出口. 2. 建立退代步骤建立退代步骤 同 validation 一样,也需为其建立 step,一个 step 包括先决条件和退代(如图 9-3). 1凭证头退代,在凭证抬头回车回保存凭证时满足条件时生效. 2凭证行项目退代. 3增加删除一个退代 *在本例中在本例中, ,使用使用 onlyonly exitexit u100(u100(对应对应 zstsubzstsub 子程序子程序 u100)u100)修改修改 lineline itemitem 的的 text.text. 4使用用户出口做退代. (关于怎么选 form 规则请看本例思考). 5字段级退代. 假设 zstsub form u100 的 source code 如下,那么在满足先决条件时,行项目的 text 都写成了record payment text. form u100. “#ec called *u100 如只是用于 line item退代. 所以改变xblnr不会成功 . *u100如果同事用于header和line item,则俩句都会成功执行. bkpf-xblnr = refer

温馨提示

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

评论

0/150

提交评论