欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

库存展示查询(含SQL合计,弹窗显示,屏幕禁录,表头等)

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.

 

posted @ 2025-06-05 09:53  萧静默  阅读(32)  评论(0)    收藏  举报