进销存明细表(含双击跳转)
*&---------------------------------------------------------------------*
*& Report ZMMR004*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zmmr004 NO STANDARD PAGE HEADING.
TABLES: mbewh, mara, mard, mkpf.
*kk
TYPE-POOLS: slis.
DATA: BEGIN OF gt_itab OCCURS 0,
matnr LIKE mara-matnr, "物料号
maktx LIKE makt-maktx, "物料描述
meins LIKE mara-meins, "单位
zsqjc LIKE mseg-menge, "上期结存
zbqjh LIKE mseg-menge, "本期进货
zbqth LIKE mseg-menge, "本期退货
bqbcs LIKE mseg-menge, "本期拨出数
bqbrs LIKE mseg-menge, "本期拨入数
cbzxf LIKE mseg-menge, "成本中心发料数
cbzxt LIKE mseg-menge, "成本中心退料数
zbqhy LIKE mseg-menge, "本期耗用
zbqjc LIKE mseg-menge, "本期结存
lgort LIKE mseg-lgort, "库位
lgobe LIKE t001l-lgobe, "库位描述
werks LIKE mseg-werks,
zqty LIKE mseg-menge,
reffi TYPE mara-meins,
END OF gt_itab.
DATA: gt_itab2 LIKE gt_itab OCCURS 0 WITH HEADER LINE .
DATA: BEGIN OF gt_matr OCCURS 0,
matnr LIKE mara-matnr,
lgort LIKE mard-lgort,
END OF gt_matr.
DATA: BEGIN OF gt_mbew OCCURS 0,
matnr LIKE mara-matnr,
werks LIKE mard-werks,
lgort LIKE mard-lgort,
lbkum LIKE mbewh-lbkum,
insme LIKE mardh-insme,
speme LIKE mardh-speme,
END OF gt_mbew.
DATA: BEGIN OF gt_mseg OCCURS 0,
matnr LIKE mara-matnr,
werks LIKE mseg-werks,
lgort LIKE mseg-lgort,
bwart LIKE mseg-bwart,
shkzg LIKE mseg-shkzg,
menge LIKE mseg-menge,
meins LIKE mseg-meins,
smbln LIKE mseg-smbln,
smblp LIKE mseg-smblp,
mblnr LIKE mseg-mblnr,
zeile LIKE mseg-zeile,
insmk LIKE mseg-insmk,
urzei LIKE mseg-urzei , "原始行项目主要是调拨时会有问题 质检
END OF gt_mseg.
DATA: gt_mseg2 LIKE gt_mseg OCCURS 0 WITH HEADER LINE.
DATA: gt_mseg3 LIKE gt_mseg OCCURS 0 WITH HEADER LINE.
DATA: gt_mseg4 LIKE gt_mseg OCCURS 0 WITH HEADER LINE.
DATA: budat_low LIKE mkpf-budat,
budat_high LIKE mkpf-budat,
year(4) TYPE c,
month(2) TYPE c,
year1(4) TYPE c,
mont1(2) TYPE c,
year2(4) TYPE c,
mont2(2) TYPE c,
date1 LIKE mkpf-budat,
date3 LIKE mkpf-budat,
date2 LIKE mkpf-budat.
DATA: BEGIN OF gs_mbmps,
smbln LIKE m_mbmps-smbln,
smblp LIKE m_mbmps-smblp,
mblnr LIKE m_mbmps-mblnr,
zeile LIKE m_mbmps-zeile,
END OF gs_mbmps.
DATA : gt_mbmps LIKE TABLE OF gs_mbmps .
*DATA: BEGIN OF gs_qals,
* mblnr LIKE qals-mblnr,
* zeile LIKE qals-zeile,
* END OF gs_qals.
*
*DATA gt_qals LIKE TABLE OF gs_qals .
DATA: BEGIN OF gs_qamb,
mblnr LIKE qamb-mblnr,
zeile LIKE qamb-zeile,
werk LIKE mseg-werks,
END OF gs_qamb.
DATA gt_qamb LIKE TABLE OF gs_qamb .
DATA gt_qamb2 LIKE TABLE OF gs_qamb .
DATA: qmatv LIKE marc-qmatv.
DATA: n TYPE i.
*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN:BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p_werks LIKE mard-werks DEFAULT '1000'.
SELECT-OPTIONS: s_budat FOR mkpf-budat OBLIGATORY DEFAULT sy-datum,
s_lgort FOR mard-lgort,
s_mtart FOR mara-mtart,
s_matkl FOR mara-matkl,
s_matnr FOR mara-matnr.
SELECTION-SCREEN END OF BLOCK blk1.
AT SELECTION-SCREEN OUTPUT.
LOOP AT s_budat.
IF s_budat-low IS INITIAL AND s_budat-high IS NOT INITIAL.
CONCATENATE sy-datum+0(6) '01' INTO s_budat-low.
* s_budat-low = s_budat-high.
MODIFY s_budat.
ELSEIF s_budat-high IS INITIAL AND s_budat-low IS NOT INITIAL.
s_budat-high = s_budat-low.
CONCATENATE sy-datum+0(6) '01' INTO s_budat-low.
MODIFY s_budat.
ENDIF.
ENDLOOP.
*&---------------------------------------------------------------------*
*& START_OF_SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_data.
PERFORM process_data.
*&---------------------------------------------------------------------*
*& END_OF_SELECTION
*&---------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM write_data.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data .
READ TABLE s_budat INDEX 1.
CONCATENATE s_budat-low+0(4) s_budat-low+4(2) '01' INTO budat_low.
budat_high = s_budat-low.
year = s_budat-low+0(4).
month = s_budat-low+4(2).
IF month = '01'.
month = '12'.
year = year - 1.
ELSE.
month = month - 1.
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = month
IMPORTING
output = month
EXCEPTIONS
OTHERS = 1.
mont1 = month.
year1 = year.
CLEAR s_budat.
SELECT a~matnr b~werks b~lgort INTO TABLE gt_mbew
FROM mara AS a INNER JOIN mard AS b ON b~matnr = a~matnr
* INNER JOIN MBEW AS C ON C~MATNR = A~MATNR
WHERE a~matnr IN s_matnr
AND a~matkl IN s_matkl
AND a~mtart IN s_mtart
AND b~lgort IN s_lgort
AND b~werks EQ p_werks.
* AND B~LABST NE 0.
* loop at gt_mbew.
*
* do.
* n = n + 1.
* select single labst insme speme into (gt_mbew-lbkum, gt_mbew-insme, gt_mbew-speme)
* from mardh where matnr = gt_mbew-matnr
* and lgort = gt_mbew-lgort
* and lfgja = year
* and lfmon = month
* and werks = gt_mbew-werks.
* if sy-subrc = 0.
* if month = '12'.
* year2 = year + 1.
* mont2 = '01'.
* else.
* year2 = year.
* mont2 = month + 1.
* endif.
* call function 'CONVERSION_EXIT_ALPHA_INPUT'
* exporting
* input = mont2
* importing
* output = mont2
* exceptions
* others = 1.
* concatenate year2 mont2 '01' into date3.
*
* select a~matnr a~werks a~lgort a~bwart a~shkzg a~menge a~meins a~smbln a~smblp a~mblnr a~zeile into gt_mseg2
* from mseg as a inner join mkpf as b on b~mblnr = a~mblnr
* inner join mara as c on c~matnr = a~matnr
* where a~matnr in s_matnr
* and c~matkl in s_matkl
* and c~mtart in s_mtart
* and a~lgort in s_lgort
* and a~matnr = gt_mbew-matnr
* and a~lgort = gt_mbew-lgort
* and a~werks = gt_mbew-werks
** and b~budat >= date3
* and b~budat < budat_high .
* append gt_mseg2.
* clear gt_mseg2.
* endselect.
*
* n = 0.
* year = year1.
* month = mont1.
* exit.
* elseif n = 12.
* n = 0.
* year = year1.
* month = mont1.
* exit.
* else.
* if month = '01'.
* month = '12'.
* year = year - 1.
* else.
* month = month - 1.
* call function 'CONVERSION_EXIT_ALPHA_INPUT'
* exporting
* input = month
* importing
* output = month
* exceptions
* others = 1.
* endif.
* endif.
* enddo.
*
* modify gt_mbew.
* endloop.
SELECT a~matnr a~werks a~lgort a~bwart a~shkzg a~menge a~meins a~smbln a~smblp a~mblnr a~zeile a~insmk a~urzei INTO TABLE gt_mseg2
FROM mseg AS a INNER JOIN mkpf AS b ON b~mblnr = a~mblnr
INNER JOIN mara AS c ON c~matnr = a~matnr
WHERE a~matnr IN s_matnr
AND c~matkl IN s_matkl
AND c~mtart IN s_mtart
AND a~lgort IN s_lgort
AND a~werks EQ p_werks
AND b~budat < budat_low
%_HINTS
DB6 '<NLJOIN><IXSCAN TABLE=''MSEG'' SAP_INDEX=''M''/>''</NLJOIN>'.
SELECT a~matnr a~werks a~lgort a~bwart a~shkzg a~menge a~meins a~smbln a~smblp a~mblnr a~zeile a~insmk a~urzei INTO TABLE gt_mseg
FROM mseg AS a INNER JOIN mkpf AS b ON b~mblnr = a~mblnr
INNER JOIN mara AS c ON c~matnr = a~matnr
WHERE a~matnr IN s_matnr
AND c~matkl IN s_matkl
AND c~mtart IN s_mtart
AND a~lgort IN s_lgort
AND b~budat IN s_budat
AND a~werks EQ p_werks
%_HINTS
DB6 '<NLJOIN><IXSCAN TABLE=''MSEG'' SAP_INDEX=''M''/>''</NLJOIN>'.
* SELECT A~MATNR A~LGORT A~BWART A~SHKZG A~MENGE A~MEINS INTO TABLE GT_MSEG2
* FROM MSEG AS A INNER JOIN MKPF AS B ON B~MBLNR = A~MBLNR
* INNER JOIN MARA AS C ON C~MATNR = A~MATNR
* WHERE A~MATNR IN S_MATNR
* AND C~MATKL IN S_MATKL
* AND C~MTART IN S_MTART
* AND A~LGORT IN S_LGORT
* AND B~BUDAT >= BUDAT_LOW
* AND B~BUDAT < BUDAT_HIGH .
SELECT
smbln
smblp
mblnr
zeile
INTO TABLE gt_mbmps
FROM m_mbmps .
IF gt_mseg2[] IS NOT INITIAL .
SELECT a~mblnr a~zeile b~werk
INTO TABLE gt_qamb
FROM qamb AS a
JOIN qals AS b ON a~prueflos = b~prueflos
FOR ALL ENTRIES IN gt_mseg2
WHERE a~mblnr = gt_mseg2-mblnr
AND a~zeile = gt_mseg2-urzei.
ENDIF .
IF gt_mseg[] IS NOT INITIAL .
SELECT a~mblnr a~zeile b~werk
INTO TABLE gt_qamb2
FROM qamb AS a
JOIN qals AS b ON a~prueflos = b~prueflos
FOR ALL ENTRIES IN gt_mseg
WHERE a~mblnr = gt_mseg-mblnr
AND a~zeile = gt_mseg-urzei.
ENDIF .
LOOP AT gt_qamb2 INTO gs_qamb .
APPEND gs_qamb TO gt_qamb .
ENDLOOP .
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form PROCESS_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM process_data .
DATA lv_tabix TYPE sy-tabix .
SORT gt_mbmps BY smbln smblp .
" 去冲销
LOOP AT gt_mseg2 .
CLEAR lv_tabix .
lv_tabix = sy-tabix .
READ TABLE gt_mbmps WITH KEY smbln = gt_mseg2-mblnr
smblp = gt_mseg2-zeile
BINARY SEARCH
TRANSPORTING NO FIELDS .
IF sy-subrc EQ 0 .
DELETE gt_mseg2 INDEX lv_tabix .
ELSEIF gt_mseg2-lgort IS INITIAL .
DELETE gt_mseg2 INDEX lv_tabix .
ENDIF .
ENDLOOP .
" 去冲销
LOOP AT gt_mseg .
CLEAR lv_tabix .
lv_tabix = sy-tabix .
READ TABLE gt_mbmps WITH KEY smbln = gt_mseg-mblnr
smblp = gt_mseg-zeile
BINARY SEARCH
TRANSPORTING NO FIELDS .
IF sy-subrc EQ 0 .
DELETE gt_mseg INDEX lv_tabix .
ENDIF .
ENDLOOP .
" " 去被冲销
SORT gt_mbmps BY mblnr zeile .
LOOP AT gt_mseg2 .
CLEAR lv_tabix .
lv_tabix = sy-tabix .
READ TABLE gt_mbmps WITH KEY mblnr = gt_mseg2-mblnr
zeile = gt_mseg2-zeile
BINARY SEARCH
TRANSPORTING NO FIELDS .
IF sy-subrc EQ 0 .
DELETE gt_mseg2 INDEX lv_tabix .
ELSEIF gt_mseg2-lgort IS INITIAL .
DELETE gt_mseg2 INDEX lv_tabix .
ENDIF .
ENDLOOP .
" 去被冲销
LOOP AT gt_mseg .
CLEAR lv_tabix .
lv_tabix = sy-tabix .
READ TABLE gt_mbmps WITH KEY mblnr = gt_mseg-mblnr
zeile = gt_mseg-zeile
BINARY SEARCH
TRANSPORTING NO FIELDS .
IF sy-subrc EQ 0 .
DELETE gt_mseg INDEX lv_tabix .
ENDIF .
ENDLOOP .
"去质检验,处理转储 -期初
SORT gt_qamb BY mblnr zeile werk .
LOOP AT gt_mseg2 .
CLEAR lv_tabix .
lv_tabix = sy-tabix .
READ TABLE gt_qamb WITH KEY mblnr = gt_mseg2-mblnr
zeile = gt_mseg2-urzei
werk = gt_mseg2-werks
BINARY SEARCH
TRANSPORTING NO FIELDS .
IF sy-subrc EQ 0 .
IF gt_mseg2-bwart <> '321' AND gt_mseg2-bwart <> '322' .
DELETE gt_mseg2 INDEX lv_tabix .
ENDIF .
ENDIF .
" 321 只保留方
IF gt_mseg2-bwart EQ '321' AND gt_mseg2-shkzg EQ 'H'.
DELETE gt_mseg2 INDEX lv_tabix .
ENDIF .
IF gt_mseg2-bwart EQ '322' AND gt_mseg2-shkzg EQ 'S'.
DELETE gt_mseg2 INDEX lv_tabix .
ENDIF .
ENDLOOP .
" 去质检验,处理转储-区间
LOOP AT gt_mseg .
CLEAR lv_tabix .
lv_tabix = sy-tabix .
READ TABLE gt_qamb WITH KEY mblnr = gt_mseg-mblnr
zeile = gt_mseg-urzei
werk = gt_mseg-werks
BINARY SEARCH
TRANSPORTING NO FIELDS .
IF sy-subrc EQ 0 .
IF gt_mseg-bwart <> '321' AND gt_mseg-bwart <> '322' .
DELETE gt_mseg INDEX lv_tabix .
ENDIF .
ENDIF .
" 321 只保留方
IF gt_mseg-bwart EQ '321' AND gt_mseg-shkzg EQ 'H'.
DELETE gt_mseg INDEX lv_tabix .
ENDIF .
IF gt_mseg-bwart EQ '322' AND gt_mseg-shkzg EQ 'S'.
DELETE gt_mseg INDEX lv_tabix .
ENDIF .
ENDLOOP .
"汇总期初
SORT gt_mseg2 BY matnr werks lgort.
LOOP AT gt_mseg2.
gt_itab-matnr = gt_mseg2-matnr .
gt_itab-werks = gt_mseg2-werks .
gt_itab-lgort = gt_mseg2-lgort .
IF gt_mseg2-shkzg EQ 'S'.
gt_itab-zsqjc = gt_itab-zsqjc + gt_mseg2-menge .
ELSE .
gt_itab-zsqjc = gt_itab-zsqjc + gt_mseg2-menge * ( -1 ) .
ENDIF .
AT END OF lgort .
APPEND gt_itab .
CLEAR gt_itab.
ENDAT.
ENDLOOP .
*汇总期间
SORT gt_mseg BY matnr werks lgort.
LOOP AT gt_mseg.
gt_itab2-matnr = gt_mseg-matnr .
gt_itab2-werks = gt_mseg-werks .
gt_itab2-lgort = gt_mseg-lgort .
IF gt_mseg-shkzg EQ 'S'.
gt_itab2-zbqjh = gt_itab2-zbqjh + gt_mseg-menge .
ELSE .
gt_itab2-zbqth = gt_itab2-zbqth + gt_mseg-menge * ( -1 ) .
ENDIF .
AT END OF lgort .
APPEND gt_itab2 .
CLEAR gt_itab2.
ENDAT.
ENDLOOP .
" 汇总期末
SORT gt_itab BY matnr werks lgort .
LOOP AT gt_itab2 .
CLEAR gt_itab .
READ TABLE gt_itab WITH KEY matnr = gt_itab2-matnr
werks = gt_itab2-werks
lgort = gt_itab2-lgort
BINARY SEARCH.
IF sy-subrc EQ 0 .
gt_itab-zbqjh = gt_itab2-zbqjh .
gt_itab-zbqth = gt_itab2-zbqth.
gt_itab-zbqjc = gt_itab-zsqjc + gt_itab-zbqjh + gt_itab-zbqth . "上面汇总时已经成负数
MODIFY gt_itab INDEX sy-tabix .
ELSE .
gt_itab-matnr = gt_itab2-matnr.
gt_itab-werks = gt_itab2-werks.
gt_itab-lgort = gt_itab2-lgort .
gt_itab-zbqjh = gt_itab2-zbqjh .
gt_itab-zbqth = gt_itab2-zbqth.
gt_itab-zbqjc = gt_itab-zsqjc + gt_itab-zbqjh + gt_itab-zbqth . "上面汇总时已经成负数
APPEND gt_itab .
SORT gt_itab BY matnr werks lgort .
ENDIF .
ENDLOOP .
LOOP AT gt_itab .
gt_itab-zbqjc = gt_itab-zsqjc + gt_itab-zbqjh + gt_itab-zbqth .
SELECT SINGLE lgobe INTO gt_itab-lgobe FROM t001l WHERE lgort = gt_itab-lgort.
SELECT SINGLE meins INTO gt_itab-meins FROM mara WHERE matnr = gt_itab-matnr.
SELECT SINGLE maktx INTO gt_itab-maktx FROM makt WHERE matnr = gt_itab-matnr.
MODIFY gt_itab .
ENDLOOP .
*
*
*
* IF gt_mseg2[] IS NOT INITIAL.
* LOOP AT gt_mseg2.
*
* IF gt_mseg2-bwart = '321'.
* IF gt_mseg2-shkzg = 'S' AND gt_mseg2-matnr = '123213'.
* DELETE gt_mseg2.
* ELSEIF gt_mseg2-shkzg = 'H'.
* DELETE gt_mseg2.
* CONTINUE.
* ENDIF.
* ELSEIF gt_mseg2-bwart = '322'.
* IF gt_mseg2-shkzg = 'H'.
* DELETE gt_mseg2.
* CONTINUE.
* ELSE.
* gt_mseg2-menge = gt_mseg2-menge * ( -1 ).
* ENDIF.
* ELSE.
*
*
* ENDIF.
* MODIFY gt_mseg2.
*
* ENDLOOP.
* ENDIF.
* DELETE gt_mseg WHERE insmk = 'X' AND bwart NE '322'.
* LOOP AT gt_mbew.
* LOOP AT gt_mseg2 WHERE matnr = gt_mbew-matnr AND lgort = gt_mbew-lgort
* AND werks = gt_mbew-werks.
* gt_mbew-lbkum = gt_mbew-lbkum + gt_mseg2-menge.
* ENDLOOP.
* MODIFY gt_mbew.
* CLEAR gt_mbew.
* ENDLOOP.
*
* LOOP AT gt_mbew.
* gt_itab-matnr = gt_mbew-matnr.
* gt_itab-lgort = gt_mbew-lgort.
* gt_itab-werks = gt_mbew-werks.
* gt_itab-zsqjc = gt_mbew-lbkum + gt_mbew-speme.
* APPEND gt_itab.
* CLEAR gt_itab.
* ENDLOOP.
* DELETE gt_mseg WHERE bwart = '321' AND shkzg = 'H'.
* DELETE gt_mseg WHERE bwart = '322' AND shkzg = 'S'.
* LOOP AT gt_itab.
* SELECT SINGLE qmatv INTO qmatv FROM marc WHERE matnr = gt_itab-matnr.
* IF qmatv = 'X'.
* LOOP AT gt_mseg WHERE matnr = gt_itab-matnr AND lgort = gt_itab-lgort
* AND werks = gt_itab-werks AND shkzg = 'S'. "and bwart <> '101' and bwart <> '123' and bwart <> '501' .
* gt_itab-zbqjh = gt_itab-zbqjh + gt_mseg-menge.
* ENDLOOP.
*
* LOOP AT gt_mseg WHERE matnr = gt_itab-matnr AND lgort = gt_itab-lgort
* AND werks = gt_itab-werks AND shkzg = 'H' ."and bwart <> '122' and bwart <> '502'."('122')..
* gt_itab-zbqth = gt_itab-zbqth + gt_mseg-menge.
* ENDLOOP.
*
* ELSE.
* LOOP AT gt_mseg WHERE matnr = gt_itab-matnr AND lgort = gt_itab-lgort AND werks = gt_itab-werks AND shkzg = 'S'..
* gt_itab-zbqjh = gt_itab-zbqjh + gt_mseg-menge.
* ENDLOOP.
* LOOP AT gt_mseg WHERE matnr = gt_itab-matnr AND lgort = gt_itab-lgort
* AND werks = gt_itab-werks AND shkzg = 'H' ."('122')..
* gt_itab-zbqth = gt_itab-zbqth + gt_mseg-menge.
* ENDLOOP.
*
*
* ENDIF.
*
* gt_itab-zbqjc = gt_itab-zsqjc + gt_itab-zbqjh - gt_itab-zbqth - gt_itab-bqbcs + gt_itab-bqbrs
* - gt_itab-cbzxf + gt_itab-cbzxt + gt_itab-zqty.
*
** GT_ITAB-ZBQHY = GT_ITAB-ZBQTH + GT_ITAB-BQBCS + GT_ITAB-CBZXF - GT_ITAB-BQBRS - GT_ITAB-CBZXT.
*
* SELECT SINGLE lgobe INTO gt_itab-lgobe FROM t001l WHERE lgort = gt_itab-lgort.
*
* SELECT SINGLE meins INTO gt_itab-meins FROM mara WHERE matnr = gt_itab-matnr.
*
* SELECT SINGLE maktx INTO gt_itab-maktx FROM makt WHERE matnr = gt_itab-matnr.
* CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT' " 单位转换
* EXPORTING
* input = gt_itab-meins
* language = sy-langu
* IMPORTING
* output = gt_itab-meins
* EXCEPTIONS
* unit_not_found = 1
* OTHERS = 2.
* gt_itab-reffi = 'KAR'.
* MODIFY gt_itab.
* CLEAR qmatv.
* CLEAR gt_itab.
* ENDLOOP.
DELETE gt_itab WHERE zsqjc = 0 AND zbqjh = 0 AND zbqth = 0 AND zbqjc = 0.
DELETE gt_itab WHERE lgort IS INITIAL .
ENDFORM. " PROCESS_DATA
*&---------------------------------------------------------------------*
*& Form WRITE_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM write_data .
DATA: ws_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
ws_fieldgroups_tab TYPE slis_t_sp_group_alv,
ws_layout TYPE slis_layout_alv,
ws_sortfields_tab TYPE slis_t_sortinfo_alv WITH HEADER LINE,
ws_events TYPE slis_t_event.
DATA: nn TYPE i VALUE 0.
DATA: title TYPE lvc_title.
DATA: color TYPE slis_t_specialcol_alv WITH HEADER LINE.
* SORT GT_CDHD BY BUKRS BUKRS ZEXCD.
*
DEFINE hout.
nn = nn + 1.
ws_fieldcat-col_pos = nn.
ws_fieldcat-tabname = 'GT_ITAB'.
ws_fieldcat-key = &1.
ws_fieldcat-fieldname = &2.
ws_fieldcat-seltext_m = &3.
ws_fieldcat-cfieldname = &4.
ws_fieldcat-datatype = &5.
ws_fieldcat-ref_tabname = &6.
ws_fieldcat-ref_fieldname = &7.
ws_fieldcat-do_sum = &8.
ws_fieldcat-qfieldname = &9.
APPEND ws_fieldcat.
CLEAR ws_fieldcat.
END-OF-DEFINITION.
hout:
'X' 'MATNR' '物料号' '' '' '' '' '' '',
'X' 'MAKTX' '物料描述' '' '' '' '' '' '',
'' 'MEINS' '基本单位' '' '' '' '' '' '',
'' 'ZSQJC' '上期结存' '' '' '' '' '' 'REFFI',
'' 'ZBQJH' '本期入库' '' '' '' '' '' 'REFFI',
'' 'ZBQTH' '本期出库' '' '' '' '' '' 'REFFI',
* '' 'BQBCS' '本期拨出数' '' '' '' '' '' '',
* '' 'BQBRS' '本期拨入数' '' '' '' '' '' '',
* '' 'CBZXF' '成本中心发料数' '' '' '' '' '' '',
* '' 'CBZXT' '成本中心退料数' '' '' '' '' '' '',
* '' 'ZBQHY' '本期耗用' '' '' '' '' '' '',
'' 'ZBQJC' '本期结存' '' '' '' '' '' 'REFFI',
'' 'LGORT' '库存地点' '' '' '' '' '' '',
'' 'LGOBE' '库位描述' '' '' '' '' '' ''.
ws_layout-zebra = 'X'.
ws_layout-get_selinfos = 'X'.
ws_layout-colwidth_optimize = 'X'.
ws_layout-detail_popup = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_user_command = 'USER_COMMAND'
is_layout = ws_layout
it_fieldcat = ws_fieldcat[]
it_special_groups = ws_fieldgroups_tab[]
it_sort = ws_sortfields_tab[]
it_events = ws_events[]
i_grid_title = title
i_default = 'X'
i_save = 'A'
TABLES
t_outtab = gt_itab[]
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " WRITE_DATA
*&---------------------------------------------------------------------*
*& Form USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: g_selected_field_value(80).
IF rs_selfield-fieldname EQ 'MATNR'.
CASE r_ucomm.
WHEN '&IC1'.
READ TABLE gt_itab INDEX rs_selfield-tabindex.
PERFORM show_detial USING gt_itab-matnr gt_itab-lgort
gt_itab-zsqjc gt_itab-zbqjc..
* SET PARAMETER ID 'MAT' FIELD GT_ITAB-MATNR.
* CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN .
ENDCASE.
ENDIF.
ENDFORM. "USER_COMMAND
FORM show_detial USING l_matnr LIKE mara-matnr
l_lgort LIKE mard-lgort
l_menge LIKE mseg-menge
l_menge1 LIKE mseg-menge.
DATA: BEGIN OF lt_itab OCCURS 0,
matnr LIKE mara-matnr,
budat LIKE mkpf-budat,
werks LIKE mseg-werks,
lgort LIKE mseg-lgort,
bwart LIKE mseg-bwart,
shkzg LIKE mseg-shkzg,
menge LIKE mseg-menge,
meins LIKE mseg-meins,
smbln LIKE mseg-smbln,
smblp LIKE mseg-smblp,
mblnr LIKE mseg-mblnr,
zeile LIKE mseg-zeile,
jcsl LIKE mseg-menge,
ref_doc TYPE char50,
ref_pos TYPE char10,
ref_txt TYPE char50,
reffi TYPE mara-meins,
END OF lt_itab.
DATA:l_qmatv LIKE marc-qmatv.
DATA:prueflos_001 LIKE qamb-prueflos,
mblnr_001 LIKE qamb-mblnr.
DATA: lv_bsart TYPE ekko-bsart .
*select DISTINCT * into TABLE lt_itab from mara UP TO 50 ROWS .
CLEAR:lt_itab[],lt_itab,l_qmatv.
SELECT SINGLE qmatv INTO l_qmatv FROM marc WHERE matnr = l_matnr.
lt_itab-matnr = l_matnr.
lt_itab-meins = gt_mseg-meins.
lt_itab-jcsl = l_menge.
APPEND lt_itab.CLEAR lt_itab.
"modify by lxf start
* IF l_qmatv = 'X'.
* LOOP AT gt_mseg WHERE matnr = l_matnr AND lgort = l_lgort AND bwart <> '101' AND bwart <> '501' .
** lt_itab = gt_mseg.
* MOVE-CORRESPONDING gt_mseg TO lt_itab.
* APPEND lt_itab.CLEAR lt_itab.
* ENDLOOP.
*
* LOOP AT gt_mseg WHERE matnr = l_matnr AND lgort = l_lgort AND bwart EQ '101' AND bwart <> '501' .
* CLEAR lv_bsart .
* SELECT SINGLE bsart INTO lv_bsart
* FROM ekko AS a
* JOIN mseg AS b
* ON a~ebeln = b~ebeln
* WHERE b~mblnr = gt_mseg-mblnr
* AND a~bsart EQ 'ZUB' .
* IF lv_bsart IS NOT INITIAL .
* MOVE-CORRESPONDING gt_mseg TO lt_itab.
* ENDIF .
* APPEND lt_itab.CLEAR lt_itab.
* ENDLOOP.
*
* ELSE.
* LOOP AT gt_mseg WHERE matnr = l_matnr AND lgort = l_lgort." and bwart <> '101'.
** lt_itab = gt_mseg.
* MOVE-CORRESPONDING gt_mseg TO lt_itab.
* APPEND lt_itab.CLEAR lt_itab.
* ENDLOOP.
* ENDIF.
"modify by lxf end
LOOP AT gt_mseg WHERE matnr = l_matnr AND lgort = l_lgort."
MOVE-CORRESPONDING gt_mseg TO lt_itab.
APPEND lt_itab.CLEAR lt_itab.
ENDLOOP.
LOOP AT lt_itab.
IF lt_itab-bwart = '321'.
SELECT SINGLE prueflos
INTO prueflos_001
FROM qamb
WHERE mblnr = lt_itab-mblnr
AND typ = '3'.
IF prueflos_001 IS NOT INITIAL.
SELECT SINGLE mblnr zeile
INTO (lt_itab-ref_doc,lt_itab-ref_pos)
FROM qamb
WHERE prueflos = prueflos_001
AND typ = '1'.
ENDIF.
ENDIF.
IF lt_itab-bwart = '201'
OR lt_itab-bwart = '202'
OR lt_itab-bwart = '311'
OR lt_itab-bwart = '312'
OR lt_itab-bwart = 'Z61'
OR lt_itab-bwart = 'Z62'.
SELECT SINGLE rsnum rspos
INTO (lt_itab-ref_doc,lt_itab-ref_pos)
FROM mseg
WHERE mblnr = lt_itab-mblnr
AND zeile = lt_itab-zeile.
IF lt_itab-bwart = '312' .
SELECT SINGLE bktxt
INTO lt_itab-ref_txt
FROM mkpf
WHERE mblnr = lt_itab-mblnr.
ENDIF.
ENDIF.
IF lt_itab-bwart = '122' OR lt_itab-bwart = '309'. "增加122、309移动类型参考凭证
SELECT SINGLE bktxt
INTO lt_itab-ref_txt
FROM mkpf
WHERE mblnr = lt_itab-mblnr.
ENDIF.
IF lt_itab-bwart = '261'
OR lt_itab-bwart = '262'.
SELECT SINGLE aufnr
INTO lt_itab-ref_doc
FROM mseg
WHERE mblnr = lt_itab-mblnr
AND zeile = lt_itab-zeile.
SELECT SINGLE bktxt
INTO lt_itab-ref_txt
FROM mkpf
WHERE mblnr = lt_itab-mblnr.
ENDIF.
IF lt_itab-bwart = '511'
OR lt_itab-bwart = '531'
OR lt_itab-bwart = '541'
OR lt_itab-bwart = '542'
OR lt_itab-bwart = '551'.
SELECT SINGLE bktxt
INTO lt_itab-ref_txt
FROM mkpf
WHERE mblnr = lt_itab-mblnr.
ENDIF.
IF lt_itab-bwart = '601'
OR lt_itab-bwart = '631'
OR lt_itab-bwart = '653'
OR lt_itab-bwart = 'Z81'
OR lt_itab-bwart = 'Z91'.
SELECT SINGLE xblnr
INTO lt_itab-ref_doc
FROM mkpf
WHERE mblnr = lt_itab-mblnr.
ENDIF.
IF lt_itab-bwart = '701'
OR lt_itab-bwart = '702'.
SELECT SINGLE iblnr zeili
INTO (lt_itab-ref_doc,lt_itab-ref_pos)
FROM iseg
WHERE mblnr = lt_itab-mblnr
AND zeile = lt_itab-zeile.
ENDIF.
SELECT SINGLE budat INTO lt_itab-budat FROM mkpf WHERE mblnr = lt_itab-mblnr." AND ZEILE = LT_ITAB-ZEILE.
lt_itab-reffi = 'KAR'.
IF lt_itab-shkzg = 'H'.
lt_itab-menge = lt_itab-menge * ( -1 ).
ENDIF.
IF lt_itab-bwart = '161'
OR lt_itab-bwart = '122'
OR lt_itab-bwart = '351'
OR lt_itab-bwart = '101' .
SELECT SINGLE bktxt
INTO lt_itab-ref_txt
FROM mkpf
WHERE mblnr = lt_itab-mblnr.
ENDIF .
MODIFY lt_itab.CLEAR lt_itab.
ENDLOOP.
SORT lt_itab BY budat mblnr zeile .
lt_itab-matnr = l_matnr.
lt_itab-jcsl = l_menge1.
lt_itab-reffi = 'KAR'.
APPEND lt_itab.CLEAR lt_itab.
DATA:last_menge TYPE menge_d.
DATA:line TYPE i.
DESCRIBE TABLE lt_itab LINES line.
LOOP AT lt_itab.
IF sy-tabix > 1 AND sy-tabix <> line.
lt_itab-jcsl = last_menge + lt_itab-menge.
ENDIF.
last_menge = lt_itab-jcsl.
MODIFY lt_itab.CLEAR lt_itab.
ENDLOOP.
DATA: lt_fcat TYPE slis_t_fieldcat_alv,
ls_fcat TYPE slis_fieldcat_alv.
CLEAR ls_fcat.
ls_fcat-fieldname = 'MATNR'.
ls_fcat-seltext_l = '物料'.
ls_fcat-outputlen = 18.
APPEND ls_fcat TO lt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'BUDAT'.
ls_fcat-seltext_l = '过账日期'.
ls_fcat-outputlen = 10.
APPEND ls_fcat TO lt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'MBLNR'.
ls_fcat-seltext_l = '物料凭证'.
ls_fcat-outputlen = 10.
APPEND ls_fcat TO lt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'ZEILE'.
ls_fcat-seltext_l = '行项目'.
ls_fcat-outputlen = 6.
APPEND ls_fcat TO lt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'BWART'.
ls_fcat-seltext_l = '移动类型'.
* ls_fcat-outputlen = 10.
APPEND ls_fcat TO lt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'MENGE'.
ls_fcat-seltext_l = '数量'.
ls_fcat-qfieldname = 'REFFI'.
ls_fcat-outputlen = 13.
APPEND ls_fcat TO lt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'JCSL'.
ls_fcat-seltext_l = '结存数量'.
ls_fcat-ref_tabname = 'MSEG'.
ls_fcat-ref_fieldname = 'MENGE'.
ls_fcat-qfieldname = 'REFFI'.
ls_fcat-outputlen = 13.
APPEND ls_fcat TO lt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'REF_DOC'.
ls_fcat-seltext_l = '参考凭证'.
ls_fcat-outputlen = 20.
APPEND ls_fcat TO lt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'REF_POS'.
ls_fcat-seltext_l = '参考行项目'.
ls_fcat-outputlen = 10.
APPEND ls_fcat TO lt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'REF_TXT'.
ls_fcat-seltext_l = '抬头文本'.
ls_fcat-outputlen = 50.
APPEND ls_fcat TO lt_fcat.
CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
EXPORTING
i_screen_start_column = 7 "ALV起始位置
i_screen_start_line = 7
i_screen_end_column = 173
i_screen_end_line = 30
i_title = '本期发生明细' "这里设置alv标题
i_tabname = space "这里默认是空就OK了
it_fieldcat = lt_fcat[] "这里是字段目录
i_callback_program = sy-repid
TABLES
t_outtab = lt_itab[] "输出内表.
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.