SAP库存管理报表(含无价厂)

*&---------------------------------------------------------------------*
*& Program name: ZCOR00057
*& Description : 库存管理报表(含无价厂)
*&---------------------------------------------------------------------*
*& Change History:                                                     *
*& Ver.  SR/Project  Date       Author     Description                 *
*& ----- ----------- ---------- ---------- ----------------------------*
*& V001  Create      2015/08/26 Evan.Xu    Creation                    *
*&---------------------------------------------------------------------*

REPORT zcor00057 NO STANDARD PAGE HEADING MESSAGE-ID zpp01.

INCLUDE ZCOR00057_TOP.
INCLUDE ZCOR00057_F01.

*---------------------------------------------------------------------*
*        INITIALIZATION                                               *
*---------------------------------------------------------------------*
INITIALIZATION.
  PERFORM data_ini.

***********************************************************************
*Selection Events Processing
***********************************************************************
AT SELECTION-SCREEN OUTPUT.


*---------------------------------------------------------------------*
*        AT SELECTION-SCREEN                                          *
*---------------------------------------------------------------------*
AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'FC01'. "...........下載規格書
      PERFORM download_require_spec.
    WHEN OTHERS.
      PERFORM check_auth.
  ENDCASE.

*---------------------------------------------------------------------*
*        START-OF-SELECTION                                           *
*---------------------------------------------------------------------*

START-OF-SELECTION.
  PERFORM get_data.
  IF gt_marc IS INITIAL.
    MESSAGE i002 WITH 'No data found!'.
    LEAVE LIST-PROCESSING.
  ENDIF.
  PERFORM process_data.


*---------------------------------------------------------------------*
*        END-OF-SELECTION                                             *
*---------------------------------------------------------------------*

END-OF-SELECTION.
  PERFORM build_alv.
  PERFORM alv_init.
  PERFORM display_alv.


*&---------------------------------------------------------------------*
*&  Include           ZCOR00057_TOP
*&---------------------------------------------------------------------*

TABLES: mara,mard,mbew,marc,zco057_t01,t001,mska,zsco_stock_loc.

DATA: BEGIN OF gw_detail,
        bukrs TYPE t001-bukrs,   "Company Code
        butxt TYPE t001-butxt,   "Company name
        name2 TYPE adrc-name2,   "short name of company
        werks TYPE mard-werks,   "Plant
        name1 TYPE t001w-name1,  "Plant name
        bklas TYPE mbew-bklas,   "Valuation Class   **

        lgort TYPE mard-lgort,   "Storage Location
        lgobe TYPE t001l-lgobe,  "Description of Storage Location
        bptnr TYPE abi_bprtnr,   "Storage Location/Business partner
        name1_bp TYPE lfa1-name1,   "Business partner

        ltype TYPE zco057_t01-ltype,  "Category1 (Mark)
        sytag TYPE zco057_t01-sytag,  "Category2 (Mark)
        pttxt TYPE zco057_t01-pttxt,  "Category (Mark)

        matnr TYPE mard-matnr,   "Material
        maktx TYPE makt-maktx,   "Material Description

        prctr TYPE marc-prctr,    "Profit Center
        mtart TYPE mara-mtart,   "Material Type
        matkl TYPE mara-matkl,   "Material Group

        "spart TYPE mara-spart,   "Division
        "maabc TYPE marc-maabc,   "ABC indicator
        sobkz TYPE mska-sobkz,   "Special Stock
        labst  TYPE mard-labst,   "Qty On Hand
        meins TYPE mara-meins,   "Base Unit of Measure(UM)
        pvprs TYPE p LENGTH 13 DECIMALS 5,  "Current Unit Price(實際單位成本)
        acost TYPE p LENGTH 13 DECIMALS 2,  "Current Stock Value(實際成本)

        stprs TYPE p LENGTH 13 DECIMALS 5,  "Standard unit cost(标准单位成本)
        scost TYPE p LENGTH 13 DECIMALS 2,  "Standard Amount(标准成本)

        waers TYPE t001-waers,   "Currency
        aufnr TYPE aufk-aufnr,    "WO NO

        lcolor TYPE c LENGTH 4,   "color
        seltd TYPE c LENGTH 1,    "Select Box

      END OF gw_detail.

DATA: BEGIN OF gw_total,
        ltype TYPE zco057_t01-ltype,  "Category1
        sytag TYPE zco057_t01-sytag,  "Category2
        pttxt TYPE zco057_t01-pttxt,  "category text
        acost TYPE p LENGTH 13 DECIMALS 2,  "Actual Amount(实际成本)
        waers TYPE t001-waers,   "Currency

        lcolor TYPE c LENGTH 4,   "color
        seltd TYPE c LENGTH 1,    "Select Box
      END OF gw_total.

DATA: BEGIN OF gw_marc,
        werks  TYPE mard-werks,   "Plant
        matnr  TYPE mard-matnr,   "Material
        maktx  TYPE makt-maktx,   "Material Description
        mtart  TYPE mara-mtart,   "Material Type
        matkl  TYPE mara-matkl,   "Material Group
        prctr  TYPE marc-prctr,    "Profit Center
        meins  TYPE mara-meins,   "Base Unit of Measure
        dummy  TYPE c,            "无价厂标记
        werk2  TYPE mard-werks,   "无价厂对应有价厂
        bklas  TYPE mbew-bklas,   "Valuation class
        kaln1  TYPE mbew-kaln1,   "Cost Estimate Number - Product Costing
      END OF gw_marc.

DATA: BEGIN OF gw_mardh,
        matnr LIKE mardh-matnr,
        werks LIKE mardh-werks,
        lgort LIKE mardh-lgort,
        lfgja LIKE mardh-lfgja,
        lfmon LIKE mardh-lfmon,
        labst LIKE mardh-labst,  "Valuated Unrestricted-Use Stock
        umlme LIKE mardh-umlme,  "Stock in transfer (from one storage location to another)
        insme LIKE mardh-insme,  "Stock in Quality Inspection
        einme LIKE mardh-einme,  "Total Stock of All Restricted Batches
        speme LIKE mardh-speme,  "Blocked Stock
        retme LIKE mardh-retme,  "Blocked Stock Returns
        "lvorm LIKE mardh-lvorm,  "Flag Material for Deletion at Storage Location Level
      END OF gw_mardh.

DATA: BEGIN OF gw_mska,    "for special stock "E"
        werks LIKE mska-werks,
        matnr LIKE mska-matnr,
        lgort LIKE mska-lgort,
        sobkz LIKE mska-sobkz,
        vbeln LIKE mska-vbeln,
        posnr LIKE mska-posnr,
        "lfgja LIKE mska-lfgja,
        "lfmon LIKE mska-lfmon,
        kalab LIKE mska-kalab,  "Valuated Unrestricted-Use Stock
        kains LIKE mska-kains,  "Stock in Quality Inspection
        kaspe LIKE mska-kaspe,  "Blocked Stock
        kaein LIKE mska-kaein,  "Total Stock of All Restricted Batches
      END OF gw_mska.

DATA: BEGIN OF gw_mslb,    "for special stock "O"
        werks LIKE mslb-werks,
        matnr LIKE mslb-matnr,
        sobkz LIKE mslb-sobkz,
        lifnr LIKE mslb-lifnr,
        lfgja LIKE mslb-lfgja,
        lfmon LIKE mslb-lfmon,
        lblab LIKE mslb-lblab,  "Valuated Unrestricted-Use Stock
        lbins LIKE mslb-lbins,  "Stock in Quality Inspection
        lbein LIKE mslb-lbein,  "Total Stock of All Restricted Batches
      END OF gw_mslb.

DATA: BEGIN OF gw_spstock,    "for special stock collect
        werks LIKE mska-werks,
        matnr LIKE mska-matnr,
        bptnr TYPE abi_bprtnr,   "Storage Location/Business partner
        sobkz LIKE mska-sobkz,
        ssnum LIKE bickey-ssnum, "Special stock number
        labst  TYPE mard-labst,   "Qty On Hand
      END OF gw_spstock.
DATA: gt_mska LIKE TABLE OF gw_mska,
      gt_mslb LIKE TABLE OF gw_mslb,
      gt_spstock LIKE TABLE OF gw_spstock.

DATA: BEGIN OF gw_mseg,
        werks  TYPE mseg-werks,    "Plant
        matnr  TYPE mseg-matnr,    "Material
        mblnr  TYPE mseg-mblnr,    "Material document
        mjahr  TYPE mseg-mjahr,    "Material Document Year
        zeile  TYPE mseg-zeile,    "Material document Item
        budat  TYPE mkpf-budat,    "Posting Date
        menge  TYPE mseg-menge,    "Quantity
        meins  TYPE mseg-meins,    "U/M
        shkzg  TYPE mseg-shkzg,    "Debit/Credit Indicator
        lgort  TYPE mseg-lgort,    "Storage Location
        "charg  TYPE mseg-charg,    "Batch
        sobkz  TYPE mseg-sobkz,    "Special Stock Indicator
        "bwart  TYPE mseg-bwart,    "Movement Type
        "bukrs  TYPE mseg-bukrs,    "Company Code
        lifnr  TYPE mseg-lifnr,    "Vendor Account Number
        mat_kdauf TYPE mseg-mat_kdauf,    "Sales Order Number of Valuated Sales Order Stock
        mat_kdpos TYPE mseg-mat_kdpos,    "Sales Order Item of Valuated Sales Order Stock
        cpudt  TYPE mkpf-cpudt,     "Date of entry
        cputm  TYPE mkpf-cputm,     "Time of Entry
      END OF gw_mseg.

DATA: BEGIN OF gw_mseg_sum,
        werks  TYPE mseg-werks,    "Plant
        matnr  TYPE mseg-matnr,    "Material
        lgort  TYPE mseg-lgort,    "Storage Location
        menge  TYPE mseg-menge,    "Quantity
END OF gw_mseg_sum.

DATA: BEGIN OF gw_mseg_sum_sp,  "for special stock
        werks  TYPE mseg-werks,    "Plant
        matnr  TYPE mseg-matnr,    "Material
        ssnum LIKE bickey-ssnum, "Special stock number
        "bptnr TYPE abi_bprtnr,   "Storage Location/Business partner
        sobkz  TYPE mseg-sobkz,    "Special Stock Indicator
        menge  TYPE mseg-menge,    "Quantity
END OF gw_mseg_sum_sp.

DATA: BEGIN OF gw_t001l,
        werks LIKE t001l-werks, "Plant
        lgort LIKE t001l-lgort, "Storage Location
        lgobe LIKE t001l-lgobe, "Description of Storage Location
      END OF gw_t001l.

DATA: BEGIN OF gw_aufk,
        bukrs LIKE aufk-bukrs,      "Company code
        werks LIKE aufk-werks,      "Plant
        aufnr LIKE aufk-aufnr,      "WO No.
        objnr LIKE aufk-objnr,      "Object number
        stat  LIKE jcds-stat,       "Object status
        udate LIKE jcds-udate,      "Date
        prctr LIKE aufk-prctr,      "Profit Center
        auart LIKE aufk-auart,      "Order Type
        ktext LIKE aufk-ktext,      "Head Material Desc.
      END OF gw_aufk.

DATA: BEGIN OF gw_afpo,
        aufnr LIKE afpo-aufnr,    "WO No.
        matnr LIKE afpo-matnr,    "WO material
      END OF gw_afpo.

DATA: BEGIN OF gw_cosp,
        objnr LIKE cosp-objnr,  "Object number
        wkg001  LIKE cosp-wkg001,  "Total Value in Controlling Area Currency
        wkg002  LIKE cosp-wkg002,
        wkg003  LIKE cosp-wkg003,
        wkg004  LIKE cosp-wkg004,
        wkg005  LIKE cosp-wkg005,
        wkg006  LIKE cosp-wkg006,
        wkg007  LIKE cosp-wkg007,
        wkg008  LIKE cosp-wkg008,
        wkg009  LIKE cosp-wkg009,
        wkg010  LIKE cosp-wkg010,
        wkg011  LIKE cosp-wkg011,
        wkg012  LIKE cosp-wkg012,
      END OF gw_cosp.

DATA: BEGIN OF gw_ckmlcr,
        bdatj LIKE ckmlcr-bdatj,  "Posting date YYYY
        poper LIKE ckmlcr-poper,  "Posting period
        curtp LIKE ckmlcr-curtp,  "Currency Type and Valuation View
        peinh LIKE ckmlcr-peinh,  "Price unit
        vprsv LIKE ckmlcr-vprsv,  "Price control indicator
*        stprs LIKE ckmlcr-stprs,  "Standard price
*        pvprs LIKE ckmlcr-pvprs,  "Periodic unit price
        stprs TYPE p LENGTH 15 DECIMALS 2,  "Standard price
        pvprs TYPE p LENGTH 15 DECIMALS 2,  "Periodic unit price
        waers LIKE ckmlcr-waers,  "Currency Key
        salk3 LIKE ckmlcr-salk3,  "Value of total valuated stock
        salkv LIKE ckmlcr-salkv,  "Value based on the periodic unit price (only with pr.ctrl S)
        lbkum LIKE ckmlpp-lbkum,  "Total valuated stock
      END OF gw_ckmlcr.

DATA: gt_aufk LIKE TABLE OF gw_aufk,
      gt_afpo LIKE TABLE OF gw_afpo,
      gt_cosp LIKE TABLE OF gw_cosp.

DATA: gt_detail LIKE TABLE OF gw_detail,
      gt_total LIKE TABLE OF gw_total,
      gt_marc LIKE TABLE OF gw_marc,
      gt_mardh LIKE TABLE OF gw_mardh,
      gt_mseg LIKE TABLE OF gw_mseg,
      gt_mseg_sp LIKE TABLE OF gw_mseg,
      gt_mseg_sum_sp LIKE TABLE OF gw_mseg_sum_sp,
      gt_mseg_sum LIKE TABLE OF gw_mseg_sum,
      gt_t001l LIKE TABLE OF gw_t001l.

DATA: gw_zco057_t01 LIKE zco057_t01,
      gt_zco057_t01 LIKE TABLE OF zco057_t01.
DATA: gw_zpp103_t01 LIKE zpp103_t01,
      gt_zpp103_t01 LIKE TABLE OF zpp103_t01.

RANGES: gr_werks FOR mard-werks,
        gr_sytag FOR zco057_t01-sytag.

DATA: g_lfgja LIKE mardh-lfgja,   "获取期末库存的年份
      g_lfmon LIKE mardh-lfmon,   "获取期末库存的月份
      g_price TYPE c LENGTH 1.    "查看Detail之Price和cost权限标记

DATA: BEGIN OF gw_field,
        fname TYPE name_feld,
      END OF gw_field.
DATA gt_field LIKE TABLE OF gw_field.

CONSTANTS:  c_tilde(01) TYPE c VALUE '~',
            c_waers_gc LIKE t001-waers VALUE 'USD'.

TYPE-POOLS: icon.
TABLES: sscrfields.
DATA: functxt TYPE smp_dyntxt.

*-----Data variable for use of ALV------------------------------------*
TYPE-POOLS: slis.
DATA: gw_fieldcat         TYPE slis_fieldcat_alv.
DATA: gt_fieldcat         TYPE slis_t_fieldcat_alv,
      gt_events           TYPE slis_t_event,
      gw_print            TYPE slis_print_alv,
      gt_sp_group         TYPE slis_t_sp_group_alv,
      g_list_top_of_page  TYPE slis_t_listheader,
      gt_sort             TYPE slis_t_sortinfo_alv WITH HEADER LINE,
      gt_listheader       TYPE slis_t_listheader,
      gw_layout           TYPE slis_layout_alv.

DATA: gw_variant  LIKE disvariant,
      g_save(1) VALUE 'A',
      g_exit(1),
      gs_repid   LIKE sy-repid.

*---------------------------------------------------------------------*
*        SELECTION SCREEN                                             *
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.

SELECT-OPTIONS: s_bukrs FOR t001-bukrs OBLIGATORY,
                s_werks FOR mard-werks OBLIGATORY,
                s_lgort FOR mard-lgort NO-DISPLAY,
                s_bptnr FOR zsco_stock_loc-bptnr,   "Storage Location/Vendor/Customer
                s_matnr FOR mard-matnr,
                s_matkl FOR mara-matkl,   "Material Group
                s_sobkz FOR mska-sobkz NO-DISPLAY,   "Special Stock
                s_bklas FOR mbew-bklas,   "Valuation Class
                s_mtart FOR mara-mtart,   "Material Type
                s_prctr FOR marc-prctr OBLIGATORY,   "Profit Center
                s_sytag FOR zco057_t01-sytag.

SELECTION-SCREEN SKIP.
PARAMETERS: p_edate LIKE rm61r-bisdt OBLIGATORY DEFAULT sy-datum. "End selection date

SELECTION-SCREEN SKIP.

PARAMETERS: p_gcurr TYPE check DEFAULT 'X' NO-DISPLAY, "Display by group currency
            p_specd TYPE check DEFAULT 'X' NO-DISPLAY.

PARAMETERS: p_all  RADIOBUTTON GROUP rg1 DEFAULT 'X', "库存分析
            p_bad  RADIOBUTTON GROUP rg1.             "不良分析

SELECTION-SCREEN SKIP.

PARAMETERS: p_summ AS CHECKBOX DEFAULT 'X'. "Summary by BU

SELECTION-SCREEN SKIP.
SELECTION-SCREEN COMMENT /1(79) text-002.
SELECTION-SCREEN COMMENT /1(79) text-003.
SELECTION-SCREEN COMMENT /1(79) text-004.
SELECTION-SCREEN COMMENT /1(79) text-005.
SELECTION-SCREEN COMMENT /1(79) text-006.
SELECTION-SCREEN COMMENT /1(79) text-007.

SELECTION-SCREEN END OF BLOCK blk1.

SELECTION-SCREEN FUNCTION KEY 1.  "Button: 下載規格書


*&---------------------------------------------------------------------*
*&  Include           ZCOR00057_F01
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  data_ini
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM data_ini .
**set
  gs_repid = sy-repid.
  g_save = 'A'.
  CLEAR: gw_variant.
  gw_variant-report = gs_repid.
  gw_variant-username = sy-uname.

  functxt-icon_id   = icon_export.
  functxt-quickinfo = '下載需求規格書'.
  functxt-icon_text = '下載規格書'.
  sscrfields-functxt_01 = functxt.

ENDFORM.                    " data_ini


*&---------------------------------------------------------------------*
*&      Form  check_auth
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM check_auth .
  DATA: l_actvt(2) TYPE c VALUE '28'.
*  09  Display prices
*  27  Display totals records
*  28  Display line items

  CLEAR: g_price.
  IF p_summ = 'X'.
    l_actvt = '27'.
    AUTHORITY-CHECK OBJECT 'ZCO057' "Authorization object for report ZCO057
      ID 'ACTVT' FIELD  l_actvt.
    IF sy-subrc <> 0.
      SET CURSOR FIELD 'P_SUMM'.
      MESSAGE e004 WITH sy-uname '没有权限执行Summary!'.
      EXIT.
    ENDIF.
  ELSE.
    l_actvt = '28'.
    AUTHORITY-CHECK OBJECT 'ZCO057' "Authorization object for report ZCO057
      ID 'ACTVT' FIELD  l_actvt.
    IF sy-subrc <> 0.
      SET CURSOR FIELD 'P_ALL'.
      MESSAGE e004 WITH sy-uname '没有权限执行库存分析!'.
      EXIT.
    ENDIF.

    l_actvt = '09'.
    AUTHORITY-CHECK OBJECT 'ZCO057' "Authorization object for report ZCO057
      ID 'ACTVT' FIELD  l_actvt.
    IF sy-subrc = 0.
      g_price = 'X'.
    ENDIF.
  ENDIF.

**获取工厂范围
  l_actvt = '03'.
  CLEAR: gr_werks[],gr_werks.
  gr_werks-sign = 'I'.
  gr_werks-option = 'EQ'.
  SELECT bwkey INTO gr_werks-low
    FROM t001k
    WHERE bwkey IN s_werks
      AND bukrs IN s_bukrs.

    AUTHORITY-CHECK OBJECT 'M_MATE_WRK' "Material Master: Plants
           ID 'WERKS' FIELD  gr_werks-low
           ID 'ACTVT' FIELD  l_actvt.
    IF sy-subrc <> 0.
      SET CURSOR FIELD 'S_WERKS-LOW'.
      MESSAGE e004 WITH 'You do not have authorization for plant' gr_werks-low.
      EXIT.
    ENDIF.
    APPEND gr_werks.
  ENDSELECT.
  IF sy-subrc <> 0.
    MESSAGE e004 WITH '请输入正确的公司和工厂!'.
  ENDIF.

  DATA: l_datum LIKE sy-datum.
  CLEAR: l_datum.
  l_datum = sy-datum.

  IF p_edate = l_datum.
    "CLEAR: p_specd.
    p_specd = 'Y'.
    "获取月末日期
    CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'
      EXPORTING
        i_date = l_datum
      IMPORTING
        e_date = l_datum.
    IF p_edate = l_datum. "当前日期为月末时,提示信息
      MESSAGE I004 WITH '<<重要提示>>月報務必於成本月結後製表!'.
    ENDIF.
  ELSE.
    "获取月末日期
    CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'
      EXPORTING
        i_date = p_edate
      IMPORTING
        e_date = l_datum.
    IF p_edate = l_datum.
      CLEAR: p_specd.
    ELSE.
      p_specd = 'X'.
    ENDIF.
  ENDIF.

  "Set Special Stock ranges
  CLEAR: s_sobkz,s_sobkz[].
  s_sobkz-sign = 'I'.
  s_sobkz-option = 'EQ'.
*  s_sobkz-low = ''.
*  APPEND s_sobkz.
  IF p_all = 'X'.
    s_sobkz-low = 'O'.
    APPEND s_sobkz.
  ELSEIF p_bad = 'X'.
    s_sobkz-low = 'E'.
    APPEND s_sobkz.
  ENDIF.


ENDFORM.                    " check_auth


*&---------------------------------------------------------------------*
*&      Form  get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_data .
  DATA: l_sdate LIKE sy-datum, "获取Material Document的起始日期
        l_edate LIKE sy-datum. "获取Material Document的终止日期
  DATA: l_tabix LIKE sy-tabix,
        l_dummy TYPE c,        "无价厂标记
        l_werks LIKE marc-werks.

**Get All Materials
  PERFORM show_timer_bar USING 0 0 'Getting All Materials...'.
  CLEAR: gt_detail.
  SELECT  c~werks     "Plant
          c~matnr     "Material
          c~prctr     "Profit Center
          t~maktx     "Material Description
          a~mtart     "Material Type
          a~matkl     "Material Group
          a~meins     "Base Unit of Measure
    INTO CORRESPONDING FIELDS OF TABLE gt_marc
    FROM marc AS c
    INNER JOIN mara AS a ON a~matnr = c~matnr
    INNER JOIN makt AS t ON t~matnr = c~matnr
                        AND t~spras = 'E'
    WHERE c~werks IN gr_werks
      AND c~matnr IN s_matnr  "
      "AND c~prctr IN s_prctr  "Profit Center
      AND a~mtart IN s_mtart  "Material Type
      AND a~matkl IN s_matkl.  "Material Group
*      AND c~lvorm = space     "Deletion flag
*      AND a~lvorm = space.    "Deletion flag

  SORT gt_marc BY werks matnr.
  DELETE ADJACENT DUPLICATES FROM gt_marc COMPARING werks matnr.
  "排除Z*虛擬料號
  DELETE gt_marc WHERE matnr+0(1) = 'Z'.

  LOOP AT gt_marc INTO gw_marc.
    l_tabix = sy-tabix.
    AT NEW werks.
      CLEAR: l_werks,l_dummy.
      SELECT SINGLE werks INTO l_werks
        FROM zppt0003
        WHERE werkd = gw_marc-werks.
      IF sy-subrc = 0.
        l_dummy = 'X'.
      ELSE.
        l_werks = gw_marc-werks.
      ENDIF.
    ENDAT.
    IF gw_marc-prctr IS INITIAL.
      SELECT SINGLE prctr INTO gw_marc-prctr
        FROM marc
        WHERE werks = l_werks
          AND matnr = gw_marc-matnr.
    ENDIF.
    IF NOT gw_marc-prctr IN s_prctr.
      DELETE gt_marc INDEX l_tabix.
      CONTINUE.
    ENDIF.

    "Valuation Class
    SELECT SINGLE bklas kaln1 INTO (gw_marc-bklas,gw_marc-kaln1)
      FROM mbew
      WHERE matnr = gw_marc-matnr
        AND bwkey = l_werks.
    IF NOT gw_marc-bklas IN s_bklas.
      DELETE gt_marc INDEX l_tabix.
      CONTINUE.
    ENDIF.

    gw_marc-dummy = l_dummy.
    gw_marc-werk2 = l_werks.

    MODIFY gt_marc FROM gw_marc INDEX l_tabix.

  ENDLOOP.

  CHECK gt_marc IS NOT INITIAL.

**Get Material Documents
  IF p_specd = 'X'.

    PERFORM show_timer_bar USING 0 0 'Getting MM Documents...'.

    "获取Material Documents的日期范围
    l_sdate = p_edate.
    l_sdate+6(2) = '01'.
    l_edate = p_edate.

    CLEAR: gt_field.
    PERFORM get_mseg_fields
        TABLES gt_field   "<--- Field names used
        USING  gw_mseg.   " ---> in structure here

    CLEAR: gt_mseg.
    SELECT (gt_field) INTO CORRESPONDING FIELDS OF TABLE gt_mseg
      FROM mkpf
      INNER JOIN mseg ON mkpf~mandt = mseg~mandt
                      AND mkpf~mblnr = mseg~mblnr
                      AND mkpf~mjahr = mseg~mjahr
      WHERE mseg~werks IN gr_werks
        AND mseg~matnr IN s_matnr
        "AND mseg~matnr <> space
        AND ( mkpf~budat >= l_sdate AND mkpf~budat <= l_edate )
        AND mseg~sobkz = space "IN s_sobkz "非特殊库存部分
        AND mseg~menge <> 0
      %_HINTS
      DB2    '&SUBSTITUTE VALUES&'
      ORACLE '&SUBSTITUTE VALUES&'.

    DELETE gt_mseg WHERE matnr+0(1) = 'Z'   "排除Z*虛擬料號
                      OR matnr = space
                      OR menge = 0.

    DELETE gt_mseg WHERE NOT lgort IN s_bptnr "s_lgort
                      OR lgort = space
                      OR lgort = 'DUMY'.     "SLoc=DUMY 無價倉不抓
                      "OR lgort+0(1) = '2'.  "SLoc=2110,2210,2310…. 2開頭倉別(2XXX),客供品不抓,貨權屬於客戶

    CLEAR: gt_mseg_sum.
    LOOP AT gt_mseg INTO gw_mseg.
      CLEAR: gw_mseg_sum.
      IF gw_mseg-shkzg = 'H'.
        gw_mseg-menge = - gw_mseg-menge.
      ENDIF.
      MOVE-CORRESPONDING gw_mseg TO gw_mseg_sum.
      COLLECT gw_mseg_sum INTO gt_mseg_sum.
    ENDLOOP.
    SORT gt_mseg_sum BY matnr werks lgort.

    "期末库存期间取选择日期的上个月份
    CALL FUNCTION 'BKK_ADD_MONTH_TO_DATE'
      EXPORTING
        months  = -1
        olddate = l_sdate
      IMPORTING
        newdate = l_sdate. "获取上个月的今天
    g_lfgja = l_sdate+0(4).
    g_lfmon = l_sdate+4(2).

  ELSE.
    "期末库存期间取选择日期所在的月份
    g_lfgja = p_edate+0(4).
    g_lfmon = p_edate+4(2).
  ENDIF.

**Get all Stock
  PERFORM show_timer_bar USING 0 0 'Getting Storage Location...'.
  CLEAR: gt_mardh.
  SELECT matnr werks lgort lfgja lfmon
         labst umlme insme einme speme retme "lvorm
    INTO CORRESPONDING FIELDS OF TABLE gt_mardh
    FROM mard
    WHERE matnr IN s_matnr
      AND werks IN gr_werks
      AND lgort IN s_bptnr. "s_lgort.

  SELECT  matnr werks lgort lfgja lfmon
          labst umlme insme einme speme retme "lvorm
    APPENDING CORRESPONDING FIELDS OF TABLE gt_mardh
    FROM mardh
    WHERE matnr IN s_matnr
      AND werks IN gr_werks
      AND lgort IN s_bptnr  "s_lgort.
      AND ( lfgja > g_lfgja OR lfgja = g_lfgja AND lfmon >= g_lfmon ).


  "删除重复行,仅保留最近一条记录
  SORT gt_mardh BY matnr werks lgort lfgja lfmon.
  DELETE ADJACENT DUPLICATES FROM gt_mardh COMPARING matnr werks lgort.

  DELETE gt_mardh WHERE lgort = space
                    OR lgort = 'DUMY'     "SLoc=DUMY 無價倉不抓
                    "OR lgort+0(1) = '2'   "SLoc=2110,2210,2310…. 2開頭倉別(2XXX),客供品不抓,貨權屬於客戶
                    OR matnr+0(1) = 'Z'.  "排除Z*虛擬料號

**特殊库存部分库存
  IF s_sobkz[] IS NOT INITIAL.
    PERFORM show_timer_bar USING 0 0 'Getting special stocks...'.

    CLEAR: gt_spstock.

    IF 'E' IN s_sobkz.
      CLEAR: gt_mska.
      SELECT  mska~matnr mska~werks
              mska~lgort mska~sobkz
              mska~vbeln mska~posnr
              mska~kalab
              mska~kains
              mska~kaspe
              mska~kaein
        INTO CORRESPONDING FIELDS OF TABLE gt_mska
        FROM mska
        WHERE matnr IN s_matnr
          AND werks IN gr_werks
          "AND lgort IN s_lgort
          AND sobkz IN s_sobkz.

      DELETE gt_mska WHERE matnr+0(1) = 'Z'   "排除Z*虛擬料號
                        OR matnr = space.

      DELETE gt_mska WHERE lgort = 'DUMY'.     "SLoc=DUMY 無價倉不抓
                        "OR lgort+0(1) = '2'.  "SLoc=2110,2210,2310…. 2開頭倉別(2XXX),客供品不抓,貨權屬於客戶
      SORT gt_mska BY werks matnr lgort.

      "collect items for E special stock
      LOOP AT gt_mska INTO gw_mska.
        CLEAR: gw_spstock.
        MOVE-CORRESPONDING gw_mska TO gw_spstock.
        gw_spstock-labst = gw_mska-kalab + gw_mska-kains
                          + gw_mska-kaspe + gw_mska-kaein.
        PERFORM get_bs_partner_for_e
          USING gw_mska-werks
                gw_mska-vbeln
                gw_mska-lgort
          CHANGING gw_spstock-bptnr.
        IF NOT gw_spstock-bptnr IN s_bptnr.
          CONTINUE.
        ENDIF.
        CONCATENATE gw_mska-vbeln gw_mska-posnr INTO gw_spstock-ssnum SEPARATED BY '/'.
        COLLECT gw_spstock INTO gt_spstock.
      ENDLOOP.
    ENDIF.

    IF 'O' IN s_sobkz.
      CLEAR: gt_mslb.
      SELECT  matnr werks sobkz lifnr
              lblab
              lbins
              lbein
        INTO CORRESPONDING FIELDS OF TABLE gt_mslb
        FROM mslb
        WHERE matnr IN s_matnr
          AND werks IN gr_werks
          AND lifnr IN s_bptnr
          AND sobkz IN s_sobkz.

      DELETE gt_mslb WHERE matnr+0(1) = 'Z'   "排除Z*虛擬料號
                        OR matnr = space.

      SORT gt_mslb BY werks matnr lifnr.

      "collect items for O special stock
      LOOP AT gt_mslb INTO gw_mslb.
        CLEAR: gw_spstock.
        MOVE-CORRESPONDING gw_mslb TO gw_spstock.
        gw_spstock-labst = gw_mslb-lblab + gw_mslb-lbins
                          + gw_mslb-lbein.
        gw_spstock-bptnr = gw_mslb-lifnr.
        IF NOT gw_spstock-bptnr IN s_bptnr.
          CONTINUE.
        ENDIF.
        gw_spstock-ssnum = gw_mslb-lifnr.
        COLLECT gw_spstock INTO gt_spstock.
      ENDLOOP.
    ENDIF.


    IF gt_field IS INITIAL.
      PERFORM get_mseg_fields
        TABLES gt_field   "<--- Field names used
        USING  gw_mseg.   " ---> in structure here
    ENDIF.
    CLEAR: gt_mseg_sp.
    SELECT (gt_field) INTO CORRESPONDING FIELDS OF TABLE gt_mseg_sp
      FROM mkpf AS mkpf
      INNER JOIN mseg AS mseg ON mkpf~mandt = mseg~mandt
                             AND mkpf~mblnr = mseg~mblnr
                             AND mkpf~mjahr = mseg~mjahr
      WHERE mseg~werks  IN  gr_werks
        AND mseg~matnr  IN  s_matnr
        "AND mseg~lgort  IN  s_lgort
        "AND mseg~charg  IN  s_charg
        AND mkpf~budat  >  p_edate
        AND mseg~sobkz  IN  s_sobkz
      %_HINTS
      DB2    '&SUBSTITUTE VALUES&'
      ORACLE '&SUBSTITUTE VALUES&'.

    DELETE gt_mseg WHERE matnr+0(1) = 'Z'   "排除Z*虛擬料號
                      OR matnr = space
                      OR menge = 0.

    CLEAR: gt_mseg_sum_sp.
    LOOP AT gt_mseg_sp INTO gw_mseg.
      CLEAR: gw_mseg_sum_sp.
      IF gw_mseg-shkzg = 'H'.
        gw_mseg-menge = - gw_mseg-menge.
      ENDIF.
      MOVE-CORRESPONDING gw_mseg TO gw_mseg_sum_sp.
      "Special stock number
      IF gw_mseg-sobkz = 'E'.
        CONCATENATE gw_mseg-mat_kdauf gw_mseg-mat_kdpos
          INTO gw_mseg_sum_sp-ssnum SEPARATED BY '/'.
      ELSEIF gw_mseg-sobkz = 'O'.
        gw_mseg_sum_sp-ssnum = gw_mseg-lifnr.
      ENDIF.
      COLLECT gw_mseg_sum_sp INTO gt_mseg_sum_sp.
    ENDLOOP.
    SORT gt_mseg_sum_sp BY matnr werks ssnum sobkz. "lgort sobkz.
  ENDIF.


**Get Location name
  CLEAR: gt_t001l.
  SELECT werks lgort lgobe INTO CORRESPONDING FIELDS OF TABLE gt_t001l
    FROM t001l
    WHERE werks IN gr_werks
      AND lgort IN s_bptnr. "s_lgort.
  SORT gt_t001l BY werks lgort.

  CLEAR: gt_zco057_t01.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_zco057_t01
    FROM zco057_t01.

  "Category
  CLEAR: gr_sytag.
  gr_sytag-sign = 'I'.
  gr_sytag-option = 'EQ'.
  LOOP AT gt_zco057_t01 INTO gw_zco057_t01.
    IF p_bad = 'X'.
      IF gw_zco057_t01-badin <> 'X'.
        CONTINUE.
      ENDIF.
    ENDIF.
    gr_sytag-low = gw_zco057_t01-sytag.
    APPEND gr_sytag.
  ENDLOOP.

**Get WO
  IF 'C' IN s_sytag AND 'C' IN gr_sytag.
    IF p_specd IS INITIAL.
      "WIP 月底抓取ZPP103 Table
      CLEAR: gt_zpp103_t01.
      SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_zpp103_t01
        FROM zpp103_t01
        WHERE period = p_edate+0(6)
          AND werks IN gr_werks
          AND plnbez IN s_matnr
          AND bklas IN s_bklas
          AND prctr IN s_prctr.
    ELSE.
      "Order master data
      CLEAR: gt_aufk.
      SELECT  bukrs       "Company code
              werks       "Plant
              aufnr       "WO No.
              aufk~objnr       "Object number
              stat        "Object status
              udate       "Date
              prctr       "Profit Center
              auart       "Order Type
              ktext       "Head Material Desc.
        INTO CORRESPONDING FIELDS OF TABLE gt_aufk
        FROM aufk
        INNER JOIN jcds ON aufk~objnr = jcds~objnr
        WHERE werks IN gr_werks
          AND bukrs IN s_bukrs
          AND prctr IN s_prctr
          AND loekz <> 'X'
          AND idat2 = '00000000'      "Technical completion date
          AND jcds~stat = 'I0002'     "REL
          AND jcds~inact NE 'X'.      "Active status
          "AND jcds~udate <= p_edate . "Active Date

      SORT gt_aufk BY aufnr.
      DELETE ADJACENT DUPLICATES FROM gt_aufk COMPARING aufnr.  "去掉重复行

      IF gt_aufk IS NOT INITIAL.
        CLEAR: gt_afpo.
        SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_afpo
          FROM afpo
          FOR ALL ENTRIES IN gt_aufk
          WHERE aufnr = gt_aufk-aufnr
            AND posnr = '0001'
            AND matnr IN s_matnr.

        SORT gt_afpo BY aufnr.

        CLEAR: gt_cosp.
        LOOP AT gt_aufk INTO gw_aufk.
          l_tabix = sy-tabix.
          READ TABLE gt_afpo INTO gw_afpo BINARY SEARCH
            WITH KEY aufnr = gw_aufk-aufnr.
          IF sy-subrc <> 0.
            DELETE gt_aufk INDEX l_tabix.
            CONTINUE.
          ENDIF.
          SELECT  objnr "Object number
                  SUM( wkg001 ) AS wkg001  "Total Value in Controlling Area Currency
                  SUM( wkg002 ) AS wkg002
                  SUM( wkg003 ) AS wkg003
                  SUM( wkg004 ) AS wkg004
                  SUM( wkg005 ) AS wkg005
                  SUM( wkg006 ) AS wkg006
                  SUM( wkg007 ) AS wkg007
                  SUM( wkg008 ) AS wkg008
                  SUM( wkg009 ) AS wkg009
                  SUM( wkg010 ) AS wkg010
                  SUM( wkg011 ) AS wkg011
                  SUM( wkg012 ) AS wkg012
            INTO CORRESPONDING FIELDS OF gw_cosp
            FROM cosp
            WHERE lednr = '00'            "Ledger for Controlling objects
              AND objnr = gw_aufk-objnr   "Object number
              AND wrttp = '04'            "Value Type (04=Actual)
              AND versn = '000'           "Version
            GROUP BY objnr.
            COLLECT gw_cosp INTO gt_cosp.
          ENDSELECT.

          SELECT  objnr "Object number
                  SUM( wkg001 ) AS wkg001  "Total Value in Controlling Area Currency
                  SUM( wkg002 ) AS wkg002
                  SUM( wkg003 ) AS wkg003
                  SUM( wkg004 ) AS wkg004
                  SUM( wkg005 ) AS wkg005
                  SUM( wkg006 ) AS wkg006
                  SUM( wkg007 ) AS wkg007
                  SUM( wkg008 ) AS wkg008
                  SUM( wkg009 ) AS wkg009
                  SUM( wkg010 ) AS wkg010
                  SUM( wkg011 ) AS wkg011
                  SUM( wkg012 ) AS wkg012
            INTO CORRESPONDING FIELDS OF gw_cosp
            FROM coss
            WHERE lednr = '00'            "Ledger for Controlling objects
              AND objnr = gw_aufk-objnr   "Object number
              AND wrttp = '04'            "Value Type (04=Actual)
              AND versn = '000'           "Version
            GROUP BY objnr.
            COLLECT gw_cosp INTO gt_cosp.
          ENDSELECT.
        ENDLOOP.

        SORT gt_cosp BY objnr.
      ENDIF.
    ENDIF.
  ENDIF.

ENDFORM.                    " get_data


*&---------------------------------------------------------------------*
*&      Form  process_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM process_data.
  DATA: l_ktext LIKE aufk-ktext,
        l_lines TYPE i,           "料号总数
        l_tabix TYPE sy-tabix,    "
        l_waers LIKE t001-waers,  "币别
        l_index LIKE sy-index.    "
  DATA: l_bukrs TYPE t001-bukrs,   "Company Code
        l_butxt TYPE t001-butxt,   "Company name
        l_name2 TYPE adrc-name2,   "short name of company
        l_name1 TYPE t001w-name1,  "Plant name
        l_lgobe TYPE t001l-lgobe,    "Description of Storage Location
        l_prctr TYPE marc-prctr,    "Profit center
        l_stprs TYPE zco054_t01-stprs,  "Standard unit cost
        l_pvprs TYPE zco054_t01-pvprs.  "Actual unit cost
  DATA: l_lfgja LIKE mardh-lfgja, "获取单价的期间年
        l_lfmon LIKE mardh-lfmon. "获取单价的期间月

  l_lfgja = p_edate+0(4).
  l_lfmon = p_edate+4(2).

  DESCRIBE TABLE gt_marc LINES l_lines.
  CLEAR: gt_detail.
  LOOP AT gt_marc INTO gw_marc.
    l_tabix = sy-tabix.
    PERFORM show_timer_bar USING l_tabix l_lines 'Getting items detail...'.
    CLEAR: gw_detail.
    MOVE-CORRESPONDING gw_marc TO gw_detail.
    AT NEW werks.

      "获取Plant name
      SELECT SINGLE name1 INTO l_name1
        FROM t001w
        WHERE werks = gw_marc-werks.

      "获取Local Currency, Company code, Company name
      CLEAR: l_waers,l_bukrs,l_butxt,l_name2.
      SELECT SINGLE t~waers t~bukrs t~butxt a~name2 INTO (l_waers,l_bukrs,l_butxt,l_name2)
        FROM t001k AS k
        INNER JOIN t001 AS t ON t~bukrs = k~bukrs
        INNER JOIN adrc AS a ON a~addrnumber = t~adrnr
        WHERE k~bwkey = gw_marc-werks.

**begin: add by Evan at 20151008
      "Company功能性貨幣(抓table可判斷),非USD者, Actual unit cost需以LC Periodic unit price / price unit / 輸入年月G-Rate
      DATA: lw_zcot0007 LIKE zcot0007,
            l_unusd TYPE c LENGTH 1,
            l_rate TYPE p LENGTH 13 DECIMALS 5.
      CLEAR: lw_zcot0007,l_rate,l_unusd.
      SELECT SINGLE * INTO lw_zcot0007
        FROM zcot0007
        WHERE bukrs = l_bukrs.
      IF sy-subrc = 0.
        l_unusd = 'X'.
        CLEAR: l_rate.
        CALL FUNCTION 'READ_EXCHANGE_RATE'
          EXPORTING
            date             = p_edate        "
            foreign_currency = c_waers_gc     "Group Currency
            local_currency   = l_waers        "Local Currency
            type_of_rate     = 'G'
          IMPORTING
            exchange_rate    = l_rate
          EXCEPTIONS
            no_rate_found    = 4
            no_factors_found = 8.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          LEAVE LIST-PROCESSING.
        ENDIF.
      ENDIF.
**end: add by Evan at 20151008
      IF p_gcurr = 'X'.
        l_waers = c_waers_gc.
      ENDIF.
    ENDAT.

    "Plant第三碼""X"" (除OTX1不是無價廠)
    IF gw_marc-dummy = 'X'.
      gw_detail-sytag = 'K'.
      IF NOT gw_detail-sytag IN s_sytag.
        CONTINUE.
      ENDIF.
    ENDIF.

    gw_detail-waers = l_waers.
    gw_detail-bukrs = l_bukrs.
    gw_detail-butxt = l_butxt.
    gw_detail-name2 = l_name2.
    gw_detail-name1 = l_name1.

    "获取实际价格
    CLEAR: l_stprs,l_pvprs.
    IF p_specd IS INITIAL.
      CLEAR: gw_ckmlcr.
**begin: add by Evan at 20151008
      "Company功能性貨幣非USD者, Actual unit cost需以LC Periodic unit price / price unit / 輸入年月G-Rate
      IF l_unusd = 'X'.
        PERFORM get_price USING gw_marc-kaln1
                              l_lfgja
                              l_lfmon
                              ''
                     CHANGING gw_ckmlcr.
        IF gw_ckmlcr-peinh <> 0.
          l_stprs = gw_ckmlcr-stprs / l_rate / gw_ckmlcr-peinh.
          l_pvprs = gw_ckmlcr-pvprs / l_rate / gw_ckmlcr-peinh.
        ENDIF.
      ELSE.
**end: add by Evan at 20151008
        PERFORM get_price USING gw_marc-kaln1
                                l_lfgja
                                l_lfmon
                                p_gcurr
                       CHANGING gw_ckmlcr.
        IF gw_ckmlcr-peinh <> 0.
          l_stprs = gw_ckmlcr-stprs / gw_ckmlcr-peinh.
          l_pvprs = gw_ckmlcr-pvprs / gw_ckmlcr-peinh.
        ENDIF.
      ENDIF.
    ELSE.
**begin: add by Evan at 20151008
      "Company功能性貨幣非USD者, Actual unit cost需以LC Periodic unit price / price unit / 輸入年月G-Rate
      IF l_unusd = 'X'.
        PERFORM get_standard_price  USING gw_marc-kaln1
                                          l_lfgja
                                          l_lfmon
                                          ''
                                 CHANGING l_stprs
                                          l_pvprs.
        l_stprs = l_stprs / l_rate.
        l_pvprs = l_pvprs / l_rate.
      ELSE.
**end: add by Evan at 20151008
        PERFORM get_standard_price  USING gw_marc-kaln1
                                          l_lfgja
                                          l_lfmon
                                          p_gcurr
                                 CHANGING l_stprs
                                          l_pvprs.
      ENDIF.
    ENDIF.
    "无价厂未取到单价或Profit center时,读取手工维护的Table:zco054_t01
    IF gw_marc-dummy = 'X' AND ( l_stprs IS INITIAL OR gw_detail-prctr IS INITIAL ).
      DATA: lw_zco054_t01 LIKE zco054_t01. "临时变量
      CLEAR: lw_zco054_t01.
      SELECT * INTO lw_zco054_t01
        FROM zco054_t01 UP TO 1 ROWS
        WHERE werks = gw_marc-werks
          AND matnr = gw_marc-matnr
          AND ( lfgja < l_lfgja OR lfgja = l_lfgja AND lfmon <= l_lfmon )
        ORDER BY lfgja DESCENDING lfmon DESCENDING.
        EXIT.
      ENDSELECT.
      IF l_stprs IS INITIAL.
        l_stprs = lw_zco054_t01-stprs.
        l_pvprs = lw_zco054_t01-pvprs.
      ENDIF.
      IF gw_detail-prctr IS INITIAL.
        gw_detail-prctr = lw_zco054_t01-prctr.
      ENDIF.
    ENDIF.
    gw_detail-stprs = l_stprs.
    gw_detail-pvprs = l_pvprs.

    "获取料号的所有库位库存
    READ TABLE gt_mardh INTO gw_mardh BINARY SEARCH
      WITH KEY matnr = gw_marc-matnr
               werks = gw_marc-werks.
    IF sy-subrc = 0.
      l_index = sy-tabix.
      LOOP AT gt_mardh INTO gw_mardh FROM l_index.
        IF gw_mardh-matnr <> gw_marc-matnr OR gw_mardh-werks <> gw_marc-werks.
          EXIT.
        ENDIF.

        gw_detail-lgort = gw_mardh-lgort.
        gw_detail-bptnr = gw_mardh-lgort.

        "Mark (Category)
        IF gw_marc-dummy <> 'X'.
          CASE gw_detail-lgort+2(1).
            WHEN '1' OR '7' OR '8' OR 'Z' OR 'A'.
              CASE gw_detail-bklas.
                WHEN '3000' OR '3001' OR '3002'.
                  IF gw_detail-matkl+0(2) = 'AA'. "只抓Material group AA*
                    IF gw_detail-bklas = '3000' OR gw_detail-bklas = '3001'.
                      gw_detail-sytag = 'B'.
                    ELSE.
                      CONTINUE.
                    ENDIF.
                  ELSE.
                    gw_detail-sytag = 'A'.
                  ENDIF.
                WHEN ''.
                  gw_detail-sytag = 'C'.
                WHEN '7900'.
                  gw_detail-sytag = 'D'.
                WHEN '7920'.
                  gw_detail-sytag = 'E'.
                WHEN OTHERS.
                  CONTINUE.
              ENDCASE.
            WHEN '4' OR '9'.
              gw_detail-sytag = 'F'.
            WHEN '3'.
              gw_detail-sytag = 'G'.
            WHEN '6'.         "不包含Special Stock  "E"
              gw_detail-sytag = 'H'.
            WHEN '0' OR '5'.
              gw_detail-sytag = 'I'.
            WHEN '2' OR 'D'.
              gw_detail-sytag = 'J'.
            WHEN OTHERS.
              "CONTINUE.
              gw_detail-sytag = 'Z'.  "Others, Add by Evan at 20151008
          ENDCASE.
          IF NOT gw_detail-sytag IN s_sytag.
            CONTINUE.
          ENDIF.
        ENDIF.

        "
        IF NOT gw_detail-sytag IN gr_sytag.
          CONTINUE.
        ENDIF.

        CLEAR: gw_zco057_t01.
        READ TABLE gt_zco057_t01 INTO gw_zco057_t01
          WITH KEY sytag = gw_detail-sytag.
        IF sy-subrc = 0.
          gw_detail-ltype = gw_zco057_t01-ltype.
          gw_detail-pttxt = gw_zco057_t01-pttxt.
        ENDIF.

        gw_detail-labst = gw_mardh-labst  "Un-res
                        + gw_mardh-insme  "QI
                        + gw_mardh-speme  "Block
                        + gw_mardh-einme. "所有限制批次的總庫存

        IF p_specd = 'X'. " OR p_edate+0(6) = sy-datum+0(6).
          "期初库存加上异动数据
          CLEAR: gw_mseg_sum.
          READ TABLE gt_mseg_sum INTO gw_mseg_sum BINARY SEARCH
            WITH KEY  matnr = gw_mardh-matnr
                      werks = gw_mardh-werks
                      lgort = gw_mardh-lgort.
          gw_detail-labst = gw_detail-labst + gw_mseg_sum-menge.
        ENDIF.

        "Standard Amount
        gw_detail-scost = gw_detail-labst * gw_detail-stprs.
        IF gw_detail-pvprs = 0.
          gw_detail-pvprs = gw_detail-stprs.
        ENDIF.
        "Actual Amount
        IF p_specd IS INITIAL AND gw_ckmlcr-lbkum <> 0.
**begin: add by Evan at 20151008
          "Company功能性貨幣非USD者,Actual Amount = LC Periodic Value / Periodic Inventory / 輸入年月G-Rate
          IF l_unusd = 'X'.
            IF gw_ckmlcr-vprsv = 'V'.
              gw_detail-acost = gw_detail-labst * gw_ckmlcr-salk3 / l_rate / gw_ckmlcr-lbkum.
            ELSE.
              gw_detail-acost = gw_detail-labst * gw_ckmlcr-salkv / l_rate / gw_ckmlcr-lbkum.
            ENDIF.
          ELSE.
**end: add by Evan at 20151008
            IF gw_ckmlcr-vprsv = 'V'.
              gw_detail-acost = gw_detail-labst * gw_ckmlcr-salk3 / gw_ckmlcr-lbkum.
            ELSE.
              gw_detail-acost = gw_detail-labst * gw_ckmlcr-salkv / gw_ckmlcr-lbkum.
            ENDIF.
          ENDIF.
        ELSE.
          gw_detail-acost = gw_detail-labst * gw_detail-pvprs.
        ENDIF.

        "Location name
        CLEAR: gw_detail-lgobe.
        READ TABLE gt_t001l INTO gw_t001l BINARY SEARCH
          WITH KEY werks = gw_mardh-werks
                   lgort = gw_mardh-lgort.
        IF sy-subrc = 0.
          gw_detail-lgobe = gw_t001l-lgobe.
          gw_detail-name1_bp = gw_detail-lgobe.
        ENDIF.

        APPEND gw_detail TO gt_detail.
      ENDLOOP.
    ENDIF.
  ENDLOOP.

  "Collecting special items
  SORT gt_spstock BY werks matnr.
  DESCRIBE TABLE gt_spstock LINES l_lines.
  LOOP AT gt_spstock INTO gw_spstock.
    l_tabix = sy-tabix.
    PERFORM show_timer_bar USING l_tabix l_lines 'Collecting special items...'.

    AT NEW werks.

      "获取Plant name
      SELECT SINGLE name1 INTO l_name1
        FROM t001w
        WHERE werks = gw_spstock-werks.

      "获取Local Currency, Company code, Company name
      CLEAR: l_waers,l_bukrs,l_butxt,l_name2.
      SELECT SINGLE t~waers t~bukrs t~butxt a~name2 INTO (l_waers,l_bukrs,l_butxt,l_name2)
        FROM t001k AS k
        INNER JOIN t001 AS t ON t~bukrs = k~bukrs
        INNER JOIN adrc AS a ON a~addrnumber = t~adrnr
        WHERE k~bwkey = gw_spstock-werks.

**begin: add by Evan at 20151008
      "Company功能性貨幣(抓table可判斷),非USD者, Actual unit cost需以LC Periodic unit price / price unit / 輸入年月G-Rate
      CLEAR: lw_zcot0007,l_rate,l_unusd.
      SELECT SINGLE * INTO lw_zcot0007
        FROM zcot0007
        WHERE bukrs = l_bukrs.
      IF sy-subrc = 0.
        l_unusd = 'X'.
        CLEAR: l_rate.
        CALL FUNCTION 'READ_EXCHANGE_RATE'
          EXPORTING
            date             = p_edate        "
            foreign_currency = c_waers_gc     "Group Currency
            local_currency   = l_waers        "Local Currency
            type_of_rate     = 'G'
          IMPORTING
            exchange_rate    = l_rate
          EXCEPTIONS
            no_rate_found    = 4
            no_factors_found = 8.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          LEAVE LIST-PROCESSING.
        ENDIF.
      ENDIF.
**end: add by Evan at 20151008
      IF p_gcurr = 'X'.
        l_waers = c_waers_gc.
      ENDIF.
    ENDAT.

    AT NEW matnr.
      CLEAR: gw_marc.
      READ TABLE gt_marc INTO gw_marc BINARY SEARCH
        WITH KEY werks = gw_spstock-werks
                 matnr = gw_spstock-matnr.

      "获取实际价格
      CLEAR: l_stprs,l_pvprs.
      IF p_specd IS INITIAL.
        CLEAR: gw_ckmlcr.
**begin: add by Evan at 20151008
      "Company功能性貨幣非USD者, Actual unit cost需以LC Periodic unit price / price unit / 輸入年月G-Rate
        IF l_unusd = 'X'.
          PERFORM get_price USING gw_marc-kaln1
                                  l_lfgja
                                  l_lfmon
                                  ''
                         CHANGING gw_ckmlcr.
          IF gw_ckmlcr-peinh <> 0.
            l_stprs = gw_ckmlcr-stprs / l_rate / gw_ckmlcr-peinh.
            l_pvprs = gw_ckmlcr-pvprs / l_rate / gw_ckmlcr-peinh.
          ENDIF.
        ELSE.
**end: add by Evan at 20151008
          PERFORM get_price USING gw_marc-kaln1
                                  l_lfgja
                                  l_lfmon
                                  p_gcurr
                         CHANGING gw_ckmlcr.
          IF gw_ckmlcr-peinh <> 0.
            l_stprs = gw_ckmlcr-stprs / gw_ckmlcr-peinh.
            l_pvprs = gw_ckmlcr-pvprs / gw_ckmlcr-peinh.
          ENDIF.
        ENDIF.
      ELSE.
**begin: add by Evan at 20151008
        "Company功能性貨幣非USD者, Actual unit cost需以LC Periodic unit price / price unit / 輸入年月G-Rate
        IF l_unusd = 'X'.
          PERFORM get_standard_price  USING gw_marc-kaln1
                                            l_lfgja
                                            l_lfmon
                                            ''
                                   CHANGING l_stprs
                                            l_pvprs.
          l_stprs = l_stprs / l_rate.
          l_pvprs = l_pvprs / l_rate.
        ELSE.
**end: add by Evan at 20151008
          PERFORM get_standard_price  USING gw_marc-kaln1
                                            l_lfgja
                                            l_lfmon
                                            p_gcurr
                                   CHANGING l_stprs
                                            l_pvprs.
        ENDIF.
      ENDIF.
    ENDAT.

    IF gw_marc-matnr IS INITIAL.
      CONTINUE.
    ENDIF.

    CLEAR: gw_detail.
    MOVE-CORRESPONDING gw_spstock TO gw_detail.
    MOVE-CORRESPONDING gw_marc TO gw_detail.

    "无价厂未取到单价或Profit center时,读取手工维护的Table:zco054_t01
    IF gw_marc-dummy = 'X' AND ( l_stprs IS INITIAL OR gw_detail-prctr IS INITIAL ).
      CLEAR: lw_zco054_t01.
      SELECT * INTO lw_zco054_t01
        FROM zco054_t01 UP TO 1 ROWS
        WHERE werks = gw_marc-werks
          AND matnr = gw_marc-matnr
          AND ( lfgja < l_lfgja OR lfgja = l_lfgja AND lfmon <= l_lfmon )
        ORDER BY lfgja DESCENDING lfmon DESCENDING.
        EXIT.
      ENDSELECT.
      IF l_stprs IS INITIAL.
        l_stprs = lw_zco054_t01-stprs.
        l_pvprs = lw_zco054_t01-pvprs.
      ENDIF.
      IF gw_detail-prctr IS INITIAL.
        gw_detail-prctr = lw_zco054_t01-prctr.
      ENDIF.
    ENDIF.
    gw_detail-stprs = l_stprs.
    gw_detail-pvprs = l_pvprs.

    "期初库存加上异动数据
    CLEAR: gw_mseg_sum_sp.
    READ TABLE gt_mseg_sum_sp INTO gw_mseg_sum_sp BINARY SEARCH
      WITH KEY  matnr = gw_detail-matnr
                werks = gw_detail-werks
                ssnum = gw_spstock-ssnum
                sobkz = gw_detail-sobkz.
    gw_detail-labst = gw_detail-labst - gw_mseg_sum_sp-menge.

    "分类
    IF gw_marc-dummy = 'X'.
      gw_detail-sytag = 'K'.
    ELSE.
      CASE gw_detail-sobkz.
        WHEN 'O'.
          "Business partner
          SELECT SINGLE name1 INTO gw_detail-name1_bp
            FROM lfa1
            WHERE lifnr = gw_detail-bptnr.
          CASE gw_detail-bklas.
            WHEN '3000' OR '3001' OR '3002'.
              IF gw_detail-matkl+0(2) = 'AA'. "只抓Material group AA*
                IF gw_detail-bklas = '3000' OR gw_detail-bklas = '3001'.
                  gw_detail-sytag = 'B'.
                ELSE.
                  CONTINUE.
                ENDIF.
              ELSE.
                gw_detail-sytag = 'A'.
              ENDIF.
            WHEN ''.
              gw_detail-sytag = 'C'.
            WHEN '7900'.
              gw_detail-sytag = 'D'.
            WHEN '7920'.
              gw_detail-sytag = 'E'.
            WHEN OTHERS.
              CONTINUE.
          ENDCASE.
        WHEN 'E'.
          "Business partner
          SELECT SINGLE name1 INTO gw_detail-name1_bp
            FROM kna1
            WHERE kunnr = gw_detail-bptnr.
          gw_detail-sytag = 'H'.
      ENDCASE.
    ENDIF.

    IF NOT gw_detail-sytag IN s_sytag.
      CONTINUE.
    ENDIF.

    IF NOT gw_detail-sytag IN gr_sytag.
      CONTINUE.
    ENDIF.

    "Status & Category
    CLEAR: gw_zco057_t01.
    READ TABLE gt_zco057_t01 INTO gw_zco057_t01
      WITH KEY sytag = gw_detail-sytag.
    IF sy-subrc = 0.
      gw_detail-ltype = gw_zco057_t01-ltype.
      gw_detail-pttxt = gw_zco057_t01-pttxt.
    ENDIF.

    gw_detail-waers = l_waers.
    gw_detail-bukrs = l_bukrs.
    gw_detail-butxt = l_butxt.
    gw_detail-name2 = l_name2.
    gw_detail-name1 = l_name1.

    "Standard Amount
    gw_detail-scost = gw_detail-labst * gw_detail-stprs.

    IF gw_detail-pvprs = 0.
      gw_detail-pvprs = gw_detail-stprs.
    ENDIF.
    "Actual Amount
    IF p_specd IS INITIAL AND gw_ckmlcr-lbkum <> 0.
**begin: add by Evan at 20151008
      "Company功能性貨幣非USD者,Actual Amount = LC Periodic Value / Periodic Inventory / 輸入年月G-Rate
      IF l_unusd = 'X'.
        IF gw_ckmlcr-vprsv = 'V'.
          gw_detail-acost = gw_detail-labst * gw_ckmlcr-salk3 / l_rate / gw_ckmlcr-lbkum.
        ELSE.
          gw_detail-acost = gw_detail-labst * gw_ckmlcr-salkv / l_rate / gw_ckmlcr-lbkum.
        ENDIF.
      ELSE.
**end: add by Evan at 20151008
        IF gw_ckmlcr-vprsv = 'V'.
          gw_detail-acost = gw_detail-labst * gw_ckmlcr-salk3 / gw_ckmlcr-lbkum.
        ELSE.
          gw_detail-acost = gw_detail-labst * gw_ckmlcr-salkv / gw_ckmlcr-lbkum.
        ENDIF.
      ENDIF.
    ELSE.
      gw_detail-acost = gw_detail-labst * gw_detail-pvprs.
    ENDIF.

    APPEND gw_detail TO gt_detail.
    "COLLECT gw_detail INTO gt_detail.
  ENDLOOP.


**WO部分:(C: WIP)
  CLEAR: gw_zco057_t01.
  READ TABLE gt_zco057_t01 INTO gw_zco057_t01
    WITH KEY sytag = 'C'.
  IF p_specd IS INITIAL.
    DESCRIBE TABLE gt_zpp103_t01 LINES l_lines.
    LOOP AT gt_zpp103_t01 INTO gw_zpp103_t01.
      l_tabix = sy-tabix.
      PERFORM show_timer_bar USING l_tabix l_lines 'Getting WO detail...'.

      AT NEW werks.

        "获取Plant name
        CLEAR: l_name1.
        SELECT SINGLE name1 INTO l_name1
          FROM t001w
          WHERE werks = gw_zpp103_t01-werks.

        "获取Local Currency, Company code, Company name
        CLEAR: l_waers,l_bukrs,l_butxt,l_name2.
        SELECT SINGLE t~waers t~bukrs t~butxt a~name2 INTO (l_waers,l_bukrs,l_butxt,l_name2)
          FROM t001k AS k
          INNER JOIN t001 AS t ON t~bukrs = k~bukrs
          INNER JOIN adrc AS a ON a~addrnumber = t~adrnr
          WHERE k~bwkey = gw_zpp103_t01-werks.

        IF p_gcurr = 'X'.
          l_waers = c_waers_gc.
        ENDIF.
      ENDAT.

      CLEAR: gw_detail.
      gw_detail-waers = l_waers.
      gw_detail-bukrs = l_bukrs.
      gw_detail-butxt = l_butxt.
      gw_detail-name2 = l_name2.
      gw_detail-name1 = l_name1.

      gw_detail-werks = gw_zpp103_t01-werks.      "Plant
      gw_detail-aufnr = gw_zpp103_t01-aufnr.      "WO No.
      gw_detail-matnr = gw_zpp103_t01-plnbez.     "Material
      gw_detail-maktx = gw_zpp103_t01-maktx.
      gw_detail-prctr = gw_zpp103_t01-prctr.      "Profit Center
      gw_detail-bklas = gw_zpp103_t01-bklas.

      IF gw_detail-matnr IS INITIAL.
        SELECT SINGLE matnr INTO gw_detail-matnr
          FROM afpo
          WHERE aufnr = gw_detail-aufnr
            AND posnr = '0001'.
        IF gw_detail-matnr IS INITIAL.
          SELECT SINGLE ktext INTO l_ktext
            FROM aufk
            WHERE aufnr = gw_detail-aufnr.
          IF l_ktext IS NOT INITIAL.
            CONDENSE l_ktext.
            SPLIT l_ktext AT '-' INTO gw_detail-matnr l_ktext.
            SPLIT gw_detail-matnr AT space INTO gw_detail-matnr l_ktext.
          ENDIF.
        ENDIF.
      ENDIF.

      CLEAR: gw_marc.
      READ TABLE gt_marc INTO gw_marc BINARY SEARCH
        WITH KEY werks = gw_detail-werks
                 matnr = gw_detail-matnr.
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.
      gw_detail-mtart = gw_marc-mtart.
      gw_detail-matkl = gw_marc-matkl.
      "gw_detail-maktx = gw_marc-maktx.

      gw_detail-sytag = 'C'.

      gw_detail-ltype = gw_zco057_t01-ltype.
      gw_detail-pttxt = gw_zco057_t01-pttxt.

      "Standard Amount
      "gw_detail-scost = 0.
      "Actual Amount
      gw_detail-acost = gw_zpp103_t01-wipamtusd.
      APPEND gw_detail TO gt_detail.
    ENDLOOP.
  ELSE.

    DESCRIBE TABLE gt_aufk LINES l_lines.
    LOOP AT gt_aufk INTO gw_aufk.
      l_tabix = sy-tabix.
      PERFORM show_timer_bar USING l_tabix l_lines 'Getting WO detail...'.

      AT NEW werks.

        "获取Plant name
        CLEAR: l_name1.
        SELECT SINGLE name1 INTO l_name1
          FROM t001w
          WHERE werks = gw_aufk-werks.

        "获取Local Currency, Company code, Company name
        CLEAR: l_waers,l_bukrs,l_butxt,l_name2.
        SELECT SINGLE t~waers t~bukrs t~butxt a~name2 INTO (l_waers,l_bukrs,l_butxt,l_name2)
          FROM t001k AS k
          INNER JOIN t001 AS t ON t~bukrs = k~bukrs
          INNER JOIN adrc AS a ON a~addrnumber = t~adrnr
          WHERE k~bwkey = gw_aufk-werks.

        IF p_gcurr = 'X'.
          l_waers = c_waers_gc.
        ENDIF.
      ENDAT.

      CLEAR: gw_afpo.
      READ TABLE gt_afpo INTO gw_afpo WITH KEY aufnr = gw_aufk-aufnr.
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.

      CLEAR: gw_detail.
      gw_detail-waers = l_waers.
      gw_detail-bukrs = l_bukrs.
      gw_detail-butxt = l_butxt.
      gw_detail-name2 = l_name2.
      gw_detail-name1 = l_name1.

      gw_detail-werks = gw_aufk-werks.      "Plant
      gw_detail-aufnr = gw_aufk-aufnr.      "WO No.
      gw_detail-prctr = gw_aufk-prctr.      "Profit Center
      IF gw_afpo-matnr IS INITIAL.
        CONDENSE gw_aufk-ktext.
        SPLIT gw_aufk-ktext AT '-' INTO gw_detail-matnr l_ktext.
        SPLIT gw_detail-matnr AT space INTO gw_detail-matnr l_ktext.
      ELSE.
        gw_detail-matnr = gw_afpo-matnr.
      ENDIF.

      CLEAR: gw_marc.
      READ TABLE gt_marc INTO gw_marc BINARY SEARCH
        WITH KEY werks = gw_detail-werks
                 matnr = gw_detail-matnr.
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.
      gw_detail-mtart = gw_marc-mtart.
      gw_detail-matkl = gw_marc-matkl.
      gw_detail-maktx = gw_marc-maktx.
      gw_detail-prctr = gw_marc-prctr.
      gw_detail-bklas = gw_marc-bklas.

      gw_detail-sytag = 'C'.

      gw_detail-ltype = gw_zco057_t01-ltype.
      gw_detail-pttxt = gw_zco057_t01-pttxt.

      CLEAR: gw_cosp.
      READ TABLE gt_cosp INTO gw_cosp
        WITH KEY objnr = gw_aufk-objnr.

      "Standard Amount
      "gw_detail-scost = 0.
      "Actual Amount
      gw_detail-acost = gw_cosp-wkg001 + gw_cosp-wkg002 + gw_cosp-wkg003 + gw_cosp-wkg004
                      + gw_cosp-wkg005 + gw_cosp-wkg006 + gw_cosp-wkg007 + gw_cosp-wkg008
                      + gw_cosp-wkg009 + gw_cosp-wkg010 + gw_cosp-wkg011 + gw_cosp-wkg012.
      APPEND gw_detail TO gt_detail.
    ENDLOOP.
  ENDIF.

  "去掉库存和金额为零的
  DELETE gt_detail WHERE labst = 0 AND acost = 0.


  IF p_summ = 'X'.
    CLEAR: gt_total.
    LOOP AT gt_detail INTO gw_detail.
      MOVE-CORRESPONDING gw_detail TO gw_total.
      COLLECT gw_total INTO gt_total.
    ENDLOOP.
    FREE: gt_detail.

    "金额转成K USD
    LOOP AT gt_total INTO gw_total.
      l_tabix = sy-tabix.
      gw_total-acost = gw_total-acost / 1000.
      MODIFY gt_total FROM gw_total INDEX l_tabix TRANSPORTING acost.
    ENDLOOP.

    SORT gt_total BY sytag.
  ENDIF.

ENDFORM.                    " process_data


*&--------------------------------------------------------------------*
*&      Form  get_bs_partner_for_e
*&--------------------------------------------------------------------*
*       Get business partner for sales order stock
*---------------------------------------------------------------------*
*      -->F_WERKS  Plant code
*      -->F_VBELN  sales order number
*      -->F_LGORT  Sloc
*      <--F_BPTNR  Business partner or Sloc
*---------------------------------------------------------------------*
FORM get_bs_partner_for_e USING f_werks
                                f_vbeln
                                f_lgort
                       CHANGING f_bptnr.

  DATA: l_kunnr TYPE vbak-kunnr.

  CLEAR: l_kunnr, f_bptnr.
  IF f_vbeln IS INITIAL.
    SELECT SINGLE t001w~kunnr INTO l_kunnr
        FROM t001w
        WHERE t001w~werks = f_werks
          AND t001w~kunnr <> space.
    IF sy-subrc = 0.
      WRITE: l_kunnr TO f_bptnr.
    ELSE.
      f_bptnr = f_lgort.  "Sloc
    ENDIF.
  ELSE.
    SELECT SINGLE vbak~kunnr INTO l_kunnr   "Sold-to as prtner
        FROM vbak
        WHERE vbak~vbeln = f_vbeln.
    IF sy-subrc = 0.
      WRITE: l_kunnr TO f_bptnr.
    ELSE.
      f_bptnr = f_lgort.   "Sloc
    ENDIF.
  ENDIF.

ENDFORM.      " get_bs_partner_for_e


*&---------------------------------------------------------------------*
*&      Form  SHOW_TIMER_BAR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      --> P_TABIX
*      --> P_RECORDS
*      --> P_STRING
*----------------------------------------------------------------------*
FORM show_timer_bar USING p_tabix
                          p_records
                          p_string.

  DATA: l_percent     TYPE p DECIMALS 2,
        l_str_status  TYPE string,
        l_str_tabix   TYPE string,
        l_str_records TYPE string.

  IF p_tabix = 0 AND p_records = 0.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        percentage = '1'
        text       = p_string.
    EXIT.
  ENDIF.

  CLEAR: l_percent, l_str_tabix, l_str_records, l_str_status.
  IF p_records NE 0.
    l_percent = ( p_tabix / p_records ) * 100.
  ENDIF.
  l_str_tabix = p_tabix.
  l_str_records = p_records.

  CONCATENATE p_string l_str_tabix '/' l_str_records
         INTO l_str_status SEPARATED BY space.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = l_percent
      text       = l_str_status.

ENDFORM.          "show_timer_bar

*&---------------------------------------------------------------------*
*&      Form  build_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_alv .
  IF p_summ = 'X'.
    IF p_all = 'X'.
      PERFORM build_filecat USING:
        'SYTAG'   'SYTAG'   'ZCO057_T01' 'CHAR'   'M'   ''   ''     '分類代號',
        'LTYPE'   'LTYPE'   'ZCO057_T01' 'CHAR'   'M'   ''   ''     'Status',
        'PTTXT'   'PTTXT'   'ZCO057_T01' 'CHAR'   'M'   ''   ''     'Category',
        'ACOST'   'PVPRS'   'CKMLCR'    'CURR'    'M'   ''   ''     'Actual Amount'.
        "'WAERS'   'WAERS'   'T001'      'CHAR'    'M'   ''   ''     'Currency'.

    ELSEIF p_bad = 'X'.
      PERFORM build_filecat USING:
        'SYTAG'   'SYTAG'   'ZCO057_T01' 'CHAR'   'M'   ''   ''     '分類代號',
        'LTYPE'   'LTYPE'   'ZCO057_T01' 'CHAR'   'M'   ''   ''     'Status',
        'PTTXT'   'PTTXT'   'ZCO057_T01' 'CHAR'   'M'   ''   ''     'Category',
        'ACOST'   'PVPRS'   'CKMLCR'    'CURR'    'M'   ''   ''     'Actual Amount'.
        "'WAERS'   'WAERS'   'T001'      'CHAR'    'M'   ''   ''     'Currency'.
    ENDIF.

  ELSE.

    PERFORM build_filecat USING:
      'BUKRS'   'BUKRS'   'T001'      'CHAR'    'M'   ''    ''    'Company',
      'BUTXT'   'BUTXT'   'T001'      'CHAR'    'M'   ''    ''    'Company name',
      'NAME2'   'NAME2'   'ADRC'      'CHAR'    'M'   ''    ''    'Company Short name',
      'WERKS'   'WERKS'   'MARD'      'CHAR'    'M'   ''    ''    'Plant',
      'NAME1'   'NAME1'   'T001W'     'CHAR'    'M'   ''    ''    'Plant name',
      'BKLAS'   'BKLAS'   'MBEW'      'CHAR'    'M'   ''    ''    'Valuation Class',
      "'LGORT'   'LGORT'   'MARD'      'CHAR'    'M'   ''   ''     'Location',
      "'LGOBE'   'LGOBE'   'T001L'     'CHAR'    'M'   ''   ''     'Location name',
      'BPTNR'   ''   ''      'CHAR'    'M'   ''   ''     'Location',
      'NAME1_BP' 'NAME1'  'LFA1'      'CHAR'    'M'   ''   ''     'Location name',
      'MATNR'   'MATNR'   'MARD'      'CHAR'    'M'   'X'   ''    'Material',
      'MAKTX'   'MAKTX'   'MAKT'      'CHAR'    'M'   ''    ''    'Material Desc.',
      'PRCTR'   'PRCTR'   'MARC'      'CHAR'    'M'   ''   ''     'Profit Center',

      'MTART'   'MTART'   'MARA'      'CHAR'    'M'   ''   ''     'Material Type',
      'MATKL'   'MATKL'   'MARA'      'CHAR'    'M'   ''   ''     'Material Group',
      'SOBKZ'   'SOBKZ'   'MSKA'      'CHAR'    'M'   ''   ''     'Special Stock',

      'SYTAG'   'SYTAG'   'ZCO057_T01' 'CHAR'   'M'   ''   ''     '分類代號',
      'LTYPE'   'LTYPE'   'ZCO057_T01' 'CHAR'   'M'   ''   ''     'Status',
      'PTTXT'   'PTTXT'   'ZCO057_T01' 'CHAR'   'M'   ''   ''     'Category',

      'LABST'   'LABST'   'MARD'      'QUAN'    'M'   ''   ''     'Qty On Hand',
      'MEINS'   'MEINS'   'MARD'      'UNIT'    'M'   ''   ''     'UM',
      'AUFNR'   'AUFNR'   'AUFK'      'CHAR'    'M'   ''   ''     'WO NO'.

    IF g_price = 'X'.
      PERFORM build_filecat USING:
        'PVPRS'   'PVPRS'   'CKMLCR'    'CURR'    'M'   ''   ''     'Actual unit cost',
        'ACOST'   'PVPRS'   'CKMLCR'    'CURR'    'M'   ''   ''     'Actual Amount',
        'WAERS'   'WAERS'   'T001'      'CUKY'    'M'   ''   ''     'Currency'.
    ENDIF.

  ENDIF.

ENDFORM.                    " build_alv


*&---------------------------------------------------------------------*
*&      Form  alv_init
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM alv_init .

  CLEAR: gw_layout.
  gw_layout-zebra = 'X'.               "Striped pattern
  gw_layout-no_vline = ' '.            "Columns separated by space
*  gw_layout-f2code = 'DISPLAY'.        " sy-ucomm for display (F2)
  gw_layout-colwidth_optimize = 'X'.   " Column width optimize
  gw_layout-info_fieldname = 'LCOLOR'.  "color field
*  gw_layout-numc_sum = 'X'.            " totals for NUMC-Fields possib
*  gw_layout-no_uline_hs = space.
*  gw_layout-no_totalline = space.      "No total line
*  gw_layout-totals_text = 'Total'.     " text for 1st col. in total line
*  gw_layout-subtotals_text = 'SUB-T'.  " text for 1st col. in subtotals
  gw_layout-box_fieldname  = 'SELTD'.   "

ENDFORM.                    " alv_init
*&---------------------------------------------------------------------*
*&      Form  display_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM display_alv .

  IF p_summ = 'X'.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        i_callback_program      = gs_repid
        i_callback_top_of_page  = 'SET_TOP_OF_PAGE'
*        i_callback_user_command = 'AT_USER_COMMAND'
*        i_callback_pf_status_set = ''
        i_background_id         = 'ALV_BACKGROUND'
        is_layout               = gw_layout
        it_fieldcat             = gt_fieldcat[]
        it_events               = gt_events[]
        it_special_groups       = gt_sp_group[]
        i_save                  = g_save
        is_print                = gw_print
        is_variant              = gw_variant
      TABLES
        t_outtab                = gt_total
      EXCEPTIONS
        program_error           = 1
        OTHERS                  = 2.
  ELSE.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        i_callback_program      = gs_repid
        i_callback_top_of_page  = 'SET_TOP_OF_PAGE'
*        i_callback_user_command = 'AT_USER_COMMAND'
*        i_callback_pf_status_set = ''
        i_background_id         = 'ALV_BACKGROUND'
        is_layout               = gw_layout
        it_fieldcat             = gt_fieldcat[]
        it_events               = gt_events[]
        it_special_groups       = gt_sp_group[]
        i_save                  = g_save
        is_print                = gw_print
        is_variant              = gw_variant
      TABLES
        t_outtab                = gt_detail
      EXCEPTIONS
        program_error           = 1
        OTHERS                  = 2.
  ENDIF.

ENDFORM.                    " display_alv

*&---------------------------------------------------------------------*
*&      Form  build_filecat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0079   text
*      -->P_0080   text
*----------------------------------------------------------------------*
FORM build_filecat  USING   value(p_field)
                            value(p_ref_field)
                            value(p_ref_tabname)
                            value(p_datatype)
                            value(p_ddictxt)
                            value(p_no_zero)
                            value(p_key)
                            value(p_seltext).

  CLEAR gw_fieldcat.
  gw_fieldcat-fieldname = p_field.
  gw_fieldcat-ref_fieldname = p_ref_field.
  gw_fieldcat-ref_tabname = p_ref_tabname.
  gw_fieldcat-datatype = p_datatype.
  gw_fieldcat-ddictxt = p_ddictxt.
  gw_fieldcat-no_zero = p_no_zero.
  gw_fieldcat-key = p_key.
  IF p_ddictxt = 'M'.
    gw_fieldcat-seltext_m = p_seltext.
  ELSEIF p_ddictxt = 'L'.
    gw_fieldcat-seltext_l = p_seltext.
  ELSEIF p_ddictxt = 'S'.
    gw_fieldcat-seltext_s = p_seltext.
  ENDIF.

  APPEND gw_fieldcat TO gt_fieldcat.

ENDFORM.                    " build_filecat


*&---------------------------------------------------------------------*
*&      Form  get_standard_price
*&---------------------------------------------------------------------*
*       get standard price
*----------------------------------------------------------------------*
*      -->P_KALNR   "Cost Estimate Number for Cost Est. w/o Qty Structure
*      -->P_LFGJA  Year
*      -->P_LFMON  Month
*      -->P_GCURR  Indicator: Group Currency
*      -->P_PVPRS  Actual price
*      <--P_STPRS  Standard price
*----------------------------------------------------------------------*
FORM get_standard_price  USING    p_kalnr
                                  p_bdatj
                                  p_poper
                                  p_gcurr
                         CHANGING p_stprs
                                  p_pvprs.

  DATA: BEGIN OF lw_ckmlcr,
          bdatj LIKE ckmlcr-bdatj,  "Posting date YYYY
          poper LIKE ckmlcr-poper,  "Posting period
          curtp LIKE ckmlcr-curtp,  "Currency Type and Valuation View
          peinh LIKE ckmlcr-peinh,  "Price unit
          vprsv LIKE ckmlcr-vprsv,  "Price control indicator
          stprs LIKE ckmlcr-stprs,  "Standard price
          pvprs LIKE ckmlcr-pvprs,  "Periodic unit price
          waers LIKE ckmlcr-waers,  "Currency Key
        END OF lw_ckmlcr.

  DATA: l_curtp LIKE ckmlcr-curtp,
        lt_ckmlcr LIKE TABLE OF lw_ckmlcr.
  CLEAR: l_curtp.
  IF p_gcurr = 'X'.
    l_curtp = '30'.
  ELSE.
    l_curtp = '10'.
  ENDIF.

  CLEAR: lt_ckmlcr.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_ckmlcr
    FROM ckmlcr
    WHERE kalnr = p_kalnr
      AND ( ( bdatj = p_bdatj AND poper <= p_poper ) OR bdatj < p_bdatj )
      AND curtp = l_curtp. "30: Group currency, 10: Local currency
  SORT lt_ckmlcr BY curtp bdatj DESCENDING poper DESCENDING.
  CLEAR: lw_ckmlcr.
  READ TABLE lt_ckmlcr INTO lw_ckmlcr INDEX 1.
  IF lw_ckmlcr-peinh <> 0.
    IF lw_ckmlcr-waers = 'TWD' OR lw_ckmlcr-waers = 'JPY'.
      p_stprs = lw_ckmlcr-stprs * 100 / lw_ckmlcr-peinh.
      p_pvprs = lw_ckmlcr-pvprs * 100 / lw_ckmlcr-peinh.
    ELSE.
      p_stprs = lw_ckmlcr-stprs / lw_ckmlcr-peinh.
      p_pvprs = lw_ckmlcr-pvprs / lw_ckmlcr-peinh.
    ENDIF.
  ENDIF.

ENDFORM.                    " get_Standard_price


*&---------------------------------------------------------------------*
*&      Form  get_price
*&---------------------------------------------------------------------*
*       get price
*----------------------------------------------------------------------*
*      -->P_KALNR   "Cost Estimate Number for Cost Est. w/o Qty Structure
*      -->P_LFGJA  Year
*      -->P_LFMON  Month
*      -->P_GCURR  Indicator: Group Currency
*      <--PW_CKMLCR  Material Ledger: Period Totals Records Values
*----------------------------------------------------------------------*
FORM get_price  USING   p_kalnr   "Cost Estimate Number for Cost Est. w/o Qty Structure
                        p_bdatj   "Posting date YYYY
                        p_poper   "Posting period
                        p_gcurr
               CHANGING pw_ckmlcr LIKE gw_ckmlcr.

  DATA: l_curtp LIKE ckmlcr-curtp,
        l_bdatj LIKE ckmlcr-bdatj,  "Posting date YYYY
        l_poper LIKE ckmlcr-poper,  "Posting period
        lt_ckmlcr LIKE TABLE OF gw_ckmlcr.
  CLEAR: l_curtp.
  IF p_gcurr = 'X'.
    l_curtp = '30'.
  ELSE.
    l_curtp = '10'.
  ENDIF.

  CLEAR: lt_ckmlcr.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_ckmlcr
    FROM ckmlcr
    WHERE kalnr = p_kalnr
      AND ( ( bdatj = p_bdatj AND poper <= p_poper ) OR bdatj < p_bdatj )
      AND curtp = l_curtp. "30: Group currency, 10: Local currency
  SORT lt_ckmlcr BY curtp bdatj DESCENDING poper DESCENDING.
  CLEAR: pw_ckmlcr.
  READ TABLE lt_ckmlcr INTO pw_ckmlcr INDEX 1.
  IF pw_ckmlcr-waers = 'TWD' OR pw_ckmlcr-waers = 'JPY'.
    pw_ckmlcr-stprs = pw_ckmlcr-stprs * 100.
    pw_ckmlcr-pvprs = pw_ckmlcr-pvprs * 100.
    pw_ckmlcr-salk3 = pw_ckmlcr-salk3 * 100.
    pw_ckmlcr-salkv = pw_ckmlcr-salkv * 100.
  ENDIF.

  SELECT lbkum bdatj poper INTO (pw_ckmlcr-lbkum,l_bdatj,l_poper) UP TO 1 ROWS
    FROM ckmlpp
    WHERE kalnr = p_kalnr
      AND ( ( bdatj = p_bdatj AND poper <= p_poper ) OR bdatj < p_bdatj )
    ORDER BY bdatj DESCENDING poper DESCENDING.
    EXIT.
  ENDSELECT.

ENDFORM.                    " get_price


*&---------------------------------------------------------------------*
*&      Form  get_mseg_fields
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_FIELD  text
*      -->P_GW_MSEG  text
*----------------------------------------------------------------------*
FORM get_mseg_fields  TABLES   pt_field STRUCTURE gw_field
                      USING    pw_mseg STRUCTURE gw_mseg.

  TYPE-POOLS: sydes.      " Types/constants needed for "DESCRIBE FIELD f INTO td"
  DATA: w_td          TYPE sydes_desc,
        w_typeinfo    TYPE sydes_typeinfo,
        w_nameinfo    TYPE sydes_nameinfo.

  DESCRIBE FIELD pw_mseg INTO w_td.  "Type and description

  LOOP AT w_td-names INTO w_nameinfo.
*   select all entries who contain 'MSEG-' or 'MKPF-'
    CASE  w_nameinfo-name(05).
      WHEN  'MKPF-'.
        MOVE    c_tilde TO w_nameinfo-name+4(01).
        APPEND  w_nameinfo-name TO pt_field. "<--- MKPF field name
      WHEN  'MSEG-'.
        MOVE  : w_nameinfo-name TO gw_field-fname,
                c_tilde         TO gw_field-fname+4(01).
        APPEND gw_field TO pt_field.
      WHEN  OTHERS.
    ENDCASE.
  ENDLOOP.

* serious error if table g_t_mseg_field does not contain fields
  IF pt_field[] IS INITIAL.
    MESSAGE e001
      WITH 'Error, contact system administrator'(e01).
  ELSE.
    SORT pt_field.
    DELETE ADJACENT DUPLICATES FROM pt_field.
  ENDIF.
ENDFORM.                    " get_mseg_fields


*&---------------------------------------------------------------------*
*&      Form  set_top_of_page
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM set_top_of_page.

  DATA: ls_line TYPE slis_listheader.
  DATA: ls_info TYPE slis_entry.

  CLEAR: g_list_top_of_page[].

  CLEAR ls_line.
  ls_line-typ  = 'H'.
  IF p_all = 'X'.
    IF p_summ = 'X'.
      ls_line-info = '库存分析_Turnover(Summary by BU)'.
    ELSE.
      ls_line-info = '库存分析(Detail)'.
    ENDIF.
    APPEND ls_line TO g_list_top_of_page.
  ELSEIF p_bad = 'X'.
    IF p_summ = 'X'.
      ls_line-info = '不良分析(Summary by BU)'.
    ELSE.
      ls_line-info = '不良分析(Detail)'.
    ENDIF.
    APPEND ls_line TO g_list_top_of_page.
  ENDIF.

  CLEAR: ls_line,ls_info.
  ls_line-typ  = 'S'.
  ls_line-key  = 'Update'.
  WRITE p_edate TO ls_info.
  ls_line-info = ls_info.
  APPEND ls_line TO g_list_top_of_page.

  CLEAR: ls_line,ls_info.
  ls_line-typ  = 'S'.
  ls_line-key  = 'Unit'.
  IF p_summ = 'X'.
    ls_line-info = 'K USD'.
  ELSE.
    ls_line-info = 'USD'.
  ENDIF.
  APPEND ls_line TO g_list_top_of_page.

  LOOP AT s_bukrs.
    CLEAR: ls_line.
    ls_line-typ  = 'S'.
    AT FIRST.
      ls_line-key  = 'Company'.
    ENDAT.
    "CONCATENATE s_bukrs-sign s_bukrs-option s_bukrs-low s_bukrs-high
    CONCATENATE s_bukrs-low s_bukrs-high
      INTO ls_line-info SEPARATED BY space.
    APPEND ls_line TO g_list_top_of_page.
  ENDLOOP.

  LOOP AT s_prctr.
    CLEAR: ls_line.
    ls_line-typ  = 'S'.
    AT FIRST.
      ls_line-key  = 'BU'.
    ENDAT.
    "CONCATENATE s_prctr-sign s_prctr-option s_prctr-low s_prctr-high
    CONCATENATE s_prctr-low s_prctr-high
      INTO ls_line-info SEPARATED BY space.
    APPEND ls_line TO g_list_top_of_page.
  ENDLOOP.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary       = g_list_top_of_page
*      I_LOGO                   = ''
*      I_END_OF_LIST_GRID       =
        .
ENDFORM.                    "set_top_of_page


*&---------------------------------------------------------------------*
*&      Form  download_require_spec
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM download_require_spec .

  DATA: remote_file LIKE rcgfiletr-ftappl,   "服务器文件路径
        local_file LIKE rcgfiletr-ftfront.    "下载文件路径
  remote_file = '/NOTES/ZCO057.xlsx'.
  "local_file = 'C:\庫存管理報表規格書.xlsx'. "从服务器上下载Excel文件到本地

  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = 'ZCO057規格書.xlsx'
      mask             = '*.xlsx;*.xlss'
      mode             = 'S'
      title            = 'Download file'
    IMPORTING
      filename         = local_file
    EXCEPTIONS
      selection_cancel = 1
      OTHERS           = 2.
  IF sy-subrc = 0.
    CALL FUNCTION 'C13Z_FILE_DOWNLOAD_BINARY'
      EXPORTING
        i_file_front_end    = local_file
        i_file_appl         = remote_file
        i_file_overwrite    = 'X'
      EXCEPTIONS
        fe_file_open_error  = 1
        fe_file_exists      = 2
        fe_file_write_error = 3
        ap_no_authority     = 4
        ap_file_open_error  = 5
        ap_file_empty       = 6
        others              = 7.
    IF sy-subrc = 0.
      MESSAGE S004 WITH '下载成功:' local_file.
    ELSE.
      MESSAGE E004 WITH '下载失败!'.
    ENDIF.
  ELSEIF sy-subrc <> 1.
    MESSAGE E004 WITH '请选择正确的文件路径和名称!'.
  ENDIF.


ENDFORM.                    " download_require_spec
 

猜你喜欢

转载自blog.csdn.net/champaignwolf/article/details/85272900
今日推荐