OO ALV实现

该代码实现了一个SAP库存解冻的程序,通过ALV网格展示库存数据,并允许用户进行操作。用户可以筛选特定工厂、物料凭证、过账日期等信息,查看解冻库存详情。程序还包含了数据处理、ALV表格的创建、事件处理、单元格样式设置等功能,并提供了插入、解冻库存等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

REPORT zmmd0063.

INCLUDE zmmd0063_top.
INCLUDE zmmd0063_c01.
INCLUDE zmmd0063_f01.
INCLUDE zmmd0063_i01.
INCLUDE zmmd0063_o01.

*&---------------------------------------------------------------------*
*& 包含               ZMMR0063_TOP
*&---------------------------------------------------------------------*
TABLES:ztmm0063_2.

*-----------------------------------------------------------------------
* ALV DECLARATIONS
*-----------------------------------------------------------------------
CLASS lcl_alv_grid DEFINITION DEFERRED.
CLASS lcl_alv_event_handler DEFINITION DEFERRED.
DATA: gv_event_handler     TYPE REF TO lcl_alv_event_handler,
      gv_docking_container TYPE REF TO cl_gui_docking_container,
      gv_grid              TYPE REF TO lcl_alv_grid,
      gs_alv_variant       LIKE disvariant,
      gt_exclude           TYPE ui_functions,
      gt_fieldcat          TYPE lvc_t_fcat,
      gs_fieldcat          TYPE lvc_s_fcat,
      gs_layout            TYPE lvc_s_layo,
      gs_sort              TYPE lvc_s_sort,
      gt_sort              TYPE lvc_t_sort,
      ok_code              TYPE sy-ucomm,
      save_ok              TYPE sy-ucomm.
DATA: gt_cellstyle TYPE lvc_t_styl,
      gs_cellstyle TYPE lvc_s_styl.


TYPES:BEGIN OF gty_output,
        mblnr101  TYPE ztmm0063_2-mblnr101, "物料凭证
        zeile101  TYPE ztmm0063_2-zeile101, "物料凭证项目
        matnr     TYPE ztmm0063_2-matnr,    "物料编码
        werks101  TYPE ztmm0063_2-werks101, "工厂
        lgort101  TYPE ztmm0063_2-lgort101, "库存地点
        lifnr     TYPE ztmm0063_2-lifnr,    "供应商
        menge101  TYPE ztmm0063_2-menge101, "数量
        meins     TYPE ztmm0063_2-meins,    "计量单位
        ebeln     TYPE ztmm0063_2-ebeln,    "采购订单
        ebelp     TYPE ztmm0063_2-ebelp,    "采购订单项目
        budat101  TYPE ztmm0063_2-budat101, "过账日期
        cpudt101  TYPE ztmm0063_2-cpudt101, "录入日期
        cputm101  TYPE ztmm0063_2-cputm101, "录入时间
        usnam101  TYPE ztmm0063_2-usnam101, "操作人
        werks343  TYPE ztmm0063_2-werks343, "工厂
        lgort343  TYPE ztmm0063_2-lgort343, "库存地点
        menge343  TYPE ztmm0063_2-menge343, "解冻数量
        budat343  TYPE ztmm0063_2-budat343, "解冻过账日期
        ablad     TYPE ztmm0063_2-ablad,    "解冻物流单
        insmk     TYPE ztmm0063_2-insmk,    "库存类型
        elikz     TYPE ztmm0063_2-elikz,    "交货已完成标识
        menge     TYPE ztmm0063_2-menge101,
        cellstyle TYPE lvc_t_styl,        "单元格样式
      END OF gty_output.

DATA:gt_output TYPE STANDARD TABLE OF gty_output,
     gs_output TYPE gty_output.

TYPES:BEGIN OF gty_menge,
        mblnr101 TYPE ztmm0063_2-mblnr101,    "物料凭证
        zeile101 TYPE ztmm0063_2-zeile101,    "物料凭证项目
        menge343 TYPE ztmm0063_2-menge343, "解冻数量
      END OF gty_menge.

DATA:gt_menge TYPE STANDARD TABLE OF gty_menge,
     gs_menge TYPE gty_menge.


*定义选择屏幕
SELECTION-SCREEN:BEGIN OF BLOCK a1 WITH FRAME TITLE TEXT-001.
  PARAMETERS:p_werks TYPE ztmm0063_2-werks101 OBLIGATORY.
  SELECT-OPTIONS:s_matnr FOR ztmm0063_2-matnr,
                 s_ebeln FOR ztmm0063_2-ebeln,
                 s_ebelp FOR ztmm0063_2-ebelp.
  PARAMETERS:p_mblnr TYPE ztmm0063_2-mblnr101.
  SELECT-OPTIONS:s_budat FOR ztmm0063_2-budat101,
                 s_cpudt FOR ztmm0063_2-cpudt101.
  PARAMETERS:p_usnam TYPE ztmm0063_2-usnam101.
SELECTION-SCREEN:END OF BLOCK a1.

START-OF-SELECTION.
  PERFORM frm_process_data.

END-OF-SELECTION.
  IF gt_output[] IS INITIAL.
    MESSAGE s001(zmm0001) DISPLAY LIKE 'E' WITH TEXT-e01.
    "没有冷冻的库存
  ELSE.
    CALL SCREEN 9000.
  ENDIF.
*&---------------------------------------------------------------------*
*& 包含               ZMMR0063_C01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* LOCAL CLASSES: Definition
*&---------------------------------------------------------------------*
CLASS lcl_alv_grid DEFINITION INHERITING FROM cl_gui_alv_grid.
  PUBLIC SECTION.
    METHODS: set_optimize_all_cols.
ENDCLASS. "LCL_ALV_GRID DEFINITION
*---------------------------------------------------------------------*
*       CLASS LCL_ALV_GRID IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_alv_grid IMPLEMENTATION.
  METHOD set_optimize_all_cols.
    CALL METHOD me->optimize_all_cols
      EXPORTING
        include_header = 1.
  ENDMETHOD.                    "SET_OPTIMIZE_ALL_COLS
ENDCLASS. "LCL_ALV_GRID IMPLEMENTATION
*----------------------------------------------------------------------*
*       CLASS LCL_ALV_EVENT_HANDLER DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_alv_event_handler DEFINITION.
  PUBLIC SECTION.
    DATA: go_object_name(30) TYPE c.
    METHODS :
      constructor IMPORTING e_object_text TYPE c,

      handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
                     IMPORTING e_object
                               e_interactive,

      handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
                           IMPORTING e_ucomm,

      handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
                          IMPORTING er_data_changed.

ENDCLASS. "LCL_ALV_EVENT_HANDLER DEFINITION
*----------------------------------------------------------------------*
*       CLASS LCL_ALV_EVENT_HANDLER IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_alv_event_handler IMPLEMENTATION.
  METHOD constructor.
    go_object_name = e_object_text.
  ENDMETHOD.                    "constructor
  "
  METHOD handle_toolbar.
    PERFORM frm_toolbar_pros  USING e_object
                                    e_interactive.
  ENDMETHOD.                    "handle_toolbar

  METHOD handle_user_command.
    PERFORM frm_user_command_pros USING e_ucomm.
  ENDMETHOD.                    "handle_user_command

  METHOD handle_data_changed.
    PERFORM frm_data_changed USING er_data_changed.
  ENDMETHOD.
ENDCLASS. "LCL_ALV_EVENT_HANDLER IMPLEMENTATION
*&---------------------------------------------------------------------*
*& 包含               ZMMR0063_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_create_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_alv .

  IF NOT gv_grid IS INITIAL.
    CALL METHOD gv_grid->free.
  ENDIF.
* Create Main Container
  CREATE OBJECT gv_docking_container
    EXPORTING
      dynnr                       = '9000'
      repid                       = sy-repid
      side                        = gv_docking_container->dock_at_top
      extension                   = 200
      ratio                       = 100
    EXCEPTIONS
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5.

  CREATE OBJECT gv_grid
    EXPORTING
      i_parent = gv_docking_container.

* Variant
  PERFORM frm_init_variant.
* Output Fields
  PERFORM frm_set_field_catalogs.
* Set GRID Layout Attribute
  PERFORM frm_display_layout_attribute USING gs_layout.
* Exclude Tool Bar From Grid1
  PERFORM frm_exclude_tb_functions.
* Register Event For Grid1
  PERFORM frm_event_handler_register USING gv_grid 'OBJ'.
* ALV Grid Display
  PERFORM frm_alv_grid_display.

ENDFORM.
*&---------------------------------------------------------------------*
*&      FORM  frm_init_variant
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_init_variant .
  DATA: lv_handle TYPE slis_handl.

  lv_handle = '9000'.
  gs_alv_variant-handle   = lv_handle.
  gs_alv_variant-report   = sy-repid.
  gs_alv_variant-username = sy-uname.
ENDFORM. " FRM_INIT_VARIANT
*&---------------------------------------------------------------------*
*&      FORM  frm_set_field_catalogs
*&---------------------------------------------------------------------*
*       Text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_set_field_catalogs.
  DATA: lv_fieldname TYPE lvc_fname,
        lv_coltext   TYPE lvc_txtcol.

  DATA: lv_pos TYPE i.
  CLEAR:gs_fieldcat,gt_fieldcat[].

  REFRESH gt_fieldcat.
  DEFINE set_outtab.
    lv_pos = lv_pos + 1.
    gs_fieldcat-col_pos   = lv_pos.
    gs_fieldcat-fieldname = &1.
    gs_fieldcat-coltext   = &2.
    IF gs_fieldcat-fieldname = 'MENGE343'.
      gs_fieldcat-ref_table = 'EKPO'.
      gs_fieldcat-ref_field = 'MENGE'.
    ENDIF.
    APPEND gs_fieldcat TO gt_fieldcat.
    CLEAR: gs_fieldcat.
  END-OF-DEFINITION.

  set_outtab:
              'MBLNR101'     TEXT-100,"物料凭证
              'ZEILE101'     TEXT-101,"物料凭证项目
              'MATNR'        TEXT-102,"物料编码
              'WERKS101'     TEXT-103,"工厂
              'LGORT101'     TEXT-104,"库存地点
              'LIFNR'        TEXT-105,"供应商
              'MENGE101'     TEXT-106,"数量
              'MEINS'        TEXT-107,"计量单位
              'EBELN'        TEXT-108,"采购订单
              'EBELP'        TEXT-109,"采购订单项目
              'BUDAT101'     TEXT-110,"过账日期
              'CPUDT101'     TEXT-111,"录入日期
              'CPUTM101'     TEXT-112,"录入时间
              'USNAM101'     TEXT-113,"操作人
              'WERKS343'     TEXT-114,"工厂
              'LGORT343'     TEXT-115,"库存地点
              'MENGE343'     TEXT-116,"解冻数量
              'BUDAT343'     TEXT-117,"解冻过账日期
              'ABLAD'        TEXT-118."解冻物流单
ENDFORM. " FRM_SET_FIELD_CATALOGS
*&---------------------------------------------------------------------*
*&      FORM  frm_display_layout_attribute
*&---------------------------------------------------------------------*
*       Text
*----------------------------------------------------------------------*
*      -->p_gs_layocat1  text
*----------------------------------------------------------------------*
FORM frm_display_layout_attribute USING p_layocat TYPE lvc_s_layo.
  p_layocat-cwidth_opt = 'X'.
  p_layocat-sel_mode   = 'A'.
  p_layocat-smalltitle = ' '.
  p_layocat-zebra      = ' '.
  p_layocat-no_rowmark = ' '.
  p_layocat-no_headers = ' '.
  p_layocat-no_vgridln = ' '.
  p_layocat-no_hgridln = ' '.
  p_layocat-stylefname = 'CELLSTYLE'.
ENDFORM. " FRM_DISPLAY_LAYOUT_ATTRIBUTE
*&---------------------------------------------------------------------*
*&      FORM  frm_exclude_tb_functions
*&---------------------------------------------------------------------*
*       Text (控制按钮隐藏显示)
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_exclude_tb_functions .
  DEFINE exclude_fcode.
    APPEND &1 TO gt_exclude.
  END-OF-DEFINITION.

  REFRESH gt_exclude.
  exclude_fcode: cl_gui_alv_grid=>mc_fc_loc_copy_row,
                 cl_gui_alv_grid=>mc_fc_loc_delete_row,
                 cl_gui_alv_grid=>mc_fc_loc_append_row,
                 cl_gui_alv_grid=>mc_fc_loc_insert_row,
                 cl_gui_alv_grid=>mc_fc_loc_move_row,
                 cl_gui_alv_grid=>mc_fc_loc_paste_new_row,
                 cl_gui_alv_grid=>mc_fc_loc_paste,
                 cl_gui_alv_grid=>mc_fc_loc_undo,
                 cl_gui_alv_grid=>mc_fc_loc_copy,
                 cl_gui_alv_grid=>mc_fc_loc_cut,
                 cl_gui_alv_grid=>mc_fc_refresh.
ENDFORM. " FRM_EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
*&      FORM  frm_event_handler_register
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->lo_grid    text
*      -->lv_obj     text
*----------------------------------------------------------------------*
FORM frm_event_handler_register USING lo_grid TYPE REF TO lcl_alv_grid
                                       lv_obj  TYPE char30.
  CREATE OBJECT gv_event_handler
    EXPORTING
      e_object_text = lv_obj.

  CALL METHOD gv_grid->set_ready_for_input
    EXPORTING
      i_ready_for_input = 1.

  CALL METHOD gv_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified.

  CALL METHOD gv_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter.

  SET HANDLER gv_event_handler->handle_data_changed FOR lo_grid.
  SET HANDLER gv_event_handler->handle_toolbar FOR lo_grid.
  SET HANDLER gv_event_handler->handle_user_command FOR lo_grid.
ENDFORM. "FRM_EVENT_HANDLER_REGISTER
*&---------------------------------------------------------------------*
*&      FORM  frm_alv_grid_display
*&---------------------------------------------------------------------*
*       alv##
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_alv_grid_display .
  CALL METHOD gv_grid->set_table_for_first_display
    EXPORTING
      is_layout            = gs_layout
      it_toolbar_excluding = gt_exclude
      i_save               = 'A'
      is_variant           = gs_alv_variant
    CHANGING
      it_fieldcatalog      = gt_fieldcat
      it_sort              = gt_sort[]
      it_outtab            = gt_output.
ENDFORM. " FRM_ALV_GRID_DISPLAY
*&---------------------------------------------------------------------*
*&      FORM  frm_refresh_alv
*&---------------------------------------------------------------------*
*       Text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_refresh_alv .
  DATA: ls_scroll TYPE lvc_s_stbl.
  ls_scroll-row = 'X'.
  ls_scroll-col = 'X'.

  CALL METHOD gv_grid->refresh_table_display
    EXPORTING
*     i_soft_refresh = 'X'
      is_stable = ls_scroll.

  CALL METHOD cl_gui_cfw=>flush.
  CALL METHOD gv_grid->set_optimize_all_cols.
ENDFORM. " FRM_REFRESH_ALV
*&---------------------------------------------------------------------*
*& Form frm_process_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_process_data .

  "设置单元格样式
  PERFORM frm_set_cellstyle.

  "查询要解冻的库存
  SELECT mblnr101
         zeile101
         matnr
         werks101
         lgort101
         insmk
         lifnr
         menge101
         menge343
         meins
         ebeln
         ebelp
         budat101
         cpudt101
         cputm101
         usnam101
         elikz
    FROM ztmm0063_2
    INTO CORRESPONDING FIELDS OF TABLE gt_output
   WHERE werks101 = p_werks
     AND mblnr101 = p_mblnr
     AND usnam101 = p_usnam
     AND elikz    = ''
     AND matnr    IN s_matnr
     AND ebeln    IN s_ebeln
     AND ebelp    IN s_ebelp
     AND budat101 IN s_budat
     AND cpudt101 IN s_cpudt.

  CHECK gt_output[] IS NOT INITIAL.

  LOOP AT gt_output INTO gs_output.
    gs_menge-mblnr101 = gs_output-mblnr101.
    gs_menge-zeile101 = gs_output-zeile101.
    gs_menge-menge343 = gs_output-menge343.
    COLLECT gs_menge INTO gt_menge.
  ENDLOOP.

  SORT gt_menge BY mblnr101 zeile101 menge343 DESCENDING.
  DELETE ADJACENT DUPLICATES FROM gt_menge COMPARING mblnr101 zeile101.

  SORT gt_output BY mblnr101 zeile101.
  DELETE ADJACENT DUPLICATES FROM gt_output COMPARING mblnr101 zeile101.

  LOOP AT gt_output INTO gs_output.
    gs_output-werks343 = gs_output-werks101.
    gs_output-lgort343 = gs_output-lgort101.
    IF gs_output-elikz = ''.
      READ TABLE gt_menge INTO gs_menge
                                  WITH KEY mblnr101 = gs_output-mblnr101
                                           zeile101 = gs_output-zeile101
                                           BINARY SEARCH.
      IF sy-subrc EQ 0.
        gs_output-menge343 = gs_output-menge101 - gs_menge-menge343.
        gs_output-budat343 = sy-datum.
      ENDIF.
      gs_output-cellstyle = gt_cellstyle[].
    ENDIF.
    MODIFY gt_output FROM gs_output.
    CLEAR gs_output.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_CELLSTYLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_cellstyle .
  REFRESH gt_cellstyle.

  gs_cellstyle-fieldname = 'ABLAD'.
  gs_cellstyle-style     = cl_gui_alv_grid=>mc_style_enabled.
  APPEND gs_cellstyle TO gt_cellstyle.
  CLEAR gs_cellstyle.

  gs_cellstyle-fieldname = 'BUDAT343'.
  gs_cellstyle-style     = cl_gui_alv_grid=>mc_style_enabled.
  APPEND gs_cellstyle TO gt_cellstyle.
  CLEAR gs_cellstyle.

  gs_cellstyle-fieldname = 'MENGE343'.
  gs_cellstyle-style     = cl_gui_alv_grid=>mc_style_enabled.
  APPEND gs_cellstyle TO gt_cellstyle.
  CLEAR gs_cellstyle.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_toolbar_pros
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> E_OBJECT
*&      --> E_INTERACTIVE
*&---------------------------------------------------------------------*
FORM frm_toolbar_pros USING po_object
                                    TYPE REF TO cl_alv_event_toolbar_set
                            pv_interactive TYPE char01.

  DATA: ls_toolbar TYPE stb_button.

  ls_toolbar-function  = 'INSERT'.
  ls_toolbar-icon      = icon_insert_row.
  ls_toolbar-text      = '插入数据'.
  ls_toolbar-quickinfo = '插入数据'.
  APPEND ls_toolbar TO po_object->mt_toolbar.
  CLEAR ls_toolbar.

  ls_toolbar-function  = 'UNLOCKED'.
  ls_toolbar-icon      = icon_unlocked.
  ls_toolbar-text      = '解冻库存'.
  ls_toolbar-quickinfo = '解冻库存'.
  APPEND ls_toolbar TO po_object->mt_toolbar.
  CLEAR ls_toolbar.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_user_command_pros
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> E_UCOMM
*&---------------------------------------------------------------------*
FORM frm_user_command_pros  USING  pv_ucomm TYPE sy-ucomm.

  CASE pv_ucomm.
    WHEN 'INSERT'.
      "插入数据
      PERFORM frm_insert_line.

    WHEN 'UNLOCKED'.
      "保存数据,更新数据库表
      PERFORM frm_update_table.
    WHEN OTHERS.
  ENDCASE.

  "刷新ALV
  PERFORM frm_refresh_alv.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_update_table
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_update_table .

  DATA:lt_rows     TYPE lvc_t_row,
       ls_rows     TYPE lvc_s_row,
       lt_mm0063_2 TYPE TABLE OF ztmm0063_2,
       ls_mm0063_2 TYPE ztmm0063_2,
       lv_mblnr    TYPE ztmm0063_2-mblnr101,
       lv_zeile    TYPE ztmm0063_2-zeile101,
       lv_lines    TYPE i,
       lv_menge    TYPE ztmm0063_2-menge101.

*使用bapi需要用到的
  "Import
  DATA: gs_goodsmvt_header TYPE bapi2017_gm_head_01,
        gv_goodsmvt_code   TYPE bapi2017_gm_code.

  "Export
  DATA: gs_goodsmvt_headref TYPE bapi2017_gm_head_ret.

  "Table
  DATA: gt_goodsmvt_item TYPE TABLE OF bapi2017_gm_item_create,
        wa_goodsmvt_item TYPE bapi2017_gm_item_create,
        gt_return        TYPE TABLE OF bapiret2,
        wa_return        TYPE bapiret2.
  DATA: lv_error TYPE c.


  CLEAR:ls_rows,ls_mm0063_2,lv_lines,lv_menge,lv_mblnr,
        lv_zeile.
  REFRESH:lt_rows,lt_mm0063_2.

  CALL METHOD gv_grid->get_selected_rows
    IMPORTING
      et_index_rows = lt_rows.

  lv_lines = lines( lt_rows ).
  IF lv_lines NE 1.
    MESSAGE s001(zmm0001) WITH TEXT-e04 DISPLAY LIKE 'E'.
    "请选择一条数据
    EXIT.
  ENDIF.

  READ TABLE lt_rows INDEX 1 INTO ls_rows.
  CHECK sy-subrc EQ 0.

  READ TABLE gt_output INDEX ls_rows-index INTO gs_output.
  IF sy-subrc EQ 0.

    READ TABLE gt_menge INDEX 1 INTO gs_menge.

    "可解冻库存
    IF sy-subrc EQ 0.
      lv_menge = gs_output-menge101 - gs_menge-menge343.
    ELSE.
      lv_menge = gs_output-menge101.
    ENDIF.

    IF gs_output-menge343 > lv_menge.
      MESSAGE s001(zmm0001) WITH TEXT-e02 DISPLAY LIKE 'E'.
      "累计解冻数量大于冻结收货数量,请修改后保存!
    ELSE.
      "Goods Move
      "Header
      gs_goodsmvt_header-pstng_date = sy-datum.
      gs_goodsmvt_header-doc_date = sy-datum.

      "GM Code
      gv_goodsmvt_code = '06'.   "收货

      "Item
      wa_goodsmvt_item-material      = gs_output-matnr.     "物料
      wa_goodsmvt_item-plant         = gs_output-werks101.  "工厂
      wa_goodsmvt_item-stge_loc      = gs_output-lgort101.  "库存地点
      wa_goodsmvt_item-move_type     = '343'.               "移动类型 343
      wa_goodsmvt_item-entry_qnt     = gs_output-menge343.  "交货数量
      wa_goodsmvt_item-entry_uom     = gs_output-meins.     "销售单位
      wa_goodsmvt_item-entry_uom_iso = gs_output-meins.     "基本的单位
      APPEND wa_goodsmvt_item TO gt_goodsmvt_item.


      CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
        EXPORTING
          goodsmvt_header  = gs_goodsmvt_header
          goodsmvt_code    = gv_goodsmvt_code
        IMPORTING
          goodsmvt_headret = gs_goodsmvt_headref
        TABLES
          goodsmvt_item    = gt_goodsmvt_item
          return           = gt_return.

      LOOP AT gt_return INTO wa_return WHERE type CA 'AEX'.
        IF sy-subrc = 0.
          lv_error = 'E'.
          EXIT.
        ENDIF.
      ENDLOOP.

      IF lv_error EQ 'E'.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        MESSAGE '过账失败' TYPE 'S' DISPLAY LIKE 'E'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
        MESSAGE '过账成功' TYPE 'S'.

        "保存解冻记录
        PERFORM frm_save_record USING gs_goodsmvt_headref
                                      ls_rows-index.
      ENDIF.
    ENDIF.
  ENDIF.

  FREE:lt_rows,lt_mm0063_2.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_insert_line
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_insert_line .

  CLEAR gs_output.
  READ TABLE gt_output INDEX 1 INTO gs_output.
  IF sy-subrc EQ 0.
    READ TABLE gt_menge INTO gs_menge
                                  WITH KEY mblnr101 = gs_output-mblnr101
                                           zeile101 = gs_output-zeile101
                                           BINARY SEARCH.
    IF sy-subrc EQ 0.
      gs_output-menge343  = gs_output-menge101 - gs_menge-menge343.
      gs_output-ablad     = ''.
      gs_output-budat343  = sy-datum.
      gs_output-cellstyle = gt_cellstyle[].
      IF gs_output-menge101 = gs_menge-menge343.
        MESSAGE s001(zmm0001) WITH TEXT-s01 DISPLAY LIKE 'E'.
        "解冻已完成
        EXIT.
      ENDIF.
    ENDIF.
    APPEND gs_output TO gt_output.
    CLEAR gs_output.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_data_changed
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> ER_DATA_CHANGED
*&---------------------------------------------------------------------*
FORM frm_data_changed  USING
               po_data_changed TYPE REF TO cl_alv_changed_data_protocol.

  DATA:lt_modi  TYPE lvc_t_modi,
       ls_modi  TYPE lvc_s_modi,
       lv_menge TYPE ztmm0063_2-menge101.

  CLEAR:ls_modi,lv_menge.
  REFRESH:lt_modi.

  LOOP AT po_data_changed->mt_mod_cells INTO ls_modi.
    CASE ls_modi-fieldname.
      WHEN 'MENGE343'.
        CALL METHOD po_data_changed->get_cell_value
          EXPORTING
            i_row_id    = ls_modi-row_id
            i_fieldname = ls_modi-fieldname
          IMPORTING
            e_value     = lv_menge.

        CLEAR gs_output.
        READ TABLE gt_output INDEX ls_modi-row_id INTO gs_output.
        IF sy-subrc EQ 0.
          READ TABLE gt_menge INTO gs_menge
                                  WITH KEY mblnr101 = gs_output-mblnr101
                                           zeile101 = gs_output-zeile101
                                           BINARY SEARCH.
          IF sy-subrc EQ 0.
            IF lv_menge > gs_output-menge101 - gs_menge-menge343.
              CALL METHOD po_data_changed->add_protocol_entry
                EXPORTING
                  i_msgid     = 'ZMM0001'
                  i_msgty     = 'E'
                  i_msgno     = '000'
                  i_msgv1     = TEXT-e02
                  i_fieldname = ls_modi-fieldname
                  i_row_id    = ls_modi-row_id.
            ENDIF.
          ENDIF.
        ENDIF.

      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.

  FREE:lt_modi.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_save_record
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GS_GOODSMVT_HEADREF
*&---------------------------------------------------------------------*
FORM frm_save_record  USING  ps_goodsmvt TYPE bapi2017_gm_head_ret
                             pv_index.

  DATA:ls_mm0063_2 TYPE ztmm0063_2,
       lv_zeile    TYPE ztmm0063_2-zeile101.

  CLEAR:ls_mm0063_2,lv_zeile.

  SELECT SINGLE MAX( zeile343 )
    FROM ztmm0063_2
    INTO lv_zeile
   where mblnr343 = ps_goodsmvt-mat_doc
   GROUP BY mblnr343.

  CLEAR gs_output-cellstyle[].
  MODIFY gt_output FROM gs_output INDEX pv_index.
  MOVE-CORRESPONDING gs_output TO ls_mm0063_2.
  ls_mm0063_2-mandt    = sy-mandt.
  ls_mm0063_2-mblnr343 = ps_goodsmvt-mat_doc.
  ls_mm0063_2-zeile343 = lv_zeile + 1.
  ls_mm0063_2-cpudt343 = sy-datum.
  ls_mm0063_2-cputm343 = sy-uzeit.
  ls_mm0063_2-usnam343 = sy-uname.

  MODIFY ztmm0063_2 FROM ls_mm0063_2.

  IF gs_output-menge343 = gs_output-menge101 - gs_menge-menge343.
    "相同物料收货冻结凭证&行项目下的累计MENGE343=MENGE101时,
    "所有MBLNE101 & ZEILE101相关行项目的ELIKZ解冻完成标识更新为“X”
    UPDATE ztmm0063_2
       SET elikz = 'X'
     WHERE mblnr101 = gs_output-mblnr101
       AND zeile101 = gs_output-zeile101.
  ENDIF.

  "更新累计解冻数量
  gs_menge-menge343 = gs_menge-menge343 + gs_output-menge343.
  MODIFY gt_menge FROM gs_menge INDEX 1.
ENDFORM.
*&---------------------------------------------------------------------*
*& 包含               ZMMR0063_I01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  EXIT_COMMAND  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE exit_command INPUT.
  LEAVE TO SCREEN 0.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.

  save_ok = ok_code.
  CASE save_ok.
    WHEN 'EXIT' OR 'BACK' OR 'CANCEL'.
      LEAVE TO SCREEN 0.
  ENDCASE.
  CLEAR: save_ok,ok_code.

ENDMODULE.
*&---------------------------------------------------------------------*
*& 包含               ZMMR0063_O01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
DATA: lv_title TYPE string.
  CLEAR: lv_title.

  lv_title = '海外BG收货冻结库存解冻入库'.
  SET PF-STATUS '9000'.
  SET TITLEBAR '9000' WITH lv_title.

ENDMODULE.
*&---------------------------------------------------------------------*
*& Module CREATE_ALV_GRID OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE create_alv_grid OUTPUT.

  IF gv_docking_container IS INITIAL.
    PERFORM frm_create_alv.
  ELSE.
    PERFORM frm_refresh_alv.
  ENDIF.

ENDMODULE.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值