当前位置: 首页 > news >正文

SAP 一个屏幕多ALV 例子

使用到类:cl_gui_docking_container, cl_gui_splitter_container, cl_gui_container, cl_gui_alv_grid

1.效果

2.源代码

MAIN程序

*&---------------------------------------------------------------------*
*& Report ZPPD011B
*&---------------------------------------------------------------------*
*& 包材材料需求运算确认
*&---------------------------------------------------------------------*
REPORT zppd011b.

TABLES:zppt0011b,zppt0011c.

* 抬头数据
TYPES: BEGIN OF ty_out1,
         sel  TYPE char01,
         icon TYPE char4.
*         pre_check_type TYPE bapiret2-type.
    INCLUDE STRUCTURE zppt0011b.
TYPES:
  maktx   TYPE maktx,
  type    TYPE bapiret2-type,
  message TYPE bapiret2-message,
  END OF ty_out1.

* 明细数据
TYPES: BEGIN OF ty_out2.
TYPES:
  sel TYPE char01.
    INCLUDE STRUCTURE zppt0011c.
TYPES:

     END OF ty_out2.

DATA:gt_out1  TYPE  TABLE OF ty_out1.
DATA gt_out2 TYPE TABLE OF ty_out2.

DATA: BEGIN OF gt_ztdz_sum OCCURS 0,
        werks  TYPE werks_d,
        ztdz   TYPE ztdz,
        zxqsl1 TYPE zppt0011c-zxqsl1,
      END OF gt_ztdz_sum.


DATA: go_container     TYPE REF TO cl_gui_docking_container,
      go_splitter      TYPE REF TO cl_gui_splitter_container,
      go_cont          TYPE REF TO cl_gui_container,
      go_cont2         TYPE REF TO cl_gui_container,
      go_alvgrid       TYPE REF TO  cl_gui_alv_grid,
      go_alvgrid2      TYPE REF TO  cl_gui_alv_grid,
      gt_excluding     TYPE ui_functions,
      gt_excluding2    TYPE ui_functions,
      gs_fieldcat      TYPE lvc_s_fcat,
      gt_fieldcat      TYPE lvc_t_fcat,
      gt_fieldcat2     TYPE lvc_t_fcat,
      gs_layout        TYPE lvc_s_layo,
      gs_layout2       TYPE lvc_s_layo,
      gs_styl          TYPE lvc_s_styl,
      gt_styl          TYPE lvc_t_styl,
      gt_events        TYPE slis_t_event WITH HEADER LINE,
      gt_events2       TYPE slis_t_event WITH HEADER LINE,
      gt_event_exit    TYPE slis_t_event_exit WITH HEADER LINE,
      gt_event_exit2   TYPE slis_t_event_exit WITH HEADER LINE,
      gs_grid_settings TYPE lvc_s_glay.


DATA: gv_ucomm TYPE sy-ucomm.


SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01.

SELECT-OPTIONS: s_werks FOR zppt0011b-werks OBLIGATORY DEFAULT '1100' NO-EXTENSION NO INTERVALS.
PARAMETERS  p_zjhts   TYPE zppt0011c-zjhts DEFAULT 7.
SELECTION-SCREEN END OF BLOCK b1.

INCLUDE zppd011b_o01.
INCLUDE zppd011b_i01.
INCLUDE zppd011b_c01.
INCLUDE zppd011b_f01.

INITIALIZATION.
  PERFORM initializtion.

AT SELECTION-SCREEN OUTPUT.


AT SELECTION-SCREEN.


START-OF-SELECTION.
  CLEAR: gt_ztdz_sum[].

  PERFORM frm_auth_check.
  PERFORM frm_get_item_data.
  PERFORM frm_get_head_data.
  PERFORM frm_get_zjxq1.  "分配净需求数量

  CALL SCREEN 1001.

 屏幕逻辑流

PROCESS BEFORE OUTPUT.
  MODULE status_1001.

PROCESS AFTER INPUT.
  MODULE user_command_1001.

 PBO

*----------------------------------------------------------------------*
***INCLUDE ZPPD011B_O01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_1001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_1001 OUTPUT.
  SET PF-STATUS 'PF_1001'.
  SET TITLEBAR 'T01'.

  IF go_container IS INITIAL.
    PERFORM frm_container_init.
    PERFORM frm_data_output1.
    PERFORM frm_data_output2.
  ENDIF.

ENDMODULE.

 PAI

*----------------------------------------------------------------------*
***INCLUDE ZPPD011B_I01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_1001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_1001 INPUT.

  PERFORM frm_user_command_1001.

ENDMODULE.

 ALV 事件响应

*&---------------------------------------------------------------------*
*& 包含               ZPPD011B_C01
*&---------------------------------------------------------------------*

CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.

    METHODS:
      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_double_click FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING
            e_column
            es_row_no,

      handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid
        IMPORTING
            e_column_id
            es_row_no,

      data_changed FOR EVENT  data_changed OF cl_gui_alv_grid
        IMPORTING
            e_onf4
            e_onf4_after
            e_onf4_before
            er_data_changed
            e_ucomm,

      data_changed_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid
        IMPORTING
            e_modified
            et_good_cells
            sender.

ENDCLASS.


CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_toolbar.
    DATA: ls_toolbar  TYPE stb_button.

    MOVE 'ZCONFIRM' TO ls_toolbar-function.   "运算结果确认
    MOVE icon_checked TO ls_toolbar-icon.
    MOVE '运算结果确认' TO ls_toolbar-text.
    APPEND ls_toolbar TO e_object->mt_toolbar.

  ENDMETHOD.

  METHOD handle_user_command.

    PERFORM frm_alv1_command USING e_ucomm.

  ENDMETHOD.



  METHOD handle_double_click.


  ENDMETHOD.

  METHOD handle_hotspot_click.


  ENDMETHOD.

  METHOD data_changed.
  ENDMETHOD.
  METHOD data_changed_finished.

  ENDMETHOD.
ENDCLASS.


CLASS lcl_event_receiver2 DEFINITION.
  PUBLIC SECTION.
    METHODS:
      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.

    METHODS handle_data_changed_finished
                  FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified et_good_cells.


ENDCLASS.


CLASS lcl_event_receiver2 IMPLEMENTATION.
  METHOD handle_toolbar.

  ENDMETHOD.

  METHOD handle_user_command.

  ENDMETHOD.

  METHOD handle_data_changed_finished.


  ENDMETHOD.                    "HANDLE_MODIFY


ENDCLASS.

DATA: go_event_receiver TYPE REF TO lcl_event_receiver.
DATA: go_event_receiver2 TYPE REF TO lcl_event_receiver2.

 FORM集

*----------------------------------------------------------------------*
***INCLUDE ZPPD011B_F01.
*----------------------------------------------------------------------*


*&---------------------------------------------------------------------*
*& Form INITIALIZTION
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM initializtion .

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_AUTH_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_auth_check .

  AUTHORITY-CHECK OBJECT 'C_AFKO_AWK'
   ID 'WERKS' FIELD s_werks-low.
  IF sy-subrc <> 0.
    MESSAGE s001(00) WITH '缺少工厂' s_werks-low '的权限' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.


ENDFORM.


*&---------------------------------------------------------------------*
*& Form FRM_CONTAINER_INIT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_container_init .

  CREATE OBJECT go_container
    EXPORTING
      repid                       = sy-repid
      dynnr                       = '1001'
      side                        = cl_gui_docking_container=>dock_at_left "容器贴屏幕左边
      extension                   = cl_gui_control=>ws_maximizebox "容器宽度
      style                       = cl_gui_control=>ws_child "可选参数,设置容器是否可用手动拖动大小
    EXCEPTIONS
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5
      OTHERS                      = 6.

  IF sy-subrc <> 0.
    MESSAGE s001(00) WITH '屏幕容器初始化失败'(044).
    LEAVE LIST-PROCESSING.
  ENDIF.

*分割容器
  CREATE OBJECT go_splitter
    EXPORTING
      parent  = go_container
      rows    = 2
      columns = 1.

  CALL METHOD go_splitter->get_container                "alv1的容器
    EXPORTING
      row       = 1
      column    = 1
    RECEIVING
      container = go_cont.

  CALL METHOD go_splitter->get_container
    EXPORTING
      row       = 2
      column    = 1
    RECEIVING
      container = go_cont2.                         "alv2的容器

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_DATA_OUTPUT1
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_data_output1 .

  DATA  ls_variant TYPE disvariant.

  ls_variant-report = sy-repid.

  CREATE OBJECT go_alvgrid
    EXPORTING
      i_parent = go_cont.

  PERFORM frm_alv_exclude TABLES gt_excluding.
  PERFORM frm_alv_layout.
  PERFORM frm_build_fieldcat
  TABLES gt_fieldcat
   USING 'HEAD'.

  PERFORM frm_alv_event.
  PERFORM frm_alv_call.
ENDFORM.

FORM frm_alv_event .
  CREATE OBJECT go_event_receiver.

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


  go_alvgrid->register_edit_event(
     EXPORTING
       i_event_id =  cl_gui_alv_grid=>mc_evt_modified   " Event ID
     EXCEPTIONS
       error      = 1
       OTHERS     = 2
   ).


  SET HANDLER go_event_receiver->handle_toolbar FOR go_alvgrid.
  SET HANDLER go_event_receiver->handle_user_command FOR go_alvgrid.
  SET HANDLER go_event_receiver->handle_hotspot_click FOR go_alvgrid.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_EXCLUDE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_GT_EXCLUDING  text
*&---------------------------------------------------------------------*
FORM frm_alv_exclude TABLES pt_exclude TYPE ui_functions .
  DATA: ls_exclude TYPE ui_func.
*  "明细
*  LS_EXCLUDE = '&DETAIL'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.

  "检查
  ls_exclude = '&CHECK'.
  APPEND ls_exclude TO pt_exclude.

  "刷新
  ls_exclude = '&REFRESH'.
  APPEND ls_exclude TO pt_exclude.

  "剪切
  ls_exclude = '&LOCAL&CUT'.
  APPEND ls_exclude TO pt_exclude.

  "复制文本
  ls_exclude = '&LOCAL#'.
  APPEND ls_exclude TO pt_exclude.

  "插入总览
  ls_exclude = '&MB_PASTE'.
  APPEND ls_exclude TO pt_exclude.

  "撤销
  ls_exclude = '&LOCAL&UNDO'.
  APPEND ls_exclude TO pt_exclude.

  "附加行
  ls_exclude = '&LOCAL&APPEND'.
  APPEND ls_exclude TO pt_exclude.

  "插入行
  ls_exclude = '&LOCAL&INSERT_ROW'.
  APPEND ls_exclude TO pt_exclude.

  "删除行
  ls_exclude = '&LOCAL&DELETE_ROW'.
  APPEND ls_exclude TO pt_exclude.

*  "降序
*  LS_EXCLUDE = '&SORT_DSC'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "升序
*  LS_EXCLUDE = '&SORT_ASC'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "查找
*  LS_EXCLUDE = '&FIND'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "查找下一个
*  LS_EXCLUDE = '&FIND_MORE'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "设置筛选器
*  LS_EXCLUDE = '&FILTER'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "总计
*  LS_EXCLUDE = '&MB_SUM '.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "小计
*  LS_EXCLUDE = '&SUBTOT'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "打印
*  LS_EXCLUDE = '&PRINT'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "视图
*  LS_EXCLUDE = '&VIEW'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "输出
*  LS_EXCLUDE = '&MB_EXPORT'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "格式
*  LS_EXCLUDE = '&MB_VARIANT'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "显示图形
*  LS_EXCLUDE = '&GRAPH'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.
*
*  "最终用户文档
*  LS_EXCLUDE = '&INFO'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.

  "复制行
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
  APPEND ls_exclude TO pt_exclude.

  "复制行
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
  APPEND ls_exclude TO pt_exclude.

ENDFORM. " frm_alv_exclude


*&---------------------------------------------------------------------*
*& Form FRM_ALV_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_alv_layout .

  gs_layout-cwidth_opt = 'X'.
  gs_layout-sel_mode = 'B'.
  gs_layout-zebra = 'X'.
* gs_layout-detailinit = 'X'.
  gs_layout-grid_title = '包材需求确认表'.


ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_BUILD_HEAD_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_GT_FIELDCAT  text
*      -->P_GT_OUT1  text
*&---------------------------------------------------------------------*
FORM frm_build_fieldcat  TABLES pt_fieldcat STRUCTURE lvc_s_fcat
                          USING p_flag.

  DEFINE mcr_fieldcat.

    CLEAR gs_fieldcat.

    gs_fieldcat-fieldname  = &1.
    gs_fieldcat-coltext = &2.
    gs_fieldcat-scrtext_s = &2.
    gs_fieldcat-scrtext_l  = &2.
    gs_fieldcat-scrtext_m  = &2.
    gs_fieldcat-key        = &3.
    gs_fieldcat-checkbox   = &4.
    gs_fieldcat-edit       = &5.
    gs_fieldcat-hotspot    = &6.
    gs_fieldcat-ref_table  = &7.
    gs_fieldcat-ref_field  = &8.
    gs_fieldcat-icon       = &9.

    APPEND gs_fieldcat TO pt_fieldcat.

  END-OF-DEFINITION.

  IF p_flag = 'HEAD'.
    mcr_fieldcat 'SEL'  '选择' '' 'X' 'X' '' '' '' ''.
    mcr_fieldcat 'ICON'  '指示灯' '' '' '' '' '' '' ''.
    mcr_fieldcat 'MESSAGE'  '消息' '' '' '' '' '' '' ''.
    mcr_fieldcat 'ZSERID'  '序列号' '' '' '' '' 'ZPPT0011B' 'ZSERID' ''.
    mcr_fieldcat 'WERKS'  '工厂' '' '' '' '' 'ZPPT0011B' 'WERKS' ''.
    mcr_fieldcat 'ZTDZ'  '替代组标识' '' '' '' '' 'ZPPT0011B' 'ZTDZ' ''.

    mcr_fieldcat 'ZXQSL'  '总需求数量' '' '' '' '' 'ZPPT0011B' 'ZXQSL' ''.
    mcr_fieldcat 'ZKCSL'  '总库存数' '' '' '' '' 'ZPPT0011B' 'ZKCSL' ''.
    mcr_fieldcat 'ZCGSQ'  '总采购申请' '' '' '' '' 'ZPPT0011B' 'ZCGSQ' ''.
    mcr_fieldcat 'ZZTSL'  '总在途数量' '' '' '' '' 'ZPPT0011B' 'ZZTSL' ''.
    mcr_fieldcat 'ZJXQ'  '总净需求' '' '' '' '' 'ZPPT0011B' 'ZJXQ' ''.

    mcr_fieldcat 'MATNR'  '物料编码' '' '' '' '' 'ZPPT0011B' 'MATNR' ''.
    mcr_fieldcat 'MAKTX'  '物料描述' '' '' '' '' 'MAKT' 'MAKTX' ''.

    mcr_fieldcat 'ZKCSL1'  '库存数' '' '' '' '' 'ZPPT0011B' 'ZKCSL1' ''.
    mcr_fieldcat 'ZCGSQ1'  '采购申请' '' '' '' '' 'ZPPT0011B' 'ZCGSQ1' ''.
    mcr_fieldcat 'ZZTSL1'  '在途数量' '' '' '' '' 'ZPPT0011B' 'ZZTSL1' ''.
    mcr_fieldcat 'ZJXQ1'  '分配净需求数量' '' '' '' '' 'ZPPT0011B' 'ZJXQ1' ''.


  ELSEIF p_flag = 'ITEM'.

    mcr_fieldcat 'ZSERID'  '序列号' '' '' '' '' 'ZPPT0011C' 'ZSERID' ''.
    mcr_fieldcat 'WERKS'  '工厂' '' '' '' '' 'ZPPT0011C' 'WERKS' ''.
    mcr_fieldcat 'ZZJ'  '直径' '' '' '' '' 'ZPPT0011C' 'ZZJ' ''.
    mcr_fieldcat 'ZYSFS'  '运输方式' '' '' '' '' 'ZPPT0011C' 'ZYSFS' ''.
    mcr_fieldcat 'ZCN'  '产能(W)/每天' '' '' '' '' 'ZPPT0011C' 'ZCN' ''.
    mcr_fieldcat 'ZJHTS'  '计划天数' '' '' '' '' 'ZPPT0011C' 'ZJHTS' ''.
    mcr_fieldcat 'ZBCLX'  '包材类型' '' '' '' '' 'ZPPT0011C' 'ZBCLX' ''.

    mcr_fieldcat 'ZTDZ'  '替代组标识' '' '' '' '' 'ZPPT0011C' 'ZTDZ' ''.
    mcr_fieldcat 'BMENG'  '基础数量' '' '' '' '' 'ZPPT0011C' 'BMENG' ''.
    mcr_fieldcat 'MENGE'  '使用数量' '' '' '' '' 'ZPPT0011C' 'MENGE' ''.
    mcr_fieldcat 'ZXQSL1'  '需求数量' '' '' '' '' 'ZPPT0011C' 'ZXQSL1' ''.



  ENDIF.



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

  DATA ls_variant TYPE disvariant .

  ls_variant-report = sy-repid.
  ls_variant-handle = '1'.

  CALL METHOD go_alvgrid->set_table_for_first_display
    EXPORTING
      is_variant           = ls_variant
      i_default            = 'X'
      i_save               = 'A'
      is_layout            = gs_layout
      it_toolbar_excluding = gt_excluding
    CHANGING
      it_outtab            = gt_out1[]
      it_fieldcatalog      = gt_fieldcat[].

  CALL METHOD go_alvgrid->set_ready_for_input
    EXPORTING
      i_ready_for_input = 1.

  PERFORM frm_alv_refresh USING go_alvgrid.

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

  DATA ls_variant TYPE disvariant .


  ls_variant-report = sy-repid.

  CREATE OBJECT go_alvgrid2
    EXPORTING
      i_parent = go_cont2.



  PERFORM frm_alv_exclude2 TABLES gt_excluding2.
  PERFORM frm_alv_layout2.
  PERFORM frm_build_fieldcat TABLES gt_fieldcat2
                             USING 'ITEM'.
  PERFORM frm_alv_event2.
  PERFORM frm_alv_call2.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_EXCLUDE2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_GT_EXCLUDING2  text
*&---------------------------------------------------------------------*
FORM frm_alv_exclude2 TABLES pt_exclude TYPE ui_functions.
  DATA: ls_exclude TYPE ui_func.

*  "明细
*  LS_EXCLUDE = '&DETAIL'.
*  APPEND LS_EXCLUDE TO PT_EXCLUDE.

  "检查
  ls_exclude = '&CHECK'.
  APPEND ls_exclude TO pt_exclude.

  "刷新
  ls_exclude = '&REFRESH'.
  APPEND ls_exclude TO pt_exclude.

  "剪切
  ls_exclude = '&LOCAL&CUT'.
  APPEND ls_exclude TO pt_exclude.

  "复制文本
  ls_exclude = '&LOCAL#'.
  APPEND ls_exclude TO pt_exclude.

  "插入总览
  ls_exclude = '&MB_PASTE'.
  APPEND ls_exclude TO pt_exclude.

  "撤销
  ls_exclude = '&LOCAL&UNDO'.
  APPEND ls_exclude TO pt_exclude.

  "附加行
  ls_exclude = '&LOCAL&APPEND'.
  APPEND ls_exclude TO pt_exclude.

  "插入行
  ls_exclude = '&LOCAL&INSERT_ROW'.
  APPEND ls_exclude TO pt_exclude.

  "删除行
  ls_exclude = '&LOCAL&DELETE_ROW'.
  APPEND ls_exclude TO pt_exclude.


  "复制行
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
  APPEND ls_exclude TO pt_exclude.

  "复制行
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
  APPEND ls_exclude TO pt_exclude.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_LAYOUT2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_alv_layout2 .
  gs_layout2-cwidth_opt = 'X'.
  gs_layout2-sel_mode = 'B'.
  gs_layout2-zebra = 'X'.
* gs_layout2-detailinit = 'X'.
  gs_layout2-grid_title = '包材需求明细表'.

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

  CREATE OBJECT go_event_receiver2.

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

  CALL METHOD go_alvgrid2->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

*  SET HANDLER go_event_receiver2->handle_toolbar FOR go_alvgrid2.
*  SET HANDLER go_event_receiver2->handle_user_command FOR go_alvgrid2.
  SET HANDLER go_event_receiver2->handle_data_changed_finished FOR go_alvgrid2.

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

  DATA ls_variant TYPE disvariant .

  ls_variant-report = sy-repid.
  ls_variant-handle = '2'.
  CALL METHOD go_alvgrid2->set_table_for_first_display
    EXPORTING
      is_variant           = ls_variant
      i_default            = 'X'
      i_save               = 'A'
      is_layout            = gs_layout2
      it_toolbar_excluding = gt_excluding2
    CHANGING
      it_outtab            = gt_out2[]
      it_fieldcatalog      = gt_fieldcat2[].

  CALL METHOD go_alvgrid2->set_ready_for_input
    EXPORTING
      i_ready_for_input = 1.

  PERFORM frm_alv_refresh USING go_alvgrid2.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV1_COMMAND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_E_UCOMM  text
*&---------------------------------------------------------------------*
FORM frm_alv1_command  USING   e_ucomm.
  CASE e_ucomm.
    WHEN 'ZCONFIRM'.
      PERFORM frm_zconfirm. "运算结果确认
      PERFORM frm_alv_refresh USING go_alvgrid.
      PERFORM frm_alv_refresh USING go_alvgrid2.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_ITEM_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_item_data .

  DATA: ls_item TYPE ty_out2.

  SELECT werks,zzj,zysfs,zcn
    INTO TABLE @DATA(lt_cnjh)
    FROM zppt0010a
   WHERE werks IN @s_werks
    AND zinact = ''.

  IF lt_cnjh[] IS NOT INITIAL.
    SELECT werks,zzj,zysfs,
           zbclx,ztdz,
           SUM( bmeng ) AS bmeng,  "基本数量
           SUM( menge ) AS menge  "基本数量
      FROM zppt0011a
      WHERE werks IN @s_werks
      AND zdel = ''
      GROUP BY werks,zzj,zysfs,zbclx,ztdz
      INTO TABLE @DATA(lt_bcxx).

    SORT lt_bcxx BY werks zzj zysfs.
  ENDIF.

  LOOP AT lt_cnjh INTO DATA(ls_cnjh).
    MOVE-CORRESPONDING ls_cnjh TO ls_item.
    READ TABLE lt_bcxx TRANSPORTING NO FIELDS WITH KEY werks = ls_cnjh-werks
                                                       zzj = ls_cnjh-zzj
                                                       zysfs = ls_cnjh-zysfs
                                          BINARY SEARCH.
    IF sy-subrc = 0.
      LOOP AT lt_bcxx INTO DATA(ls_bcxx) FROM sy-tabix.
        ls_item-zbclx = ls_bcxx-zbclx.
        ls_item-ztdz = ls_bcxx-ztdz.
        ls_item-bmeng = ls_bcxx-bmeng.
        ls_item-menge = ls_bcxx-menge.

        COLLECT ls_item INTO gt_out2.
        CLEAR: ls_bcxx.
      ENDLOOP.
*    ELSE.
*      COLLECT ls_item INTO gt_out2.
    ENDIF.
    CLEAR: ls_item,ls_cnjh.
  ENDLOOP.

  LOOP AT gt_out2 ASSIGNING FIELD-SYMBOL(<fs_item2>).
    <fs_item2>-zjhts = p_zjhts.
* 需求数=产能(W)/每天  * 10000 * 使用数量 /基础数量
    IF <fs_item2>-bmeng IS NOT INITIAL.
      <fs_item2>-zxqsl1 = <fs_item2>-zcn  * 10000 *  <fs_item2>-menge / <fs_item2>-bmeng.
    ENDIF.
    gt_ztdz_sum-werks = <fs_item2>-werks.
    gt_ztdz_sum-ztdz = <fs_item2>-ztdz.
    gt_ztdz_sum-zxqsl1 = <fs_item2>-zxqsl1.
    COLLECT gt_ztdz_sum.
    CLEAR:gt_ztdz_sum.
  ENDLOOP.

  SORT gt_ztdz_sum BY werks ztdz.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_HEAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_head_data .
  DATA: ls_head TYPE ty_out1.


  LOOP AT gt_out2 INTO DATA(ls_item).
    ls_head-werks = ls_item-werks.
    ls_head-ztdz = ls_item-ztdz.

    SELECT a~werks,a~matnr,b~maktx,
           a~ztdz
      INTO TABLE @DATA(lt_bctd)
      FROM zppt0011 AS a
      LEFT JOIN makt AS b
      ON a~matnr = b~matnr
    WHERE werks = @ls_head-werks
      AND ztdz = @ls_head-ztdz
      AND zdel = ''.

    LOOP AT lt_bctd INTO DATA(ls_bctd).
      ls_head-matnr = ls_bctd-matnr.
      ls_head-maktx = ls_bctd-maktx.
      COLLECT ls_head INTO gt_out1.
      CLEAR: ls_bctd.
    ENDLOOP.

    CLEAR: lt_bctd.
  ENDLOOP.

  DATA: lv_po TYPE menge_d,
        lv_jh TYPE menge_d.

  DATA: BEGIN OF lt_ztdz OCCURS 0,
          werks  TYPE werks_d,
          ztdz   TYPE ztdz,
          zkcsl1 TYPE zppt0011b-zkcsl1,   "库存数
          zcgsq1 TYPE zppt0011b-zcgsq1,   "采购申请
          zztsl1 TYPE zppt0011b-zztsl1,   "在途数据
        END OF lt_ztdz.

  LOOP AT gt_out1 ASSIGNING FIELD-SYMBOL(<fs_head>).
    CLEAR: lv_po,lv_jh.
* 库存数
    SELECT SINGLE SUM( labst + insme )
      INTO @<fs_head>-zkcsl1
      FROM mard
     WHERE werks = @<fs_head>-werks
      AND matnr = @<fs_head>-matnr
      AND lgort = 'D101'.
* 采购申请
* 汇总(eban-menge - eban-bsmng), 条件:eban-werks = 工厂 and eban-matnr = 物料编码
* and eban-loekz <> 'X' and eban-knttp <> 'F'
    SELECT SINGLE ( menge - bsmng )
      INTO @<fs_head>-zcgsq1
      FROM eban
    WHERE werks = @<fs_head>-werks
      AND matnr = @<fs_head>-matnr
      AND loekz = ''
      AND knttp <> 'F'.

* 在途数据 ZZTSL1
    SELECT SUM( menge ) INTO @lv_po
      FROM ekpo
    WHERE werks = @<fs_head>-werks
      AND matnr = @<fs_head>-matnr
      AND loekz = ''
      AND elikz = ''
      AND knttp <> 'F'
      AND retpo = ''.

    SELECT SUM( CASE shkzg WHEN 'S' THEN a~menge
                           WHEN 'H' THEN - a~menge END )
      INTO @lv_jh
      FROM ekbe AS a
      INNER JOIN ekpo AS b
      ON a~ebeln = b~ebeln
      AND a~ebelp = b~ebelp
   WHERE b~werks = @<fs_head>-werks
    AND b~matnr = @<fs_head>-matnr
    AND b~loekz = ''
    AND b~elikz = ''
    AND b~knttp <> 'F'
    AND b~retpo = ''
    AND a~vgabe = '1'.

    <fs_head>-zztsl1 = lv_po - lv_jh.
* 总需求数量
    READ TABLE gt_ztdz_sum WITH KEY werks = <fs_head>-werks
                                    ztdz = <fs_head>-ztdz
                         BINARY SEARCH.
    IF sy-subrc = 0.
      <fs_head>-zxqsl = gt_ztdz_sum-zxqsl1.
    ENDIF.

    MOVE-CORRESPONDING <fs_head> TO lt_ztdz.
    COLLECT lt_ztdz.
    CLEAR: lt_ztdz.

  ENDLOOP.

  SORT lt_ztdz BY werks ztdz.

  LOOP AT gt_out1 ASSIGNING <fs_head>.
    READ TABLE lt_ztdz WITH KEY werks = <fs_head>-werks
                                ztdz = <fs_head>-ztdz
                         BINARY SEARCH.
    IF sy-subrc = 0.
      <fs_head>-zkcsl = lt_ztdz-zkcsl1.  "总库存数
      <fs_head>-zcgsq = lt_ztdz-zcgsq1.  "总采购申请
      <fs_head>-zztsl = lt_ztdz-zztsl1.  "总在途数量
    ENDIF.

* 总净需求 = 总需求数- 总库存数 - 总采购申请 - 总在途数量
    <fs_head>-zjxq = <fs_head>-zxqsl - <fs_head>-zkcsl - <fs_head>-zcgsq - <fs_head>-zztsl.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_ZJXQ1
*&---------------------------------------------------------------------*
*& 分配净需求数量
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_zjxq1 .

* 把总净需求平均分配到替代组标识对应的物料中。
* 例如一个替代组标识对应3个物料,那么就用总净需求(H列)/ 3 ,
* 取整赋给前两个物料,最后一个物料则是总净需求 - 前两个的和

  DATA: lv_zjxq1_sum TYPE zppt0011b-zjxq1.
  DATA: lv1 TYPE i.     "第几个物料

  LOOP AT gt_out1 INTO DATA(ls_out1) GROUP BY ( werks = ls_out1-werks
                                                ztdz = ls_out1-ztdz
                                                size = GROUP SIZE
                                               index = GROUP INDEX )
                                      INTO DATA(ls_group).

    CLEAR: lv_zjxq1_sum,lv1.

    LOOP AT gt_out1 ASSIGNING FIELD-SYMBOL(<fs_out1>) WHERE werks = ls_group-werks
                                                        AND ztdz = ls_group-ztdz.

      lv1 = lv1 + 1.

      IF lv1 NE ls_group-size.
        IF ls_group-size NE 0.
          <fs_out1>-zjxq1 = CONV int4( <fs_out1>-zjxq / ls_group-size ).
        ENDIF.
        lv_zjxq1_sum = lv_zjxq1_sum +  <fs_out1>-zjxq1.
      ELSE.              "最后一个物料
        <fs_out1>-zjxq1 = <fs_out1>-zjxq - lv_zjxq1_sum.
      ENDIF.
    ENDLOOP.

    CLEAR: ls_out1.
  ENDLOOP.


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

  DATA: lt_db_head TYPE TABLE OF zppt0011b,
        ls_db_head TYPE zppt0011b,
        lt_db_item TYPE TABLE OF zppt0011c,
        ls_db_item TYPE zppt0011c,
        lv_zserid  TYPE zppt0011b-zserid.


  IF go_alvgrid IS BOUND.
    go_alvgrid->check_changed_data( ).
  ENDIF.

  IF line_exists( gt_out1[ sel = 'X' ] ).
  ELSE.
    MESSAGE s001(00) WITH '请至少选择一行数据确认' DISPLAY LIKE 'E'.
    RETURN.

  ENDIF.

  PERFORM frm_get_max_zserid CHANGING lv_zserid.

  LOOP AT gt_out1 INTO DATA(ls_group) WHERE sel = 'X'
                                      GROUP BY ( werks = ls_group-werks
                                                ).

    CLEAR: lt_db_head,lt_db_item.
    IF ls_group-zserid IS NOT INITIAL.  "避免重复生成序列号
      CONTINUE.
    ENDIF.

    UPDATE zppt0011b
      SET zinact = 'X'
    WHERE werks = ls_group-werks.

    LOOP AT gt_out1 ASSIGNING FIELD-SYMBOL(<fs_head>) WHERE werks = ls_group-werks.

      <fs_head>-zserid = lv_zserid.
      <fs_head>-icon = icon_green_light.
      <fs_head>-message = '确认成功'.
      MOVE-CORRESPONDING <fs_head> TO ls_db_head.
      ls_db_head-ernam = sy-uname.
      ls_db_head-ersda = sy-datum.
      ls_db_head-ersdt = sy-uzeit.
      ls_db_head-zstat = 'A'. "待转单状态
      APPEND ls_db_head TO lt_db_head.
      CLEAR: ls_db_head.
    ENDLOOP.

    MODIFY zppt0011b FROM TABLE lt_db_head.

    LOOP AT gt_out2 ASSIGNING FIELD-SYMBOL(<fs_item>) WHERE werks = ls_group-werks.
      <fs_item>-zserid = lv_zserid.
      MOVE-CORRESPONDING <fs_item> TO ls_db_item.
      APPEND ls_db_item TO lt_db_item.
      CLEAR ls_db_item.
    ENDLOOP.

    MODIFY zppt0011c FROM TABLE lt_db_item.

    COMMIT WORK.

    CLEAR: ls_group.
  ENDLOOP.

  PERFORM frm_unlock USING lv_zserid.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_MAX_ZSERID
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      <--P_LV_ZSERID  text
*&---------------------------------------------------------------------*
FORM frm_get_max_zserid  CHANGING ev_zserid TYPE zserid.

* 工厂(4)+年月日(8)+3位流水号
  DATA lv_no TYPE n LENGTH 3.
  DATA lv_varkey TYPE rstable-varkey.

  DO 10 TIMES.
    CLEAR: lv_no.
    SELECT MAX( zserid )
      INTO @DATA(lv_max_zserid)
      FROM zppt0011b
    WHERE werks = @s_werks-low
      AND ersda = @sy-datum.
    IF sy-subrc = 0.
      lv_no = lv_max_zserid+12(3).
      lv_no = lv_no + 1.
    ELSE.
      lv_no = 1.
    ENDIF.
    ev_zserid = s_werks-low && sy-datum && lv_no.
    lv_varkey = ev_zserid.

    CALL FUNCTION 'ENQUEUE_E_TABLE'
      EXPORTING
        mode_rstable   = 'E'
        tabname        = 'ZPPT0011B'
        varkey         = lv_varkey
      EXCEPTIONS
        foreign_lock   = 1
        system_failure = 2
        OTHERS         = 3.

    IF sy-subrc = 0.
      EXIT.
    ELSE.                 "如果加锁失败,尝试等待
      WAIT UP TO '0.5' SECONDS.

    ENDIF.

    CLEAR: lv_max_zserid.
  ENDDO.



ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UNLOCK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_LV_ZSERID  text
*&---------------------------------------------------------------------*
FORM frm_unlock  USING   lv_zserid.

  DATA lv_varkey TYPE rstable-varkey.

  lv_varkey = lv_zserid.

  CALL FUNCTION 'DEQUEUE_E_TABLE'
    EXPORTING
*     MODE_RSTABLE       = 'E'
      tabname = 'ZPPT0011B'
      varkey  = lv_varkey
*     X_TABNAME          = ' '
*     X_VARKEY           = ' '
*     _SCOPE  = '3'
*     _SYNCHRON          = ' '
*     _COLLECT           = ' '
    .

ENDFORM.

FORM frm_alv_refresh USING lo_alvgrid TYPE REF TO cl_gui_alv_grid.
  DATA:
    ls_stable     TYPE lvc_s_stbl,
    ls_layout     TYPE lvc_s_layo,
    lt_columns    TYPE lvc_t_col,
    lt_index_rows TYPE  lvc_t_row,
    lt_row_no     TYPE  lvc_t_roid.

  ls_stable-row = 'X'.
  ls_stable-col = 'X'.

  CLEAR: lt_columns,ls_layout.

  CALL METHOD lo_alvgrid->get_frontend_layout
    IMPORTING
      es_layout = ls_layout.

  ls_layout-cwidth_opt = 'X'.

  CALL METHOD lo_alvgrid->set_frontend_layout
    EXPORTING
      is_layout = ls_layout.

  CALL METHOD lo_alvgrid->get_selected_columns "获取选择列
    IMPORTING
      et_index_columns = lt_columns.

  CALL METHOD lo_alvgrid->get_selected_rows "获取选择行
    IMPORTING
      et_index_rows = lt_index_rows
      et_row_no     = lt_row_no.

  CALL METHOD lo_alvgrid->refresh_table_display
    EXPORTING
      is_stable      = ls_stable
      i_soft_refresh = 'X'
    EXCEPTIONS
      finished       = 1
      OTHERS         = 2.
*
  CALL METHOD lo_alvgrid->set_selected_columns "设置回刷新前的列
    EXPORTING
      it_col_table = lt_columns.

  CALL METHOD lo_alvgrid->set_selected_rows "设置回刷新前的列
    EXPORTING
      it_index_rows = lt_index_rows
      it_row_no     = lt_row_no.
ENDFORM. " frm_alv_refresh

*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND_1001
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_user_command_1001 .


  CASE sy-ucomm.
    WHEN 'EXIT' OR 'BACK' OR 'CANC'.
      LEAVE TO SCREEN 0.


  ENDCASE.

ENDFORM.

相关文章:

  • RabbitMQ惰性队列的工作原理、消息持久化机制、同步刷盘的概念、延迟插件的使用方法
  • HBuilder运行uni-app程序报错【Error: listen EACCES: permission denied 0.0.0.0:5173】
  • 华为数字芯片机考2025合集5已校正
  • 性能 测试
  • RuntimeError: CUDA error: invalid device function
  • 【动态规划】 深入动态规划—两个数组的dp问题
  • 从零开始学java--泛型(二)
  • 【操作系统(Linux)】——生产者消费者同步互斥模型
  • 图解力扣回溯及剪枝问题的模板应用
  • ctfshow VIP题目限免 密码逻辑脆弱
  • 区间 dp 系列 题解
  • 《深入探秘:分布式软总线自发现、自组网技术原理》
  • 部署大模型不再难:DeepSeek + 腾讯云 HAI 实战教程
  • Java 列表初始化全解析:7种方式详解与最佳实践
  • SpringBoot和微服务学习记录Day2
  • python基础语法10-异常处理
  • TPS入门DAY03 服务器篇
  • 提示词工程
  • 牛客KY257 日期累加
  • 逆向工程的多层次解析:从实现到领域的全面视角
  • 网站建设画册/公司全网推广
  • 如何申请免费网站空间/seo运营是做什么的
  • 请人做竞价网站的要求重点/nba最新交易信息
  • 电商推广方法有哪些/苏州seo网站系统
  • 网站建设注意事项 南京/注册域名
  • 做设计网站的工作内容/淄博网络推广公司哪家好