创建动态DEEP STRUCTURE实现控制单元格可编辑,单元格颜色,行颜色

来源:互联网 发布:linux pvdispaly 编辑:程序博客网 时间:2024/05/18 18:42
REPORT  zpp_rp009 NO STANDARD PAGE HEADING
        LINE-SIZE 280
        MESSAGE-ID zpp01.
************************************************************************
*        TABLES
************************************************************************
TABLES:
  marc,
  t001w,
  plaf,
  mara,
  makt. "物料描述
************************************************************************
*        INTERNAL TABLES
************************************************************************
FIELD-SYMBOLS:<dynitab> TYPE STANDARD TABLE, "Dynamic internal table
              <dynwa> TYPE ANY,            "Dynamic work area
              <field> TYPE ANY.           "Field
TYPE-POOLS: slis.
DATA: fieldcat TYPE lvc_t_fcat,
      fieldcat_ln TYPE lvc_s_fcat,
      g_user_command TYPE slis_formname VALUE 'USER_COMMAND',
      git_events TYPE slis_t_event,   "ALV 事件
      ps_layout TYPE lvc_s_layo.
DATA: cl_stru TYPE REF TO cl_abap_structdescr,
      cl_tabl TYPE REF TO cl_abap_tabledescr,
      cl_handle TYPE REF TO data,
      cl_strue TYPE REF TO data,
      compdesc TYPE abap_componentdescr,
      components TYPE abap_component_tab.

DATA:BEGIN OF wa_itab,
     plnum LIKE plaf-plnum,
     matnr LIKE plaf-matnr,
     plwrk LIKE plaf-plwrk,
     gsmng LIKE plaf-gsmng,    "
     pertr LIKE plaf-pertr,   "未清日期
     psttr LIKE plaf-psttr,   "开始日期
     dispo LIKE plaf-dispo,
     matkl LIKE mara-matkl,
     wgbez LIKE t023t-wgbez, "物料组描述
     maktx LIKE makt-maktx,
     meins LIKE mara-meins,
END OF wa_itab.
DATA:itab LIKE wa_itab OCCURS WITH HEADER LINE.

DATA:
     wa_flname(11TYPE c,
     wa_field(10),
     t_quan TYPE DECIMALS 0,
     t_style TYPE lvc_t_styl,
     t_color TYPE lvc_t_scol,
     w_color TYPE lvc_s_scol,
     tline(4),
     stylelin TYPE lvc_s_styl.
DATA:BEGIN OF func OCCURS 0,
     fcode(20TYPE c,
END OF func.
DATA:BEGIN OF it_day OCCURS 0,
     day TYPE d,
END OF it_day.

DATA tem_grid TYPE REF TO cl_gui_alv_grid.
*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS handle_modify
    FOR EVENT data_changed OF cl_gui_alv_grid
    IMPORTING er_data_changed .
ENDCLASS.                    "LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_modify.
    DATA stbl TYPE lvc_s_stbl.
    PERFORM frm_refresh_data USING er_data_changed.
*   稳定刷新
    stbl-row 'X'." 基于行的稳定刷新
    stbl-col 'X'." 基于列稳定刷新
    CALL METHOD tem_grid->refresh_table_display
      EXPORTING
        is_stable stbl.
  ENDMETHOD.                    "handle_modify
ENDCLASS.              "LCL_EVENT_RECEIVER IMPLEMENTATION
DATA gt_event_receiver TYPE REF TO lcl_event_receiver .
************************************************************************
*        selection-screen
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE t1.
SELECT-OPTIONS:s_werks FOR plaf-plwrk.
SELECT-OPTIONS:s_psttr FOR plaf-psttr.
SELECTION-SCREEN END OF BLOCK b1.
************************************************************************
*        Initialization
************************************************************************
INITIALIZATION.
  t1 '选择条件'.

START-OF-SELECTION.
  PERFORM sub_read_data.
  PERFORM sub_dny_field_create.
  PERFORM sub_dny_table_create.
  PERFORM sub_dny_field_update.

END-OF-SELECTION.
  PERFORM sub_write_data.
*&---------------------------------------------------------------------*
*&      Form  SUB_READ_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_read_data .

  SELECT p~plnum p~matnr p~plwrk p~gsmng p~psttr p~dispo
         m~meins m~matkl
  INTO CORRESPONDING FIELDS OF TABLE itab
  FROM plaf AS p
  JOIN mara AS ON m~matnr p~matnr
  WHERE p~psttr IN s_psttr
    AND p~plwrk IN s_werks.

  IF itab[] IS NOT INITIAL.
    SORT itab BY matnr.
    LOOP AT itab.
      CLEAR it_day.
      it_day-day itab-psttr.
      APPEND it_day.

      SELECT SINGLE maktx INTO itab-maktx
      FROM makt
      WHERE matnr itab-matnr
        AND spras '1'.

      SELECT SINGLE wgbez INTO itab-wgbez
      FROM t023t
      WHERE matkl itab-matkl
        AND spras '1'.


      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
        EXPORTING
          input    itab-meins
          language sy-langu
        IMPORTING
          output   itab-meins.

      MODIFY itab.
    ENDLOOP.
    SORT it_day BY day.
    DELETE ADJACENT DUPLICATES FROM it_day COMPARING ALL FIELDS.
  ELSE.
    MESSAGE i997 WITH '没有找到相关数据!'.
    SUBMIT (sy-repidVIA SELECTION-SCREEN.
  ENDIF.

  SORT it_day BY day.
ENDFORM.                    " SUB_READ_DATA
*&---------------------------------------------------------------------*
*&      Form  SUB_WRITE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_write_data .
  CLEAR fieldcat.
  REFRESH fieldcat.
  PERFORM frm_get_event.           "设置自定义事件处理程序
  PERFORM build_fieldcat.
  PERFORM display_alv.
ENDFORM.                    " SUB_WRITE_DATA
*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_fieldcat .
  DATA : col_pos TYPE VALUE 1.
  ps_layout-zebra             'X'.
  ps_layout-cwidth_opt        'X'.
  ps_layout-stylefname        'STYLE'.
  ps_layout-ctab_fname        'COLOR'.
  ps_layout-info_fname         'CLINE'.
*----------------------------------------------------------------------*
*& Rerference
*&  _fieldname scrtext_l  _no_zero  _edit _decimals_out
*----------------------------------------------------------------------*
  PERFORM field USING 'PLWRK'  '工厂'  ''  ' '  '' .
  PERFORM field USING 'MATNR' '产品编码' 'X' '' ''.
  PERFORM field USING  'MAKTX'  '物料描述'   ''  ' '  '' .
  PERFORM field USING  'WGBEZ'   '物料组'    '' ' '  ''  .
  PERFORM field USING  'DISPO'  'MRP控制者'  '' '' ''.
  PERFORM field USING  'MEINS'  '单位'       ''  ' '  ''.
  PERFORM field USING  'GSMNG'  '总数'   'X'  ''  '0' .
  LOOP AT it_day.
    CONCATENATE 'DAY' it_day-day INTO wa_flname.
    CONCATENATE it_day-day(4'.' it_day-day+4(2)
                '.' it_day-day+6(2INTO wa_field.
    PERFORM field USING wa_flname wa_field 'X' 'X' '0'.
  ENDLOOP.
ENDFORM.                    " BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  field
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_COL_POS  text
*      -->P_1055   text
*      -->P_1056   text
*      -->P_1057   text
*      -->P_1058   text
*      -->P_1059   text
*----------------------------------------------------------------------*
FORM field  USING   p_fieldname       "
                     p_seltext_l       "
                     p_no_zero         "
                     p_edit            "
                     p_deci.
  fieldcat_ln-fieldname     p_fieldname.
  fieldcat_ln-reptext     p_seltext_l.
  fieldcat_ln-no_zero       p_no_zero.
  fieldcat_ln-edit          p_edit.
  fieldcat_ln-decimals_o  p_deci.

  APPEND fieldcat_ln TO fieldcat.
  CLEAR: fieldcat_ln.
ENDFORM.                    " field
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_alv .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program      sy-cprog
      is_layout_lvc           ps_layout
      it_fieldcat_lvc         fieldcat
      i_save                  'A'
      i_callback_user_command 'USER_COMMAND'
      it_events               git_events
    TABLES
      t_outtab                <dynitab>
    EXCEPTIONS
      program_error           1
      OTHERS                  2.
ENDFORM.                    " DISPLAY_ALV
*&---------------------------------------------------------------------*
*&      Form  usercommand
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM user_command   USING r_ucomm LIKE sy-ucomm
                     rs_selfield TYPE slis_selfield.
  DATA:str(2),
       line TYPE i.
  CASE r_ucomm.
    WHEN '&IC1'.
      CASE rs_selfield-sel_tab_field.
        WHEN  '1-MATNR'.
          SET PARAMETER ID 'MAT' FIELD rs_selfield-value.
          SET PARAMETER ID 'MXX' FIELD 'K'.
          CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
      ENDCASE.
  ENDCASE.
ENDFORM.                    "user_command
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_EVENT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_event .
  DATA l_events TYPE LINE OF slis_t_event.
  CLEAR l_events.
  l_events-name 'CALLER_EXIT'.
  l_events-form 'FM_BUTTON'.
  APPEND l_events TO git_events.
ENDFORM.                    " FRM_GET_EVENT
*&---------------------------------------------------------------------*
*&      Form  fm_button
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->E_GRID     text
*----------------------------------------------------------------------*
FORM fm_button USING e_grid TYPE slis_data_caller_exit.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid tem_grid.

* 设置enter事件
  CALL METHOD tem_grid->register_edit_event
    EXPORTING
      i_event_id cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      1
      OTHERS     2.
* 设置单光标焦点移开被修改单元格后既触发事件
  CALL METHOD tem_grid->register_edit_event
    EXPORTING
      i_event_id cl_gui_alv_grid=>mc_evt_modified
    EXCEPTIONS
      error      1
      OTHERS     2.

  CREATE OBJECT gt_event_receiver.
  SET HANDLER gt_event_receiver->handle_modify FOR tem_grid.
ENDFORM.                    "FM_BUTTON
*&---------------------------------------------------------------------*
*&      Form  FRM_REFRESH_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_E_MODIFIED  text
*----------------------------------------------------------------------*
FORM frm_refresh_data USING p_er_data_changed
                      TYPE REF TO cl_alv_changed_data_protocol.
  DATA:mod_data TYPE lvc_t_modi,
         wa_mod_data TYPE lvc_s_modi.
  mod_data p_er_data_changed->mt_mod_cells.

ENDFORM.                    " FRM_REFRESH_DATA
*&---------------------------------------------------------------------*
*&      Form  SUB_DNY_FIELD_CREATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_dny_field_create .

  CLEAR compdesc.
  compdesc-type ?= cl_abap_datadescr=>describe_by_name'MARA-MATNR' ).
  compdesc-name 'MATNR'.
  APPEND compdesc TO components.

  compdesc-type ?= cl_abap_datadescr=>describe_by_name'MARC-WERKS').
  compdesc-name 'PLWRK'.
  APPEND compdesc TO components.

  compdesc-type ?= cl_abap_datadescr=>describe_by_name'PLAF-GSMNG').
  compdesc-name 'GSMNG'.         "数量
  APPEND compdesc TO components.

  compdesc-type ?= cl_abap_datadescr=>describe_by_name'PLAF-DISPO').
  compdesc-name 'DISPO'.         "mrp控制者
  APPEND compdesc TO components.

  compdesc-type ?= cl_abap_datadescr=>describe_by_name'MARA-MATKL').
  compdesc-name 'MATKL'.         "
  APPEND compdesc TO components.

  compdesc-type ?= cl_abap_datadescr=>describe_by_name'T023T-WGBEZ' ).
  compdesc-name 'WGBEZ'.   "物料组描述
  APPEND compdesc TO components.

  compdesc-type ?= cl_abap_datadescr=>describe_by_name'MARA-MEINS' ).
  compdesc-name 'MEINS'.   "
  APPEND compdesc TO components.

  compdesc-type ?= cl_abap_datadescr=>describe_by_name'MAKT-MAKTX' ).
  compdesc-name 'MAKTX'.   "
  APPEND compdesc TO components.

  LOOP AT it_day.
    CONCATENATE 'DAY' it_day-day INTO wa_flname.
    compdesc-type ?= cl_abap_datadescr=>describe_by_datat_quan ).
    compdesc-name  wa_flname.
    APPEND compdesc TO components.
  ENDLOOP.

  compdesc-type ?= cl_abap_typedescr=>describe_by_datat_style ).
  compdesc-name  'STYLE'.       "控制单元格可编辑
  APPEND compdesc TO components.

  compdesc-type ?= cl_abap_typedescr=>describe_by_datat_color ).
  compdesc-name  'COLOR'.       "控制单元格颜色
  APPEND compdesc TO components.

  compdesc-type ?= cl_abap_typedescr=>describe_by_datatline ).
  compdesc-name  'CLINE'.       "控制行颜色
  APPEND compdesc TO components.

ENDFORM.                    " SUB_DNY_FIELD_CREATE
*&---------------------------------------------------------------------*
*&      Form  SUB_DNY_TABLE_CREATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_dny_table_create .
  cl_stru cl_abap_structdescr=>createcomponents ).
  cl_tabl cl_abap_tabledescr=>createcl_stru ).
  CREATE DATA cl_handle TYPE HANDLE cl_tabl.
  ASSIGN cl_handle->TO <dynitab>.
  CREATE DATA cl_strue TYPE HANDLE cl_stru.
  ASSIGN cl_strue->TO <dynwa>.
ENDFORM.                    " SUB_DNY_TABLE_CREATE
*&---------------------------------------------------------------------*
*&      Form  SUB_DNY_FIELD_UPDATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_dny_field_update .
  LOOP AT itab.
    wa_flname 'MATNR'.
    READ TABLE <dynitab> INTO <dynwa> WITH KEY (wa_flnameitab-matnr.
    IF sy-subrc NE 0.
      ASSIGN COMPONENT 'MATNR' OF STRUCTURE <dynwa> TO <field>.
      <field> =  itab-matnr.

      ASSIGN COMPONENT 'PLWRK' OF STRUCTURE <dynwa> TO <field>.
      <field> itab-plwrk.

      ASSIGN COMPONENT 'GSMNG' OF STRUCTURE <dynwa> TO <field>.
      <field> itab-gsmng.

      ASSIGN COMPONENT 'DISPO' OF STRUCTURE <dynwa> TO <field>.
      <field> itab-dispo.    "mrp控制者

      ASSIGN COMPONENT 'MATKL' OF STRUCTURE <dynwa> TO <field>.
      <field> itab-matkl.    "

      ASSIGN COMPONENT 'WGBEZ' OF STRUCTURE <dynwa> TO <field>.
      <field> itab-wgbez.    "物料组描述

      ASSIGN COMPONENT 'MEINS' OF STRUCTURE <dynwa> TO <field>.
      <field> itab-meins.    "

      ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <dynwa> TO <field>.
      <field> itab-maktx.    "

      CONCATENATE 'DAY' itab-psttr INTO wa_flname.
      ASSIGN COMPONENT wa_flname OF STRUCTURE <dynwa> TO <field>.
      <field> itab-gsmng.

      APPEND <dynwa> TO <dynitab>.
      CLEAR <dynwa>.
    ELSE.
      ASSIGN COMPONENT 'GSMNG' OF STRUCTURE <dynwa> TO <field>.
      <field> <field> + itab-gsmng.

      CONCATENATE 'DAY' itab-psttr INTO wa_flname.
      ASSIGN COMPONENT wa_flname OF STRUCTURE <dynwa> TO <field>.
      <field> <field> + itab-gsmng.

      MODIFY <dynitab> FROM <dynwa> INDEX sy-tabix .
      CLEAR <dynwa>.
    ENDIF.
  ENDLOOP.

**********
  LOOP AT <dynitab> INTO <dynwa>.
    ASSIGN COMPONENT 'GSMNG' OF STRUCTURE <dynwa> TO <field>.
    IF <field> > 100 AND <field> < 500.
      CLEAR w_color.
      REFRESH t_color.
      w_color-fname 'GSMNG'.
      w_color-color-col 6.       "<--- colour number
      w_color-color-int 1.       "
      w_color-color-inv 1.
      APPEND w_color TO t_color.
      ASSIGN COMPONENT 'COLOR' OF STRUCTURE  <dynwa> TO <field>.
      <field> t_color.
    ELSEIF <field> >= 500 AND <field> < 800.
      CLEAR w_color.
      REFRESH t_color.
      w_color-fname 'GSMNG'.
      w_color-color-col 5.       "<--- colour number
      w_color-color-int 1.       "
      w_color-color-inv 1.
      APPEND w_color TO t_color.
      ASSIGN COMPONENT 'COLOR' OF STRUCTURE  <dynwa> TO <field>.
      <field> t_color.
    ELSEIF <field> < 5.
      ASSIGN COMPONENT 'CLINE' OF STRUCTURE  <dynwa> TO <field>.
      <field> 'C310'.
    ENDIF.

    REFRESH t_style.
    LOOP AT it_day.
      CONCATENATE 'DAY' it_day-day INTO wa_flname.
      ASSIGN COMPONENT wa_flname OF STRUCTURE <dynwa> TO <field>.
      IF <field> > 20 OR <field> IS INITIAL.
        stylelin-fieldname wa_flname.
        stylelin-style cl_gui_alv_grid=>mc_style_disabled.
        INSERT stylelin INTO TABLE t_style.
        ASSIGN COMPONENT 'STYLE' OF STRUCTURE  <dynwa> TO <field>.
        <field> t_style.
        CLEAR stylelin.
      ENDIF.
    ENDLOOP.

    MODIFY <dynitab> FROM <dynwa>.
  ENDLOOP.

ENDFORM.                    " SUB_DNY_FIELD_UPDATE
原创粉丝点击