1、表结构如下
2、效果图如下:
下拉框表示工厂, ##??表示流水线号,按钮分别是提取,保存,删除
代码:
REPORT zppt009a.
INCLUDE zppt009A_top.
INCLUDE zppt009A_getdata.
INCLUDE zppt009A_core.
INITIALIZATION.
AT SELECTION-SCREEN OUTPUT.
START-OF-SELECTION.
CALL SCREEN 100.
zppt009A_top包括代码:
*&---------------------------------------------------------------------*
*& 包括 ZPPT009A_TOP
*&---------------------------------------------------------------------*
TYPE-POOLS:slis,vrm.
TABLES sscrfields.
TABLES:zppt009a.
DATA:gt_fcat TYPE lvc_t_fcat,
gs_layout TYPE lvc_s_layo,
wa_fieldcat TYPE lvc_s_fcat,
tmp_fieldcat TYPE lvc_t_fcat,
gt_fieldcat TYPE lvc_t_fcat,
gt_exclude TYPE ui_functions,
alv_grid TYPE REF TO cl_gui_alv_grid,
container TYPE scrfname VALUE 'ZSR1',
custom_container TYPE REF TO cl_gui_custom_container.
DATA:ls_layout TYPE disvariant.
DATA: ok_code LIKE sy-ucomm,
save_ok LIKE ok_code.
DATA: c_form_name TYPE tdsfname,
c_form_title TYPE string.
DATA: z_werks LIKE marc-werks, z_assline LIKE zppt009a-asslinename.
DATA: itab LIKE TABLE OF zppt009a WITH HEADER LINE.
DATA: it_out LIKE TABLE OF zppt009a WITH HEADER LINE.
DATA: BEGIN OF wa_werks,
werks LIKE t001w-werks,
name1 LIKE t001w-name1,
END OF wa_werks.
DATA:it_werks LIKE TABLE OF wa_werks WITH HEADER LINE.
CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA:
gi_index_rows TYPE lvc_t_row,
g_selected_row LIKE lvc_s_row.
*----------------------------------------------------------------------*
* CLASS lcl_event_receiver DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_data_changed
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_data_changed.
PERFORM handle_data_changed USING er_data_changed.
ENDMETHOD. "handle_data_changed
ENDCLASS. "lcl_event_receiver IMPLEMENTATION
DATA: g_alv_application TYPE REF TO lcl_event_receiver.
DATA:
o_event_receiver TYPE REF TO lcl_event_receiver.
DATA:zcw TYPE lvc_t_cell,
wa_cw TYPE lvc_s_cell.
zppt009A_getdata.包含代码
*&---------------------------------------------------------------------*
*& 包括 ZPPT009A_GETDATA
*&---------------------------------------------------------------------*
FORM getdata.
IF z_werks IS INITIAL AND z_assline IS INITIAL.
SELECT
asslineno
werks
asslinename
arbpl
zstatus
INTO CORRESPONDING FIELDS OF TABLE itab FROM zppt009a.
ELSEIF z_werks IS INITIAL AND z_assline IS NOT INITIAL.
SELECT
asslineno
werks
asslinename
arbpl
zstatus
INTO CORRESPONDING FIELDS OF TABLE itab FROM zppt009a WHERE asslineno = z_assline.
ELSEIF z_werks IS NOT INITIAL AND z_assline IS INITIAL.
SELECT
asslineno
werks
asslinename
arbpl
zstatus
INTO CORRESPONDING FIELDS OF TABLE itab FROM zppt009a WHERE werks = z_werks.
ELSE.
SELECT
asslineno
werks
asslinename
arbpl
zstatus
INTO CORRESPONDING FIELDS OF TABLE itab FROM zppt009a WHERE werks = z_werks AND asslineno = z_assline.
ENDIF.
ENDFORM. "getdata
*&---------------------------------------------------------------------*
*& Form alvdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM alvdata.
DATA:it_fcat TYPE lvc_t_fcat WITH HEADER LINE,
ls_fcat TYPE lvc_s_fcat,
l_col_pos LIKE lvc_s_fcat-col_pos,
l_tabix LIKE sy-tabix.
CLEAR gt_fcat[].
CLEAR ls_fcat.
ls_fcat-fieldname = 'CHE'.
ls_fcat-coltext = '选择'.
ls_fcat-checkbox = 'X'.
ls_fcat-outputlen = 4.
ls_fcat-edit = 'X'.
APPEND ls_fcat TO gt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'WERKS'.
ls_fcat-coltext = '工厂'.
ls_fcat-outputlen = 6.
ls_fcat-edit = 'X'.
ls_fcat-ref_field = 'WERKS'.
ls_fcat-ref_table = 'T001W'.
APPEND ls_fcat TO gt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'ASSLINENAME'.
ls_fcat-coltext = '流水线'.
ls_fcat-outputlen = 10.
ls_fcat-edit = 'X'.
APPEND ls_fcat TO gt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'ARBPL'.
ls_fcat-coltext = '工作中心'.
ls_fcat-outputlen = 12.
ls_fcat-edit = 'X'.
"ls_fcat-ref_table = 'CRHD'.
"ls_fcat-ref_field = 'ARBPL'.
APPEND ls_fcat TO gt_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'ZSTATUS'.
ls_fcat-coltext = '状态'.
ls_fcat-drdn_hndl = '1'."下拉选项
ls_fcat-outputlen = 4.
ls_fcat-edit = 'X'.
APPEND ls_fcat TO gt_fcat.
CLEAR ls_fcat.
ENDFORM. "alvdata
*&---------------------------------------------------------------------*
*& Form prepare_drilldown_values
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM prepare_drilldown_values.
DATA: lt_ddval TYPE lvc_t_drop.
DATA: ls_ddval TYPE lvc_s_drop.
ls_ddval-handle = 1.
ls_ddval-value = 'Y'.
APPEND ls_ddval TO lt_ddval.
ls_ddval-handle = 1.
ls_ddval-value = 'N'.
APPEND ls_ddval TO lt_ddval.
CALL METHOD alv_grid->set_drop_down_table( it_drop_down = lt_ddval ).
ENDFORM. "prepare_drilldown_values
zppt009A_core.包含代码
*&---------------------------------------------------------------------*
*& 包括 ZPPT009A_CORE
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS '009'.
SET TITLEBAR 'T009'.
ENDMODULE. "status_0100 OUTPUT
*----------------------------------------------------------------------*
* MODULE user_command_0100 INPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN '&BACK' OR '&EXIT' OR '&CANCEL'.
LEAVE TO SCREEN 0.
WHEN 'ZGET'.
PERFORM getdata.
WHEN 'ZSAVE'.
CALL METHOD alv_grid->check_changed_data.
PERFORM savedata.
WHEN 'ZDEL'.
PERFORM deldata.
ENDCASE.
ENDMODULE. "user_command_0100 INPUT
*&---------------------------------------------------------------------*
*& Form savedata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM savedata.
DATA : b TYPE i.
DATA: tb_asslineno TYPE zppt009a-asslineno.
DATA:s_werks TYPE zppt009a-werks, s_mess(20) TYPE c.
DESCRIBE TABLE itab LINES b.
IF b > 0.
LOOP AT itab.
SELECT SINGLE werks INTO s_werks FROM zppt009a WHERE werks = itab-werks AND asslinename = itab-asslinename.
IF s_werks IS INITIAL.
tb_asslineno = itab-asslineno.
IF tb_asslineno IS INITIAL OR tb_asslineno = ''.
CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
EXPORTING
object = 'ZSERIALNO'
EXCEPTIONS
foreign_lock = 1
object_not_found = 2
system_failure = 3
OTHERS = 4.
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = '00'
object = 'ZSERIALNO'
ignore_buffer = 'X'
IMPORTING
number = tb_asslineno
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4
quantity_is_not_1 = 5
interval_overflow = 6
buffer_overflow = 7
OTHERS = 8.
CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
EXPORTING
object = 'ZSERIALNO'.
SHIFT tb_asslineno LEFT DELETING LEADING '0'.
itab-asslineno = tb_asslineno.
MODIFY itab.
ENDIF.
ELSE.
* DATA: s_mess1(20) TYPE c.
* s_mess1 = ''.
* CONCATENATE '工厂' itab-werks '拉号' itab-asslinename '已经存在' INTO s_mess1.
* MESSAGE s_mess1 TYPE 'I'.
EXIT.
ENDIF.
ENDLOOP.
SORT itab BY werks asslinename.
DELETE ADJACENT DUPLICATES FROM itab COMPARING werks asslinename.
MODIFY zppt009a FROM TABLE itab.
IF sy-subrc = 0.
COMMIT WORK.
MESSAGE: '保存成功' TYPE 'I'.
ELSE.
ROLLBACK WORK.
MESSAGE:'保存失败' TYPE 'E'.
ENDIF.
ENDIF.
ENDFORM. "savedata
*&---------------------------------------------------------------------*
*& Form deldata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM deldata.
DATA:a TYPE i.
a = 0.
LOOP AT itab WHERE che EQ 'X'.
a = a + 1.
ENDLOOP.
IF a = 0.
MESSAGE:'请选择需要删除的行项目' TYPE 'E'.
ELSE.
DATA: wl_answer TYPE c.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
text_question = '确定要删除选择的行项目吗?'
icon_button_1 = '确定' "是
icon_button_2 = '不确定'"否
default_button = '2'
display_cancel_button = 'X'
start_column = 25
start_row = 6
IMPORTING
answer = wl_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
CASE wl_answer.
WHEN '1'.
DELETE itab WHERE che <> 'X'.
DELETE zppt009a FROM TABLE itab.
PERFORM getdata.
WHEN '2'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
ENDIF.
ENDFORM. "deldata
*----------------------------------------------------------------------*
* MODULE displayalv OUTPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE displayalv OUTPUT.
IF custom_container IS INITIAL.
CREATE OBJECT custom_container
EXPORTING
container_name = container.
ENDIF.
IF alv_grid IS INITIAL.
CREATE OBJECT alv_grid
EXPORTING
i_parent = custom_container.
ENDIF.
IF g_alv_application IS INITIAL.
CREATE OBJECT g_alv_application.
ENDIF.
SET HANDLER g_alv_application->handle_data_changed FOR alv_grid.
CLEAR gs_layout.
ls_layout-report = sy-repid.
gs_layout-sel_mode = 'C'.
gs_layout-box_fname = 'CHE'.
gs_layout-zebra = 'X'.
PERFORM alvdata.
PERFORM prepare_drilldown_values.
CALL METHOD alv_grid->set_table_for_first_display
EXPORTING
is_layout = gs_layout
it_toolbar_excluding = gt_exclude
i_save = 'A'
CHANGING
it_outtab = itab[]
it_fieldcatalog = gt_fcat[].
CALL METHOD alv_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
ENDMODULE. "displayalv OUTPUT
*&---------------------------------------------------------------------*
*& Form handle_data_changed
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ER_DATA_CHANGED text
*----------------------------------------------------------------------*
FORM handle_data_changed 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. "handle_data_changed
*&---------------------------------------------------------------------*
*& Module create_dropdown_box INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE create_dropdown_box INPUT.
SELECT werks name1 FROM t001w INTO CORRESPONDING FIELDS OF TABLE it_werks.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'WERKS'
value_org = 'S'
TABLES
value_tab = it_werks
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
ENDMODULE. "create_dropdown_box INPUT
screen 100的逻辑流如下
PROCESS BEFORE OUTPUT.
MODULE status_0100.
MODULE displayalv.
PROCESS AFTER INPUT.
MODULE user_command_0100.
PROCESS ON VALUE-REQUEST.
field z_werks MODULE create_dropdown_box.
屏幕设计如下:
工厂下拉框名为Z_WERKS, 选择LIstbox
流水线号名z_assline ,三个按钮分别为zget, zsave, zdel
定制控制位ZSR1