sap obbh 浅谈

来源:互联网 发布:网络广播方案 编辑:程序博客网 时间:2024/05/17 09:17

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 codeLevel).

GGB1:各模块全部替代

sub1

按照国内很多企业的内部制度,所有的会计凭证都需要文本摘要并且多数凭证要打印出来存档,对于很多自动凭证却并不能产生文本摘要,此时可以使用替代塞一个文本进去,有的企业连ERP系统产生的特有的中间凭证也打印,真是不掀嫌浪费纸张。

1是一个文本摘要的例子,和Validation不同的是,Substitution只有两步骤,图1表示的是如果凭证类型是折旧AF,并且科目是累计折旧类科目或折旧费用科目,则文本摘要为“计提本月折旧”。1中建立Substitution和建立Validation步骤一样。

到目前为止,我们发现ValidationSubstitution建立都非常简单,只要有简单逻辑思维的用户不需要任何编程经验拖拖拽拽就可以实现功能,国内的ERP设计者应该好好借鉴借鉴,ERP项目实施不容易,不要让可怜的业务顾问天天浪费时间去玩技术玩Coding 

系统允许更复杂的替代逻辑,下面举一个结合用户出口的替代简单应用实例。

业务背景:

假设在公司代码5100,如果发生业务招待费,则在其行项目文本摘要字段(BSEG-SGTXT)写入信息“业务招待费”以做统计。

同时,在公司代码5100的期初,会将一些调整凭证或月结凭证过帐到上期间,如果有这样的业务,无论用户输入上期间的任何一天,替代将自动将上期间的凭证的过帐日期换成上期间最后一天。

参考步骤如下:

(1).自定义的退代程序(Tcode:GCX2)

 

sub2

最好Copy系统默认的程序出来修改,起码不要申请Access Key! App. Area 选择GBLS,输入Copy出来的自定义程序ZRGGBS00,自定义的程序名称最好不超过8,系统只能显示程序名的前8位。

(2)。建立退代步骤(Tcode:OBBH)

建立一个替代的Step包括先决条件和退代内容,3,你可选择一个替代字段,表示替代这个字段的内容,在此选择”Only exit,表示使用用户出口编写程序来替代。

sub3

 

(3).剖析替代用户出口程序ZRGGBS00(Tcode:SE38).

用户出口程序ZRGGBS00分析.

究竟自定义的Form例程是field exit,headerexit,line exit completeexit有系统参数c_exit_param_none, c_exit_param_fieldc_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只用于字段出口Fieldexit

  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.APPENDexits.表示增加该出口例程。

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,

     Z_PSTYEAR LIKE T009B-BDATJ,

     Z_PERLSTDAY LIKE SY-DATUM.

If bseg-hkont = ‘这填写您的业务招待费科目’.

BSEG-SGTXT = ‘业务招待费‘.For业务招待费用文本摘要.

Endif.

*如果期初发生上期的财务凭证过帐,则自动将过帐日期一律调整为上期期末最后一天.

*check posting dates period andfiscal year

CALL FUNCTIONDETERMINE_PERIOD

  EXPORTING

    DATE                      =BKPF-BUDAT

    VERSION                   =‘Z1′ “你的会计年度变式,国内多是K4

 IMPORTING

   PERIOD                    =Z_PSTPER

   YEAR                      =Z_PSTYEAR .

*check sysdates period andfiscal year

CALL FUNCTIONDETERMINE_PERIOD

  EXPORTING

    DATE                      =SY-DATUM

    VERSION                   =‘Z1′ “Fiscal Year Var.

 IMPORTING

   PERIOD                    =Z_CURPER

   YEAR                      =Z_CURYEAR.

*能否在输入的postingdate记帐让系统去判断.

CHECK Z_CURYEAR <> Z_PSTYEAR OR Z_PSTPER <> Z_CURPER.

*如posting date不在本期间得到其期间最后一天

Z_PSTPER = Z_PSTPER + 1 .

CALL FUNCTIONFIRST_DAY_IN_PERIOD_GET

  EXPORTING

    I_GJAHR              =Z_PSTYEAR

    I_PERIV              =‘Z1′

    I_POPER              =Z_PSTPER

 IMPORTING

   E_DATE               =  Z_PERLSTDAY.

*无论用户选择过帐到上期哪一天,都将过帐日期设置为最后一天

BKPF-BUDAT = Z_PERLSTDAY - 1 .

BKPF-MONAT= Z_PSTPER .

通过上面的业务我们可以看到,替代+用户出口能实现更复杂的业务,而这些业务通常是简单

的拖拽实现不了的,再举一个典型的有用的替代实例。

业务背景:

SAP中,供应商主数据的科目只有一个比如通常设置的是应付帐款,在SAP中,科目和中

国传统会计不一样,其科目是不强调层级的,比如应付帐款,国内ERP可能会带供应商项目

等几个核算项目,SAP采用另一种方式,它将供应商直接看成明细科目,从其主数据自动带

出应付帐款,如果还需要区分是什么项目的应付,则可采用统计内部订单或特殊总帐标志,

但是,在后勤发票校验(TcodeMIRO)时却不能使用特殊总帐标志。这样,比如企业从同

一供应商购买生产用材料(对应普通应付帐款)和项目材料(对应应付项目款)且需要从会

计科目上就直接区分时两种应付时就有点小麻烦。

一般的思路有这么些:

I.因为同一供应商主数据中只能有一个科目又不能特殊总帐标志,建议拆分成多个虚拟供应商来对应不同科目,此法严重违反编码唯一性原则,贼笨。

II.会计科目还是使用同一个应付帐款科目,附加一个字段比如文本/参考字段来区分同一供应商的不同应付,假设供应商还承包了你的在建项目有涉及应付劳务,如果仅用一个文本区分不严谨,也没有从科目上直接区分那样直观。

III.使用科目替代方式解决,直接从科目上区分不同应付款。

参考步骤如下:

a.SE16:V_T053定义行文本标志,其中ZNOR:MIRO 普通应付和ZPSC:MIRO 项目应付。

b.建立特殊总帐标志9表示应付项目款,并设置好应付项目款会计科目。

c.使用Only exit 出口替代,这样使用替代就直接从科目上就区分出了应付帐款类型,

参考代码如下表(参考使用,责任自负):

FORM U100 .

 DATA: IWA_T074 LIKE T074 ,

         I_ANS(1)  TypeC .

  Check ( SY-Tcode = ‘MIRO’ OR  SY-Tcode =‘MR8M’ )

    and BSEG-KOART = ‘K’ .  “检查是否为发票校验事务

  condense bseg-sgtxt .

*判断用户必须输入文本摘要而且MIRO/MR8M时只能是ZNORZPSC

  ifbseg-sgtxt <> ‘MIRO 普通应付‘  and  bseg-sgtxt <>’MIRO 项目应付‘.

    message E001(00) with ‘Choose ZNOR or ZPSC ‘.

  endif.

*如果文本输入应付项目款则从特殊总帐配置中读取应付项目款项目替代应付帐款

  if  bseg-sgtxt= ‘MIRO 项目应付‘ .

    I_ANS = ‘9′ .   “特殊总帐标志9表示应付项目款

    SELECT SINGLE * INTO IWA_T074 FROM T074

          WHEREKTOPL = ‘INT’

            ANDKOART = ‘K’

            ANDUMSKZ = I_ANS

            ANDHKONT = BSEG-HKONT .

    IF IWA_T074-HKONT NE SPACE.

      BSEG-HKONT =IWA_T074-HKONT.     “特殊总帐科目

      BSEG-UMSKZ = I_ANS.      “特别总帐标示

      BSEG-UMSKS = ‘A’.      “特别总帐事务类型,AWO

*SAP高度集成替代必须考虑其它模块影响,替代同时也替代特殊总帐的计划层次。

      BSEG-FDLEV = IWA_T074-EBENE . 特殊总帐计划层次,如果启动CBM

      BSEG-BSCHL+1(1) = ‘9′ .   “记账码的第一码

    ENDIF.

  endif .

  endform.                                  

为什么你的替代不起作用?

替代不起作用通常有两个原因:

一.系统默认不允许你替代该字段内容。

SAP将所有的允许字段退代关系维护在GB01表中,如果该表中没有出现你的替代字段,你是不能替代的,比如会计科目BSEG-HKONT通常是不允许替代的,你就需要在此表增加。

二.替代程序需要重新自动编译。

在一些特殊情况下,你发现你的ValidatonSubstitution都不起作用了,SE38运行程

RGUGBR00| RGUGBR00将能选的项目全选上手工重新编译就行。

替代如何工作?

相关表格:

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|GBTDMFI0| GBTDMFIJ|RGUGBR00|RGUGBR00|GBTDMFIJ|GBTDMFIG|MF05AIENJ

 

sub4

在会计凭证的主程序SAPMF05A的子例程MF05AIENJ,Moduledocument_merge INPUT是检查和替代的处理入口,

简单理解, 系统将用户自屏幕上输入的信息首先保存在一些临时内表中,当通过所有的业务检查时最后保存到数据库,替代则是根据用户设置的条件去退换掉内表的一些临时内容从而保存到一些字段内容最终保存到数据库时是用户替换的内容。在叙述SAP增强时会详细描述这个机制。

 

SAP所有模块的替代字段都由表GB01控制。

所谓release fields forsubstitution,就是在对应的BOOLCLASS中添加该字段,或者将该字段的GB01-BEXCLUDE = X’改为GB01-BEXCLUDE=‘。

BOOLCLASSBoolean class)对于FI/COBOOLCLASS对应的是调用点:

BOOLCLASS= 008 at callup point 1

  BOOLCLASS= 009 at callup point 2

  BOOLCLASS= 015 at callup point 3

对于调用点3SAP缺省的是未激活即release所以的字段,因为有如下entries

BOOLCLASSCLASSTYPE BCLTAB     BCLFIELD   BEXCLUDE

15       S        BKPF       *        X

15       S        BSEG       *        X

所以,你会得到如此信息-”此事件可以不替换任何字段”。

解决步骤如下:

1.确认你已经阅读并了解Note 42615- Substitution in FI391309 -GB01 Boolean class 015: FI subst. for call-up point 3

2.尝试你需要替代的字段是否可以在调用点12实现。

3.如果step2 failed,修改表BG01,删除相应记录:

如果是抬头字段,删除“15 S BKPF * X”,添加所需字段;

如果是行项字段,删除“15 S BSEG * X”,添加所需字段。

由于表GB01不可(通过配置)修改,你需要写一段小程序完成以上修改。

4.运行程序RGUGBR00重新激活替代。

5.重新维护OBBH

更改GB01程序的源代码:

REPORTZUPDATE_SKB1 .

PARAMETERS:P_BOOLCL LIKE GB01-BOOLCLASS OBLIGATORY,

           P_CLASST LIKE GB01-CLASSTYPE OBLIGATORY,

           P_BCLTAB LIKE GB01-BCLTAB OBLIGATORY,

           P_BCLFIE LIKE GB01-BCLFIELD OBLIGATORY.

DATA:IT_GB01 LIKE TABLE OF GB01 WITH HEADER LINE.

SELECT*

FROMGB01

INTOTABLE IT_GB01

WHEREBOOLCLASS = P_BOOLCL

AND  CLASSTYPE = P_CLASST

AND  BCLTAB    = P_BCLTAB

AND  BCLFIELD  = P_BCLFIE.

LOOPAT IT_GB01.

 IT_GB01-BEXCLUDE = ‘ ‘.

 MODIFY IT_GB01.

ENDLOOP.

MODIFYGB01 FROM TABLE IT_GB01.

COMMITWORK AND WAIT.

WRITE: /DONE!.

标签exitsubstitution

归类于 FIabapfunctionsap enhancement摘录知识积累 | 1篇评论 »

采购订单价格及其发票校验权限控制的实现

星期三, 08 19th,2009

本文的主要目的是实现采购订单价格信息维护以及估价标识维护的权限控制,并保证估价订单行项目不能够做发票校验。

1.         创建权限对象zpuordcon,用来进行订单价格信息维护和估价标识维护的权限检查

2.      functiongroup V69A的屏幕6201PBOMODULE FELDAUSWAHL中找到user exituserexit_field_modification,插入如下代码: 

AUTHORITY-CHECKOBJECT ‘ZPUORDCON’

ID‘ACTVT’ FIELD ‘16′.

CHECKsy-subrc <> 0.

IFSCREEN-INPUT = ‘1′.

SCREEN-INPUT= ‘0′.

ENDIF.

但用户没有权限时,将可输入的字段改为不可输入

同样在屏幕6201PAI MODULEkondition_pruefen中找到user exituserexit_pricing_check加入如下代码:

AUTHORITY-CHECKOBJECT ‘ZPUORDCON’

ID‘ACTVT’ FIELD ‘16′.

CHECKsy-subrc <> 0.

MESSAGEE832(ZBRIL).

当用户没有权限是,如果用户在价格条件的tablecontrol中输入值时则报error message。

3.         在函数组MEGUI的屏幕1325中,双击module event_pbo,然后双击call_viewmethod handle event然后双击method PBO,然后双击methodiniti_control,加入如下代码:

  IFsy-dynnr = ‘1325′.

    LOOP AT SCREEN.

      IF SCREEN-NAME = ‘MEPO1325-SCHPR’.

        AUTHORITY-CHECK OBJECT ‘ZPUORDCON’

                 ID ‘ACTVT’ FIELD ‘16′.

        IF sy-subrc <> 0.

          SCREEN-INPUT = ‘0′.

          MODIFY SCREEN.

        ENDIF.

      ENDIF.

    ENDLOOP.

  ENDIF.当用户没有估价标志的维护权限时,则将其改为不可输入。

通过创建项目,激活增强LMR1M004,在其中加入如下代码:

 IF TAB_DRSEG-SELKZ = ‘X’ ANDTAB_DRSEG-SCHPR = ‘X’.

    MESSAGE e831(zbril) WITH TAB_DRSEG-ebelnTAB_DRSEG-ebelp

                             TAB_DRSEG-MATNR.

 ENDIF.

当用户对估价的订单行项目做发票校验时,则会报error message,发票校验无法通过。曾经尝试通过badi INVOICE_UPDATECHANGE_BEFORE_UPDATE来校验,但是这样的报error message后就会退出失误,不够理想,故改为使用customer exit的方式。不过可以在badi INVOICE_UPADATECHANGE_AT_SAVE中加入下面代码校验:

methodIF_EX_INVOICE_UPDATE~CHANGE_AT_SAVE.

  DATA:wa_mrmrseg LIKE LINE OF ti_rseg_new,

        flag TYPE c,

        v_schpr TYPE schpr.

  LOOPAT ti_rseg_new INTO wa_mrmrseg.

    SELECT SINGLE schpr INTO v_schpr

                        FROM ekpo

                       WHERE ebeln = wa_mrmrseg-ebeln AND

                             ebelp = wa_mrmrseg-ebelp.

    IF v_schpr = ‘X’.

      flag = ‘X’.

      EXIT.

    ENDIF.

  ENDLOOP.

  IFflag = ‘X’.

    MESSAGE e831(zbril) WITH wa_mrmrseg-ebelnwa_mrmrseg-ebelp.

  ENDIF.

endmethod.

归类于 MMPURCHASEabapfunctionsap enhancement | 没有评论 »

采购订单价格及其发票校验权限控制的实现

星期六, 08 15th,2009

本文的主要目的是实现采购订单价格信息维护以及估价标识维护的权限控制,并保证估价订单行项目不能够做发票校验。

1.         创建权限对象zpuordcon,用来进行订单价格信息维护和估价标识维护的权限检查

2.      functiongroup V69A的屏幕6201PBOMODULE FELDAUSWAHL中找到user exituserexit_field_modification,插入如下代码: 

AUTHORITY-CHECKOBJECT ‘ZPUORDCON’

ID‘ACTVT’ FIELD ‘16′.

CHECKsy-subrc <> 0.

IFSCREEN-INPUT = ‘1′.

SCREEN-INPUT= ‘0′.

ENDIF.

但用户没有权限时,将可输入的字段改为不可输入

同样在屏幕6201PAI MODULEkondition_pruefen中找到user exituserexit_pricing_check加入如下代码:

AUTHORITY-CHECKOBJECT ‘ZPUORDCON’

ID‘ACTVT’ FIELD ‘16′.

CHECKsy-subrc <> 0.

MESSAGEE832(ZBRIL).

当用户没有权限是,如果用户在价格条件的tablecontrol中输入值时则报error message。

3.         在函数组MEGUI的屏幕1325中,双击module event_pbo,然后双击call_viewmethod handle event然后双击method PBO,然后双击methodiniti_control,加入如下代码:

  IFsy-dynnr = ‘1325′.

    LOOP AT SCREEN.

      IF SCREEN-NAME = ‘MEPO1325-SCHPR’.

        AUTHORITY-CHECK OBJECT ‘ZPUORDCON’

                 ID ‘ACTVT’ FIELD ‘16′.

        IF sy-subrc <> 0.

          SCREEN-INPUT = ‘0′.

          MODIFY SCREEN.

        ENDIF.

      ENDIF.

    ENDLOOP.

  ENDIF.当用户没有估价标志的维护权限时,则将其改为不可输入。

通过创建项目,激活增强LMR1M004,在其中加入如下代码:

 IF TAB_DRSEG-SELKZ = ‘X’ ANDTAB_DRSEG-SCHPR = ‘X’.

    MESSAGE e831(zbril) WITH TAB_DRSEG-ebelnTAB_DRSEG-ebelp

                             TAB_DRSEG-MATNR.

 ENDIF.

当用户对估价的订单行项目做发票校验时,则会报error message,发票校验无法通过。曾经尝试通过badi INVOICE_UPDATECHANGE_BEFORE_UPDATE来校验,但是这样的报error message后就会退出失误,不够理想,故改为使用customer exit的方式。不过可以在badi INVOICE_UPADATECHANGE_AT_SAVE中加入下面代码校验:

methodIF_EX_INVOICE_UPDATE~CHANGE_AT_SAVE.

  DATA:wa_mrmrseg LIKE LINE OF ti_rseg_new,

        flag TYPE c,

        v_schpr TYPE schpr.

  LOOPAT ti_rseg_new INTO wa_mrmrseg.

    SELECT SINGLE schpr INTO v_schpr

                        FROM ekpo

                       WHERE ebeln = wa_mrmrseg-ebeln AND

                             ebelp = wa_mrmrseg-ebelp.

    IF v_schpr = ‘X’.

      flag = ‘X’.

      EXIT.

    ENDIF.

  ENDLOOP.

  IFflag = ‘X’.

    MESSAGE e831(zbril) WITH wa_mrmrseg-ebelnwa_mrmrseg-ebelp.

  ENDIF.

endmethod.

标签abapBADIPRICE CONDITIONPURCHASE ORDERUSER EXIT

归类于 MMPURCHASEfunctionsap enhancement | 没有评论 »

field symbol动态分配的妙用:在出口中访问其他程序中字段的值

星期五, 08 14th,2009

  field symbol动态分配的妙用:在出口中访问其他程序中字段的值收藏

DATA:LV_AUTH LIKE USRBF2-AUTH.

DATA:LV_VON  LIKE UST12-VON.

*{  INSERT        PRDK900214                                       1

DATA:lv_zuonr TYPE dzuonr.

FIELD-SYMBOLS:<fs_zuonr> TYPE dzuonr,

              <fs_prctr> TYPE prctr.

DATA: c_invfo(21) TYPE c VALUE(SAPLFDCB)INVFO-ZUONR.

DATA:c_alloc_num(17) TYPE c VALUE

                     ‘(ZPCFIE08)P_PRCTR’.

 ASSIGN (c_invfo) TO <fs_zuonr>.

 IF sy-subrc = 0.

   lv_zuonr = <fs_zuonr>.

 ELSE.

   ASSIGN (c_alloc_num) TO <fs_prctr>.

   IF sy-subrc = 0.

     lv_zuonr = <fs_prctr>.

   ENDIF.

 ENDIF.

标签ABAP FIELSYMBOL USEREXIT

归类于 abapsap enhancement | 没有评论 »

采购订单维护condition的权限控制

星期三, 08 12th,2009

为了实现只有制定的采购员才能维护采购订单的condition即价格信息,有两种方式可以实现:

1.spro中物料管理-〉采购-〉定义采购员的功能权限,然后在su01中维护用户的parameter:EFB即可,这种方式可以达到控制condition输入的目的,但是缺陷是用户的个人parameter是可以更改的,控制不够严谨。

2.第二种方式是自定义权限对象,在condition屏幕的userexit中加入权限控制代码来实现,主要步骤如下:

创建自定义权限对象zpurordcon

在函数组V69A的屏幕06201PBOMODULE FELDAUSWAHLuser exituserexit_field_modification,加入下面的代码:

AUTHORITY-CHECK OBJECTZPUORDCON

IDACTVT FIELD16′.

CHECKsy-subrc 0.

IF SCREEN-INPUT =1′.

SCREEN-INPUT =0′.

ENDIF.

即可,这样就可以通过维护role,来实现condition修改的权限控制。

原创粉丝点击