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究竟是怎么工作的? 很好,使用SE37在Function FI_VALIDATION_HEADER和FI_VALIDATION_ITEM合适位置设置断点,就可知道更详细的程序逻辑. 另外,相关Table T001D|和相关程序GBTDMFI0|RGUGBR00,有兴趣的读者不妨研究一下. 2.另一个留给读者的疑问是,一个Validation可有多个Steps,不妨假设一Line Validation有俩Steps-STEP1和Step2,它们的Prerequisite都是:BKPF-BUKRS = 5100,但是Check却不同甚至是矛盾的,Step1 check是BSEG-DMBTR <=1000.而Step2-check却是BSEG-DMBTR > 1000,结果会如何? 3.财务凭证的退代(Substitution)
和Validation一样,凭证的退代在多个模块中能找到,IMG Path(IMG Path如图7-1标号2). 比较实用的Substitution IMG T-code有: OBBH:AP/AR/GL Doc.| OACS:AM Create Assets|OA02:Mass change Assets|GCVY:Global Substitution(In SPL,Company Level)|GCVX:Local Substitution(In SPL,Company code Level). 和Validation不同的是,Validation只做检测,一般不做相应数据的修改,Substitution弥补了这反面的缺陷,甚至允许和user_exit相结合. 假设用户希望在产生APAR凭证能将vendor,customer 或其它信息比如写入Assignment(BSEG-ZUONR)字段,或者希望某些P&L科目在记入某些特定成本中心时将些分析信息写入TEXT(BSEG-SGTXT)字段,可使用退代.
下面举一个最简单实例假设在公司代码5100中,如使用现金类科目10010120记帐,在
Text(BSEG-SGTXT)写入信息,同时在期初,可能会将一些凭证post到上期间,使用退代假设是post到上期间的凭证Posting Date换成上期间最后一天.
此简单实例是为了说明问题,其中有些步骤和第7例Validation相同,就不再一一讲解,希望读者在实际业务中能举一反三,发挥退代作用. 1. 自定义的退代程序. 相关Tcode:GCX2. (图9-2) [1]App. Area 选择GBLS
[2]输入自定义程序名ZSTSUB(Copy并取代SAP默认的标准程序RGGBS000)
***自定义的程序名称最好不超过8位,在OBBH似乎只能显示程序名的前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]增加删除一个退代
***在本例中,使用only exit U100(对应ZSTSUB子程序U100)修改line item的Text.
[4]使用用户出口做退代. (关于怎么选Form规则请看本例思考). [5]字段级退代.
假设ZSTSUB Form U100的source code如下,那么在满足先决条件时,行项目的Text都写成了Record Payment Text.
FORM u100. \***U100 如只是用于 line item退代. 所以改变XBLNR不会成功 . ***U100如果同事用于header和line item,则俩句都会成功执行. BKPF-XBLNR = 'Reference For STONE Test'. BSEG-SGTXT = 'Record Payment Text ' . ENDFORM. 读者可思考下面几个问题: 思考:
1如果先决条件没有输入任何值,是否退代会无条件执行?
2在ZSTSUB(本人自定义),用户可参考SAP标准程序RGGBS000, RGGBS000的Form
会以什么规则在不同级别的(header,Line,Complete doc)退代中做Exit ,用户能否自定义自己的field exit,header exit,line exit 和complete exit?
请看此FORM get_exit_titles TABLES etab,有类似语句.
这些由参数c_exit_param_none, c_exit_param_field和c_exit_param_class决定 exits-name = 'U100'.
exits-param = c_exit_param_none. “能用在Field exit,only exit等任何地方 exits-title = text-100. APPEND exits.
exits-name = 'U101'.
exits-param = c_exit_param_field.”此Form只用于字段exit exits-title = text-101. APPEND exits.
exits-name = 'U801'.
exits-param = c_exit_param_class.
”Form U801只能在Callup point 3 complete doc才可使用.
exits-title = text-101. \ APPEND exits.
3 BKPF,BSEG什么样的值才可应用在退代程序中? 4为什么有些字段即使在退代中更改了但是不生效
下面再以举一实例,彻底剖析退代的运行规则同时解释上面3,4提出的问题. 首先在FI_SUBSTITUTION_HEADER|FI_SUBSTITUTION_ITEM|ZSTSUB(自定义)| GBTDMFI0|
GBTDMFIJ设置断点你能进行跟踪. 从技术上讲,在回车或保存触发退代前在屏幕上输入的一些值就已经保存在一些内表中,然后才执行退代去根据用户设置的条件去退换一些值而已.
实例:通常企业在期初未关帐前可能需要在上期间记帐.如用户需要假设posting date是上期间某个日期,自动将此日期退换成上期间最后一天.使用抬头退代. 1确定当新增退代时BKPF-BUDAT是否可见
如在此看不到,即使你写了代码也是无效的.如图9-6.
[1]使用only exit U100,也可使用field exit . [2]BKPF-BUDAT可见.