1.实现效果
2.代码
DATA: BEGIN OF GT_SFLIGHT OCCURS 0,
BOX TYPE C.
INCLUDE STRUCTURE SFLIGHT.
DATA STYLE TYPE LVC_T_STYL.
DATA: END OF GT_SFLIGHT.
DATA: GS_LAYOUT_LVC TYPE LVC_S_LAYO, "显示布局参数
GT_FIELDCAT_LVC TYPE LVC_T_FCAT WITH HEADER LINE, "字段
GS_SETTING TYPE LVC_S_GLAY,
O_GRID TYPE REF TO CL_GUI_ALV_GRID, "ALV对象
GT_STYLE TYPE LVC_T_STYL. "编辑模式控制表
DATA: GT_ROW_ID TYPE LVC_T_ROW, "需要在changed获取编辑的行信息,changed change_finished使用;否则可能因为F4搜索帮助导致行ID异常
GV_ROW TYPE I,
GV_COL TYPE I.
"定义fieldcat脚本
DEFINE INIT_FIELDCAT.
CLEAR: GT_FIELDCAT_LVC.
GT_FIELDCAT_LVC-FIELDNAME = &1. "字段名
GT_FIELDCAT_LVC-COLTEXT = &2. "列标题Title
GT_FIELDCAT_LVC-REF_TABLE = &3. "内部表字段的参考表名称
GT_FIELDCAT_LVC-REF_FIELD = &4. "内部表字段的参考字段名称
GT_FIELDCAT_LVC-NO_ZERO = &5. "为输出隐藏零 X:隐藏
GT_FIELDCAT_LVC-NO_CONVEXT = &6. "是否应用转换出口函数 X:开启
GT_FIELDCAT_LVC-EDIT = &7. "编辑模式
GT_FIELDCAT_LVC-F4AVAILABL = &8. "是否字段帮助
CASE GT_FIELDCAT_LVC-FIELDNAME.
WHEN 'BOX'.
GT_FIELDCAT_LVC-TECH = 'X'. "技术字段
* GT_FIELDCAT_LVC-checkbox = 'X'.
WHEN OTHERS.
ENDCASE.
APPEND GT_FIELDCAT_LVC.
END-OF-DEFINITION.
INITIALIZATION.
AT SELECTION-SCREEN OUTPUT.
AT SELECTION-SCREEN.
START-OF-SELECTION.
PERFORM FRM_SET_LAYOUT. "设置layout
PERFORM FRM_SET_FIELDCAT. "设置Fieldcatlog
PERFORM FRM_SET_SETTING. "参数回调
PERFORM FRM_GET_DATA. "获取数据
PERFORM FRM_PROC_DATA. "处理数据,增加单元格编辑参数
END-OF-SELECTION.
PERFORM FRM_DISPLAY_ALV.
*__________________________________form____________________________*
FORM FRM_SET_LAYOUT .
* GS_LAYOUT_LVC-BOX_FNAME = 'BOX'.
GS_LAYOUT_LVC-ZEBRA = 'X'.
GS_LAYOUT_LVC-CWIDTH_OPT = 'X'.
* GS_LAYOUT_LVC-SEL_MODE = 'D'.
*1、sapce,等同于B,默认的设置。
*2、A(行与列的选择,无法选择单元格)。
*3、B(单选,不可以多选行,不可以多选单元格)。
*4、C(多选行、列,不可以多选单元格)。
*5、D(多选行、列,还可以多选单元格)。
GS_LAYOUT_LVC-STYLEFNAME = 'STYLE'. "设置内表中单元格编辑的控制字段
ENDFORM.
FORM FRM_SET_FIELDCAT .
"USE CLASS CL_ABAP_TYPEDESCR Dynamic table
* DATA: LT_TABLE_TYPE TYPE REF TO CL_ABAP_TABLEDESCR,
* LS_STRUCT_TYPE TYPE REF TO CL_ABAP_STRUCTDESCR,
* lt_comp_table TYPE cl_abap_structdescr=>component_table.
*
* LT_TABLE_TYPE ?= CL_ABAP_TABLEDESCR=>DESCRIBE_BY_DATA( GT_SFLIGHT ).
* LS_STRUCT_TYPE ?= LT_TABLE_TYPE->GET_TABLE_LINE_TYPE( ).
* lt_comp_table[] = LS_STRUCT_TYPE->GET_COMPONENTS( ).
INIT_FIELDCAT:
'BOX' '复选框' '' '' '' '' 'X' 'X',
'CARRID' '航线代码' 'SFLIGHT' 'CARRID' '' '' 'X' 'X',
'CONNID' '航班连接编号' 'SFLIGHT' 'CONNID' '' '' 'X' 'X',
'FLDATE' '航班日期' 'SFLIGHT' 'FLDATE' '' '' 'X' 'X',
'PRICE' '航空运费' 'SFLIGHT' 'PRICE' '' '' 'X' 'X',
'CURRENCY' '航班的本地货币 ' 'SFLIGHT' 'CURRENCY' '' '' 'X' 'X',
'PLANETYPE' '飞机类型' 'SFLIGHT' 'PLANETYPE' '' '' 'X' 'X',
'SEATSMAX' '经济舱的最大容量 ' 'SFLIGHT' 'SEATSMAX' '' '' 'X' 'X',
'SEATSOCC' '占据的经济舱座位' 'SFLIGHT' 'SEATSOCC' '' '' 'X' 'X',
'PAYMENTSUM' '当前预定总数' 'SFLIGHT' 'PAYMENTSUM' '' '' 'X' 'X',
'SEATSMAX_B' '商务舱的最大容量 ' 'SFLIGHT' 'SEATSMAX_B' '' '' 'X' 'X',
'SEATSOCC_B' '占据的商务舱座位' 'SFLIGHT' 'SEATSOCC_B' '' '' 'X' 'X',
'SEATSMAX_F' '头等舱的最大容量 ' 'SFLIGHT' 'SEATSMAX_F' '' '' 'X' 'X',
'SEATSOCC_F' '占据的头等舱座位' 'SFLIGHT' 'SEATSOCC_F' '' '' 'X' 'X'.
ENDFORM.
FORM FRM_GET_DATA .
SELECT *
FROM SFLIGHT
INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT UP TO 50 ROWS.
ENDFORM.
FORM FRM_DISPLAY_ALV .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_PF_STATUS_SET = 'FRM_PF_STATUS'
I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND'
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
I_GRID_SETTINGS = GS_SETTING "设置参数回调,屏幕修改值,自动保存到ALV 内表
IS_LAYOUT_LVC = GS_LAYOUT_LVC
IT_FIELDCAT_LVC = GT_FIELDCAT_LVC[]
* I_DEFAULT = 'X'
I_SAVE = 'A' "Variant能保存
TABLES
T_OUTTAB = GT_SFLIGHT[]
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
FORM FRM_SET_SETTING .
GS_SETTING-EDT_CLL_CB = 'X'.
ENDFORM.
FORM FRM_PF_STATUS USING I_IT_EXTAB TYPE SLIS_T_EXTAB. "设置状态栏
DATA: I_IS_EXTAB LIKE LINE OF I_IT_EXTAB.
I_IS_EXTAB = '&ABC'.
APPEND I_IS_EXTAB TO I_IT_EXTAB.
IF 1 = 2.
SET PF-STATUS 'STANDARD'.
ELSE.
SET PF-STATUS 'STANDARD' EXCLUDING I_IT_EXTAB.
ENDIF.
ENDFORM.
FORM FRM_USER_COMMAND USING I_UCOMM TYPE SY-UCOMM
IS_SELFIELD TYPE SLIS_SELFIELD. "响应user_command
DATA: LV_UCOMM TYPE SY-UCOMM.
DATA: LV_ROW TYPE I,
LV_COL TYPE I.
LV_UCOMM = I_UCOMM.
IF O_GRID IS INITIAL. "获取绑定ALV对象
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = O_GRID.
ENDIF.
CALL METHOD O_GRID->GET_CURRENT_CELL "获取选中单元格
IMPORTING
E_ROW = LV_ROW
E_COL = LV_COL.
LV_COL = LV_COL + 1. "如果设置了BOX字段GT_FIELDCAT_LVC-TECH = 'X';列号-1
CLEAR: GT_SFLIGHT,GT_FIELDCAT_LVC.
READ TABLE GT_SFLIGHT[] INTO GT_SFLIGHT INDEX LV_ROW. "获取style
READ TABLE GT_FIELDCAT_LVC[] INTO GT_FIELDCAT_LVC INDEX LV_COL. "获取fieldname
CASE LV_UCOMM.
WHEN '&EDIT'.
PERFORM FRM_MODIFY_STYLE USING GT_FIELDCAT_LVC-FIELDNAME 'X' CHANGING GT_SFLIGHT-STYLE.
WHEN '&DISPLAY'.
PERFORM FRM_MODIFY_STYLE USING GT_FIELDCAT_LVC-FIELDNAME '' CHANGING GT_SFLIGHT-STYLE.
WHEN OTHERS.
ENDCASE.
MODIFY GT_SFLIGHT[] FROM GT_SFLIGHT INDEX LV_ROW TRANSPORTING STYLE . "回写值到ALV内表
IS_SELFIELD-REFRESH = 'X'.
IS_SELFIELD-COL_STABLE = 'X'.
IS_SELFIELD-ROW_STABLE = 'X'.
ENDFORM.
FORM FRM_PROC_DATA .
LOOP AT GT_SFLIGHT.
PERFORM FRM_INIT_STYLE USING 'BOX' 'X' CHANGING GT_STYLE. "参数:字段名 是否EDIT模式 编辑参数缓存表 CHECK BOX始终可编辑
IF GT_SFLIGHT-CARRID = 'AA'.
PERFORM FRM_INIT_STYLE USING 'CARRID' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'CONNID' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'FLDATE' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'PRICE' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'CURRENCY' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'PLANETYPE' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSMAX' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSOCC' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'PAYMENTSUM' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSMAX_B' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSOCC_B' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSMAX_F' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSOCC_F' '' CHANGING GT_STYLE.
ELSE.
PERFORM FRM_INIT_STYLE USING 'CARRID' 'X' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'CONNID' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'FLDATE' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'PRICE' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'CURRENCY' 'X' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'PLANETYPE' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSMAX' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSOCC' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'PAYMENTSUM' 'X' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSMAX_B' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSOCC_B' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSMAX_F' '' CHANGING GT_STYLE.
PERFORM FRM_INIT_STYLE USING 'SEATSOCC_F' '' CHANGING GT_STYLE.
ENDIF.
GT_SFLIGHT-STYLE = GT_STYLE. "参数写入到行
MODIFY GT_SFLIGHT. "存入ALV数据表
CLEAR GT_STYLE. "清楚缓存
ENDLOOP.
ENDFORM.
FORM FRM_INIT_STYLE USING VALUE(P1)
VALUE(P2)
CHANGING OT_STYLE TYPE LVC_T_STYL.
DATA:LS_STYLE TYPE LVC_S_STYL.
LS_STYLE-FIELDNAME = P1.
IF P2 = 'X'.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. "开启编辑模式
ELSE.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "关闭编辑模式
ENDIF.
INSERT LS_STYLE INTO TABLE OT_STYLE. "INSERT操作,APPEND对于sort表可能出现异常
CLEAR LS_STYLE.
ENDFORM.
FORM FRM_MODIFY_STYLE USING VALUE(P1)
VALUE(P2)
CHANGING OT_STYLE TYPE LVC_T_STYL.
DATA:LS_STYLE TYPE LVC_S_STYL.
LS_STYLE-FIELDNAME = P1.
IF P2 = 'X'.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. "开启编辑模式
ELSE.
LS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "关闭编辑模式
ENDIF.
MODIFY OT_STYLE FROM LS_STYLE TRANSPORTING STYLE WHERE FIELDNAME = P1."修改指定行指定字段编辑参数
CLEAR LS_STYLE.
ENDFORM.