原來一直沒用到這麼深,這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.