SAP_ABAP_MM_安全库存_设计方案+实现代码(MARD_MBEW )_ALV_行列控制动态编辑

这篇具有很好参考价值的文章主要介绍了SAP_ABAP_MM_安全库存_设计方案+实现代码(MARD_MBEW )_ALV_行列控制动态编辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SAP ABAP 顾问(开发工程师)能力模型-CSDN博客文章浏览阅读959次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料!https://blog.csdn.net/java_zhong1990/article/details/132469977


目标:从工厂、库存地点、物料层面,设置库存的范围,在范围内的库存表示正常,在范围外的库存表示异常.

需要考虑的是如何定义正常的库存范围,

一、背景说明

1.1 实现效果

SAP_ABAP_MM_安全库存_设计方案+实现代码(MARD_MBEW )_ALV_行列控制动态编辑,Abap编程,SAP,ABAP

SAP_ABAP_MM_安全库存_设计方案+实现代码(MARD_MBEW )_ALV_行列控制动态编辑,Abap编程,SAP,ABAP SAP_ABAP_MM_安全库存_设计方案+实现代码(MARD_MBEW )_ALV_行列控制动态编辑,Abap编程,SAP,ABAP

1.2 业务说明

设计步骤:

1 计划员,批量维护物料的安全库存

2 计划主管,可以更改安全库存范围

3 输出安全库存报表

1.3 代码实现
*&---------------------------------------------------------------------*
*& Report ZMM028
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmm031.


INCLUDE zmm031_top.
INCLUDE zmm031_sel.
INCLUDE zmm031_frm.
INCLUDE zmm031_pbo.
INCLUDE zmm031_pai.


SELECTION-SCREEN FUNCTION KEY: 1 .

INITIALIZATION.
  PERFORM init.

AT SELECTION-SCREEN OUTPUT.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_file.
  PERFORM get_excel.

AT SELECTION-SCREEN.

  CASE sscrfields-ucomm .
    WHEN 'FC01'.
      PERFORM download_template USING '批导模版.xlsx' 'ZMM031'.
    WHEN OTHERS.
  ENDCASE.

START-OF-SELECTION.

  IF p_inp = 'X'.

*    SELECT * INTO TABLE @DATA(ls_ztmm031) FROM ztmm031 WHERE ztmm031~c1 = @sy-uname.
*    IF sy-subrc = 0.
*    ELSE.
*      MESSAGE '没有权限,请联系系统管理员!' TYPE 'S' DISPLAY LIKE 'E'.
*      LEAVE TO LIST-PROCESSING.
*      EXIT.
*
*    ENDIF.

    PERFORM get_data_for_excel.
    PERFORM check_data_for_excel.
    PERFORM set_catalog.
    PERFORM display_alv.

  ELSEIF p_sel = 'X'.

    PERFORM get_data_for_ztmm030.
    PERFORM set_catalog1.
    PERFORM display_alv_ztmm030.

  ELSE.

    PERFORM get_data_for_mard.
    PERFORM set_catalog2.
    PERFORM display_alv2.

  ENDIF.
*&---------------------------------------------------------------------*
*& Form get_data_for_mard
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_data_for_mard .

  DATA:lv_lfgja TYPE mard-lfgja.
  DATA:lv_lfmon TYPE mard-lfmon.

  lv_lfgja = sy-datum+0(4).
  lv_lfmon = sy-datum+4(2).

*  lv_lfgja = '2022'.
*  lv_lfmon = '05'.

  SELECT
    mard~lfgja,
    mard~lfmon,
    mard~werks,
    mard~lgort,

    mard~matnr,
    mard~labst,

    t001l~lgobe,

    mara~zwlcms,
    mara~meins,

    mbew~verpr,
    mbew~peinh,

    ztmm030~l1,
    ztmm030~l2,

    ztmm030~createby,
    ztmm030~createdate,
    ztmm030~createtime


    INTO CORRESPONDING FIELDS OF TABLE @gt_data2

    FROM mard

      LEFT JOIN ztmm030 ON ztmm030~werks = mard~werks AND ztmm030~lgort = mard~lgort AND ztmm030~matnr = mard~matnr

      INNER JOIN t001l   ON t001l~werks   = mard~werks AND mard~lgort = t001l~lgort
      INNER JOIN mara    ON mara~matnr    = mard~matnr
      INNER JOIN mbew    ON mbew~matnr    = mard~matnr AND mbew~bwkey    = mard~werks AND mbew~vprsv = 'V'


      WHERE mard~lfgja = @lv_lfgja  AND mard~lfmon = @lv_lfmon
       AND mard~werks IN @so_werks
       AND mard~lgort IN @so_lgort
       AND mard~matnr IN @so_matnr
       AND mard~labst <> '0'

    .

  "verpr
  LOOP AT gt_data2 ASSIGNING FIELD-SYMBOL(<fs1>).

    <fs1>-je = <fs1>-verpr / <fs1>-peinh * <fs1>-labst.

    IF <fs1>-l1 IS NOT INITIAL AND <fs1>-l2 IS NOT INITIAL.

      IF <fs1>-labst < <fs1>-l1 .
        <fs1>-text = '库存过低'.
      ELSEIF  <fs1>-labst > <fs1>-l2.
        <fs1>-text = '超上限'.
      ELSE.
        <fs1>-text = '库存正常'.
      ENDIF.

    ENDIF.

*    <fs1>-labst2 = <fs1>-labst.
    <fs1>-l1_ = <fs1>-l1.
    <fs1>-l2_ = <fs1>-l2.


    IF <fs1>-l1 IS INITIAL AND <fs1>-l2 IS INITIAL.
      <fs1>-f1 = 'X'.

    ELSE.

      SELECT * INTO TABLE @DATA(ls_ztmm031) FROM ztmm031 WHERE ztmm031~c1 = @sy-uname.
      IF sy-subrc = 0.
        <fs1>-f1 = 'X'.
      ELSE.
        "<fs>-message = '无权限修改'.<fs>-status  = 'E'. CONTINUE.
      ENDIF.


    ENDIF.

  ENDLOOP.



  DATA:gwa_edit TYPE lvc_s_styl,
       git_edit TYPE lvc_t_styl.

  LOOP AT gt_data2 INTO gs_data2.

    IF  gs_data2-f1 = 'X'.

      CLEAR: gwa_edit.
      gwa_edit-fieldname = 'L1'.
      gwa_edit-style = cl_gui_alv_grid=>mc_style_enabled."设置为可编辑
      APPEND  gwa_edit TO gs_data2-celtab .

      CLEAR: gwa_edit.
      gwa_edit-fieldname = 'L2'.
      gwa_edit-style = cl_gui_alv_grid=>mc_style_enabled."设置为可编辑
      APPEND  gwa_edit TO gs_data2-celtab .


    ELSE.
      CLEAR: gwa_edit.
      gwa_edit-fieldname = 'L1'.
      gwa_edit-style = cl_gui_alv_grid=>mc_style_disabled."设置为不可编辑
      APPEND  gwa_edit TO gs_data2-celtab .

      CLEAR: gwa_edit.
      gwa_edit-fieldname = 'L2'.
      gwa_edit-style = cl_gui_alv_grid=>mc_style_disabled."设置为不可编辑
      APPEND  gwa_edit TO gs_data2-celtab .

    ENDIF.

    MODIFY gt_data2  FROM  gs_data2 .

  ENDLOOP.



ENDFORM.
*&---------------------------------------------------------------------*
*& 包含               ZMM028_FRM
*&---------------------------------------------------------------------*

FORM get_excel.
  DATA : l_filetab TYPE filetable,
         l_waftab  LIKE LINE OF l_filetab,
         l_rc      TYPE i.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = '打开文件'
      initial_directory       = 'C:/'
    CHANGING
      file_table              = l_filetab
      rc                      = l_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ELSE.
    READ TABLE l_filetab INTO l_waftab INDEX 1.
    pa_file = l_waftab-filename.
    CLEAR: l_filetab,l_waftab.
  ENDIF.

ENDFORM.


FORM init.
  DATA: ls_dyntxt TYPE smp_dyntxt .
  ls_dyntxt-icon_id   = icon_export.
  ls_dyntxt-quickinfo = '模板下载'.
  ls_dyntxt-icon_text = '模板下载'.
  sscrfields-functxt_01 = ls_dyntxt.
ENDFORM.

FORM init_output.

ENDFORM.

FORM get_data_for_excel.
  TYPES: BEGIN OF ly_excel_data,

           werks TYPE ztmm030-werks, "工厂
           lgort TYPE ztmm030-lgort, "存储地点
           matnr TYPE ztmm030-matnr, "物料编号

           l1    TYPE ztmm030-l1,    "库存下限(未来)
           l2    TYPE ztmm030-l2,    "库存上限(未来)
*           createby   TYPE ztmm030-createby,  "最近更新人
*           createdate TYPE ztmm030-createdate, "最近更新日期
*           createtime TYPE ztmm030-createtime, "最近更新时间
         END OF ly_excel_data.
  DATA: lt_excel      TYPE TABLE OF alsmex_tabline WITH HEADER LINE,
        ls_excel_data TYPE ly_excel_data,
        l_index       LIKE sy-tabix.
  DATA: lv_lines TYPE i.

  FIELD-SYMBOLS: <fs>.
  IF pa_file IS NOT INITIAL.
    CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
      EXPORTING
        filename                = pa_file
        i_begin_col             = '1'
        i_begin_row             = '2'
        i_end_col               = '10'
        i_end_row               = '50000'
      TABLES
        intern                  = lt_excel
      EXCEPTIONS
        inconsistent_parameters = 1
        upload_ole              = 2
        OTHERS                  = 3.
    IF sy-subrc = 0.
*&& 将EXCEL格式中的数据导入到内表TAB_LOAD中
      LOOP AT lt_excel.

        ASSIGN COMPONENT lt_excel-col OF STRUCTURE ls_excel_data TO <fs>.
        <fs> = lt_excel-value.
        AT END OF row.

          MOVE-CORRESPONDING ls_excel_data TO gs_data."跟Excel的列一一对应的内表


          APPEND gs_data TO gt_data.
          CLEAR: ls_excel_data,gs_data.
        ENDAT.

      ENDLOOP.

      lv_lines = lines( gt_data ).

      IF lv_lines > 8000.
        MESSAGE  '本次导入数据超过5000,请拆分数据文件!' TYPE 'S'DISPLAY LIKE 'E'.
        STOP.
      ENDIF.
    ENDIF.

  ELSE.
    MESSAGE  '请输入文件路径!' TYPE 'S'DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

ENDFORM.



FORM check_data_for_excel.


  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs>).

    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input  = <fs>-matnr
      IMPORTING
        output = <fs>-matnr
*     EXCEPTIONS
*       LENGTH_ERROR       = 1
*       OTHERS = 2
      .
    IF sy-subrc <> 0.
    ENDIF.


    SELECT SINGLE matnr INTO @DATA(ls1) FROM mara WHERE mara~matnr = @<fs>-matnr.
    IF sy-subrc = 0.
    ELSE.
      <fs>-message = '物料号不存在'.
      <fs>-status  = 'E'.
      CONTINUE.
    ENDIF.

    SELECT SINGLE t001l~werks INTO @DATA(ls2) FROM t001l WHERE t001l~werks = @<fs>-werks.
    IF sy-subrc = 0.
    ELSE.
      <fs>-message = '工厂不存在'.<fs>-status  = 'E'.
      CONTINUE.
    ENDIF.

    SELECT SINGLE t001l~werks INTO @DATA(ls3) FROM t001l WHERE t001l~lgort = @<fs>-lgort.
    IF sy-subrc = 0.
    ELSE.
      <fs>-message = '库位不存在'.<fs>-status  = 'E'.
      CONTINUE.
    ENDIF.

    SELECT SINGLE * INTO  @DATA(ls_ztmm030)
      FROM ztmm030 WHERE ztmm030~werks = @<fs>-werks  AND ztmm030~lgort = @<fs>-lgort  AND ztmm030~matnr = @<fs>-matnr.

    IF sy-subrc = 0.

      <fs>-l1_old = ls_ztmm030-l1.
      <fs>-l2_old = ls_ztmm030-l2.

      <fs>-createby   = ls_ztmm030-createby.
      <fs>-createdate = ls_ztmm030-createdate.
      <fs>-createtime = ls_ztmm030-createtime.

      SELECT * INTO TABLE @DATA(ls_ztmm031) FROM ztmm031 WHERE ztmm031~c1 = @sy-uname.
      IF sy-subrc = 0.
      ELSE.
        <fs>-message = '无权限修改'.<fs>-status  = 'E'. CONTINUE.
      ENDIF.

    ELSE.

      <fs>-createby   = sy-uname.
      <fs>-createdate = sy-datum.
      <fs>-createtime = sy-uzeit.

    ENDIF.



  ENDLOOP.





ENDFORM.


FORM download_template USING pu_filename pu_objid.
*& 下载模版
  DATA: ls_objdata LIKE wwwdatatab.
  DATA: lv_filename TYPE string,
        lv_fullpath TYPE string  VALUE 'C:\',
        lv_path     TYPE  string VALUE 'C:\'.
  DATA: lv_errtxt TYPE string.
  DATA: lv_destination LIKE rlgrap-filename.
  DATA: lv_rc LIKE sy-subrc.

  DATA: lv_fileup LIKE rlgrap-filename.

  lv_filename = pu_filename .
*& 调用保存对话框
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      default_extension    = 'xlsx'
      default_file_name    = lv_filename
      initial_directory    = 'C:\'
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = lv_fullpath
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc NE 0.
    MESSAGE '不能打开EXCEL' TYPE 'E'.
  ENDIF.
  CHECK lv_fullpath IS NOT INITIAL .
  lv_fileup = lv_fullpath.
  ls_objdata-relid = 'MI' .
  ls_objdata-objid = pu_objid .

  lv_destination = lv_fullpath .
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = ls_objdata
      destination = lv_destination
    IMPORTING
      rc          = lv_rc.
  IF lv_rc NE 0.
    CONCATENATE '模板文件:' ls_objdata-objid '下载失败' INTO lv_errtxt.
    MESSAGE lv_errtxt TYPE 'E'.
  ELSE.
    MESSAGE '模版下载成功' TYPE 'S'.
  ENDIF.

ENDFORM.                    " DOWNLOAD_TEMPLATE



FORM set_catalog.
  DATA:lv_position TYPE i VALUE 1.
  CLEAR: lv_position.
  lv_position = lv_position + 1.
* 预定义一个输出模式
  DEFINE df_fieldcat.
    CLEAR gs_fieldcat_lvc.
    gs_fieldcat_lvc-col_pos     = lv_position."ALV 控制: 输出列
    gs_fieldcat_lvc-scrtext_m   = &1."中字段标签
    gs_fieldcat_lvc-fieldname   = &2."ALV 控制: 内部表字段的字段名称
    gs_fieldcat_lvc-no_zero     = &3."ALV 控制: 为输出隐藏零
    gs_fieldcat_lvc-checkbox    = &4."ALV 控制: 作为复选框输出
    gs_fieldcat_lvc-edit        = &5."设置可编辑模式
    gs_fieldcat_lvc-outputlen   = &6."输出长度
    gs_fieldcat_lvc-ref_table   = &7.
    gs_fieldcat_lvc-ref_field   = &8.
    gs_fieldcat_lvc-datatype    = &9.
    APPEND gs_fieldcat_lvc TO gt_fieldcat_lvc.

    ADD 1 TO lv_position.
  END-OF-DEFINITION.
  df_fieldcat:

'状态' 'STATUS' 'X' '' '' '' '' '' '',
'消息' 'MESSAGE' 'X' '' '' '' '' '' '',
'工厂' 'WERKS' 'X' '' '' '' '' '' '',
'存储地点' 'LGORT' 'X' '' '' '' '' '' '',
'物料编号' 'MATNR' 'X' '' '' '' '' '' '',
'库存下限(当前)' 'L1_OLD' 'X' '' '' '' '' '' '',
'库存上限(当前)' 'L2_OLD' 'X' '' '' '' '' '' '',
'最近更新人' 'CREATEBY' 'X' '' '' '' '' '' '',
'最近更新日期' 'CREATEDATE' 'X' '' '' '' '' '' '',
'最近更新时间' 'CREATETIME' 'X' '' '' '' '' '' '',
'库存下限(未来)' 'L1' 'X' '' '' '' '' '' '',
'库存上限(未来)' 'L2' 'X' '' '' '' '' '' ''
.

ENDFORM.



FORM set_catalog1.
  DATA:lv_position TYPE i VALUE 1.
  CLEAR: lv_position.
  lv_position = lv_position + 1.
* 预定义一个输出模式
  DEFINE df_fieldcat.
    CLEAR gs_fieldcat_lvc.
    gs_fieldcat_lvc-col_pos     = lv_position."ALV 控制: 输出列
    gs_fieldcat_lvc-scrtext_m   = &1."中字段标签
    gs_fieldcat_lvc-fieldname   = &2."ALV 控制: 内部表字段的字段名称
    gs_fieldcat_lvc-no_zero     = &3."ALV 控制: 为输出隐藏零
    gs_fieldcat_lvc-checkbox    = &4."ALV 控制: 作为复选框输出
    gs_fieldcat_lvc-edit        = &5."设置可编辑模式
    gs_fieldcat_lvc-outputlen   = &6."输出长度
    gs_fieldcat_lvc-ref_table   = &7.
    gs_fieldcat_lvc-ref_field   = &8.
    gs_fieldcat_lvc-datatype    = &9.
    APPEND gs_fieldcat_lvc TO gt_fieldcat_lvc.

    ADD 1 TO lv_position.
  END-OF-DEFINITION.
  df_fieldcat:

    '工厂' 'WERKS' 'X' '' '' '' '' '' '',
    '存储地点' 'LGORT' 'X' '' '' '' '' '' '',
    '物料编号' 'MATNR' 'X' '' '' '' '' '' '',
    '库存下限' 'L1' 'X' '' '' '' '' '' '',
    '库存上限' 'L2' 'X' '' '' '' '' '' '',
    '最近更新人' 'CREATEBY' 'X' '' '' '' '' '' '',
    '最近更新日期' 'CREATEDATE' 'X' '' '' '' '' '' '',
    '最近更新时间' 'CREATETIME' 'X' '' '' '' '' '' ''
    .


ENDFORM.

FORM set_catalog2.
  DATA:lv_position TYPE i VALUE 1.
  CLEAR: lv_position.
  lv_position = lv_position + 1.
* 预定义一个输出模式
  DEFINE df_fieldcat.
    CLEAR gs_fieldcat_lvc.
    gs_fieldcat_lvc-col_pos     = lv_position."ALV 控制: 输出列
    gs_fieldcat_lvc-scrtext_m   = &1."中字段标签
    gs_fieldcat_lvc-fieldname   = &2."ALV 控制: 内部表字段的字段名称
    gs_fieldcat_lvc-no_zero     = &3."ALV 控制: 为输出隐藏零
    gs_fieldcat_lvc-checkbox    = &4."ALV 控制: 作为复选框输出

    gs_fieldcat_lvc-edit        = &5."设置可编辑模式

    gs_fieldcat_lvc-outputlen   = &6."输出长度
    gs_fieldcat_lvc-ref_table   = &7.
    gs_fieldcat_lvc-ref_field   = &8.
    gs_fieldcat_lvc-datatype    = &9.
    APPEND gs_fieldcat_lvc TO gt_fieldcat_lvc.

    ADD 1 TO lv_position.
  END-OF-DEFINITION.
  df_fieldcat:

'年度' 'LFGJA' 'X' '' '' '' '' '' '',
'月份' 'LFMON' 'X' '' '' '' '' '' '',
'工厂' 'WERKS' 'X' '' '' '' '' '' '',
'库存地点' 'LGORT' 'X' '' '' '' '' '' '',
'仓储地点描述' 'LGOBE' 'X' '' '' '' '' '' '',
'物料' 'MATNR' 'X' '' '' '' '' '' '',
'物料描述' 'ZWLCMS' 'X' '' '' '' '' '' '',
'单位' 'MEINS' 'X' '' '' '' '' '' '',
'库存数量' 'LABST' 'X' '' '' '' '' '' '',
'库存下限' 'L1' 'X' '' 'X' '' '' '' '',
'库存上限' 'L2' 'X' '' 'X' '' '' '' '',
'金额' 'JE' 'X' '' '' '' '' '' '',
'库存状态' 'TEXT' 'X' '' '' '' '' '' '',
'最近更新人' 'CREATEBY' 'X' '' '' '' '' '' '',
'最近更新日期' 'CREATEDATE' 'X' '' '' '' '' '' '',
'最近更新时间' 'CREATETIME' 'X' '' '' '' '' '' ''
    .


ENDFORM.


FORM display_alv_ztmm030.
  DATA: ls_layout TYPE lvc_s_layo.
  IF gt_data IS NOT INITIAL.
    ls_layout-zebra      = 'X'.
    ls_layout-cwidth_opt = 'X'.
* 调用ALV function
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        i_callback_program       = sy-repid "这里是调用这个ALV的程序名
        i_callback_pf_status_set = 'PF_STATUS' "设置ALV状态栏的函数
        i_callback_user_command  = 'USER_COMMAND' "获取用户事件的函数
        is_layout_lvc            = ls_layout "显示的布局
        it_fieldcat_lvc          = gt_fieldcat_lvc "设置显示的字段以及字段的功能
        i_save                   = 'A'
      TABLES
        t_outtab                 = gt_data
      EXCEPTIONS
        program_error            = 1.
    IF sy-subrc <> 0.
      MESSAGE '报表生成异常,请联系系统管理员!' TYPE 'S' DISPLAY LIKE 'E'.
    ENDIF.
  ELSE.
* 这个消息用来显示我们是不是获取到了数据,自己用的时候把这个硬代码换成你需要的TEXT-XXX.
    MESSAGE '没有获取到数据,请重新检索!' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE TO LIST-PROCESSING.
    EXIT.
  ENDIF.
ENDFORM.


FORM display_alv.
  DATA: ls_layout TYPE lvc_s_layo.
  IF gt_data IS NOT INITIAL.
    ls_layout-zebra      = 'X'.
    ls_layout-cwidth_opt = 'X'.
* 调用ALV function
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        i_callback_program       = sy-repid "这里是调用这个ALV的程序名
        i_callback_pf_status_set = 'PF_STATUS' "设置ALV状态栏的函数
        i_callback_user_command  = 'USER_COMMAND' "获取用户事件的函数
        is_layout_lvc            = ls_layout "显示的布局
        it_fieldcat_lvc          = gt_fieldcat_lvc "设置显示的字段以及字段的功能
        i_save                   = 'A'
      TABLES
        t_outtab                 = gt_data
      EXCEPTIONS
        program_error            = 1.
    IF sy-subrc <> 0.
      MESSAGE '报表生成异常,请联系系统管理员!' TYPE 'S' DISPLAY LIKE 'E'.
    ENDIF.
  ELSE.
* 这个消息用来显示我们是不是获取到了数据,自己用的时候把这个硬代码换成你需要的TEXT-XXX.
    MESSAGE '没有获取到数据,请重新检索!' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE TO LIST-PROCESSING.
    EXIT.
  ENDIF.
ENDFORM.

FORM display_alv2.
  DATA: ls_layout TYPE lvc_s_layo.
  IF gt_data2 IS NOT INITIAL.
    ls_layout-zebra      = 'X'.
    ls_layout-cwidth_opt = 'X'.

   ls_layout-stylefname   = 'CELTAB'.
* 调用ALV function
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        i_callback_program       = sy-repid "这里是调用这个ALV的程序名
        i_callback_pf_status_set = 'PF_STATUS' "设置ALV状态栏的函数
        i_callback_user_command  = 'USER_COMMAND' "获取用户事件的函数
        is_layout_lvc            = ls_layout "显示的布局
        it_fieldcat_lvc          = gt_fieldcat_lvc "设置显示的字段以及字段的功能
        i_save                   = 'A'
      TABLES
        t_outtab                 = gt_data2
      EXCEPTIONS
        program_error            = 1.
    IF sy-subrc <> 0.
      MESSAGE '报表生成异常,请联系系统管理员!' TYPE 'S' DISPLAY LIKE 'E'.
    ENDIF.
  ELSE.
* 这个消息用来显示我们是不是获取到了数据,自己用的时候把这个硬代码换成你需要的TEXT-XXX.
    MESSAGE '没有获取到数据,请重新检索!' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE TO LIST-PROCESSING.
    EXIT.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_data_for_ztmm030
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_data_for_ztmm030 .

  SELECT * INTO CORRESPONDING FIELDS OF TABLE @gt_data FROM ztmm030
    WHERE ztmm030~matnr IN @so_matnr
      AND ztmm030~werks IN @so_werks
      AND ztmm030~lgort IN @so_lgort
    .

ENDFORM.
*&---------------------------------------------------------------------*
*& 包含               ZMM028_PAI
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&  包含                ZFI068_PAI
*&---------------------------------------------------------------------*

FORM user_command USING i_ucomm TYPE sy-ucomm
                            i_wa_selfield TYPE slis_selfield.
  DATA:gwa_edit TYPE lvc_s_styl,
       git_edit TYPE lvc_t_styl.

  DATA lv_length TYPE num10.
  DATA lr_grid TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lr_grid.
  CALL METHOD lr_grid->check_changed_data.
  CALL METHOD lr_grid->refresh_table_display.
  i_wa_selfield-refresh = 'X'.

  CASE i_ucomm.

    WHEN  'ZSAVE'.

      DATA(lt_check) = gt_data.

      DELETE lt_check WHERE status <> 'E'.

      IF lines( lt_check ) <> 0.
        MESSAGE '检查未通过' TYPE 'E'.
      ENDIF.

*      "权限检查
*      DATA:lv_auth TYPE char.
*      lv_auth = ''.

*      SELECT * INTO TABLE @DATA(ls_ztmm031) FROM ztmm031 WHERE ztmm031~c1 = @sy-uname.
*      IF sy-subrc = 0.
*        lv_auth = 'X'.
*      ELSE.

**        MESSAGE '没有权限,请联系系统管理员!' TYPE 'S' DISPLAY LIKE 'E'.
**        LEAVE TO LIST-PROCESSING.
**        EXIT.
*      ENDIF.
*
*      IF lv_auth  = 'X'.

      DATA:lt_ TYPE TABLE OF ztmm030.
      MOVE-CORRESPONDING gt_data TO lt_.

      MODIFY ztmm030 FROM TABLE lt_.

      MESSAGE '保存成功' TYPE 'S'.

*      ENDIF.

    WHEN  'ZSAVE1'.

      DATA:lt_ztmm030 TYPE TABLE OF ztmm030.
      DATA:ls_ztmm030 TYPE  ztmm030.

      LOOP AT gt_data2 INTO gs_data2.

        IF gs_data2-l1 = gs_data2-l1_ AND gs_data2-l2 = gs_data2-l2_.
        ELSE.

          MOVE-CORRESPONDING gs_data2 TO ls_ztmm030.

          ls_ztmm030-createby   = sy-uname.
          ls_ztmm030-createdate = sy-datum.
          ls_ztmm030-createtime = sy-uzeit.

          APPEND ls_ztmm030           TO lt_ztmm030.

        ENDIF.

      ENDLOOP.

      IF lt_ztmm030 IS NOT INITIAL.

        MODIFY ztmm030 FROM TABLE lt_ztmm030.
        MESSAGE '保存成功' TYPE 'S'.

      ENDIF.




    WHEN  'ZSAVE2'.



    WHEN 'ZSAL'.

    WHEN 'ZALL'.

    WHEN OTHERS.

  ENDCASE.

ENDFORM.
*&---------------------------------------------------------------------*
*& 包含               ZMM028_PBO
*&---------------------------------------------------------------------*


FORM pf_status USING lt_extab TYPE slis_t_extab.

  REFRESH:lt_extab[]. CLEAR:lt_extab.

  IF p_inp = 'X'.

    SET TITLEBAR 'ZSTATUS_TITLE'.
    "说明:需要显示的按钮进行注释
*    APPEND 'ZSAVE'  TO lt_extab.
     APPEND 'ZSAVE1'  TO lt_extab.
    SET PF-STATUS 'ZSTATUS_001' EXCLUDING lt_extab.

  ELSEIF p_sel = 'X'.

    SET TITLEBAR 'ZSTATUS_TITLE'.
    "说明:需要显示的按钮进行注释
    APPEND 'ZSAVE'  TO lt_extab.
    APPEND 'ZSAVE1'  TO lt_extab.
    SET PF-STATUS 'ZSTATUS_001' EXCLUDING lt_extab.



  ELSE.

    SET TITLEBAR 'ZSTATUS_TITLE'.
    "说明:需要显示的按钮进行注释
    APPEND 'ZSAVE'  TO lt_extab.
    SET PF-STATUS 'ZSTATUS_001' EXCLUDING lt_extab.

  ENDIF.



ENDFORM.
*&---------------------------------------------------------------------*
*& 包含               ZMM028_SEL
*&---------------------------------------------------------------------*

TABLES:lips,ztmm030,mard.

SELECTION-SCREEN:BEGIN OF BLOCK b0 WITH FRAME TITLE TEXT-001.

  PARAMETERS:p_inp RADIOBUTTON GROUP g1 USER-COMMAND u1 DEFAULT 'X'.
  PARAMETERS:p_sel RADIOBUTTON GROUP g1 .

  PARAMETERS:p_sel2 RADIOBUTTON GROUP g1 .

  PARAMETERS: pa_file TYPE rlgrap-filename ."文件夹上传


  SELECTION-SCREEN SKIP 1.

*
*  SELECT-OPTIONS: so_lfgja FOR mard-lfgja.
*  SELECT-OPTIONS: so_lfmon FOR mard-lfmon.


  SELECT-OPTIONS: so_werks FOR ztmm030-werks.
  SELECT-OPTIONS: so_lgort FOR ztmm030-lgort.
  SELECT-OPTIONS: so_matnr FOR ztmm030-matnr.


SELECTION-SCREEN:END OF BLOCK b0.
*&---------------------------------------------------------------------*
*& 包含               ZMM028_TOP
*&---------------------------------------------------------------------*


*&---------------------------------------------------------------------*
*&  包含                ZFI068_TOP
*&---------------------------------------------------------------------*
TABLES: sscrfields,vbak,bsis.
TYPE-POOLS: esp1,slis ,icon.

TYPES: BEGIN OF gy_data,

*         checked    TYPE char1,       "勾选框
*         status_inc TYPE char10,      "状态灯
         status     TYPE char2,       "状态
         message    TYPE char255,     "消息文本
         zindex     TYPE i,            "序号

         werks      TYPE ztmm030-werks, "工厂
         lgort      TYPE ztmm030-lgort, "存储地点
         matnr      TYPE ztmm030-matnr, "物料编号
         l1_old     TYPE ztmm030-l1,   "库存下限(当前)
         l2_old     TYPE ztmm030-l2,   "库存上限(当前)
         createby   TYPE ztmm030-createby,  "最后更新人
         createdate TYPE ztmm030-createdate, "最后更新日期
         createtime TYPE ztmm030-createtime, "最后更新时间
         l1         TYPE ztmm030-l1,    "库存下限(未来)
         l2         TYPE ztmm030-l2,    "库存上限(未来)

       END OF gy_data.

DATA: gs_data TYPE gy_data,
      gt_data TYPE TABLE OF gy_data.
FIELD-SYMBOLS: <fs_data>  TYPE gy_data.


TYPES: BEGIN OF gy_data2,

         lfgja      TYPE   mard-lfgja,  "年度
         lfmon      TYPE   mard-lfmon,  "月份
         werks      TYPE   mard-werks,  "工厂
         lgort      TYPE   mard-lgort,  "库存地点
         lgobe      TYPE   t001l-lgobe, "仓储地点描述
         matnr      TYPE   mard-matnr,  "物料
         zwlcms     TYPE   mara-zwlcms, "物料描述
         meins      TYPE   mara-meins,  "单位
         labst      TYPE   mard-labst,  "库存数量

         l1         TYPE ztmm030-l1,    "库存下限
         l2         TYPE ztmm030-l2,    "库存上限

         "je         TYPE  mbew-verpr,   "金额
         je         TYPE  acdoca-tsl,   "金额

         text       TYPE char10,        "库存状态

         verpr      TYPE mbew-verpr,
         peinh      TYPE mbew-peinh,
*         sobkz  TYPE   mspr-sobkz,  "特殊库存
*         pspnr  TYPE   mspr-pspnr,  "特殊库存编号
*         prlab  TYPE   mspr-prlab,  "库存数量

         createby   TYPE ztmm030-createby,   "最后更新人
         createdate TYPE ztmm030-createdate, "最后更新日期
         createtime TYPE ztmm030-createtime, "最后更新时间


         f1         TYPE char1,

         l1_        TYPE ztmm030-l1,    "库存下限
         l2_        TYPE ztmm030-l2,    "库存上限

         celtab     TYPE  lvc_t_styl,  "控制字段可编辑的参数

       END OF gy_data2.

DATA: gs_data2 TYPE gy_data2,
      gt_data2 TYPE TABLE OF gy_data2.
FIELD-SYMBOLS: <fs_data2>  TYPE gy_data2.


DATA: gt_fieldcat_lvc TYPE lvc_t_fcat, "ALV:定义一个先显示字段的表
      gs_fieldcat_lvc LIKE LINE OF gt_fieldcat_lvc. "ALV

二、设计逻辑

表名-字段名

字段描述

说明

MARD-LFGJA

MARD-LFMON

备注:

1.以当前年月为查询条件

MARD-LFGJA    = 当前年

MARD-LFMON  = 当前月份

2.通用库存MARD,库存数量不为0的数据

3.只查询V价物料

MBEW-MATNR =MSPR/MARD-MATNR

MBEW-BWKEY=MSPR/MARD-WERKS

MBEW-VPRSV=V的数据

MARD-WERKS

工厂

MARD-LGORT

仓库

T001L-LGOBE

仓储地点描述

MARD-WERKS=T001L-WERKS

MARD-LGORT=T001L-LGORT

取T001L-LGOBE

MARD-MATNR

物料编码

MARA-ZWLCMS

物料长描述

MARD-MATNR=MARA-MATNR

取MARA-ZWLCMS

MSPR-SOBKZ

特殊库存

MSPR-PSPNR

特殊库存编号

MARA-MEINS

单位

MSPR-PRLAB

MARD-LABST

库存数量

MSPR-PRLAB≠0

MARD-LABST≠0

用户输入

库存下限

  1. 用户可批导
  2. 用户编辑修改  只能编辑修改一次   可参考ZMM018变更计划交期字段 

用户输入

库存上限

  1. 用户可批导
  2. 用户编辑修改  只能编辑修改一次   可参考ZMM018变更计划交期字段 

库存金额

MBEW-MATNR =MARD-MATNR

MBEW-BWKEY=MARD-WERKS

取到MBEW-VERPR ÷MBEW-PEINH的单价

再用单价*所对应的库存数量

文本显示

库存状态

状态有四种(超上限、库存过低、库存正常、空)

当前库存数量与库存上下限对比,无上下限对比则为空

高于上限值=“超上限”

介于上下限值中间=“库存正常”

低于下限值=“库存过低”文章来源地址https://www.toymoban.com/news/detail-854479.html

到了这里,关于SAP_ABAP_MM_安全库存_设计方案+实现代码(MARD_MBEW )_ALV_行列控制动态编辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SAP动态安全库存简介

    动态安全库存:跑需求计划时,ERP系统按设置的库存方式自动计算出满足一定时间内可保障生产的库存数量 SAP动态安全库存的计算公式:动态安全库存=平均日需求*覆盖范围。 平均日需求=特定时期内的总需求/特定时期内的工作天数 覆盖范围指在没又货物供应的情况下,库存

    2024年02月12日
    浏览(30)
  • SAP 从入门到放弃系列之安全库存

    安全库存的主要目的是以一定数量的库存或时间的作为缓冲区间,以应对供需之间波动的影响。SAP ERP 系统提供两种类型的安全库存:静态安全库存和动态安全库存(即安全天数供应)。 物料主数据设置,MRP2视图,安全库存字段根据基于服务水平历史记录或之前的消耗情况

    2024年02月07日
    浏览(24)
  • ABAP 期初库存批量导入 demo1

    --------------------------------------------------------------------- * Report ZMMCP005 --------------------------------------------------------------------- 作者: Liv 完成日期: 描述: 期初库存导入 需求简要说明: --------------------------------------------------------------------- 版本号 日期 作者 修改描述 功能更改说明

    2024年02月12日
    浏览(24)
  • 库存预占架构升级方案设计-交易库存中心

    伴随物流行业的迅猛发展,一体化供应链模式的落地,对系统吞吐、系统稳定发出巨大挑战,库存作为供应链的重中之重表现更为明显。近三年数据可以看出: 接入商家同比增长37.64%、货品种类同比增长53.66% 货品数量同比增长46.43%、仓库数量同比增长18.87% 通过分析过往大促

    2024年02月11日
    浏览(34)
  • SAP/ABAP(二)

    一、循环结构 二、条件判断 三、异常处理(cx-root) 四、结构体,工作区 五、内表

    2024年02月17日
    浏览(31)
  • 【SAP ABAP】SAP Webservice & RESTful 接口服务发布教程

    关于 WebService 概念,这篇文章讲解的非常全面,可以移步阅读《SAP Web service》。 本想通过 RFC 来发布 ODATA 服务,奈何当前 SAP ECC 版本过低不支持,只好采用其他方式来发布服务,于是就尝试了下面这两种方法。 SE37,创建以下测试用 RFC 测试执行 RFC,得到的数据结果如下图:

    2024年02月02日
    浏览(35)
  • SAP ABAP技术文章合集_微信公众号:ABAP猿

    序号 文章标题 01 ABAP OOALV-基本显示 02 ABAP OOALV-排序、过滤 03 ABAP OOALV-合计、小计 04 ABAP OOALV-选择模式、触发事件 05 ABAP OOALV-隐藏列、修改列标题、添加图标列、调整列位置 06 ABAP OOALV-固定列、鼠标悬停文本 07 ABAP OOALV-颜色(列、行、单元格) 08 ABAP OOALV-样式(列、行、单元格

    2024年02月03日
    浏览(38)
  • 库存预占架构升级方案设计-交易库存中心 | 京东物流技术团队

    伴随物流行业的迅猛发展,一体化供应链模式的落地,对系统吞吐、系统稳定发出巨大挑战,库存作为供应链的重中之重表现更为明显。近三年数据可以看出: 接入商家同比增长37.64%、货品种类同比增长53.66% 货品数量同比增长46.43%、仓库数量同比增长18.87% 通过分析过往大促

    2024年02月11日
    浏览(29)
  • SAP ABAP 基础语法超详细

    1.表声明 当你声明了一个数据表的同时,系统也同时自动生成了一个和数据表同名的结构,结构的变量集等于数据表里面的字段。 2.定义变量 v1 是变量名。 (l) 是变量的长度。 t 是数据类型。 d 是小数位。 ‘xxx’ 是缺省值。 如:data num(10) type p decimals 3 value ‘1.12’. 数据

    2024年02月15日
    浏览(45)
  • SAP ABAP 用户状态锁定案例

    一、前言 项目需求是根据当天及前两天的离职员工信息(假设这是一个定时器任务每天下午5点执行程序,计算前两天的员工工号是为了将5点之后办理离职的员工工号找出来),将这些员工在用户表 USR02 中的锁定状态设置为 “64”,以保证离职员工无法继续使用系统账号。

    2024年02月15日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包