RoadRunner написал:
Оказалось проще, чем я думал... Хэндл даже не нужен, если сразу можно получить указатель на объект грида. Теперь возникает другая проблема.
Допустим, в гриде 5 строк. Пользователь заполняет в 1, 4 и 5 строчках некоторые данные, затем (не нажимая энтер) нажимает кнопку сохранения. Данные во внутр. таблице еще не обновились. Как проще сделать соответствие того, что на экране, тому, что во внутр. таблице? Послать гриду ок-код энтера? Или можно сделать assign отображаемой таблице, а затем в цикле загнать соотв. значения во внутр.?
Code:
TYPE-POOLS: SLIS, KKBLO.
DATA: LT_EVENTS TYPE SLIS_T_EVENT,
LS_EVENT TYPE SLIS_ALV_EVENT.
DATA: LS_LAYOUT TYPE SLIS_LAYOUT_ALV,
LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
DATA: GT_FIELDCATALOG TYPE LVC_T_FCAT,
IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
PRN LIKE SY-REPID,
IT LIKE LINE OF IT_FIELDCAT,
GT LIKE LINE OF GT_FIELDCATALOG.
CLEAR: LT_EVENTS. REFRESH LT_EVENTS.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
I_LIST_TYPE = 1
IMPORTING
ET_EVENTS = LT_EVENTS.
CLEAR LS_EVENT.
READ TABLE LT_EVENTS WITH KEY NAME = 'DATA_CHANGED'
INTO LS_EVENT.
IF SY-SUBRC = 0.
DELETE LT_EVENTS WHERE NAME = 'DATA_CHANGED'.
MOVE 'DATA_CHANGED' TO LS_EVENT-NAME.
MOVE 'EDITDATA' TO LS_EVENT-FORM.
APPEND LS_EVENT TO LT_EVENTS.
ENDIF.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = PRN
IS_LAYOUT = LS_LAYOUT
I_SAVE = 'A'
IT_EVENTS = LT_EVENTS[]
IT_FIELDCAT = IT_FIELDCAT[]
I_CALLBACK_USER_COMMAND = 'USCOM'
I_CALLBACK_PF_STATUS_SET = 'SETPF'
TABLES
T_OUTTAB = TB.
FORM EDITDATA USING RR_DATA_CHANGED TYPE REF TO
CL_ALV_CHANGED_DATA_PROTOCOL.
* Здесь можно вообще ничего не писать,
* данные всё равно обновятся
ENDFORM. "EDITDATA
FORM USCOM USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
DATA: L_GRID TYPE REF TO CL_GUI_ALV_GRID.
* Это нужно, чтобы данные обновились,
* при нажатию на пользовательскую кнопку
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = L_GRID.
CALL METHOD L_GRID->CHECK_CHANGED_DATA.
RS_SELFIELD-REFRESH = 'X'.
ENDFORM.