ALV单元格级别控制

一般而言,alv某列可编辑,就是如下:
DATA: wa_fieldcatalog     TYPE lvc_s_fcat,     "显示数据列内表工作区域
      it_fieldcatalog     TYPE lvc_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数据变量
DATA : LT_DATA          LIKE   TABLE  OF GS_DATA .
DATA : LW_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 .

DATA : LW_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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值