REUSE_ALV_GRID_DISPLAY_LVC 实现单元格级别的显示编辑

1.实现效果

1
2

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.

Guess you like

Origin blog.csdn.net/qq_30797051/article/details/120218597