1.ALV某列可以编辑.
很简单在FIELDCAT中设置EDIT属性为X就可以了。
2.ALV某行可以编辑.
要在ALV数据内表中添加一个字段参考内表类(LVC_T_STYL)
并且在ALV的LAYOUT部分指示出控制是否可编辑的字段名字
3.ALV某个单元格可以编辑.
控制单元格和行的控制一样
如果控制到行和单元格,就不能用以前那个’REUSE_ALV_GRID_DISPLAY’了,
要用增强的函数‘REUSE_ALV_GRID_DISPLAY_LVC’.
如果大家还有更好的方法,请多多指教。
下面是执行后的效果图:
INCLUDE <icon>.
INCLUDE <symbol>.
TYPE-POOLS:slis.
TABLES:
SPFLI.
TYPES:
BEGIN OF TYP_SPFLI,
CARRID TYPE SPFLI-CARRID,
CONNID TYPE SPFLI-CONNID,
COUNTRYFR TYPE SPFLI-COUNTRYFR,
COUNTRYTO TYPE SPFLI-COUNTRYTO,
CITYFROM TYPE SPFLI-CITYFROM,
CITYTO TYPE SPFLI-CITYTO,
END OF TYP_SPFLI,
BEGIN OF TYP_OUTPUT,
ICON TYPE icon_d,
SYMBOL TYPE icon_d,
CARRID TYPE SPFLI-CARRID,
CONNID TYPE SPFLI-CONNID,
COUNTRYFR TYPE SPFLI-COUNTRYFR,
COUNTRYTO TYPE SPFLI-COUNTRYTO,
CITYFROM TYPE SPFLI-CITYFROM,
CITYTO TYPE SPFLI-CITYTO,
STYLE TYPE LVC_T_STYL, “FOR DISABLE
END OF TYP_OUTPUT.
DATA:
TH_SPFLI TYPE TYP_SPFLI,
TD_SPFLI TYPE TABLE OF TYP_SPFLI,
TH_STYLE TYPE LVC_S_STYL,
TD_STYLE TYPE TABLE OF LVC_S_STYL,
TH_LAYOUT TYPE LVC_S_LAYO,
TH_FIELDCAT TYPE LVC_S_FCAT,
TD_FIELDCAT TYPE TABLE OF LVC_S_FCAT,
TH_OUTPUT TYPE TYP_OUTPUT,
TD_OUTPUT TYPE TABLE OF TYP_OUTPUT.
START-OF-SELECTION.
SELECT-OPTIONS:
S_CARRID FOR SPFLI-CARRID,
S_CONNID FOR SPFLI-CONNID.
PERFORM FRM_GET_DATA.
PERFORM FRM_EDIT_DATA.
PERFORM FRM_DISPLAY_DATA.
*&———————————————————————*
*& Form FRM_GET_DATA
*&———————————————————————*
* GET MAIN DATA
*———————————————————————-*
FORM FRM_GET_DATA .
SELECT CARRID
CONNID
COUNTRYFR
COUNTRYTO
CITYFROM
CITYTO
INTO TABLE TD_SPFLI
FROM SPFLI
WHERE CARRID IN S_CARRID
AND CONNID IN S_CONNID.
IF SY-SUBRC <> 0.
MESSAGE S001 DISPLAY LIKE ‘E’.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM. ” FRM_GET_DATA
*&———————————————————————*
*& Form FRM_DISPLAY_DATA
*&———————————————————————*
* text
*———————————————————————-*
* –> p1 text
* <– p2 text
*———————————————————————-*
FORM FRM_DISPLAY_DATA .
PERFORM FRM_SET_TITLE.
PERFORM FRM_SET_FIELDCAT.
PERFORM FRM_CALL_FUNCTION.
ENDFORM. ” FRM_DISPLAY_DATA
*&———————————————————————*
*& Form FRM_SET_TITLE
*&———————————————————————*
* text
*———————————————————————-*
* –> p1 text
* <– p2 text
*———————————————————————-*
FORM FRM_SET_TITLE .
TH_LAYOUT-STYLEFNAME = ‘STYLE’.
TH_LAYOUT-GRID_TITLE = ‘行列单元格编辑控制’.
TH_LAYOUT-CWIDTH_OPT = ‘X’.
ENDFORM. ” FRM_SET_TITLE
*&———————————————————————*
*& Form FRM_SET_FIELDCAT
*&———————————————————————*
* text
*———————————————————————-*
* –> p1 text
* <– p2 text
*———————————————————————-*
FORM FRM_SET_FIELDCAT .
PERFORM FRM_SET_VALUE USING ‘1′ ‘ICON’ ‘ICON’ ‘5′ ‘ ‘.
PERFORM FRM_SET_VALUE USING ‘2′ ‘SYMBOL’ ‘SYMBOL’ ‘5′ ‘ ‘.
PERFORM FRM_SET_VALUE USING ‘3′ ‘CARRID’ ‘航线承运人ID’ ‘3′ ”.
PERFORM FRM_SET_VALUE USING ‘4′ ‘CONNID’ ‘航班连接 Id’ ‘4′ ”.
PERFORM FRM_SET_VALUE USING ‘5′ ‘COUNTRYFR’ ‘国家代码FROM’ ‘3′ ”.
PERFORM FRM_SET_VALUE USING ‘6′ ‘COUNTRYTO’ ‘国家代码TO’ ‘3′ ”.
PERFORM FRM_SET_VALUE USING ‘7′ ‘CITYFROM’ ‘起飞城市’ ‘20′ ”.
PERFORM FRM_SET_VALUE USING ‘8′ ‘CITYTO’ ‘目标城市’ ‘20′ ”.
ENDFORM. ” FRM_SET_FIELDCAT
*&———————————————————————*
*& Form FRM_SET_VALUE
*&———————————————————————*
* text
*———————————————————————-*
* –>P_COL_POS text NO_ROWMARK
* –>P_FIELDNAME text
* –>P_SELTEXT_L text
* –>P_OUTPUTLEN text
*———————————————————————-*
FORM FRM_SET_VALUE USING I_COL_POS
I_FIELDNAME
I_SELTEXT
I_OUTPUTLEN
I_CHECKBOX.
TH_FIELDCAT-COL_POS = I_COL_POS.
TH_FIELDCAT-FIELDNAME = I_FIELDNAME.
TH_FIELDCAT-SCRTEXT_M = I_SELTEXT.
TH_FIELDCAT-OUTPUTLEN = I_OUTPUTLEN.
IF I_FIELDNAME = ‘CARRID’.
TH_FIELDCAT-EDIT = ‘X’.
ELSEIF I_FIELDNAME = ‘CHECK’.
TH_FIELDCAT-SCRTEXT_M = ‘SELECT’.
TH_FIELDCAT-CHECKBOX = ‘X’.
TH_FIELDCAT-OUTPUTLEN = 1.
TH_FIELDCAT-EDIT = ‘X’.
ELSEIF I_FIELDNAME = ‘ICON’.
TH_FIELDCAT-icon = ‘X’.
ELSEIF I_FIELDNAME = ‘SYMBOL’.
TH_FIELDCAT-symbol = ‘X’.
ENDIF.
APPEND TH_FIELDCAT TO TD_FIELDCAT.
CLEAR TH_FIELDCAT.
ENDFORM. ” FRM_SET_VALUE
*&———————————————————————*
*& Form FRM_CALL_FUNCTION
*&———————————————————————*
* text
*———————————————————————-*
* –> p1 text
* <– p2 text
*———————————————————————-*
FORM FRM_CALL_FUNCTION .
* call function ‘REUSE_ALV_GRID_DISPLAY’
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY_LVC’
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_USER_COMMAND = ‘FRM_SET_COMMAND’
IS_LAYOUT_LVC = TH_LAYOUT
IT_FIELDCAT_LVC = TD_FIELDCAT
I_SAVE = ‘A’
TABLES
T_OUTTAB = TD_OUTPUT
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. ” FRM_CALL_FUNCTION
*&———————————————————————*
*& Form FRM_EDIT_DATA
*&———————————————————————*
* text
*———————————————————————-*
* –> p1 text
* <– p2 text
*———————————————————————-*
FORM FRM_EDIT_DATA .
DATA:
LW_INDEX TYPE SY-INDEX,
LW_MOD TYPE I.
LOOP AT TD_SPFLI INTO TH_SPFLI.
LW_INDEX = SY-TABIX.
LW_MOD = LW_INDEX MOD 3.
IF LW_MOD <> 0.
TH_OUTPUT-ICON = ICON_TIME.
TH_OUTPUT-SYMBOL = SYM_LEFT_HAND.
ELSE.
TH_OUTPUT-ICON = ICON_COLOR.
TH_OUTPUT-SYMBOL = sym_folder.
ENDIF.
IF TH_SPFLI-COUNTRYTO = ‘DE’ .
PERFORM FRM_SET_ENABLED USING ‘COUNTRYTO’.
PERFORM FRM_SET_ENABLED USING ‘CITYTO’.
ENDIF.
IF TH_SPFLI-CONNID = ‘2436′.
PERFORM FRM_SET_ENABLED USING ‘COUNTRYFR’.
PERFORM FRM_SET_ENABLED USING ‘CITYFROM’.
ENDIF.
IF TH_SPFLI-CARRID = ‘SQ’.
PERFORM FRM_SET_DISABLED USING ‘CARRID’.
ENDIF.
IF TH_SPFLI-CARRID = ‘DL’.
PERFORM FRM_SET_ENABLED USING ‘ICON’.
PERFORM FRM_SET_ENABLED USING ‘SYMBOL’.
PERFORM FRM_SET_ENABLED USING ‘CARRID’.
PERFORM FRM_SET_ENABLED USING ‘CONNID’.
PERFORM FRM_SET_ENABLED USING ‘COUNTRYFR’.
PERFORM FRM_SET_ENABLED USING ‘COUNTRYTO’.
PERFORM FRM_SET_ENABLED USING ‘CITYFROM ‘.
PERFORM FRM_SET_ENABLED USING ‘CITYTO’.
ENDIF.
MOVE-CORRESPONDING TH_SPFLI TO TH_OUTPUT.
TH_OUTPUT-STYLE[] = TD_STYLE[].
REFRESH:
TD_STYLE.
APPEND TH_OUTPUT TO TD_OUTPUT.
CLEAR:
LW_INDEX,
LW_MOD,
TH_OUTPUT.
ENDLOOP.
ENDFORM. ” FRM_EDIT_DATA
FORM FRM_SET_COMMAND USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN ‘&IC1′. “双击事件
* READ TABLE itab INTO wa INDEX rs_selfield-tabindex.
*
* SET PARAMETER ID ‘BLN’ FIELD wa-belnr.
* SET PARAMETER ID ‘BUK’ FIELD wa-bukrs.
* SET PARAMETER ID ‘GJR’ FIELD wa-gjahr.
*
* CALL TRANSACTION ‘FB03′ AND SKIP FIRST SCREEN.
ENDCASE.
ENDFORM.
*&———————————————————————*
*& Form FRM_SET_ENABLED
*&———————————————————————*
* text
*———————————————————————-*
* –>P_0447 text
*———————————————————————-*
FORM FRM_SET_ENABLED USING I_NAME.
TH_STYLE-FIELDNAME = I_NAME.
TH_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
“set field to disabled
APPEND TH_STYLE TO TD_STYLE.
CLEAR TH_STYLE.
ENDFORM. ” FRM_SET_ENABLED
*&———————————————————————*
*& Form FRM_SET_DISABLED
*&———————————————————————*
* text
*———————————————————————-*
* –>I_NAME text
*———————————————————————-*
FORM FRM_SET_DISABLED USING I_NAME.
TH_STYLE-FIELDNAME = I_NAME.
TH_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
“set field to disabled
APPEND TH_STYLE TO TD_STYLE.
CLEAR TH_STYLE.
ENDFORM. ” FRM_SET_DISABLED
REPORT zppr050.
TABLES: zgnn_stock.
DATA: it_zgnn_stock1 LIKE zgnn_stock OCCURS 0 WITH HEADER LINE.
DATA: BEGIN OF it_zgnn_stock OCCURS 0.
INCLUDE STRUCTURE zgnn_stock.
DATA:style TYPE lvc_t_styl,"FOR DISABLE
END OF it_zgnn_stock .
DATA: it_stock LIKE it_zgnn_stock OCCURS 0 WITH HEADER LINE.
DATA: it_del LIKE zgnn_stock OCCURS 0 WITH HEADER LINE.
*-------------------ALV显示变量----------------------------------------*
DATA: wa_fieldcat TYPE lvc_s_fcat. "定义一个显示内表的一行
DATA: i_fieldcat TYPE TABLE OF lvc_s_fcat. "定义显示一列的框架
DATA: i_layout TYPE lvc_s_layo . "布局
DATA: i_repid LIKE sy-repid.
DATA: th_style TYPE lvc_s_styl,
td_style TYPE TABLE OF lvc_s_styl.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
START-OF-SELECTION.
PERFORM get_data.
PERFORM get_display.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data .
SELECT * INTO CORRESPONDING FIELDS OF TABLE it_zgnn_stock
FROM zgnn_stock.
SORT it_zgnn_stock BY cusnumber matnr1 matnr.
it_stock[] = it_zgnn_stock[].
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form GET_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_display .
PERFORM frm_set_title . " 这段代码也是控制行是否可以编辑
PERFORM build_field.
* i_layout-colwidth_optimize = 'X'.
* i_layout-info_fieldname = 'LINE_COL'.
* i_layout-zebra = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = i_layout
it_fieldcat_lvc = i_fieldcat
i_callback_pf_status_set = 'SET_PF_STATUS'
i_callback_user_command = 'F_USER_COMMAND'
i_save = 'A'
* i_default = 'X'
TABLES
t_outtab = it_zgnn_stock
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " GET_DISPLAY
*&---------------------------------------------------------------------*
*& Form BUILD_FIELD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM build_field .
DEFINE alv_field.
clear wa_fieldcat .
wa_fieldcat-fieldname = &1.
if &1 = 'BALANCE'.
wa_fieldcat-edit = &2.
endif.
wa_fieldcat-scrtext_m = &3.
wa_fieldcat-outputlen = &4.
append wa_fieldcat to i_fieldcat .
END-OF-DEFINITION.
alv_field 'CUSNUMBER' 'X' 'Customer part number' '15'.
alv_field 'MATNR1' 'X' 'Material Number' '15'.
alv_field 'MATNR' 'X' 'Material Number' '15'.
alv_field 'BALANCE' 'X' 'Quantity' '15'.
ENDFORM. " BUILD_FIELD
*&---------------------------------------------------------------------*
*& Form set_pf_status
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD'.
ENDFORM. "set_pf_status
*&---------------------------------------------------------------------*
*& Form f_user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_UCOMM text
* -->P_RS_SELFIELD text
*----------------------------------------------------------------------*
FORM f_user_command USING p_ucomm TYPE sy-ucomm
p_rs_selfield TYPE slis_selfield .
CASE p_ucomm.
WHEN '&ADD'.
DATA: l_grid TYPE REF TO cl_gui_alv_grid.
*------------将ALV上修改的内容保存到内表---------------------------------*
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = l_grid.
CALL METHOD l_grid->check_changed_data.
PERFORM frm_set_enabled USING 'CUSNUMBER'. " 这段代码也是控制行是否可以编辑
PERFORM frm_set_enabled USING 'MATNR1'. " 这段代码也是控制行是否可以编辑
PERFORM frm_set_enabled USING 'MATNR'. " 这段代码也是控制行是否可以编辑
PERFORM frm_set_enabled USING 'BALANCE'. " 这段代码也是控制行是否可以编辑
it_zgnn_stock-style[] = td_style[].
APPEND it_zgnn_stock.
REFRESH:td_style.
WHEN 'SAVE'.
PERFORM get_save.
WHEN '&DEL'. "**Delete
FIELD-SYMBOLS: <fs_msg> LIKE LINE OF it_zgnn_stock.
**读取选中的一行
READ TABLE it_zgnn_stock ASSIGNING <fs_msg> INDEX p_rs_selfield-tabindex.
IF sy-subrc EQ 0.
MOVE-CORRESPONDING <fs_msg> TO it_del.
APPEND it_del. CLEAR it_del.
DELETE TABLE it_zgnn_stock FROM <fs_msg>.
ENDIF.
ENDCASE.
p_rs_selfield-refresh = 'X' . " 当用户在显式界面上对数据进行修改时,同时内表中的数据也随之刷新
ENDFORM. "f_user_command
*&---------------------------------------------------------------------*
*& Form FRM_SET_TITLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_set_title .
i_layout-stylefname = 'STYLE'.
i_layout-grid_title = '行列单元格编辑控制'.
i_layout-cwidth_opt = 'X'.
ENDFORM. " FRM_SET_TITLE
*&---------------------------------------------------------------------*
*& Form FRM_SET_ENABLED
*&---------------------------------------------------------------------*
* text
*********改变AVL属性,如下为可以修改
*----------------------------------------------------------------------*
* -->P_0222 text
*----------------------------------------------------------------------*
FORM frm_set_enabled USING i_name.
th_style-fieldname = i_name.
th_style-style = cl_gui_alv_grid=>mc_style_enabled.
APPEND th_style TO td_style.
CLEAR th_style.
ENDFORM. " FRM_SET_ENABLED
*&---------------------------------------------------------------------*
*& Form frm_set_disabled
*&---------------------------------------------------------------------*
* text
****改变ALV属性,如下为不可以修改
*----------------------------------------------------------------------*
* -->I_NAME text
*----------------------------------------------------------------------*
FORM frm_set_disabled USING i_name.
th_style-fieldname = i_name.
th_style-style = cl_gui_alv_grid=>mc_style_disabled.
"set field to disabled
APPEND th_style TO td_style.
CLEAR th_style.
ENDFORM. "frm_set_disabled
*&---------------------------------------------------------------------*
*& Form GET_SAVE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_save .
DATA: l_grid TYPE REF TO cl_gui_alv_grid.
DATA l_matnr LIKE mara-matnr.
DATA l_matnr1 LIKE mara-matnr.
DATA: fs_msg2 LIKE zgnn_stock.
DATA: BEGIN OF message OCCURS 0,
message TYPE c LENGTH 255,
END OF message.
DATA l_message(255) TYPE c.
*------------将ALV上修改的内容保存到内表---------------------------------*
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = l_grid.
CALL METHOD l_grid->check_changed_data.
LOOP AT it_zgnn_stock .
MOVE-CORRESPONDING it_zgnn_stock TO fs_msg2.
READ TABLE it_stock WITH KEY cusnumber = fs_msg2-cusnumber matnr1 = fs_msg2-matnr1 matnr = fs_msg2-matnr .
IF sy-subrc EQ 0.
MODIFY zgnn_stock FROM fs_msg2."Changed
COMMIT WORK.
ELSE.
CLEAR: l_matnr,l_matnr1.
SELECT SINGLE matnr INTO l_matnr1
FROM mara
WHERE matnr = fs_msg2-matnr1.
IF sy-subrc NE 0.
CLEAR: message ,l_message.
CONCATENATE fs_msg2-matnr1 'is not exist !' INTO l_message SEPARATED BY space.
message-message = l_message.
APPEND message. CLEAR message.
CONTINUE.
ENDIF.
SELECT SINGLE matnr INTO l_matnr
FROM mara
WHERE matnr = fs_msg2-matnr.
IF sy-subrc NE 0.
CLEAR: message ,l_message.
CONCATENATE fs_msg2-matnr 'is not exist !' INTO l_message SEPARATED BY space.
message-message = l_message.
APPEND message. CLEAR message.
CONTINUE.
ENDIF.
MODIFY zgnn_stock FROM fs_msg2."Insert
COMMIT WORK.
ENDIF.
ENDLOOP.
LOOP AT it_del."Delete
DELETE zgnn_stock FROM it_del.
ENDLOOP.
READ TABLE message INDEX 1.
IF sy-subrc EQ 0.
MESSAGE message-message TYPE 'I'.
ELSE.
MESSAGE 'Save data is OK !' TYPE 'S'.
ENDIF.
ENDFORM. " GET_SAVE