*———————————————————————*
* FORM U801 *
*———————————————————————*
* Check account document line item *
*———————————————————————*
FORM U801.
DATA: LV_AUTH LIKE USRBF2-AUTH.
DATA: LV_VON LIKE UST12-VON.
*{ INSERT PRDK900214 1
DATA: lv_zuonr TYPE dzuonr.
FIELD-SYMBOLS: TYPE dzuonr,
TYPE prctr.
DATA: c_invfo(21) TYPE c VALUE ‘(SAPLFDCB)INVFO-ZUONR’.
DATA: c_alloc_num(17) TYPE c VALUE
‘(ZPCFIE08)P_PRCTR’.
DATA: c_rbkp_v(21) TYPE c VALUE
‘(SAPLMR1M)RBKPV-ZUONR’.
IF sy-tcode <> ‘MR8M’.
ASSIGN (c_invfo) TO .
IF sy-subrc = 0.
lv_zuonr = .
ELSE.
ASSIGN (c_alloc_num) TO .
IF sy-subrc = 0.
lv_zuonr = .
ENDIF.
ENDIF.
ELSE.
ASSIGN (c_rbkp_v) TO .
lv_zuonr = .
ENDIF.
*} INSERT
* IF BSEG-HKONT = ‘4101012300′.
IF BSEG-HKONT = ‘5001812300′ OR BSEG-HKONT = ‘4101012300′.
*{ REPLACE PRDK900214 2
* SELECT SINGLE AUTH
* INTO LV_AUTH
* FROM USRBF2
* WHERE BNAME = SY-UNAME
* AND OBJCT = ‘Z_BSEG_PRC’.
* IF SY-SUBRC = 0.
* SELECT VON
* INTO LV_VON
* FROM UST12
* WHERE OBJCT = ‘Z_BSEG_PRC’
* AND AUTH = LV_AUTH
* AND AKTPS = ‘A’
* AND FIELD = ‘PRCTR’
* AND VON <> ‘DM01′.
* ENDSELECT.
* IF LV_VON = ‘ZH01′.
* SELECT SINGLE AUTH
* INTO LV_AUTH
* FROM USRBF2
* WHERE BNAME = SY-UNAME
* AND OBJCT = ‘Z_BSEG_PRC’.
* IF SY-SUBRC = 0.
* SELECT VON
* INTO LV_VON
* FROM UST12
* WHERE OBJCT = ‘Z_BSEG_PRC’
* AND AUTH = LV_AUTH
* AND AKTPS = ‘A’
* AND FIELD = ‘PRCTR’
* AND VON <> ‘DM01′.
* ENDSELECT.
* IF LV_VON = ‘ZH01′.
AUTHORITY-CHECK OBJECT ‘Z_BSEG_PRC’
ID ‘PRCTR’ FIELD lv_zuonr.
IF sy-subrc <> 0.
MESSAGE e999(ZBRIL_01) WITH TEXT-E01.
ENDIF.
IF lv_zuonr = ‘ZH01′.
*} REPLACE
CASE BKPF-BLART.
WHEN ‘RE’.
BSEG-KOSTL = ‘ZP2300′.
WHEN ‘ZF’.
BSEG-KOSTL = ‘ZP3200′.
ENDCASE.
*{ REPLACE PRDK900214 3
* ELSEIF LV_VON = ‘HS01′.
* ELSEIF LV_VON = ‘HS01′.
ELSEIF lv_zuonr = ‘HS01′.
*} REPLACE
BSEG-KOSTL = ‘HP1400′.
ENDIF.
ENDIF.
*{ REPLACE PRDK900214 4
* ENDIF.
* ENDIF.
*} REPLACE
ENDFORM.
和Validation不同的是,Validation只做检测,一般不做相应数据的修改,Substitution弥补了这反面的缺陷,它和user exit结合将方便用户编写更复杂的逻辑。注意的是,如果Substitution使用User exit在程序中只做检查而不替代内容,此时,Substitution可以完全取代Validation。
简单地讲,替代就是在会计凭证生产时(包括手工和自动过帐)允许用户根据需求对凭证抬头和凭证行项目进行一定的内容修改,这种灵活的功能可以满足一些非常变态的需求,要不怎么说SAP什么东西都能轻易配置出来呢?
比如国内很多企业都要求会计凭证有个文本摘要可对某些自动凭证根据规则写入一些文本摘要,或修改凭证的利润中心,功能范围等,同样,理论上讲,SAP系统几乎允许你修改会计凭证的任何内容,甚至包括会计科目,SAP一直强调科目没有级别,对自动科目设置非常严谨,所以修改会计科目通常发生在自动过帐时人工无法干预科目的情况,典型的是MIRO时科目只能对应供应商主数据科目,如果一个供应商发票校验需要对应应付或其他应付,系统就无法自动实行,就可采用科目替代。
替代Tcode: 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). GGB1:各模块全部替代 |
按照国内很多企业的内部制度,所有的会计凭证都需要文本摘要并且多数凭证要打印出来存档,对于很多自动凭证却并不能产生文本摘要,此时可以使用替代塞一个文本进去,有的企业连ERP系统产生的特有的中间凭证也打印,真是不掀嫌浪费纸张。
图1是一个文本摘要的例子,和Validation不同的是,Substitution只有两步骤,图1表示的是如果凭证类型是折旧AF,并且科目是累计折旧类科目或折旧费用科目,则文本摘要为“计提本月折旧”。图1中建立Substitution和建立Validation步骤一样。
到目前为止,我们发现Validation和Substitution建立都非常简单,只要有简单逻辑思维的用户不需要任何编程经验拖拖拽拽就可以实现功能,国内的ERP设计者应该好好借鉴借鉴,ERP项目实施不容易,不要让可怜的业务顾问天天浪费时间去玩技术玩Coding 。
系统允许更复杂的替代逻辑,下面举一个结合用户出口的替代简单应用实例。
业务背景:
假设在公司代码5100中,如果发生业务招待费,则在其行项目文本摘要字段(BSEG-SGTXT)写入信息“业务招待费”以做统计。
同时,在公司代码5100的期初,会将一些调整凭证或月结凭证过帐到上期间,如果有这样的业务,无论用户输入上期间的任何一天,替代将自动将上期间的凭证的过帐日期换成上期间最后一天。
参考步骤如下:
(1).自定义的退代程序(Tcode:GCX2)
最好Copy系统默认的程序出来修改,起码不要申请Access Key! App. Area 选择GBLS,输入Copy出来的自定义程序ZRGGBS00,自定义的程序名称最好不超过8位,系统只能显示程序名的前8位。
(2)。建立退代步骤(Tcode:OBBH)
建立一个替代的Step包括先决条件和退代内容,如图3,你可选择一个替代字段,表示替代这个字段的内容,在此选择”Only exit”,表示使用用户出口编写程序来替代。
(3).剖析替代用户出口程序ZRGGBS00(Tcode:SE38).
用户出口程序ZRGGBS00分析. 究竟自定义的Form例程是field exit,header exit,line exit 或complete exit有系统参数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只用于字段出口Field exit exits-title = text-101. APPEND exits. exits-name = ‘U900′. exits-param = c_exit_param_class.”U801只能在complete doc才可使用. exits-title = text-900. APPEND exits. *…………可以对着Copy增加自定义的例程 REFRESH ETAB. LOOP AT EXITS. ETAB = EXITS. APPEND ETAB. ENDLOOP. 增加一个例程就5个简单步骤: 1.Exits-name = ‘****’表示出口例程名称。 2.exits-param =‘***’只有c_exit_param_none/field/class3种,表示例程的用法. 3.exits-title=’***’ 例程的抬头显示 4.APPEND exits.表示增加该出口例程。 5.接下来定义一个例程Form **** /endform .在例程中编写替代逻辑。 |
接下来根据业务背景编写逻辑,假设使用Form 100,其类型c_exit_param_none,可用于“Only Exit”,参考代码如下表:
FORM U100. DATA:Z_PSTDATE TYPE SY-DATUM, Z_CURPER LIKE T009B-POPER, Z_CURYEAR LIKE T009B-BDATJ, Z_PSTPER LIKE T009B-POPER, 来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/443058/viewspace-1040364/,如需转载,请注明出处,否则将追究法律责任。
请登录后发表评论
登录
全部评论
<%=items[i].createtime%>
<%=items[i].content%> <%if(items[i].items.items.length) { %>
<%for(var j=0;j
<%}%> <%}%>
<%=items[i].items.items[j].createtime%>
<%=items[i].items.items[j].username%> 回复 <%=items[i].items.items[j].tousername%>: <%=items[i].items.items[j].content%>
还有<%=items[i].items.total-5%>条评论
) data-count=1 data-flag=true>点击查看
<%}%>
|
转载于:http://blog.itpub.net/443058/viewspace-1040364/