进销存明细表(含双击跳转)


进销存明细表(含双击跳转)

进销存明细表(含双击跳转)

进销存明细表(含双击跳转)

*&---------------------------------------------------------------------*

*& Report  ZMMR004
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT  zmmr004 NO STANDARD PAGE HEADING.
TABLESmbewhmaramardmkpf.
*kk
TYPE-POOLSslis.

DATABEGIN OF gt_itab OCCURS 0,
        matnr LIKE mara-matnr,                           "物料号
        maktx LIKE makt-maktx,                           "物料描述
        meins LIKE mara-meins,                           "单位
        zsqjc LIKE mseg-menge,                           "上期结存
        zbqjh LIKE mseg-menge,                           "本期进货
        zbqth LIKE mseg-menge,                           "本期退货
        bqbcs LIKE mseg-menge,                           "本期拨出数
        bqbrs LIKE mseg-menge,                           "本期拨入数
        cbzxf LIKE mseg-menge,                           "成本中心发料数
        cbzxt LIKE mseg-menge,                           "成本中心退料数
        zbqhy LIKE mseg-menge,                           "本期耗用
        zbqjc LIKE mseg-menge,                           "本期结存
        lgort LIKE mseg-lgort,                           "库位
        lgobe LIKE t001l-lgobe,                          "库位描述
        werks LIKE mseg-werks,
        zqty  LIKE mseg-menge,
        reffi TYPE mara-meins,
      END OF gt_itab.


DATAgt_itab2 LIKE gt_itab OCCURS 0  WITH HEADER LINE  .


DATABEGIN OF gt_matr OCCURS 0,
        matnr LIKE mara-matnr,
        lgort LIKE mard-lgort,
      END OF gt_matr.

DATABEGIN OF gt_mbew OCCURS 0,
        matnr LIKE mara-matnr,
        werks LIKE mard-werks,
        lgort LIKE mard-lgort,
        lbkum LIKE mbewh-lbkum,
        insme LIKE mardh-insme,
        speme LIKE mardh-speme,
      END OF gt_mbew.

DATABEGIN OF gt_mseg OCCURS 0,
        matnr LIKE mara-matnr,
        werks LIKE mseg-werks,
        lgort LIKE mseg-lgort,
        bwart LIKE mseg-bwart,
        shkzg LIKE mseg-shkzg,
        menge LIKE mseg-menge,
        meins LIKE mseg-meins,
        smbln LIKE mseg-smbln,
        smblp LIKE mseg-smblp,
        mblnr LIKE mseg-mblnr,
        zeile LIKE mseg-zeile,
        insmk LIKE mseg-insmk,
        urzei LIKE mseg-urzei "原始行项目主要是调拨时会有问题 质检
      END OF gt_mseg.

DATAgt_mseg2 LIKE gt_mseg OCCURS WITH HEADER LINE.
DATAgt_mseg3 LIKE gt_mseg OCCURS WITH HEADER LINE.
DATAgt_mseg4 LIKE gt_mseg OCCURS WITH HEADER LINE.
DATAbudat_low  LIKE mkpf-budat,
      budat_high LIKE mkpf-budat,
      year(4)    TYPE c,
      month(2)   TYPE c,
      year1(4)   TYPE c,
      mont1(2)   TYPE c,
      year2(4)   TYPE c,
      mont2(2)   TYPE c,
      date1      LIKE mkpf-budat,
      date3      LIKE mkpf-budat,
      date2      LIKE mkpf-budat.


DATABEGIN OF gs_mbmps,
        smbln LIKE m_mbmps-smbln,
        smblp LIKE m_mbmps-smblp,
        mblnr LIKE m_mbmps-mblnr,
        zeile LIKE m_mbmps-zeile,
      END OF gs_mbmps.

DATA gt_mbmps LIKE TABLE OF gs_mbmps .


*DATA: BEGIN OF gs_qals,
*        mblnr LIKE qals-mblnr,
*        zeile LIKE qals-zeile,
*      END OF gs_qals.
*
*DATA gt_qals LIKE TABLE OF gs_qals .



DATABEGIN OF gs_qamb,
        mblnr LIKE qamb-mblnr,
        zeile LIKE qamb-zeile,
        werk  LIKE mseg-werks,
      END OF gs_qamb.

DATA gt_qamb LIKE TABLE OF gs_qamb .
DATA gt_qamb2 LIKE TABLE OF gs_qamb .


DATAqmatv LIKE marc-qmatv.

DATATYPE i.

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

SELECT-OPTIONSs_budat FOR mkpf-budat OBLIGATORY DEFAULT sy-datum,
                s_lgort FOR mard-lgort,
                s_mtart FOR mara-mtart,
                s_matkl FOR mara-matkl,
                s_matnr FOR mara-matnr.

SELECTION-SCREEN END OF BLOCK blk1.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT s_budat.
    IF s_budat-low IS INITIAL AND s_budat-high IS NOT INITIAL.
      CONCATENATE sy-datum+0(6'01' INTO s_budat-low.
*      s_budat-low = s_budat-high.
      MODIFY s_budat.
    ELSEIF s_budat-high IS INITIAL AND s_budat-low IS NOT INITIAL.
      s_budat-high s_budat-low.
      CONCATENATE sy-datum+0(6'01' INTO s_budat-low.
      MODIFY s_budat.
    ENDIF.
  ENDLOOP.

*&---------------------------------------------------------------------*
*&      START_OF_SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.

  PERFORM get_data.
  PERFORM process_data.

*&---------------------------------------------------------------------*
*&      END_OF_SELECTION
*&---------------------------------------------------------------------*
END-OF-SELECTION.
  PERFORM write_data.

*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_data .

  READ TABLE s_budat INDEX 1.
  CONCATENATE s_budat-low+0(4s_budat-low+4(2'01' INTO budat_low.
  budat_high s_budat-low.

  year s_budat-low+0(4).
  month s_budat-low+4(2).

  IF month '01'.
    month '12'.
    year year 1.
  ELSE.
    month month 1.
  ENDIF.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  month
    IMPORTING
      output month
    EXCEPTIONS
      OTHERS 1.
  mont1 month.
  year1 year.

  CLEAR s_budat.

  SELECT a~matnr b~werks b~lgort  INTO TABLE gt_mbew
   FROM mara AS a INNER JOIN mard AS ON b~matnr a~matnr
*   INNER JOIN MBEW AS C ON C~MATNR = A~MATNR
   WHERE a~matnr IN s_matnr
     AND a~matkl IN s_matkl
     AND a~mtart IN s_mtart
     AND b~lgort IN s_lgort
     AND b~werks EQ p_werks.
*     AND B~LABST NE 0.

*  loop at gt_mbew.
*
*    do.
*      n = n + 1.
*      select single labst insme speme into (gt_mbew-lbkum, gt_mbew-insme, gt_mbew-speme)
*                                             from mardh where matnr = gt_mbew-matnr
*                                                          and lgort = gt_mbew-lgort
*                                                          and lfgja = year
*                                                          and lfmon = month
*                                                          and werks = gt_mbew-werks.
*      if sy-subrc = 0.
*        if month = '12'.
*          year2 = year + 1.
*          mont2 = '01'.
*        else.
*          year2 = year.
*          mont2 = month + 1.
*        endif.
*        call function 'CONVERSION_EXIT_ALPHA_INPUT'
*          exporting
*            input  = mont2
*          importing
*            output = mont2
*          exceptions
*            others = 1.
*        concatenate year2 mont2 '01' into date3.
*
*        select a~matnr a~werks a~lgort a~bwart a~shkzg a~menge a~meins a~smbln a~smblp a~mblnr a~zeile into gt_mseg2
*           from mseg as a inner join mkpf as b on b~mblnr = a~mblnr
*           inner join mara as c on c~matnr = a~matnr
*            where a~matnr in s_matnr
*             and c~matkl in s_matkl
*             and c~mtart in s_mtart
*             and a~lgort in s_lgort
*             and a~matnr = gt_mbew-matnr
*             and a~lgort = gt_mbew-lgort
*             and a~werks = gt_mbew-werks
**             and b~budat >= date3
*             and b~budat < budat_high .
*          append gt_mseg2.
*          clear gt_mseg2.
*        endselect.
*
*        n = 0.
*        year = year1.
*        month = mont1.
*        exit.
*      elseif n = 12.
*        n = 0.
*        year = year1.
*        month = mont1.
*        exit.
*      else.
*        if month = '01'.
*          month = '12'.
*          year = year - 1.
*        else.
*          month = month - 1.
*          call function 'CONVERSION_EXIT_ALPHA_INPUT'
*            exporting
*              input  = month
*            importing
*              output = month
*            exceptions
*              others = 1.
*        endif.
*      endif.
*    enddo.
*
*    modify gt_mbew.
*  endloop.

  SELECT a~matnr a~werks a~lgort a~bwart a~shkzg a~menge a~meins  a~smbln a~smblp a~mblnr a~zeile a~insmk a~urzei INTO TABLE gt_mseg2
  FROM mseg AS a INNER JOIN mkpf AS ON b~mblnr a~mblnr
  INNER JOIN mara AS ON c~matnr a~matnr
  WHERE a~matnr IN s_matnr
    AND c~matkl IN s_matkl
    AND c~mtart IN s_mtart
    AND a~lgort IN s_lgort
    AND a~werks EQ p_werks
    AND b~budat < budat_low
            %_HINTS
DB6 '<NLJOIN><IXSCAN TABLE=''MSEG'' SAP_INDEX=''M''/>''</NLJOIN>'.
  SELECT a~matnr a~werks a~lgort a~bwart a~shkzg a~menge a~meins  a~smbln a~smblp a~mblnr a~zeile a~insmk a~urzei INTO TABLE gt_mseg
  FROM mseg AS a INNER JOIN mkpf AS ON b~mblnr a~mblnr
  INNER JOIN mara AS ON c~matnr a~matnr
  WHERE a~matnr IN s_matnr
    AND c~matkl IN s_matkl
    AND c~mtart IN s_mtart
    AND a~lgort IN s_lgort
    AND b~budat IN s_budat
    AND a~werks EQ p_werks
            %_HINTS
DB6 '<NLJOIN><IXSCAN TABLE=''MSEG'' SAP_INDEX=''M''/>''</NLJOIN>'.

*  SELECT A~MATNR A~LGORT A~BWART A~SHKZG A~MENGE A~MEINS INTO TABLE GT_MSEG2
* FROM MSEG AS A INNER JOIN MKPF AS B ON B~MBLNR = A~MBLNR
* INNER JOIN MARA AS C ON C~MATNR = A~MATNR
* WHERE A~MATNR IN S_MATNR
*   AND C~MATKL IN S_MATKL
*   AND C~MTART IN S_MTART
*   AND A~LGORT IN S_LGORT
*   AND B~BUDAT >= BUDAT_LOW
*   AND B~BUDAT < BUDAT_HIGH .

  SELECT
       smbln
       smblp
       mblnr
       zeile

    INTO TABLE gt_mbmps
    FROM   m_mbmps .

  IF gt_mseg2[] IS NOT INITIAL   .

    SELECT a~mblnr a~zeile  b~werk
      INTO TABLE  gt_qamb
      FROM qamb AS  a
      JOIN qals AS ON a~prueflos b~prueflos
      FOR ALL ENTRIES IN gt_mseg2
      WHERE a~mblnr gt_mseg2-mblnr
       AND  a~zeile gt_mseg2-urzei.

  ENDIF .

  IF gt_mseg[] IS NOT INITIAL   .

    SELECT a~mblnr a~zeile b~werk
      INTO TABLE  gt_qamb2
      FROM qamb AS a
      JOIN qals  AS ON a~prueflos b~prueflos
      FOR ALL ENTRIES IN gt_mseg
      WHERE a~mblnr gt_mseg-mblnr
       AND  a~zeile gt_mseg-urzei.

  ENDIF .

  LOOP AT gt_qamb2 INTO gs_qamb .
    APPEND gs_qamb TO gt_qamb .
  ENDLOOP .





ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  PROCESS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM process_data .
  DATA lv_tabix TYPE sy-tabix .
  SORT   gt_mbmps BY   smbln   smblp .
  " 去冲销
  LOOP AT gt_mseg2 .
    CLEAR lv_tabix .
    lv_tabix =  sy-tabix  .
    READ TABLE gt_mbmps WITH KEY smbln gt_mseg2-mblnr
                                 smblp gt_mseg2-zeile
                                 BINARY SEARCH
                                 TRANSPORTING NO FIELDS .
    IF sy-subrc EQ .
      DELETE gt_mseg2 INDEX lv_tabix .
    ELSEIF gt_mseg2-lgort IS INITIAL .
      DELETE gt_mseg2 INDEX lv_tabix .
    ENDIF .


  ENDLOOP .

  " 去冲销
  LOOP AT gt_mseg .
    CLEAR lv_tabix .
    lv_tabix =  sy-tabix  .
    READ TABLE gt_mbmps WITH KEY smbln gt_mseg-mblnr
                                 smblp gt_mseg-zeile
                                 BINARY SEARCH
                                 TRANSPORTING NO FIELDS .
    IF sy-subrc EQ .
      DELETE gt_mseg  INDEX lv_tabix .
    ENDIF .
  ENDLOOP .

  " " 去被冲销
  SORT   gt_mbmps BY mblnr  zeile .
  LOOP AT gt_mseg2 .
    CLEAR lv_tabix .
    lv_tabix =  sy-tabix  .
    READ TABLE gt_mbmps WITH KEY mblnr  gt_mseg2-mblnr
                                 zeile  gt_mseg2-zeile
                                 BINARY SEARCH
                                 TRANSPORTING NO FIELDS .
    IF sy-subrc EQ .
      DELETE gt_mseg2 INDEX lv_tabix .
    ELSEIF  gt_mseg2-lgort IS INITIAL .
      DELETE gt_mseg2 INDEX lv_tabix .
    ENDIF .


  ENDLOOP .

  " 去被冲销
  LOOP AT gt_mseg .
    CLEAR lv_tabix .
    lv_tabix =  sy-tabix  .
    READ TABLE gt_mbmps WITH KEY mblnr  gt_mseg-mblnr
                                 zeile  gt_mseg-zeile
                                 BINARY SEARCH
                                 TRANSPORTING NO FIELDS .
    IF sy-subrc EQ .
      DELETE gt_mseg INDEX lv_tabix .
    ENDIF .
  ENDLOOP .

  "去质检验,处理转储 -期初

  SORT gt_qamb BY mblnr zeile werk .

  LOOP AT gt_mseg2 .
    CLEAR lv_tabix .
    lv_tabix =  sy-tabix  .
    READ TABLE gt_qamb WITH KEY  mblnr  gt_mseg2-mblnr
                                 zeile  gt_mseg2-urzei
                                 werk   gt_mseg2-werks
                                 BINARY SEARCH
                                 TRANSPORTING NO FIELDS .
    IF sy-subrc EQ .
      IF  gt_mseg2-bwart <> '321' AND  gt_mseg2-bwart <>  '322' .
        DELETE gt_mseg2 INDEX lv_tabix .
      ENDIF .
    ENDIF .
    " 321 只保留方
    IF gt_mseg2-bwart EQ '321' AND gt_mseg2-shkzg EQ  'H'.
      DELETE gt_mseg2 INDEX lv_tabix .
    ENDIF .

    IF gt_mseg2-bwart EQ '322' AND gt_mseg2-shkzg EQ  'S'.
      DELETE gt_mseg2 INDEX lv_tabix .
    ENDIF .
  ENDLOOP .

  " 去质检验,处理转储-区间
  LOOP AT gt_mseg .
    CLEAR lv_tabix .
    lv_tabix =  sy-tabix  .
    READ TABLE gt_qamb WITH KEY  mblnr  gt_mseg-mblnr
                                 zeile  gt_mseg-urzei
                                 werk   gt_mseg-werks
                                 BINARY SEARCH
                                 TRANSPORTING NO FIELDS .
    IF sy-subrc EQ .
      IF  gt_mseg-bwart <> '321' AND  gt_mseg-bwart <> '322'  .
        DELETE gt_mseg INDEX lv_tabix .
      ENDIF .
    ENDIF .
    " 321 只保留方
    IF gt_mseg-bwart EQ '321' AND gt_mseg-shkzg EQ  'H'.
      DELETE gt_mseg INDEX lv_tabix .
    ENDIF .

    IF gt_mseg-bwart EQ '322' AND gt_mseg-shkzg EQ  'S'.
      DELETE gt_mseg INDEX lv_tabix .
    ENDIF .

  ENDLOOP .

  "汇总期初

  SORT gt_mseg2 BY matnr  werks   lgort.

  LOOP AT gt_mseg2.
    gt_itab-matnr gt_mseg2-matnr .
    gt_itab-werks gt_mseg2-werks  .
    gt_itab-lgort gt_mseg2-lgort .
    IF gt_mseg2-shkzg EQ 'S'.
      gt_itab-zsqjc =   gt_itab-zsqjc + gt_mseg2-menge .
    ELSE .
      gt_itab-zsqjc =   gt_itab-zsqjc + gt_mseg2-menge * -.
    ENDIF .
    AT END OF  lgort .
      APPEND gt_itab .
      CLEAR gt_itab.
    ENDAT.
  ENDLOOP .

*汇总期间
  SORT gt_mseg BY matnr  werks   lgort.



  LOOP AT gt_mseg.
    gt_itab2-matnr gt_mseg-matnr .
    gt_itab2-werks gt_mseg-werks  .
    gt_itab2-lgort gt_mseg-lgort .
    IF gt_mseg-shkzg EQ 'S'.
      gt_itab2-zbqjh =   gt_itab2-zbqjh + gt_mseg-menge .
    ELSE .
      gt_itab2-zbqth =   gt_itab2-zbqth + gt_mseg-menge * -.
    ENDIF .
    AT END OF  lgort .
      APPEND gt_itab2 .
      CLEAR gt_itab2.
    ENDAT.
  ENDLOOP .


  " 汇总期末
  SORT gt_itab BY matnr werks lgort .
  LOOP AT gt_itab2 .
    CLEAR gt_itab .
    READ TABLE gt_itab WITH KEY matnr gt_itab2-matnr
                                werks gt_itab2-werks
                                lgort gt_itab2-lgort
                                BINARY SEARCH.
    IF sy-subrc EQ .
      gt_itab-zbqjh  gt_itab2-zbqjh .
      gt_itab-zbqth  gt_itab2-zbqth.
      gt_itab-zbqjc  gt_itab-zsqjc + gt_itab-zbqjh + gt_itab-zbqth .  "上面汇总时已经成负数
      MODIFY gt_itab INDEX sy-tabix .
    ELSE .
      gt_itab-matnr gt_itab2-matnr.
      gt_itab-werks gt_itab2-werks.
      gt_itab-lgort gt_itab2-lgort .
      gt_itab-zbqjh  gt_itab2-zbqjh .
      gt_itab-zbqth  gt_itab2-zbqth.
      gt_itab-zbqjc  gt_itab-zsqjc + gt_itab-zbqjh +  gt_itab-zbqth .  "上面汇总时已经成负数
      APPEND gt_itab .
      SORT gt_itab BY matnr werks lgort .
    ENDIF .

  ENDLOOP .


  LOOP AT gt_itab  .
    gt_itab-zbqjc  gt_itab-zsqjc + gt_itab-zbqjh +  gt_itab-zbqth .
    SELECT SINGLE lgobe INTO gt_itab-lgobe FROM t001l WHERE lgort gt_itab-lgort.

    SELECT SINGLE meins INTO gt_itab-meins FROM mara WHERE matnr gt_itab-matnr.

    SELECT SINGLE maktx INTO gt_itab-maktx FROM makt WHERE matnr gt_itab-matnr.

    MODIFY gt_itab .

  ENDLOOP .


*
*
*
*  IF gt_mseg2[] IS NOT INITIAL.
*    LOOP AT gt_mseg2.
*
*      IF gt_mseg2-bwart = '321'.
*        IF gt_mseg2-shkzg = 'S'  AND gt_mseg2-matnr = '123213'.
*          DELETE gt_mseg2.
*        ELSEIF gt_mseg2-shkzg = 'H'.
*          DELETE gt_mseg2.
*          CONTINUE.
*        ENDIF.
*      ELSEIF gt_mseg2-bwart = '322'.
*        IF gt_mseg2-shkzg = 'H'.
*          DELETE gt_mseg2.
*          CONTINUE.
*        ELSE.
*          gt_mseg2-menge = gt_mseg2-menge * ( -1 ).
*        ENDIF.
*      ELSE.
*
*
*      ENDIF.
*      MODIFY gt_mseg2.
*
*    ENDLOOP.
*  ENDIF.
*  DELETE gt_mseg WHERE insmk = 'X' AND bwart NE '322'.
*  LOOP AT gt_mbew.
*    LOOP AT gt_mseg2 WHERE matnr = gt_mbew-matnr AND lgort = gt_mbew-lgort
*                                                 AND werks = gt_mbew-werks.
*      gt_mbew-lbkum = gt_mbew-lbkum + gt_mseg2-menge.
*    ENDLOOP.
*    MODIFY gt_mbew.
*    CLEAR gt_mbew.
*  ENDLOOP.
*
*  LOOP AT gt_mbew.
*    gt_itab-matnr = gt_mbew-matnr.
*    gt_itab-lgort = gt_mbew-lgort.
*    gt_itab-werks = gt_mbew-werks.
*    gt_itab-zsqjc = gt_mbew-lbkum + gt_mbew-speme.
*    APPEND gt_itab.
*    CLEAR gt_itab.
*  ENDLOOP.
*  DELETE gt_mseg WHERE bwart = '321' AND shkzg = 'H'.
*  DELETE gt_mseg WHERE bwart = '322' AND shkzg = 'S'.
*  LOOP AT gt_itab.
*    SELECT SINGLE qmatv INTO qmatv FROM marc WHERE matnr = gt_itab-matnr.
*    IF qmatv = 'X'.
*      LOOP AT gt_mseg WHERE matnr = gt_itab-matnr AND lgort = gt_itab-lgort
*                          AND werks = gt_itab-werks AND shkzg = 'S'. "and bwart <> '101' and bwart <> '123' and bwart <> '501' .
*        gt_itab-zbqjh = gt_itab-zbqjh + gt_mseg-menge.
*      ENDLOOP.
*
*      LOOP AT gt_mseg WHERE matnr = gt_itab-matnr AND lgort = gt_itab-lgort
*                            AND werks = gt_itab-werks AND shkzg = 'H' ."and bwart <> '122' and bwart <> '502'."('122')..
*        gt_itab-zbqth = gt_itab-zbqth + gt_mseg-menge.
*      ENDLOOP.
*
*    ELSE.
*      LOOP AT gt_mseg WHERE matnr = gt_itab-matnr AND lgort = gt_itab-lgort  AND werks = gt_itab-werks  AND shkzg = 'S'..
*        gt_itab-zbqjh = gt_itab-zbqjh + gt_mseg-menge.
*      ENDLOOP.
*      LOOP AT gt_mseg WHERE matnr = gt_itab-matnr AND lgort = gt_itab-lgort
*                            AND werks = gt_itab-werks AND shkzg = 'H' ."('122')..
*        gt_itab-zbqth = gt_itab-zbqth + gt_mseg-menge.
*      ENDLOOP.
*
*
*    ENDIF.
*
*    gt_itab-zbqjc = gt_itab-zsqjc + gt_itab-zbqjh - gt_itab-zbqth - gt_itab-bqbcs + gt_itab-bqbrs
*                    - gt_itab-cbzxf + gt_itab-cbzxt + gt_itab-zqty.
*
**    GT_ITAB-ZBQHY = GT_ITAB-ZBQTH + GT_ITAB-BQBCS + GT_ITAB-CBZXF - GT_ITAB-BQBRS - GT_ITAB-CBZXT.
*
*    SELECT SINGLE lgobe INTO gt_itab-lgobe FROM t001l WHERE lgort = gt_itab-lgort.
*
*    SELECT SINGLE meins INTO gt_itab-meins FROM mara WHERE matnr = gt_itab-matnr.
*
*    SELECT SINGLE maktx INTO gt_itab-maktx FROM makt WHERE matnr = gt_itab-matnr.
*    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT' " 单位转换
*      EXPORTING
*        input          = gt_itab-meins
*        language       = sy-langu
*      IMPORTING
*        output         = gt_itab-meins
*      EXCEPTIONS
*        unit_not_found = 1
*        OTHERS         = 2.
*    gt_itab-reffi = 'KAR'.
*    MODIFY gt_itab.
*    CLEAR qmatv.
*    CLEAR gt_itab.
*  ENDLOOP.
  DELETE gt_itab WHERE zsqjc AND zbqjh AND zbqth AND zbqjc 0.
  DELETE gt_itab WHERE lgort IS INITIAL .
ENDFORM.                    " PROCESS_DATA
*&---------------------------------------------------------------------*
*&      Form  WRITE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM write_data .

  DATAws_fieldcat        TYPE slis_t_fieldcat_alv WITH HEADER LINE,
        ws_fieldgroups_tab TYPE slis_t_sp_group_alv,
        ws_layout          TYPE slis_layout_alv,
        ws_sortfields_tab  TYPE slis_t_sortinfo_alv WITH HEADER LINE,
        ws_events          TYPE slis_t_event.
  DATAnn TYPE VALUE 0.
  DATAtitle TYPE lvc_title.
  DATAcolor TYPE slis_t_specialcol_alv WITH HEADER LINE.
*  SORT GT_CDHD BY BUKRS BUKRS ZEXCD.
*
  DEFINE hout.
    nn nn + 1.
    ws_fieldcat-col_pos       =  nn.
    ws_fieldcat-tabname       'GT_ITAB'.
    ws_fieldcat-key           &1.
    ws_fieldcat-fieldname     &2.
    ws_fieldcat-seltext_m     &3.
    ws_fieldcat-cfieldname    &4.
    ws_fieldcat-datatype      &5.
    ws_fieldcat-ref_tabname   &6.
    ws_fieldcat-ref_fieldname &7.
    ws_fieldcat-do_sum        &8.
    ws_fieldcat-qfieldname       &9.
    APPEND ws_fieldcat.
    CLEAR ws_fieldcat.
  END-OF-DEFINITION.

  hout:

      'X'  'MATNR'   '物料号'               ''     ''      ''  ''      ''  '',
      'X'  'MAKTX'   '物料描述'             ''     ''      ''  ''      ''  '',
      ''   'MEINS'   '基本单位'             ''     ''      ''  ''      ''  '',
      ''   'ZSQJC'   '上期结存'             ''     ''      ''  ''      ''  'REFFI',
      ''   'ZBQJH'   '本期入库'             ''     ''      ''  ''      ''  'REFFI',
      ''   'ZBQTH'   '本期出库'             ''     ''      ''  ''      ''  'REFFI',
*      ''   'BQBCS'   '本期拨出数'           ''     ''      ''  ''      ''  '',
*      ''   'BQBRS'   '本期拨入数'           ''     ''      ''  ''      ''  '',
*      ''   'CBZXF'   '成本中心发料数'       ''     ''      ''  ''      ''  '',
*      ''   'CBZXT'   '成本中心退料数'       ''     ''      ''  ''      ''  '',
*      ''   'ZBQHY'   '本期耗用'             ''     ''      ''  ''      ''  '',
      ''   'ZBQJC'   '本期结存'             ''     ''      ''  ''      ''  'REFFI',
      ''   'LGORT'   '库存地点'             ''     ''      ''  ''      ''  '',
      ''   'LGOBE'   '库位描述'             ''     ''      ''  ''      ''  ''.


  ws_layout-zebra             'X'.
  ws_layout-get_selinfos      'X'.
  ws_layout-colwidth_optimize 'X'.
  ws_layout-detail_popup      'X'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      sy-repid
      i_callback_user_command 'USER_COMMAND'
      is_layout               ws_layout
      it_fieldcat             ws_fieldcat[]
      it_special_groups       ws_fieldgroups_tab[]
      it_sort                 ws_sortfields_tab[]
      it_events               ws_events[]
      i_grid_title            title
      i_default               'X'
      i_save                  'A'
    TABLES
      t_outtab                gt_itab[]
    EXCEPTIONS
      program_error           1
      OTHERS                  2.

ENDFORM.                    " WRITE_DATA

*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.

  DATAg_selected_field_value(80).

  IF rs_selfield-fieldname EQ 'MATNR'.

    CASE r_ucomm.

      WHEN '&IC1'.
        READ TABLE gt_itab INDEX  rs_selfield-tabindex.
        PERFORM show_detial USING gt_itab-matnr gt_itab-lgort
                                  gt_itab-zsqjc gt_itab-zbqjc..
*        SET PARAMETER ID 'MAT' FIELD GT_ITAB-MATNR.
*        CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN .
    ENDCASE.
  ENDIF.
ENDFORM.                    "USER_COMMAND
FORM show_detial USING l_matnr LIKE mara-matnr
                        l_lgort LIKE mard-lgort
                        l_menge LIKE mseg-menge
                        l_menge1 LIKE mseg-menge.
  DATABEGIN OF lt_itab OCCURS 0,
          matnr   LIKE mara-matnr,
          budat   LIKE mkpf-budat,
          werks   LIKE mseg-werks,
          lgort   LIKE mseg-lgort,
          bwart   LIKE mseg-bwart,
          shkzg   LIKE mseg-shkzg,
          menge   LIKE mseg-menge,
          meins   LIKE mseg-meins,
          smbln   LIKE mseg-smbln,
          smblp   LIKE mseg-smblp,
          mblnr   LIKE mseg-mblnr,
          zeile   LIKE mseg-zeile,

          jcsl    LIKE mseg-menge,
          ref_doc TYPE char50,
          ref_pos TYPE char10,
          ref_txt TYPE char50,
          reffi   TYPE mara-meins,
        END OF lt_itab.
  DATA:l_qmatv LIKE marc-qmatv.
  DATA:prueflos_001 LIKE qamb-prueflos,
       mblnr_001    LIKE qamb-mblnr.

  DATAlv_bsart TYPE ekko-bsart .

*select DISTINCT * into TABLE lt_itab from mara UP TO 50 ROWS .
  CLEAR:lt_itab[],lt_itab,l_qmatv.
  SELECT SINGLE qmatv INTO l_qmatv FROM marc WHERE matnr l_matnr.
  lt_itab-matnr l_matnr.
  lt_itab-meins gt_mseg-meins.
  lt_itab-jcsl l_menge.
  APPEND lt_itab.CLEAR lt_itab.
  "modify by  lxf start
*  IF l_qmatv = 'X'.
*    LOOP AT gt_mseg WHERE matnr = l_matnr AND lgort = l_lgort AND bwart <> '101'  AND bwart <> '501' .
**      lt_itab = gt_mseg.
*      MOVE-CORRESPONDING gt_mseg TO lt_itab.
*      APPEND lt_itab.CLEAR lt_itab.
*    ENDLOOP.
*
*    LOOP AT gt_mseg WHERE matnr = l_matnr AND lgort = l_lgort AND bwart EQ '101'  AND bwart <> '501' .
*      CLEAR lv_bsart .
*      SELECT SINGLE bsart INTO lv_bsart
*        FROM ekko AS a
*        JOIN mseg AS b
*        ON a~ebeln = b~ebeln
*        WHERE   b~mblnr = gt_mseg-mblnr
*        AND a~bsart EQ 'ZUB' .
*      IF lv_bsart IS NOT INITIAL .
*        MOVE-CORRESPONDING gt_mseg TO lt_itab.
*      ENDIF .
*      APPEND lt_itab.CLEAR lt_itab.
*    ENDLOOP.
*
*  ELSE.
*    LOOP AT gt_mseg WHERE matnr = l_matnr AND lgort = l_lgort." and bwart <> '101'.
**      lt_itab = gt_mseg.
*      MOVE-CORRESPONDING gt_mseg TO lt_itab.
*      APPEND lt_itab.CLEAR lt_itab.
*    ENDLOOP.
*  ENDIF.
  "modify by  lxf end

  LOOP AT gt_mseg WHERE matnr l_matnr AND lgort l_lgort."
    MOVE-CORRESPONDING gt_mseg TO lt_itab.
    APPEND lt_itab.CLEAR lt_itab.
  ENDLOOP.



  LOOP AT lt_itab.
    IF lt_itab-bwart '321'.
      SELECT SINGLE prueflos
        INTO prueflos_001
        FROM qamb
        WHERE mblnr lt_itab-mblnr
        AND   typ '3'.
      IF prueflos_001 IS NOT INITIAL.
        SELECT SINGLE mblnr zeile
          INTO (lt_itab-ref_doc,lt_itab-ref_pos)
          FROM qamb
          WHERE prueflos prueflos_001
          AND   typ '1'.

      ENDIF.

    ENDIF.

    IF lt_itab-bwart '201'
    OR lt_itab-bwart '202'
    OR lt_itab-bwart '311'
    OR lt_itab-bwart '312'
    OR lt_itab-bwart 'Z61'
    OR lt_itab-bwart 'Z62'.

      SELECT SINGLE rsnum rspos
        INTO (lt_itab-ref_doc,lt_itab-ref_pos)
        FROM mseg
        WHERE mblnr lt_itab-mblnr
        AND   zeile lt_itab-zeile.

      IF lt_itab-bwart '312'       .

        SELECT SINGLE bktxt
          INTO lt_itab-ref_txt
          FROM mkpf
          WHERE mblnr lt_itab-mblnr.

      ENDIF.

    ENDIF.

    IF lt_itab-bwart '122' OR lt_itab-bwart '309'.          "增加122、309移动类型参考凭证
      SELECT SINGLE bktxt
                INTO lt_itab-ref_txt
                FROM mkpf
                WHERE mblnr lt_itab-mblnr.
    ENDIF.

    IF lt_itab-bwart '261'
    OR lt_itab-bwart '262'.

      SELECT SINGLE aufnr
        INTO lt_itab-ref_doc
        FROM mseg
        WHERE mblnr lt_itab-mblnr
        AND   zeile lt_itab-zeile.

      SELECT SINGLE bktxt
            INTO lt_itab-ref_txt
            FROM mkpf
            WHERE mblnr lt_itab-mblnr.

    ENDIF.

    IF lt_itab-bwart '511'
    OR lt_itab-bwart '531'
    OR lt_itab-bwart '541'
    OR lt_itab-bwart '542'
    OR lt_itab-bwart '551'.

      SELECT SINGLE bktxt
            INTO lt_itab-ref_txt
            FROM mkpf
            WHERE mblnr lt_itab-mblnr.

    ENDIF.

    IF lt_itab-bwart '601'
    OR lt_itab-bwart '631'
    OR lt_itab-bwart '653'
    OR lt_itab-bwart 'Z81'
    OR lt_itab-bwart 'Z91'.

      SELECT SINGLE xblnr
            INTO lt_itab-ref_doc
            FROM mkpf
            WHERE mblnr lt_itab-mblnr.

    ENDIF.

    IF lt_itab-bwart '701'
    OR lt_itab-bwart '702'.

      SELECT SINGLE iblnr zeili
            INTO (lt_itab-ref_doc,lt_itab-ref_pos)
            FROM iseg
            WHERE mblnr lt_itab-mblnr
            AND   zeile lt_itab-zeile.

    ENDIF.
    SELECT SINGLE budat INTO lt_itab-budat FROM mkpf WHERE mblnr lt_itab-mblnr." AND ZEILE = LT_ITAB-ZEILE.
    lt_itab-reffi 'KAR'.
    IF lt_itab-shkzg 'H'.
      lt_itab-menge lt_itab-menge  * -).
    ENDIF.


    IF  lt_itab-bwart '161'
       OR lt_itab-bwart '122'
       OR lt_itab-bwart '351'
       OR lt_itab-bwart '101' .
      SELECT SINGLE bktxt
          INTO lt_itab-ref_txt
          FROM mkpf
          WHERE mblnr lt_itab-mblnr.
    ENDIF .


    MODIFY lt_itab.CLEAR lt_itab.
  ENDLOOP.

  SORT lt_itab BY budat mblnr zeile .
  lt_itab-matnr l_matnr.
  lt_itab-jcsl l_menge1.
  lt_itab-reffi 'KAR'.
  APPEND lt_itab.CLEAR lt_itab.
  DATA:last_menge TYPE menge_d.
  DATA:line TYPE i.
  DESCRIBE TABLE lt_itab LINES line.
  LOOP AT lt_itab.
    IF sy-tabix > AND sy-tabix <> line.
      lt_itab-jcsl last_menge + lt_itab-menge.

    ENDIF.
    last_menge lt_itab-jcsl.
    MODIFY lt_itab.CLEAR lt_itab.
  ENDLOOP.
  DATAlt_fcat TYPE slis_t_fieldcat_alv,
        ls_fcat TYPE slis_fieldcat_alv.

  CLEAR ls_fcat.
  ls_fcat-fieldname 'MATNR'.
  ls_fcat-seltext_l '物料'.
  ls_fcat-outputlen 18.
  APPEND ls_fcat TO lt_fcat.
  CLEAR ls_fcat.
  ls_fcat-fieldname 'BUDAT'.
  ls_fcat-seltext_l '过账日期'.
  ls_fcat-outputlen 10.
  APPEND ls_fcat TO lt_fcat.
  CLEAR ls_fcat.
  ls_fcat-fieldname 'MBLNR'.
  ls_fcat-seltext_l '物料凭证'.
  ls_fcat-outputlen 10.
  APPEND ls_fcat TO lt_fcat.
  CLEAR ls_fcat.
  ls_fcat-fieldname 'ZEILE'.
  ls_fcat-seltext_l '行项目'.
  ls_fcat-outputlen 6.
  APPEND ls_fcat TO lt_fcat.
  CLEAR ls_fcat.
  ls_fcat-fieldname 'BWART'.
  ls_fcat-seltext_l '移动类型'.
*  ls_fcat-outputlen = 10.
  APPEND ls_fcat TO lt_fcat.
  CLEAR ls_fcat.
  ls_fcat-fieldname 'MENGE'.
  ls_fcat-seltext_l '数量'.
  ls_fcat-qfieldname 'REFFI'.
  ls_fcat-outputlen 13.
  APPEND ls_fcat TO lt_fcat.

  CLEAR ls_fcat.
  ls_fcat-fieldname 'JCSL'.
  ls_fcat-seltext_l '结存数量'.
  ls_fcat-ref_tabname  'MSEG'.
  ls_fcat-ref_fieldname 'MENGE'.
  ls_fcat-qfieldname 'REFFI'.
  ls_fcat-outputlen 13.
  APPEND ls_fcat TO lt_fcat.

  CLEAR ls_fcat.
  ls_fcat-fieldname 'REF_DOC'.
  ls_fcat-seltext_l '参考凭证'.
  ls_fcat-outputlen 20.
  APPEND ls_fcat TO lt_fcat.

  CLEAR ls_fcat.
  ls_fcat-fieldname 'REF_POS'.
  ls_fcat-seltext_l '参考行项目'.
  ls_fcat-outputlen 10.
  APPEND ls_fcat TO lt_fcat.

  CLEAR ls_fcat.
  ls_fcat-fieldname 'REF_TXT'.
  ls_fcat-seltext_l '抬头文本'.
  ls_fcat-outputlen 50.
  APPEND ls_fcat TO lt_fcat.
  CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
    EXPORTING
      i_screen_start_column 7                                       "ALV起始位置
      i_screen_start_line   7
      i_screen_end_column   173
      i_screen_end_line     30
      i_title               '本期发生明细'  "这里设置alv标题
      i_tabname             space    "这里默认是空就OK了
      it_fieldcat           lt_fcat[]  "这里是字段目录
      i_callback_program    sy-repid
    TABLES
      t_outtab              lt_itab[]  "输出内表.
    EXCEPTIONS
      program_error         1
      OTHERS                2.
ENDFORM.