BADI 入门篇


1.1 BADIs
  
  BADI Name
  /KJEPS/BADI2
  Description
  BADI for change visibility of EPS fields
  Dev. Class
  /KJEPS/JD
  
  
  1.1.1 Method SET_SCREEN_COND_VBAP
  Overview:
  Method Name
  SET_SCREEN_COND_VBAP
  Description
  Change field visibility for Sales order item screen
  Function
  Called from PBO module of SAPMV45A 8450 and return EX_SCREEN_VISIBLE
  
  
  Interface:
  Importing Parameters
  Field Name
  Reference
  Description
  Mandatory
  IN_VBAK
  VBAK
  Sales Order Header
  X
  IN_VBAP
  VBAP
  Processing Sales Order Item
  
  
  IN_TRTYP
  TRTYP
  Transaction type
  
  
  IN_XVBAP
  VA_VBAPVB_T
  Document Structure for XVBAP/YVBAP (Sales order item)
  
  
  IN_XVBEP
  VA_VBEPVB_T
  Structure of Document for XVBEP/YVBEP (schedule line)
  
  
  IN_XVBKD
  VA_VBKDVB_T
  Reference structure for XVBKD/YVBKD (business data)
  
  
  IN_XVBPA
  VA_VBPAVB_T
  (partner function)
  
  
  
  Changing Parameters
  Field Name
  Reference
  Description
  Mandatory
  EX_SCREEN_VISIBLE
  C
  ‘X’ = EPS screen is visible
  Space = EPS screen is not visible
  
  
  以上一个是BADI的定义, 那么什么是BADI呢, 说土点就是现在你定义个接口类,但是这个接口
  类有一些方法,但是这些方法都是空的,这些方法也有都自己的IMPORTING ,EXPORTING,
  CHANING参数.但是这些方法没有被实现, 而你却还要在自己当前写的程序中去调用这个
  没有被实现的方法, 这里就出现了一堆问题,
  
  
  为什么要调用它?
  为什么这个BADI是空的?
  为什么要做这样的一个空的东西?
  下面将回答这些问题, 因为比较偷懒所以没找到比较好的例子, 以下是一个SAP的业务场景:
   SALES ORDER的ITEM数据行的DETAIL信息, SAP系统给客户留了一个BADI, 这个
  BADI被系统的标准程序调用过, 显示一个SUBSCREEN, 里面包含一些信息, 如下:

  如果某个用户实施了SAP的产品,不希望出现这个SUBSCREEN的话, 客户想把这个屏幕给隐
  藏掉, 所以给客户预留了一个BADI的DEFINITION. 也就是最上面的那个表.
  使用SE18可以看到这个定义.  
  
  
  这三个方法在标准的程序中是怎么被调用的.
  以下是系统标准程序
  ************************************************************************************
  *Define class load
  class cl_exithandler definition load.
  
  
  *Define the Sales Order Control Table instance
   data: lds_soctrl type /kjeps/soctrl,
   ldf_screen_visible(1) type C value space,
   ldf_pre_existing type c,
   exit type ref to /KJEPS/IF_EX_BADI2,
   ldf_badi_name type exit_def value '/KJEPS/BADI2'.
  
  
  *Check the BADI whether was implemented.
  *检查BADI是否被用户给实现过了,传入BADI的定义名字和接口类名
   CALL METHOD CL_EXITHANDLER=>GET_INSTANCE
   EXPORTING
   EXIT_NAME = ldf_badi_name
   NULL_INSTANCE_ACCEPTED = space
   IMPORTING
   ACT_IMP_EXISTING = ldf_pre_existing
   CHANGING
   INSTANCE = exit.
  
  
  *IF the BADI has implemented, and then call corresponding method.
  *如果这个BADI被用户实现了,下面的这个参数会等于’X’
  *如果实现了,就调用客户实现的方法.
   if ldf_pre_existing = gcf_on.
   CALL METHOD EXIT->SET_SCREEN_COND_VBAP
   EXPORTING
   IN_VBAK = vbak
   IN_VBAP = vbap
   IN_TRTYP = t180-trtyp
   IN_XVBAP = xvbap[]
   IN_XVBEP = xvbep[]
   IN_XVBKD = xvbkd[]
   IN_XVBPA = xvbpa[]
   CHANGING
   EX_SCREEN_VISIBLE = ldf_screen_visible.
   endif.
  
  
   if ldf_screen_visible = space.
   loop at screen.
   screen-active = '0'.
   modify screen.
   endloop.
   endif.
  ************************************************************************************
  
  
  那么这里客户如何是实现这个BADI的DEFINITION呢,使用SE19


  
  其中的SET_SCREEN_COND_VBAP被实现了,把SUBSCREEN的显示的一个变量清除了.
  这就表示,用户不想看见那个显示数据的SUBSCREEN, 然后看上面的系统中的程序. 执行到
  这里的时候会判断这个变量是否被用户的程序给修改了,如果修改了就不显示SUBSCREEN了.
  *******************************************************************
   if ldf_screen_visible = space.
   loop at screen.
   screen-active = '0'.
   modify screen.
   endloop.
   endif.
  *******************************************************************

你可能感兴趣的:(BADI 入门篇)