原来一直没用到这么深,这2天开始关注这块,基本上搞清楚了。
1、使用的ABAP ALV 控件是: REUSE_ALV_GRID_DISPLAY_LVC 。
2、DEMO程序运行后的效果,等于4700000005的PO,PO ITEM列的单元格时可以编辑的:
3、注意内存数据结构,这个清楚了,就很好理解是怎么玩的。在数据表的每一行末,还有一个小表,这个表存放这一行中哪些字段可编辑,哪些不可编辑的信息(所以需要表数据)。程序工作起来,需要控制每一行末的这张EDIT小表,给它相应的数据,才能控制单元格的编辑状态。
4、对于REUSE_ALV_GRID_DISPLAY_LVC函数,我目前只能打开一整列为可编辑状态,然后关闭不编辑的单元格。
全部DEMO的程序,如果你没有PO数据,换一个有数据的client试:
REPORT ZALV2.
TYPES:BEGIN OF GS_TYPE,
EBELN TYPE EKKO-EBELN,
VERKF TYPE EKKO-VERKF,
STYLE TYPE LVC_T_STYL, "设置编辑状态字段
END OF GS_TYPE.
DATA:GT_TABLE TYPE STANDARD TABLE OF GS_TYPE,
GS_TABLE TYPE GS_TYPE.
DATA:GIT_FCAT TYPE LVC_T_FCAT,
GWA_FCAT LIKE LINE OF GIT_FCAT,
GWA_LAYOUT TYPE LVC_S_LAYO,
GWA_GLAY TYPE LVC_S_GLAY.
DATA:GS_EDIT TYPE LVC_S_STYL,
GT_EDIT TYPE LVC_T_STYL.
START-OF-SELECTION.
SELECT EBELN
VERKF
INTO CORRESPONDING FIELDS OF TABLE GT_TABLE
FROM EKKO
UP TO 10 ROWS.
GS_EDIT-FIELDNAME = 'VERKF'.
GS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED."设置为不可编辑
INSERT GS_EDIT INTO TABLE GT_EDIT.
LOOP AT GT_TABLE INTO GS_TABLE.
IF GS_TABLE-EBELN <> '4700000005'.
GS_TABLE-STYLE = GT_EDIT.
ENDIF.
MODIFY GT_TABLE FROM GS_TABLE TRANSPORTING STYLE.
ENDLOOP.
PERFORM FRM_SET_CATALOG.
GWA_LAYOUT-ZEBRA = 'X'.
GWA_LAYOUT-SEL_MODE = 'A'.
GWA_LAYOUT-CWIDTH_OPT = 'X'.
GWA_LAYOUT-EDIT = ''. "将整个ALV设置成可编辑
GWA_LAYOUT-STYLEFNAME = 'STYLE'. "指定保存编辑状态的字段名
GWA_GLAY-EDT_CLL_CB = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
IS_LAYOUT_LVC = GWA_LAYOUT "参数
IT_FIELDCAT_LVC = GIT_FCAT "参数表
* I_GRID_SETTINGS = GWA_GLAY
TABLES
T_OUTTAB = GT_TABLE[]
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC = 0.
ENDIF.
*&---------------------------------------------------------------------*
*& FORM FRM_SET_CATALOG
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM FRM_SET_CATALOG .
DATA:L_POS TYPE I VALUE 1.
CLEAR: L_POS.
L_POS = L_POS + 1.
GWA_FCAT-COLTEXT = 'PO'.
GWA_FCAT-SCRTEXT_L = 'PO'.
GWA_FCAT-SCRTEXT_M = 'PO'.
GWA_FCAT-SCRTEXT_S = 'PO'.
GWA_FCAT-FIELDNAME = 'EBELN'.
GWA_FCAT-COL_POS = L_POS.
GWA_FCAT-OUTPUTLEN = '10'.
APPEND GWA_FCAT TO GIT_FCAT.
L_POS = L_POS + 1.
GWA_FCAT-COLTEXT = 'PO ITEM'.
GWA_FCAT-SCRTEXT_L = 'PO ITEM'.
GWA_FCAT-SCRTEXT_M = 'PO ITEM'.
GWA_FCAT-SCRTEXT_S = 'PO ITEM'.
GWA_FCAT-FIELDNAME = 'VERKF'.
GWA_FCAT-EDIT = 'X'. "将这列设置为可编辑
GWA_FCAT-COL_POS = L_POS.
GWA_FCAT-OUTPUTLEN = '20'.
APPEND GWA_FCAT TO GIT_FCAT.
ENDFORM.