ALV单元格级别控制

来源:互联网 发布:程序员教程 第四版 编辑:程序博客网 时间:2024/05/21 20:25
一般而言,alv某列可编辑,就是如下:
DATA: wa_fieldcatalog   TYPE lvc_s_fcat,   "显示数据列内表工作区域
     it_fieldcatalog    TYPElvc_t_fcat.    "显示数据列内表

if &1 eq 'AAA'.
    wa_fieldcatalog-edit    = 'X'.             "可编辑
endif.

然后有时候需要的是,某行的某列数据为特定值的时候才可以编辑,其他时候不可编辑。

这里说明一下是:REUSE_ALV_GRID_DISPLAY是细化不到具体单元格的,
使用REUSE_ALV_GRID_DISPLAY_LVC可以

其实思想跟table control 单元格控制思想差不太多;
都是循环数据内表,等数据满足时,去修改显示的属性;
table control 单元格级别控制可见:
http://blog.sina.com.cn/s/blog_c0978c9b0101gbsu.html

此处大概写下alv的单元格级别控制

*&---------------------------------------------------------------------*
*& Report  YLM_0003
*& http://blog.sina.com.cn/sapliumeng
*&---------------------------------------------------------------------*
*& created by lium 
*& ALV单元格控制
*&---------------------------------------------------------------------*

REPORT  YLM_0003.


DATA:BEGIN OF GS_DATA.
        INCLUDE STRUCTURE SPFLI.
DATA  CELL_STYLE TYPE LVC_T_STYL                   "为内表添加设置编辑状态所需的字段
     END OF GS_DATA.
     
     
"alv数据变量
DATALT_DATA     LIKE  TABLE OF GS_DATA.
DATALW_DATA     LIKE  LINE OF LT_DATA.

"alv变量
DATA:
      LT_FIELDCAT    TYPE LVC_T_FCAT            "显示数据列内表
      LW_FIELDCAT    LIKE LINE OF LT_FIELDCAT   "显示数据列内表工作区域
      L_LAYOUT       TYPE LVC_S_LAYO.

DATALW_STYLELIN TYPE LVC_S_STYL.


FIELD-SYMBOLS《L_DATA》 LIKE LINE OF LT_DATA.“因英文版单括号会被html误解析,特使用《》

DEFINE MAC_FIELDLOG.
  LW_FIELDCAT-FIELDNAME &1 "字段名称
  LW_FIELDCAT-REPTEXT   &2 "标题

 "设置复选框可编辑
  IF &1 EQ 'CARRID'.
    LW_FIELDCAT-EDIT          'X'.
  ENDIF.
  APPEND LW_FIELDCAT TO LT_FIELDCAT.

  CLEAR LW_FIELDCAT.
END-OF-DEFINITION.

START-OF-SELECTION.

  SELECT FROM SPFLI INTO CORRESPONDING FIELDS OF TABLE LT_DATA.

  MAC_FIELDLOG:
  'CARRID    '航线承运人ID ',
  'CONNID    '航班连接 Id  ',
  'COUNTRYFR '国家键值     ',
  'CITYFROM  '起飞城市     ',
  'AIRPFROM  '起飞机场     '.



  LOOP AT LT_DATA ASSIGNING《L_DATA》 .

    LW_STYLELIN-FIELDNAME 'CARRID'需要编辑的列名

    IF《L_DATA》-CARRID 'LH3'.
     LW_STYLELIN-STYLE CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. 设置为可编辑状态
    ELSE.
      LW_STYLELIN-STYLE CL_GUI_ALV_GRID=>MC_STYLE_DISABLED设置为可编辑状态
    ENDIF.

    APPEND LW_STYLELIN TO《L_DATA》-CELL_STYLE.
    CLEAR LW_STYLELIN.
  ENDLOOP.


  L_LAYOUT-STYLEFNAME 'CELL_STYLE'                  将内表中的字段名存入显示格式

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'"调用函数

      EXPORTING

       IT_FIELDCAT_LVC    LT_FIELDCAT

        IS_LAYOUT_LVC      L_LAYOUT

      TABLES
        T_OUTTAB           LT_DATA

      EXCEPTIONS

        PROGRAM_ERROR      1

        OTHERS             2.

  IF SY-SUBRC <> 0.
Implement suitable error handling here
  ENDIF.



这里说明下:
我最开始的时候,没有加下面这句话
 "设置复选框可编辑
  IF &1 EQ 'CARRID'.
    LW_FIELDCAT-EDIT          'X'.
  ENDIF.
而是直接使用的
   IF -CARRID 'LH3'.
    LW_STYLELIN-STYLE CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. 设置为可编辑状态
    ELSE.
      LW_STYLELIN-STYLE CL_GUI_ALV_GRID=>MC_STYLE_DISABLED设置为可编辑状态
    ENDIF.

发现没起到作用,所有单元格都是不可编辑的
应该是 LW_STYLELIN-STYLE CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. 设置为可编辑状态
这句话没起到作用。

具体我没有细研究。

目前测试,把  
 IF &1 EQ 'CARRID'.
    LW_FIELDCAT-EDIT          'X'.
  ENDIF.

让该列所有单元格可编辑,然后使用
LW_STYLELIN-STYLE CL_GUI_ALV_GRID=>MC_STYLE_DISABLED
是可以控制不需要编辑的。

这种是可以实现的。



0 0
原创粉丝点击