进销存价格查找

通过

MATNR MATNR CHAR 40 0 物料编号
BWKEY BWKEY CHAR 4 0 估价范围

找到CKMLHD-KALNR

ps:mlit表也有成本估算编号KALNR。

再通过CKMLHD-KALNR -> CKMLCR期间价格

付:

*&---------------------------------------------------------------------*
*& Report ZMMR015E
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmmr015e.

INCLUDE zmm015e_head.
INCLUDE zmm015e_screen.
INCLUDE zmm015e_form.

AT SELECTION-SCREEN.
  PERFORM: frm_check_auth.

START-OF-SELECTION.
  PERFORM frm_get_data.
  PERFORM frm_change_data.

END-OF-SELECTION.
  PERFORM f_display_data.

ZMM015E_HEAD包含文件:

*&---------------------------------------------------------------------*
*& 包含               ZMM015E_HEAD
*&---------------------------------------------------------------------*
TABLES:mara,matdoc.

TYPESBEGIN OF sy_output,
         key1      TYPE matdoc-key1,
         key2      TYPE matdoc-key2,
         key3      TYPE matdoc-key3,
         key4      TYPE matdoc-key4,
         key5      TYPE matdoc-key5,
         key6      TYPE matdoc-key6,
         matnr     TYPE matdoc-matnr,      "物料
         maktx     TYPE makt-maktx,        "物料描述
         werks     TYPE matdoc-werks,
         lgort_sid TYPE matdoc-lgort_sid,  "仓位
         lgobe     TYPE t001l-lgobe,       "仓位描述
         konts     TYPE t030-konts,        "科目
         txt50     TYPE skat-txt50,        "科目描述
         mtart     TYPE mara-mtart,        "物料类型
         mtbez     TYPE t134t-mtbez,       "物料类型描述
         matkl     TYPE mara-matkl,        "物料组
         wgbez     TYPE t023t-wgbez,       "物料组描述
         extwg     TYPE mara-extwg,        "外部物料组
         meins     TYPE matdoc-meins,      "基本计量单位
         waers     TYPE matdoc-waers,      "货币码
         menge     TYPE matdoc-menge,      "数量
         gjahr     TYPE matdoc-gjahr,
         dmbtr     TYPE matdoc-dmbtr"zdanjia,      "金额
         mblnr     TYPE matdoc-mblnr,      "物料凭证编号
         lifnr_sid TYPE matdoc-lifnr_sid,  "供应商
         stock_qty TYPE matdoc-stock_qty,  "库存数量
         shkzg     TYPE matdoc-shkzg,      "借/贷标识
         CPUDT     TYPE matdoc-budat,      "会计凭证输入日期
         bwart     TYPE matdoc-bwart,

         zqcsl     TYPE matdoc-menge,      "期初数量
         zqcje     TYPE matdoc-dmbtr,      "期初金额
         zrksl     TYPE matdoc-menge,      "本期入库数量
         zrkje     TYPE matdoc-dmbtr,      "本期入库金额
         zcksl     TYPE matdoc-menge,      "本期出库数量
         zckje     TYPE matdoc-dmbtr,      "本期出口金额
         zqmsl     TYPE matdoc-menge,      "期末数量
         zqmje     TYPE matdoc-dmbtr,      "期末金额
         dmbtr2    TYPE p DECIMALS 8"zdanjia,      "金额

         slbox,
       END OF sy_output.

DATA: gt_output  TYPE STANDARD TABLE OF sy_output,
      gs_output  TYPE sy_output,
      gt_output2 TYPE STANDARD TABLE OF sy_output,
      gs_output2 TYPE sy_output,
      gt_output3 TYPE STANDARD TABLE OF sy_output,
      gs_output3 TYPE sy_output.
DATA: gs_layout   TYPE lvc_s_layo,
      gt_fieldcat TYPE lvc_t_fcat.
DATA: lt_output  TYPE STANDARD TABLE OF sy_output,
      lt_output2 TYPE STANDARD TABLE OF sy_output.

ZMM015E_SCREEN包含文件:

*&---------------------------------------------------------------------*
*& 包含               ZMM015E_SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN:BEGIN OF BLOCK blk1 WITH FRAME  TITLE TEXT-001.
PARAMETERS:p_werks LIKE matdoc-werks DEFAULT '1000'.

SELECT-OPTIONS: s_budat FOR matdoc-budat OBLIGATORY DEFAULT sy-datum,
                s_lgort FOR matdoc-lgort_sid,
                s_mtart FOR mara-mtart,
                s_matkl FOR mara-matkl,
                s_matnr FOR mara-matnr.

SELECTION-SCREEN END OF BLOCK blk1.

ZMM015E_FORM包含文件:

*&---------------------------------------------------------------------*
*& 包含               ZMM015E_FORM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  DATA: p_datumh TYPE sy-datum,
        p_datuml TYPE sy-datum.
  READ TABLE s_budat INDEX 1.
  IF sy-subrc EQ 0.
    IF s_budat-high IS NOT INITIAL.
      p_datumh = s_budat-high.
      p_datuml = s_budat-low.
    ELSE.
      p_datumh = s_budat-low.
      p_datuml = s_budat-low.
    ENDIF.
  ENDIF.
  SELECT matdoc~key1
         matdoc~key2
         matdoc~key3
         matdoc~key4
         matdoc~key5
         matdoc~key6
         matdoc~matnr
         matdoc~werks
         matdoc~lgort_sid
         matdoc~meins
         matdoc~waers
         matdoc~menge
         matdoc~dmbtr
         matdoc~mblnr
         matdoc~lifnr_sid
         matdoc~stock_qty
         matdoc~shkzg
         matdoc~cpudt
         matdoc~gjahr
         matdoc~bwart
         mara~mtart "物料类型
         mara~matkl "
         mara~extwg
    INTO CORRESPONDING FIELDS OF TABLE gt_output2
    FROM matdoc JOIN mara ON matdoc~matnr EQ mara~matnr
   WHERE matdoc~werks EQ p_werks
     AND matdoc~matnr IN s_matnr
     AND matdoc~cpudt LE p_datumh
     AND matdoc~lgort IN s_lgort
     AND mara~matkl IN s_matkl
     AND mara~mtart IN s_mtart.

  lt_output[] = gt_output2[].
  SORT lt_output[] BY matnr.
  DELETE ADJACENT DUPLICATES FROM lt_output COMPARING matnr.

  CHECK lt_output[] IS NOT INITIAL.
**通过 物料/工厂/评估类型->ckmlhd-kalnr
  SELECT belnr,kjahr,posnr,matnr,bwkey,bwtar,kalnr
    INTO TABLE @DATA(lt_mlit)
    FROM mlit
    FOR ALL ENTRIES IN @lt_output
    WHERE matnr = @lt_output-matnr
      AND bwkey EQ @p_werks.
  SORT lt_mlit[] BY matnr bwkey kalnr.
  DELETE ADJACENT DUPLICATES FROM lt_mlit[] COMPARING matnr bwkey kalnr.
  IF lt_mlit[] IS NOT INITIAL.
    SELECT kalnr,bdatj,poper,untper,curtp,peinh,vprsv,stprs,pvprs,salk3
      INTO TABLE @DATA(lt_ckmlcr)
      FROM ckmlcr
      FOR ALL ENTRIES IN @lt_mlit
      WHERE kalnr = @lt_mlit-kalnr.
    SORT lt_ckmlcr[] BY kalnr bdatj poper.
  ENDIF.

*按上次物料凭证对应的FI凭证,计算的单价,作为最新的单价,来计算没有价格的物料凭证
  SORT gt_output2[] BY matnr werks lgort_sid cpudt.
*  SORT gt_output2[] BY matnr werks budat.
  DATA: ls_indmbtr TYPE sy_output.
*        lt_indmbtr TYPE sy_output.
  LOOP AT gt_output2 ASSIGNING FIELD-SYMBOL(<ls_input>).

    IF <ls_input>-dmbtr EQ 0.
*      IF ls_indmbtr-matnr EQ <ls_input>-matnr AND ls_indmbtr-werks EQ <ls_input>-werks AND ls_indmbtr-dmbtr2 NE 0 AND ls_indmbtr-lgort_sid = <ls_input>-lgort_sid AND <ls_input>-cpudt+0(6) EQ ls_indmbtr-cpudt+0(6).
*        <ls_input>-dmbtr2 = ls_indmbtr-dmbtr2.
*        <ls_input>-dmbtr = abs( <ls_input>-dmbtr2 * <ls_input>-stock_qty ).
*      ELSE.
      READ TABLE lt_mlit INTO DATA(ls_mlitWITH KEY matnr = <ls_input>-matnr
                                                     bwkey = <ls_input>-werks.
      IF sy-subrc EQ 0.
        READ TABLE lt_ckmlcr INTO DATA(ls_ckmlcrWITH KEY kalnr = ls_mlit-kalnr
                                                           bdatj = <ls_input>-gjahr
                                                           poper = <ls_input>-cpudt+4(2BINARY SEARCH.
        IF sy-subrc EQ 0.
          IF ls_ckmlcr-peinh IS NOT INITIAL.
            IF ls_ckmlcr-vprsv EQ 'S'"标准
              <ls_input>-dmbtr2 = ls_ckmlcr-stprs / ls_ckmlcr-peinh.
            ELSE.
              <ls_input>-dmbtr2 = ls_ckmlcr-pvprs / ls_ckmlcr-peinh.
            ENDIF.
          ELSE.
*          IF ls_ckmlcr-vprsv EQ 'S'. "标准
*            <ls_input>-dmbtr = ls_ckmlcr-stprs.
*          ELSE.
*            <ls_input>-dmbtr = ls_ckmlcr-pvprs.
*          ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
      <ls_input>-dmbtr abs( <ls_input>-dmbtr2 * <ls_input>-stock_qty ).
*      ENDIF.
*   ELSE.
*      CLEAR ls_indmbtr.
*      ls_indmbtr-matnr = <ls_input>-matnr.
*      ls_indmbtr-werks = <ls_input>-werks.
*      ls_indmbtr-lgort_sid = <ls_input>-lgort_sid.
*      ls_indmbtr-cpudt = <ls_input>-cpudt.
*      ls_indmbtr-dmbtr2 = abs( <ls_input>-dmbtr / <ls_input>-stock_qty ).
    ENDIF.

  ENDLOOP.

  LOOP AT gt_output2 INTO gs_output2.
    gs_output-matnr = gs_output2-matnr.
    gs_output-werks = gs_output2-werks.
    gs_output-lgort_sid = gs_output2-lgort_sid.
    gs_output-lifnr_sid = gs_output2-lifnr_sid.
    gs_output-mtart = gs_output2-mtart.
    gs_output-matkl = gs_output2-matkl.
    gs_output-extwg = gs_output2-extwg.
    gs_output-meins = gs_output2-meins.
    gs_output-waers = gs_output2-waers.
    IF gs_output2-cpudt IN s_budat[].
      IF gs_output2-stock_qty > 0.
        gs_output-zrksl = gs_output2-stock_qty."本期入库数量
        gs_output-zrkje = gs_output2-dmbtr.
      ELSE.
        gs_output-zcksl = gs_output2-stock_qty."本期出库数量
        gs_output-zckje - gs_output2-dmbtr.
      ENDIF.
    ELSE.
      gs_output-zqcsl = gs_output2-stock_qty"期初数量
      gs_output-zqcje = gs_output2-dmbtr.
    ENDIF.
    gs_output-zqmsl = gs_output2-stock_qty"期末数量
    gs_output-zqmje = gs_output2-dmbtr.

    COLLECT gs_output INTO gt_output[].
    CLEAR: gs_output,gs_output2.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHANGE_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_change_data .

  CHECK gt_output2[] IS NOT INITIAL.
**库存价值科目
  SELECT *
    INTO TABLE @DATA(lt_t030)
    FROM t030
   WHERE ktopl EQ 'HL00'
     AND ktosl EQ 'BSX'.
  SORT lt_t030[] BY bklas.


**物料描述
  SELECT *
    INTO TABLE @DATA(lt_makt)
    FROM makt
     FOR ALL ENTRIES IN @lt_output
   WHERE spras EQ @sy-langu
     AND matnr EQ @lt_output-matnr.
  SORT lt_makt[] BY matnr.

**评估分类

  SELECT matnr,bwkey,bwtar,vprsv,peinh,verpr,stprs,bklas
    INTO TABLE @DATA(lt_mbew)
    FROM mbew
     FOR ALL ENTRIES IN @lt_output
   WHERE matnr EQ @lt_output-matnr
     AND bwkey EQ @p_werks.
  SORT lt_mbew[] BY matnr bwkey.

*  lt_output2[] = gt_output2[].
*  SORT lt_output2[] BY matnr werks lgort_sid.
*  DELETE ADJACENT DUPLICATES FROM lt_output2[] COMPARING matnr werks lgort_sid.
*  DELETE lt_output2[] WHERE dmbtr EQ 0
*                         OR menge EQ 0.

**仓位描述
  SELECT werks,
         lgort,          lgobe     

INTO TABLE @DATA(lt_t001l)     
FROM t001l.   
SORT lt_t001l[] BY werks lgort.
**科目描述   
SELECT *     
INTO TABLE @DATA(lt_skat)     
FROM skat    
WHERE spras EQ @sy-langu      
AND ktopl EQ 'HL00'.   
SORT lt_skat[] BY saknr.

**物料类型描述   
SELECT *     
INTO TABLE @DATA(lt_t134t)     
FROM t134t    
WHERE spras EQ @sy-langu.   
SORT lt_t134t[] BY mtart.

**物料组描述   
SELECT *     
INTO TABLE @DATA(lt_t023t)     
FROM t023t    
WHERE spras EQ @sy-langu.   
SORT lt_t023t[] BY matkl.   

LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<gs_output>).
**根据评估分类查找科目     

READ TABLE lt_mbew INTO DATA(ls_mbewWITH KEY matnr = <gs_output>-matnr                                                    bwkey 
= <gs_output>-werks BINARY SEARCH.
*    IF sy-subrc EQ 0.
*    IF ls_mbew-vprsv EQ 'S'. "MM03成本 = 标准价格
*      IF ls_mbew-peinh IS NOT INITIAL.
*    <gs_output>-dmbtr = ls_mbew-stprs." / ls_mbew-peinh.
*      ENDIF.
*    ELSEIF ls_mbew-vprsv EQ 'V'."MM03成本 = 移动平均价/周期价格
*      IF ls_mbew-peinh IS NOT INITIAL.
*        <gs_output>-dmbtr = ls_mbew-verpr." / ls_mbew-peinh.
*      ENDIF.
*    ENDIF.     

READ TABLE lt_t030 INTO DATA(ls_t030WITH KEY bklas = ls_mbew-bklas BINARY SEARCH.     
IF sy-subrc EQ 0.       <gs_output>
-konts = ls_t030-konts"科目     
ENDIF.
*    ENDIF.
**仓位描述     
READ TABLE lt_t001l INTO DATA(ls_t001lWITH KEY werks = <gs_output>-werks                                                      lgort 
= <gs_output>-lgort_sid BINARY SEARCH.     
IF sy-subrc EQ 0.       <gs_output>
-lgobe = ls_t001l-lgobe.     
ENDIF.
**科目描述     
READ TABLE lt_skat INTO DATA(ls_skatWITH KEY saknr = <gs_output>-konts BINARY SEARCH.     
IF sy-subrc EQ 0.       <gs_output>
-txt50 = ls_skat-txt50.     
ENDIF.
**物料描述     
READ TABLE lt_makt INTO DATA(ls_maktWITH KEY matnr = <gs_output>-matnr BINARY SEARCH.     
IF sy-subrc EQ 0.       <gs_output>
-maktx = ls_makt-maktx.     
ENDIF.
***物料类型,物料组,外部物料组
*        READ TABLE lt_output INTO DATA(ls_output) with KEY matnr = <gs_output>-matnr BINARY SEARCH.
*        IF sy-subrc eq 0.
*    <gs_output>-mtart = ls_output-mtart.
*    <gs_output>-matkl = ls_output-matkl.
*    <gs_output>-extwg = ls_output-extwg.
*        ENDIF.
**物料类型描述     
READ TABLE lt_t134t INTO DATA(ls_t134tWITH KEY mtart = <gs_output>-mtart BINARY SEARCH.     
IF sy-subrc EQ 0.       <gs_output>
-mtbez = ls_t134t-mtbez.     
ENDIF.
**物料组描述     
READ TABLE lt_t023t INTO DATA(ls_t023tWITH KEY matkl = <gs_output>-matkl BINARY SEARCH.     
IF sy-subrc EQ 0.       <gs_output>
-mtbez = ls_t134t-mtbez.     
ENDIF.
**单价
*    READ TABLE lt_output2 INTO DATA(ls_output2) WITH KEY matnr     = <gs_output>-matnr
*                                                         werks     = <gs_output>-werks
*                                                         lgort_sid = <gs_output>-lgort_sid BINARY SEARCH.
*    IF sy-subrc EQ 0.
*      <gs_output>-dmbtr = ls_output2-dmbtr / ls_output2-menge.
*    ENDIF.
**期初金额/本期入库金额/本期出库金额/期末金额
*    IF ls_mbew-peinh IS NOT INITIAL.
*      <gs_output>-zqcje = <gs_output>-zqcsl * <gs_output>-dmbtr / ls_mbew-peinh.
*      <gs_output>-zrkje = <gs_output>-zrksl * <gs_output>-dmbtr / ls_mbew-peinh.
*      <gs_output>-zckje = <gs_output>-zcksl * <gs_output>-dmbtr / ls_mbew-peinh.
*      <gs_output>-zqmje = <gs_output>-zqmsl * <gs_output>-dmbtr / ls_mbew-peinh.
*      <gs_output>-dmbtr = <gs_output>-dmbtr / ls_mbew-peinh.
*    ENDIF.     
CLEAR ls_mbew.   
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_display_data .   
PERFORM f_set_layout.   
PERFORM f_set_fieldcat.   
PERFORM f_alv_display TABLES gt_output.
ENDFORM.

FORM f_set_layout.   
CLEAR: gs_layout.   gs_layout
-box_fname 'SLBOX'.   gs_layout
-zebra 'X'.   gs_layout
-cwidth_opt 'X'.
*  gs_layout-ctab_fname = 'CELLCOLOR'.
ENDFORM.
FORM f_set_fieldcat.   
CLEAR: gt_fieldcat[].   
DATA: ls_fieldcat TYPE lvc_s_fcat.   
DEFINE set_fieldcat.     
CLEAR: ls_fieldcat.     ls_fieldcat
-fieldname = &1.     ls_fieldcat
-ref_field = &2.     ls_fieldcat
-ref_table = &3.     ls_fieldcat
-convexit  = &4.     ls_fieldcat
-do_sum    = &5.     ls_fieldcat
-seltext   = &6.     ls_fieldcat
-scrtext_l = &6.     ls_fieldcat
-scrtext_m = &6.     ls_fieldcat
-scrtext_s = &6.     ls_fieldcat
-coltext   = &6.     
APPEND ls_fieldcat TO gt_fieldcat.   
END-OF-DEFINITION.
*显示内容   set_fieldcat 
'MATNR'      'MATNR'      'MATDOC' ''      ''  '物料'.   set_fieldcat 
'MAKTX'      'MAKTX'      'MAKT'   ''      ''  '物料描述'.   set_fieldcat 
'WERKS'      'WERKS'      'MATDOC' ''      ''  '工厂'.   set_fieldcat 
'LGORT_SID'  'LGORT_SID'  'MATDOC' ''      ''  '仓位'.   set_fieldcat 
'LGOBE'      'LGOBE'      'T001L'  ''      ''  '仓位描述'.   set_fieldcat 
'KONTS'      'KONTS'      'T030'   ''      ''  '科目代码'.   set_fieldcat 
'TXT50'      'TXT50'      'SKAT'   ''      ''  '科目描述'.   set_fieldcat 
'LIFNR_SID'  'LIFNR_SID'  'MATDOC' ''      ''  '供应商'.   set_fieldcat 
'MTART'      'MTART'      'MARA'   ''      ''  '物料类型'.   set_fieldcat 
'MTBEZ'      'MTBEZ'      'T134T'  ''      ''  '物料类型描述'.   set_fieldcat 
'MATKL'      'MATKL'      'MARA'   ''      ''  '物料组'.   set_fieldcat 
'WGBEZ'      'WGBEZ'      'T023T'  ''      ''  '物料组描述'.   set_fieldcat 
'EXTWG'      'EXTWG'      'MARA'   ''      ''  '外部物料组'.   set_fieldcat 
'MEINS'      'MEINS'      'MATDOC' ''      ''  '基本计量单位'.   set_fieldcat 
'WAERS'      'WAERS'      'MATDOC' ''      ''  '货币码'.
*  SET_FIELDCAT 'MENGE'      'MENGE'      'MATDOC' '' ''  '数量'.
*  SET_FIELDCAT 'DMBTR'      'DMBTR'      'MATDOC' '' ''  '金额'.   set_fieldcat 
'MBLNR'      'MBLNR'      'MATDOC' ''      ''  '物料凭证编号'.   set_fieldcat 
'ZQCSL'      'MENGE'      'MATDOC' 'QTYCH' ''  '期初数量'.   set_fieldcat 
'ZQCJE'      'DMBTR'      'MATDOC' ''      ''  '期初金额'.   set_fieldcat 
'ZRKSL'      'MENGE'      'MATDOC' 'QTYCH' ''  '本期入库数量'.   set_fieldcat 
'ZRKJE'      'DMBTR'      'MATDOC' ''      ''  '本期入库金额'.   set_fieldcat 
'ZCKSL'      'MENGE'      'MATDOC' 'QTYCH' ''  '本期出库数量'.   set_fieldcat 
'ZCKJE'      'DMBTR'      'MATDOC' ''      ''  '本期出库金额'.   set_fieldcat 
'ZQMSL'      'MENGE'      'MATDOC' 'QTYCH' ''  '期末数量'.   set_fieldcat 
'ZQMJE'      'DMBTR'      'MATDOC' ''      ''  '期末金额'.
















ENDFORM.
FORM f_alv_display TABLES it_table.   
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'     
EXPORTING       i_callback_program      
= sy-repid
*     i_callback_pf_status_set = 'F_SET_PF_STATUS'       i_callback_user_command 
'F_USER_COMMAND'       is_layout_lvc           
= gs_layout       it_fieldcat_lvc         
= gt_fieldcat       i_save                  
'U'     
TABLES       t_outtab                
= it_table     
EXCEPTIONS       program_error           
1       
OTHERS                  2.   
IF sy-subrc <> 0.   
ENDIF.
ENDFORM.
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM f_set_pf_status USING rt_extab TYPE slis_t_extab.
*  SET PF-STATUS 'STD'.
ENDFORM.
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM f_user_command USING r_ucomm LIKE sy-ucomm  rs_selfield 
TYPE slis_selfield.   
PERFORM f_check_change_data.   
CASE r_ucomm.     
WHEN 'LIST'.     

WHEN '&IC1'."双击事件       
READ TABLE gt_output INTO gs_output INDEX rs_selfield-tabindex.       
IF sy-subrc EQ 0.         
CLEAR gt_output3[].         gt_output3[] 
= gt_output2[].         
DELETE gt_output3[] WHERE werks NE gs_output-werks                                
OR lgort_sid NE gs_output-lgort_sid.         
PERFORM f_display_data2.       

ENDIF.   
ENDCASE.   
PERFORM f_refresh_alv.
ENDFORM.
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM f_check_change_data.   
DATA: lo_grid TYPE REF TO cl_gui_alv_grid.   
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'     
IMPORTING       e_grid 
= lo_grid.   lo_grid
->check_changed_data).
ENDFORM.
*-----------------------------------------------------------------------* *
*-----------------------------------------------------------------------*
FORM f_refresh_alv.   
DATA: lo_grid      TYPE REF TO cl_gui_alv_grid,         ls_is_stable 
TYPE lvc_s_stbl.   
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'     
IMPORTING       e_grid 
= lo_grid.   ls_is_stable
-col 'X'.   ls_is_stable
-row 'X'.   lo_grid
->refresh_table_display(   
EXPORTING   is_stable 
= ls_is_stable   
EXCEPTIONS   finished 
1   
OTHERS ).   
IF sy-subrc <> 0.   
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_DISPLAY_DATA2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_display_data2 .   
PERFORM f_set_layout.   
PERFORM f_set_fieldcat3.   
PERFORM f_alv_display3 TABLES gt_output3.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_ALV_DISPLAY3
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_GT_OUTPUT  text
*&---------------------------------------------------------------------*
FORM f_alv_display3  TABLES it_table.   
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'     
EXPORTING       i_callback_program      
= sy-repid
*     i_callback_pf_status_set = 'F_SET_PF_STATUS'       i_callback_user_command 
'F_USER_COMMAND3'       is_layout_lvc           
= gs_layout       it_fieldcat_lvc         
= gt_fieldcat       i_save                  
'U'     
TABLES       t_outtab                
= it_table     
EXCEPTIONS       program_error           
1       
OTHERS                  2.   
IF sy-subrc <> 0.   
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_SET_FIELDCAT3
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_set_fieldcat3 .   
CLEAR: gt_fieldcat[].   
DATA: ls_fieldcat TYPE lvc_s_fcat.   
DEFINE set_fieldcat.     
CLEAR: ls_fieldcat.     ls_fieldcat
-fieldname = &1.     ls_fieldcat
-ref_field = &2.     ls_fieldcat
-ref_table = &3.     ls_fieldcat
-convexit  = &4.     ls_fieldcat
-do_sum    = &5.     ls_fieldcat
-seltext   = &6.     ls_fieldcat
-scrtext_l = &6.     ls_fieldcat
-scrtext_m = &6.     ls_fieldcat
-scrtext_s = &6.     ls_fieldcat
-coltext   = &6.     
APPEND ls_fieldcat TO gt_fieldcat.   
END-OF-DEFINITION.
*显示内容   set_fieldcat 
'MATNR'      'MATNR'      'MATDOC' '' ''  '物料'.
*  set_fieldcat 'MAKTX'      'MAKTX'      'MAKT'   '' ''  '物料描述'.   set_fieldcat 
'WERKS'      'WERKS'      'MATDOC' '' ''  '工厂'.   set_fieldcat 
'LGORT_SID'  'LGORT_SID'  'MATDOC' '' ''  '仓位'.   set_fieldcat 
'MEINS'      'MEINS'      'MATDOC' '' ''  '单位'.   set_fieldcat 
'WAERS'      'WAERS'      'MATDOC' '' ''  '货币'.   set_fieldcat 
'CPUDT'      'CPUDT'      'MATDOC' '' ''  '输入日期'.   set_fieldcat 
'DMBTR2'     ''            ''      '' ''  '单价'.   set_fieldcat 
'DMBTR'      'DMBTR'      'MATDOC' '' ''  '金额'.
*  set_fieldcat 'LGOBE'      'LGOBE'      'T001L'  '' ''  '仓位描述'.
*  set_fieldcat 'KONTS'      'KONTS'      'T030'   '' ''  '科目代码'.
*  set_fieldcat 'TXT50'      'TXT50'      'SKAT'   '' ''  '科目描述'.   set_fieldcat 
'LIFNR_SID'  'LIFNR_SID'  'MATDOC' '' ''  '供应商'.   set_fieldcat 
'STOCK_QTY'  'STOCK_QTY'  'MATDOC' 'QTYCH' ''  '数量'.   set_fieldcat 
'SHKZG'      'SHKZG'      'MATDOC' '' ''  '借贷标识'.   set_fieldcat 
'BWART'      'BWART'      'MATDOC' '' ''  '移动类型'.   set_fieldcat 
'MTART'      'MTART'      'MARA'   '' ''  '物料类型'.
*  set_fieldcat 'MTBEZ'      'MTBEZ'      'T134T'  '' ''  '物料类型描述'.   set_fieldcat 
'MATKL'      'MATKL'      'MARA'   '' ''  '物料组'.
*  set_fieldcat 'WGBEZ'      'WGBEZ'      'T023T'  '' ''  '物料组描述'.   set_fieldcat 
'EXTWG'      'EXTWG'      'MARA'   '' ''  '外部物料组'.   set_fieldcat 
'MEINS'      'MEINS'      'MATDOC' '' ''  '基本计量单位'.   set_fieldcat 
'WAERS'      'WAERS'      'MATDOC' '' ''  '货币码'.   set_fieldcat 
'MBLNR'      'MBLNR'      'MATDOC' '' ''  '物料凭证编号'.

ENDFORM.

FORM f_user_command3 USING r_ucomm LIKE sy-ucomm  rs_selfield 
TYPE slis_selfield.   
PERFORM f_check_change_data.   
CASE r_ucomm.     
WHEN 'LIST'.     

WHEN '&IC1'."双击事件       
READ TABLE gt_output3 INTO gs_output3 INDEX rs_selfield-tabindex.       
IF sy-subrc EQ 0.
*        SET PARAMETER ID 'BLN' FIELD gs_output-BELNR.
*        SET PARAMETER ID 'BUK' FIELD gs_output-RBUKRS.
*        SET PARAMETER ID 'GJR' FIELD gs_output-GJAHR.
*        CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.         
CALL FUNCTION 'MIGO_DIALOG'           
EXPORTING             i_action            
'A04'             i_refdoc            
'R02'             i_mblnr             
= gs_output3-mblnr             i_mjahr             
= gs_output3-gjahr           
EXCEPTIONS             illegal_combination 
1             
OTHERS              2.         
IF sy-subrc <> 0.
* Implement suitable error handling here         
ENDIF.       
ENDIF.   
ENDCASE.   
PERFORM f_refresh_alv.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_AUTH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_auth .   
SELECT werks     
INTO TABLE @DATA(lt_t001w)     
FROM t001w    
WHERE werks EQ @p_werks.   
LOOP AT lt_t001w INTO DATA(ls_t001).     
AUTHORITY-CHECK OBJECT 'ZHL_AUTHOR'         
ID 'ZWERKS' FIELD ls_t001-werks.     
IF sy-subrc <> 0.       
MESSAGE '无该工厂查询权限' TYPE 'E'.       
STOP.     
ENDIF.   
ENDLOOP.
ENDFORM.

原文地址:https://www.cnblogs.com/chaguoguo/p/14195425.html