*&---------------------------------------------------------------------*
*& 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