abap三月通(9)

2019-07-29 11:13

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可见.

***使用下面参考代码将BCLTAB和BCLFIELD稍微更改就可将BKPF,BSEG任何字段用于退代编码.

1所有退代字段关系在GB01表中,可使用下面代码使用BUDAT可用于退代. 在本人的机器上GB01建立了维护视图,因此实际上可直接使用SE16修改GB01,如果企业可能大量使用退代和确定,可以考虑用SE11为表GB01建立维护视图,否则就使用下面程序. Report ZMODGB01. DATA ZGB01 LIKE GB01 . SELECT SINGLE * INTO ZGB01 FROM GB01 WHERE BOOLCLASS = '008' AND CLASSTYPE = 'S' AND BCLTAB = 'BKPF' AND BCLFIELD = 'BUDAT' . * AND BCLTAB = 'BSEG' * AND BCLFIELD = 'PRCTR' . ZGB01-BEXCLUDE = ''. MODIFY GB01 FROM ZGB01 . 2 在凭证的退代和确定中,有几个比较有用的Tcode. GGB0: All Validations. GGB1: All Substitutions GGB2: All Rule Class GGB3:没有这样的Tcode,嘿嘿,你自己造一个吧. GGB4: 激活 2检查退代代码自动生成. 退代代码是自动生产的,这样的自动生成程序的实际应用很多,比如在CO-PA中,相关表,结构和程序很多是自动生成的,关于程序自动生产请参考拙作ABAP百谈. 记得在OBBH画面当新建一退代时,有如图9-7的画面.

[1]退代名 [2]退代class,这个将对应到自动生成程序GBTDMFIJ.

在GBTDMFIG中读者能看到四个子程序FORM EXP_TAB_008_BKPF(class

8,callpnt1),FORM EXP_TAB_009_BSEG(class 9,callpnt2), FORM EXP_TAB_015_BKPF和FORM EXP_TAB_015_BSEG(Class 15,Callpnt 3).

现在以FORM EXP_TAB_008_BKPF为例.如果读者不能在此子程序的一个结构

TEMP_STRUCT发现想退代的字段(原因就不细解),很明显,必须重新生成退代程序.

***如果您的退代不工作可以这样找原因,在GBTDMFIG程序中的上面提到的四个Form的TEMP_STRUCT结构没有看是否有相应的字段.比如在TEMP_STRUCT结构中没有BKPF-BUDAT,当然posting date的退代代码就会不起作用,此时执行下面步骤3运行RGUGBR00吧.

原因很简单,在退代程序中定义的BKPF,BSEG相当于内表,退代代码按用户的逻辑修改了BKPF后如TEMP_STRUCT(实际对应的是可用做退代的全不字段)中没有,BKPF就被Reset回.

3重新生成程序.

SE38运行RGUGBR00, 将能选的全选上的选项再运行吧(图略). 4.编写代码

下面是参考程序,判断Posting Date如在上期间(非上月,以月为期间只是期间的一特例,国外企业似乎都不这样采用,关于期间请参考第4刀SAP期间概念)自动将其退换成上期最后一天(对其他期间无效,读者可能需要修改才可满足贵企业需求). FORM u100. *同一Exit(Form)可用于head(Line item)或Filed 退代,互不影响. *具体原理可跟踪GBTDMFIG(有GBTDMFI0动态调用) *此程序由Yueming Li编写,如有必要读者可能需要改动. Form 100. BSEG-SGTXT = 'TEST TeXT'. *BKPF-BUDAT TABLES: T009B.

DATA: BEGIN OF T_T009B OCCURS 10, BUMON LIKE T009B-BUMON, BUTAG LIKE T009B-BUTAG, END OF T_T009B.

DATA: L_DATE(8) TYPE C, L_YEAR(4) TYPE C, L_MONTH(2) TYPE C, L_DAY(2) TYPE C, L_PERMONTH(2) TYPE C, L_CURYEAR(4) TYPE C, L_CURMONTH(2) TYPE C, L_CURDAY(2) TYPE C.

L_DATE = SY-DATUM. L_CURYEAR = L_DATE(4). L_CURMONTH = L_DATE+4(2). L_CURDAY = L_DATE+6(2). L_CURMONTH = L_CURMONTH - 0. L_PERMONTH = L_CURMONTH - 1.

L_DATE = BKPF-BUDAT. L_YEAR = L_DATE(4). L_MONTH = L_DATE+4(2). L_DAY = L_DATE+6(2). L_MONTH = L_MONTH - 0.

IF L_CURYEAR NE L_YEAR. BKPF-BUDAT = L_DATE. EXIT. ENDIF.

IF L_MONTH NE L_CURMONTH AND L_MONTH NE L_PERMONTH.

BKPF-BUDAT = L_DATE. EXIT.

ENDIF.

SELECT BUMON BUTAG

INTO T_T009B FROM T009B

WHERE PERIV EQ 'Z1'

AND BDATJ EQ L_YEAR \

AND ( BUMON EQ L_CURMONTH \ OR BUMON EQ L_PERMONTH ). IF T_T009B-BUMON EQ L_PERMONTH. APPEND T_T009B. ENDIF.

IF T_T009B-BUMON EQ L_CURMONTH AND T_T009B-BUTAG LE L_CURDAY. APPEND T_T009B. ENDIF.

ENDSELECT.

SORT T_T009B.

LOOP AT T_T009B.

IF T_T009B-BUMON EQ L_MONTH. IF T_T009B-BUTAG GE L_DAY.

CONCATENATE L_YEAR T_T009B-BUMON T_T009B-BUTAG INTO L_DATE. EXIT. ENDIF. ENDIF.

IF T_T009B-BUMON GT L_MONTH. IF T_T009B-BUTAG GE L_DAY. EXIT. ENDIF. ENDIF. ENDLOOP.

BKPF-BUDAT = L_DATE.

ENDFORM. \

使用函数的.

FORM u100. \*同一个Form可用做header和line 退代而互不影响. BSEG-SGTXT = 'Line Item Text'. \DATA:Z_PSTDATE TYPE SY-DATUM, Z_CURPER LIKE T009B-POPER, Z_CURYEAR LIKE T009B-BDATJ, Z_PSTPER LIKE T009B-POPER, Z_PSTYEAR LIKE T009B-BDATJ, Z_PERLSTDAY LIKE SY-DATUM.


abap三月通(9).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:实习指导老师评语

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: