本文ATP的增强(EXIT_SAPLATPC_002)会在订单,出库单的程序中被调用,我们可能希望读取这些程序的变量的数据,我们就可以通过FIELD-SYMBOLS来完成,具体参见下面的代码样例:
TABLES: y0000ca_userexit. "allready declaredDATA: c_programm LIKE y0000ca_userexit-yprogramm.
DATA: c_funcname LIKE y0000ca_userexit-yfuncname.
DATA: w_programm LIKE y0000ca_userexit-yprogramm.
DATA: w_funcname LIKE y0000ca_userexit-yfuncname.
DATA: w_active LIKE y0000ca_userexit-yactive.
DATA: w_subrc LIKE sy-subrc.
DATA: w_mandt LIKE sy-mandt.
DATA: function_name LIKE y0000ca_userexit-yfuncname.
DATA: wt_unit_params LIKE y0000ca_exit_params OCCURS 0.
DATA: wa_unit_params LIKE y0000ca_exit_params.
DATA: w_subp(30) TYPE c.
DATA: w_prog TYPE sy-repid VALUE 'ZXATPU02'.
DATA: lv_kunnr TYPE kna1-kunnr.
DATA: lv_vkorg TYPE tvko-vkorg.
DATA: lv_vtweg TYPE tvtw-vtweg.
DATA: lt_xvbpa TYPE vbpavb_tab.
FIELD-SYMBOLS:
<fs_vbak> TYPE vbak,
<fs_likp> TYPE likp,
<fs_lips> TYPE lips,
<fs_xvbpa> TYPE vbpavb_tab.
*** ATTENTION:
*** THIS exit is also called from purchasing
*** (e.g. in stock transfer orders - doc type UB)
*** However, there (SAPMV45A)VBAK is not defined ...
*** and consequently the assign was not sucessful -->
*** THIS implementation only works when coming from
*** sales order processing / delivery processing.
CASE t_atpcsx-vbtyp.
WHEN 'C' OR 'I'. "standard order / FoC
ASSIGN ('(SAPMV45A)VBAK') TO <fs_vbak>.
IF <fs_vbak> IS ASSIGNED.
lv_vkorg = <fs_vbak>-vkorg.
lv_vtweg = <fs_vbak>-vtweg.
lv_kunnr = <fs_vbak>-kunnr.
UNASSIGN <fs_vbak>.
ENDIF.
*** get partners and transfer to local table.
ASSIGN ('(SAPMV45A)XVBPA[]') TO <fs_xvbpa>.
IF <fs_xvbpa> IS ASSIGNED.
lt_xvbpa = <fs_xvbpa>.
UNASSIGN <fs_xvbpa>.
ENDIF.
WHEN 'J'. "Delivery
ASSIGN ('(SAPMV50A)VBAK') TO <fs_vbak>.
IF <fs_vbak> IS ASSIGNED.
lv_vkorg = <fs_vbak>-vkorg.
lv_vtweg = <fs_vbak>-vtweg.
lv_kunnr = <fs_vbak>-kunnr.
UNASSIGN <fs_vbak>.
ENDIF.
*** second attempt:
IF lv_vkorg IS INITIAL.
ASSIGN ('(SAPMV50S)VBAK') TO <fs_vbak>.
IF <fs_vbak> IS ASSIGNED.
lv_vkorg = <fs_vbak>-vkorg.
lv_vtweg = <fs_vbak>-vtweg.
lv_kunnr = <fs_vbak>-kunnr.
UNASSIGN <fs_vbak>.
ENDIF.
ENDIF.
*** third attempt:
IF lv_vkorg IS INITIAL.
ASSIGN ('(SAPMV50A)LIKP') TO <fs_likp>.
IF <fs_likp> IS ASSIGNED.
lv_vkorg = <fs_likp>-vkorg.
lv_kunnr = <fs_likp>-kunag.
UNASSIGN <fs_likp>.
ENDIF.
ENDIF.
*** fourth attempt:
IF lv_vkorg IS INITIAL.
ASSIGN ('(SAPMV50S)LIKP') TO <fs_likp>.
IF <fs_likp> IS ASSIGNED.
lv_vkorg = <fs_likp>-vkorg.
lv_kunnr = <fs_likp>-kunag.
UNASSIGN <fs_likp>.
ENDIF.
ENDIF.
*** Also check VTWEG:
IF lv_vtweg IS INITIAL.
ASSIGN ('(SAPMV50A)LIPS') TO <fs_lips>.
IF <fs_lips> IS ASSIGNED.
lv_vtweg = <fs_lips>-vtweg.
UNASSIGN <fs_lips>.
ENDIF.
ENDIF.
*** still check... VTWEG
IF lv_vtweg IS INITIAL.
ASSIGN ('(SAPMV50S)LIPS') TO <fs_lips>.
IF <fs_lips> IS ASSIGNED.
lv_vtweg = <fs_lips>-vtweg.
UNASSIGN <fs_lips>.
ENDIF.
ENDIF.
*** get partners and transfer to local table.
*** First attempt - online (SAPMV50A)
ASSIGN ('(SAPMV50A)XVBPA[]') TO <fs_xvbpa>.
IF <fs_xvbpa> IS ASSIGNED.
lt_xvbpa = <fs_xvbpa>.
UNASSIGN <fs_xvbpa>.
ENDIF.
*** Second attempt - Background (SAPMV50S)
IF lt_xvbpa[] IS INITIAL.
ASSIGN ('(SAPMV50S)XVBPA[]') TO <fs_xvbpa>.
IF <fs_xvbpa> IS ASSIGNED.
lt_xvbpa = <fs_xvbpa>.
UNASSIGN <fs_xvbpa>.
ENDIF.
ENDIF.
ENDCASE.
IF lv_vkorg IS NOT INITIALAND lv_vtweg IS NOT INITIAL.
*** This is only executed when field symbol assigned !!
** 1. step generally activated ?
c_programm = 'ZXATPU02'.
c_funcname = 'EXIT_SAPLATPC_002'.
*** check whether the user exit is activated for this client:
CALL FUNCTION 'Y_0000CA_CHECK_USEREXIT'
EXPORTING
pi_programm = c_programm
pi_funcname = c_funcname
IMPORTING
pe_programm = w_programm
pe_funcname = w_funcname
pe_active = w_active
pe_subrc = w_subrc.
*** if userexit is active execute it.
IF ( w_active <> ' ' ) AND ( w_subrc = 0 ).
w_mandt = sy-mandt. w_mandt+2(1) = '0'.
** 2. Step
*----------------------------------------------------------------------*
* new: fill parameter table for organizational units
*----------------------------------------------------------------------*
function_name = 'EXIT_SAPLATPC_002'.
CLEAR wt_unit_params. REFRESH wt_unit_params.
wa_unit_params-unit = 'VKORG'.
wa_unit_params-value = lv_vkorg.
APPEND wa_unit_params TO wt_unit_params.
*----------------------------------------------------------------------*
* read table Y0000CA_EXIT_EXT extended exit control
*----------------------------------------------------------------------*
CALL FUNCTION 'Y_0000CA_CHECK_EXIT_EXT'
EXPORTING
pi_funcname = function_name
IMPORTING
pe_programm = w_programm
pe_funcname = w_funcname
pe_active = w_active
pe_subrc = w_subrc
TABLES
pt_unit_params = wt_unit_params.
*----------------------------------------------------------------------*
* if userexit is active execute it
*----------------------------------------------------------------------*
IF ( w_subrc = 0 ) AND ( w_active <> ' ' ).
CONCATENATE: 'Y0000SD_' w_programm '_BMENG_ROUNDING' INTO w_subp,
'Y0000SD_' w_programm '_ZXATPU02' INTO w_prog.
PERFORM (w_subp) IN PROGRAM (w_prog) IF FOUND
TABLES
t_atpcsx " STRUCTURE ATPCS
t_mdvex " STRUCTURE MDVE
USING
lv_vkorg " TYPE tvko-vkorg
lv_vtweg " TYPE tvtw-vtweg
lv_kunnr " TYPE knvv-kunnr
CHANGING
p_atpcc " TYPE ATPCC OPTIONAL
lt_xvbpa. " TYPE vbpavb_tab
ENDIF.
ENDIF.
ENDIF.