如何動態地呼叫沒有引用的其他程式的記憶體變數資料的樣例?

JackWu發表於2018-02-24

本文ATP的增強(EXIT_SAPLATPC_002)會在訂單,出庫單的程式中被呼叫,我們可能希望讀取這些程式的變數的資料,我們就可以通過FIELD-SYMBOLS來完成,具體參見下面的程式碼樣例:

TABLESy0000ca_userexit"allready declared
DATAc_programm     LIKE y0000ca_userexit-yprogramm.
DATAc_funcname     LIKE y0000ca_userexit-yfuncname.
DATAw_programm     LIKE y0000ca_userexit-yprogramm.
DATAw_funcname     LIKE y0000ca_userexit-yfuncname.
DATAw_active       LIKE y0000ca_userexit-yactive.
DATAw_subrc        LIKE sy-subrc.
DATAw_mandt        LIKE sy-mandt.
DATAfunction_name  LIKE y0000ca_userexit-yfuncname.
DATAwt_unit_params LIKE y0000ca_exit_params OCCURS 0.
DATAwa_unit_params LIKE y0000ca_exit_params.
DATAw_subp(30)     TYPE c.
DATAw_prog         TYPE sy-repid VALUE 'ZXATPU02'.
DATAlv_kunnr       TYPE kna1-kunnr.
DATAlv_vkorg       TYPE tvko-vkorg.
DATAlv_vtweg       TYPE tvtw-vtweg.
DATAlt_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 ).
    w_mandt sy-mandtw_mandt+2(1'0'.
** 2. Step
*----------------------------------------------------------------------*
*  new: fill parameter table for organizational units
*----------------------------------------------------------------------*
    function_name 'EXIT_SAPLATPC_002'.
    CLEAR wt_unit_paramsREFRESH 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 AND w_active <> ' ' ).
      CONCATENATE'Y0000SD_' w_programm '_BMENG_ROUNDING' INTO w_subp,
                   'Y0000SD_' w_programm '_ZXATPU02'       INTO w_prog.
      PERFORM (w_subpIN PROGRAM (w_progIF 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.



相關文章