您的位置:首页 > 其它

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

2011-10-27 15:02 489 查看
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 0 WITH HEADER LINE.

DATA:

wa_flname(11) TYPE c,

wa_field(10),

t_quan TYPE p 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(20) TYPE 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 m 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-repid) VIA 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 i 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(2) INTO 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_data( t_quan ).

compdesc-name = wa_flname.

APPEND compdesc TO components.

ENDLOOP.

compdesc-type ?= cl_abap_typedescr=>describe_by_data( t_style ).

compdesc-name = 'STYLE'. "控制单元格可编辑

APPEND compdesc TO components.

compdesc-type ?= cl_abap_typedescr=>describe_by_data( t_color ).

compdesc-name = 'COLOR'. "控制单元格颜色

APPEND compdesc TO components.

compdesc-type ?= cl_abap_typedescr=>describe_by_data( tline ).

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=>create( components ).

cl_tabl = cl_abap_tabledescr=>create( cl_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_flname) = itab-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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: