TABLES:MARA,MARD,MSEG.
TYPES:BEGIN OF TY_DATA,
WERKS TYPE MARD-WERKS, "工厂
MATNR TYPE MARD-MATNR, "物料号
MAKTX TYPE MAKT-MAKTX, "物料描述
MEINS TYPE MARA-MEINS, "基本单位---后面最好优化为条目单位
LABST_Y TYPE MARD-LABST, "原材料库存-2031-5060
LABST_X TYPE MARD-LABST, "线边仓库存-2031-4010
LABST_DT TYPE MARD-LABST, "动力化学品、特气仓库存-2031-6010+6011
LABST_H TYPE MARD-LABST, "库存合计
END OF TY_DATA.
DATA:LT_ALV TYPE STANDARD TABLE OF TY_DATA.
DATA:LS_ALV TYPE TY_DATA.
DATA: GT_FILE TYPE FILETABLE.
DATA: G_REPID TYPE SY-REPID.
DATA: GT_FIELD TYPE SLIS_T_FIELDCAT_ALV.
* ALV 用
DATA:
GS_LAYOUT TYPE LVC_S_LAYO,
GV_REPID TYPE REPID,
GT_FIELDCAT TYPE LVC_T_FCAT,
LS_FIELDCAT TYPE LVC_S_FCAT.
DATA: G_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA:POS TYPE I.
DATA: G_TITLE TYPE LVC_TITLE.
DEFINE ADD_COL.
CLEAR LS_FIELDCAT.
ADD 1 TO POS.
LS_FIELDCAT-COL_POS = POS.
LS_FIELDCAT-FIELDNAME = &1.
LS_FIELDCAT-SCRTEXT_L = &2.
LS_FIELDCAT-TABNAME = &3.
LS_FIELDCAT-DO_SUM = &4.
LS_FIELDCAT-EDIT = &5.
LS_FIELDCAT-NO_ZERO = &6.
* WA_FIELDCAT-DECIMALS_OUT = &7.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
END-OF-DEFINITION.
*---------------------------------------------------------------------*
* 选择屏幕
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLK01 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS : S_WERKS FOR MARD-WERKS NO INTERVALS DEFAULT '2031', "工厂 先默认
S_MATNR FOR MARA-MATNR . "物料编码
* S_CPXH FOR MARA-ZCPXHTY MODIF ID M2, "产品型号
* S_BUDAT FOR MKPF-BUDAT .
SELECTION-SCREEN END OF BLOCK BLK01.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF SCREEN-NAME EQ 'S_WERKS-LOW' OR SCREEN-NAME EQ 'S_WERKS-HIGH'.
SCREEN-INPUT = 0. "0=只读,1=可输入
SCREEN-ACTIVE = 1. "1=可聚焦(仅显示不可输入),0=不可聚焦(灰色)
MODIFY SCREEN.
ENDIF.
ENDLOOP.
START-OF-SELECTION.
PERFORM GET_DATA.
PERFORM ALV_SHOW.
END-OF-SELECTION.
FORM GET_DATA .
SELECT MARD~WERKS,
MARD~MATNR,
MAKT~MAKTX,
CASE MARA~MEINS WHEN 'ST' THEN 'PC' ELSE MARA~MEINS END AS MEINS,
SUM( CASE MARD~LGORT WHEN '5060'THEN MARD~LABST ELSE 0 END ) AS LABST_Y,"假如取MCHB表数据可以合计,这里库位是单条实际可以不合计
SUM( CASE MARD~LGORT WHEN '4010'THEN MARD~LABST ELSE 0 END ) AS LABST_X,
SUM( CASE WHEN MARD~LGORT = '6010' OR MARD~LGORT = '6011' THEN MARD~LABST ELSE 0 END ) AS LABST_DT,
SUM( CASE WHEN MARD~LGORT = '5060' OR MARD~LGORT = '4010' OR MARD~LGORT = '6010' OR MARD~LGORT = '6011' THEN MARD~LABST ELSE 0 END ) AS LABST_H
FROM MARD
INNER JOIN MAKT ON MAKT~MATNR = MARD~MATNR
INNER JOIN MARA ON MARA~MATNR = MARD~MATNR
INTO CORRESPONDING FIELDS OF TABLE @LT_ALV
WHERE MARD~WERKS IN @S_WERKS
AND MARD~MATNR IN @S_MATNR
GROUP BY MARD~WERKS, MARD~MATNR,MAKT~MAKTX,MARA~MEINS.
"这里单位是ST,需要例程转换下--做的好的话应该用例程转换,不要在SQL里硬编码转换
* DATA(lv_ext) = CONVERSION_EXIT_MATN1_OUTPUT( 'ST' ). " 直接返回外码
* " 调用转换函数:内码转外码
* CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
* EXPORTING
* INPUT = LV_MEINS
* IMPORTING
* OUTPUT = LV_EXT.
SORT LT_ALV BY WERKS MATNR.
ENDFORM.
FORM ALV_SHOW .
DATA : LV_HTML_HEADER TYPE SLIS_FORMNAME .
*定义输出模式
CLEAR:GS_LAYOUT,GT_FIELDCAT.
GS_LAYOUT-CWIDTH_OPT = 'X'.
* GS_LAYOUT-ZEBRA = 'X'.
* GS_LAYOUT-BOX_FNAME = 'SEL'.
GV_REPID = SY-REPID.
* PERFORM FRM_SET_FIELDCAT.
ADD_COL 'WERKS' '工厂' 'LT_ALV' SPACE SPACE SPACE.
ADD_COL 'MATNR' '物料编码' 'LT_ALV' SPACE SPACE SPACE.
ADD_COL 'MAKTX' '物料描述' 'LT_ALV' SPACE SPACE SPACE.
ADD_COL 'MEINS' '基本单位' 'LT_ALV' SPACE SPACE SPACE.
ADD_COL 'LABST_Y' '原辅料仓(5060)' 'LT_ALV' SPACE SPACE SPACE.
ADD_COL 'LABST_X' '生产线边库存(4010)' 'LT_ALV' SPACE SPACE SPACE.
ADD_COL 'LABST_DT' '动力化学品、特气仓库存' 'LT_ALV' SPACE SPACE SPACE.
ADD_COL 'LABST_H' '合计可用库存' 'LT_ALV' SPACE SPACE SPACE.
* * ALV显示函数
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = GV_REPID
* I_CALLBACK_TOP_OF_PAGE = 'TOP_OF_PAGE' "注册TOP-OF-PAGE回调
I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND'
I_CALLBACK_PF_STATUS_SET = 'FRM_PF_STATUS'
IS_LAYOUT_LVC = GS_LAYOUT
IT_FIELDCAT_LVC = GT_FIELDCAT
I_SAVE = 'A'
TABLES
T_OUTTAB = LT_ALV
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM.
* 定义回调子程序(处理每页顶部内容)
*FORM TOP_OF_PAGE.
* DATA: LS_HEADER TYPE SLIS_LISTHEADER,
* GT_HEADER TYPE SLIS_T_LISTHEADER,
* LV_LINES TYPE I.
* " 2. 创建表头内容
* " 主标题
* LS_HEADER-TYP = 'H'.
* LS_HEADER-INFO = '太原基地BOM内物料库存情况分析表'.
* APPEND LS_HEADER TO GT_HEADER.
* " 系统信息
* LS_HEADER-TYP = 'A'.
* LS_HEADER-INFO = |生成日期: { SY-DATUM DATE = USER } 时间: { SY-UZEIT TIME = USER }|.
* APPEND LS_HEADER TO GT_HEADER.
*
* " 记录数统计
* DESCRIBE TABLE LT_ALV LINES LV_LINES.
* LS_HEADER-TYP = 'A'.
* LS_HEADER-INFO = |记录总数: { LV_LINES }|.
* APPEND LS_HEADER TO GT_HEADER.
*
* " 3. 调用函数显示表头
* CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
* EXPORTING
* IT_LIST_COMMENTARY = GT_HEADER
* I_LOGO = 'ENJOYSAP_LOGO'. " 可选:添加LOGO -SE78上传
*ENDFORM.
*自定义用户动作
FORM FRM_USER_COMMAND USING P_UCOMM TYPE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD.
DATA : L_UCOMM TYPE SY-UCOMM .
IF G_GRID IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = G_GRID.
ENDIF.
"失去焦点触发更新内表
CALL METHOD G_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
CALL METHOD G_GRID->CHECK_CHANGED_DATA.
RS_SELFIELD-REFRESH = 'X'.
RS_SELFIELD-COL_STABLE = 'X'.
RS_SELFIELD-ROW_STABLE = 'X'.
L_UCOMM = P_UCOMM .
CLEAR P_UCOMM .
DATA : L_UNAME TYPE SY-UNAME,
L_DATUM TYPE SY-DATUM,
L_UZEIT TYPE SY-UZEIT.
CASE L_UCOMM.
WHEN '&IC1'. "双击
READ TABLE LT_ALV INDEX RS_SELFIELD-TABINDEX INTO DATA(WA_SEL_TEMP). "双击行
IF SY-SUBRC = 0 .
* SET PARAMETER ID 'VL' FIELD WA_SEL_TEMP-VBELN .
* CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN ."SKIP FIRST SCREEN 忽略SELECTION SCREEN
PERFORM DISPLAT_ITEM USING WA_SEL_TEMP-WERKS WA_SEL_TEMP-MATNR."改用弹窗显示数据
ENDIF.
CLEAR:WA_SEL_TEMP.
WHEN OTHERS.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& --> P1 TEXT
*& <-- P2 TEXT
*&---------------------------------------------------------------------*
FORM DISPLAT_ITEM USING P_WERKS P_MATNR.
DATA: GO_ALV TYPE REF TO CL_SALV_TABLE,
GO_FUNLST TYPE REF TO CL_SALV_FUNCTIONS_LIST.
DATA:O_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE.
DATA: CXROOT TYPE REF TO CX_ROOT,
EXCMSG TYPE C.
CLEAR:GO_ALV,GO_FUNLST.
SELECT MARD~WERKS,
MARD~LGORT,
MARD~MATNR,
MAKT~MAKTX,
MARA~MEINS,
MARD~LABST
FROM MARD
INNER JOIN MAKT ON MAKT~MATNR = MARD~MATNR
INNER JOIN MARA ON MARA~MATNR = MARD~MATNR
WHERE MARD~WERKS = @P_WERKS
AND MARD~MATNR = @P_MATNR
INTO TABLE @DATA(LT_ITEM) .
IF SY-SUBRC = 0.
TRY.
CL_SALV_TABLE=>FACTORY(
IMPORTING
R_SALV_TABLE = GO_ALV "导出ALV的容器对象
CHANGING
T_TABLE = LT_ITEM[] ). "内容表
CATCH CX_ROOT INTO CXROOT.
EXCMSG = CXROOT->GET_TEXT( ).
MESSAGE E000(OO) WITH EXCMSG.
ENDTRY.
GO_FUNLST = GO_ALV->GET_FUNCTIONS( ).
GO_FUNLST->SET_ALL( 'X' ).
O_COLUMNS = GO_ALV->GET_COLUMNS( ).
O_COLUMNS->SET_OPTIMIZE( ABAP_TRUE ). "自动优化列宽
"重新设置列名称
* GO_ALV->GET_COLUMNS( )->GET_COLUMN( 'MAKTX' )->SET_LONG_TEXT( 'TES删除' )."
IF GO_ALV IS BOUND."设置窗口大小与位置-
GO_ALV->SET_SCREEN_POPUP(
START_COLUMN = 30
END_COLUMN = 160
START_LINE = 5
END_LINE = 20 ).
GO_ALV->DISPLAY( ).
ENDIF.
ENDIF.
ENDFORM.