ABAP 물타기/ALV
ALV : class alv f4
물타기
2011. 8. 5. 14:54
f4를 사용자의 요구에 맞게 개발하거나 f4 이벤트 후의 후속 작업을 하기 위해 사용된다.
dictionary 테이블의 필드에 있는 search help를 그대로 사용할 수 있고,
내가 데이터를 직접 만들어서 display 해줄 수도 있다.
연계작업으로 f4 이벤트 뿐 아니라 onchanged 이벤트도 대부분 필요 하다.
possible 엔트리 외의 기타데이터를 입력할 경우 validation check가 가능하기 때문이다.
먼저 fieldcatalog 에 아래의 속성을 지정해준다. (F4AVAILABL)
아래는 필자가 사용하는 템플릿이므로 적절히 자신이 사용하는 템플릿에 맞추도록 하자.
'S' 'RE_CODE' ' ',
' ' 'COLTEXT' TEXT-D19,
' ' 'EDIT' 'X',
' ' 'F4AVAILABL' 'X',
'E' 'KEY' ' ',
' ' 'COLTEXT' TEXT-D19,
' ' 'EDIT' 'X',
' ' 'F4AVAILABL' 'X',
'E' 'KEY' ' ',
다음은 f4를 사용하기 위해 등록 해주어야 한다.
힌트를 주자면 아래 소스는 layout 작업과 함께 하면 될 것 이다.
그리고 주의 해야할 것은 alv grid 단위로 등록 된다는 점이다.
핸들러 등록도 잊지 말자.
PERFORM alv_register_f4_fields USING pa_grid.
SET HANDLER gs_event_receiver->handle_onf4 FOR pa_grid.
FORM alv_register_f4_fields USING pa_grid TYPE REF TO cl_gui_alv_grid.
PERFORM alv_get_event_grid. "호출한 그리드 세팅
CASE pa_grid.
WHEN grid2.
PERFORM alv_set_f4_field USING 'RE_CODE'.
ENDCASE.
CALL METHOD pa_grid->register_f4_for_fields
EXPORTING
it_f4 = gt_alv_f4[].
ENDFORM. " P3040_REGISTER_F4_FIELDS
SET HANDLER gs_event_receiver->handle_onf4 FOR pa_grid.
FORM alv_register_f4_fields USING pa_grid TYPE REF TO cl_gui_alv_grid.
PERFORM alv_get_event_grid. "호출한 그리드 세팅
CASE pa_grid.
WHEN grid2.
PERFORM alv_set_f4_field USING 'RE_CODE'.
ENDCASE.
CALL METHOD pa_grid->register_f4_for_fields
EXPORTING
it_f4 = gt_alv_f4[].
ENDFORM. " P3040_REGISTER_F4_FIELDS
이제 이벤트를 작성해준다.
FORM alv_onf4 USING e_fieldname TYPE lvc_fname
e_fieldvalue TYPE lvc_value
es_row_no TYPE lvc_s_roid
er_event_data TYPE REF TO cl_alv_event_data
et_bad_cells TYPE lvc_t_modi
e_display TYPE c.
DATA : ls_object TYPE objec,
ls_bad_cells TYPE lvc_s_modi,
lt_objects TYPE TABLE OF objec WITH HEADER LINE.
REFRESH : et_bad_cells, gt_fields.
CLEAR : gv_index, gv_svalue.
PERFORM alv_get_event_grid. "호출한 ALV 찾음
CASE gv_gui_obj.
WHEN grid2.
CASE e_fieldname.
WHEN 'RE_CODE'.
PERFORM CALL_ALV_F4_0100_RE_CODE USING es_row_no.
ENDCASE.
ENDCASE.
ENDFORM.
FORM CALL_ALV_F4_0100_RE_CODE USING pa_row TYPE lvc_s_roid.
DATA : lt_return TYPE TABLE OF ddshretval WITH HEADER LINE.
DATA: BEGIN OF LT_QPCD OCCURS 0,
KATALOGART LIKE QPCD-KATALOGART,
CODEGRUPPE LIKE QPCD-CODEGRUPPE,
CODE LIKE QPCD-CODE , "코드
KURZTEXT LIKE QPCT-KURZTEXT , "내역
END OF LT_QPCD.
DATA : lt_return_tab LIKE TABLE OF ddshretval WITH HEADER LINE.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE LT_QPCD
FROM QPCD
WHERE KATALOGART = GC_TYPE
AND CODEGRUPPE = GC_GROUP
.
LOOP AT LT_QPCD.
SELECT SINGLE KURZTEXT
INTO LT_QPCD-KURZTEXT
FROM QPCT
WHERE KATALOGART = LT_QPCD-KATALOGART
AND CODEGRUPPE = LT_QPCD-CODEGRUPPE
AND CODE = LT_QPCD-CODE
AND SPRACHE = SY-LANGU.
IF SY-SUBRC = 0.
MODIFY LT_QPCD TRANSPORTING KURZTEXT.
ENDIF.
ENDLOOP.
"아래 부분이 화면에 보여줄 SEARCH HELP LIST
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'CODE'
value_org = 'S'
TABLES
value_tab = LT_QPCD
return_tab = lt_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc = 0. " AND return_tab-fieldval <> ''.
READ TABLE lt_return INDEX 1.
IF SY-SUBRC = 0.
GT_DETAIL-RE_CODE = lt_return-fieldval.
SELECT SINGLE KURZTEXT
INTO GT_DETAIL-RE_CODETXT
FROM QPCT
WHERE KATALOGART = GC_TYPE
AND CODEGRUPPE = GC_GROUP
AND CODE = lt_return-fieldval
AND SPRACHE = SY-LANGU.
GT_DETAIL-RE_TYPE = GC_TYPE.
GT_DETAIL-RE_GROUP = GC_GROUP.
MODIFY GT_DETAIL INDEX pa_row-row_id
TRANSPORTING RE_TYPE RE_GROUP RE_CODE RE_CODETXT.
ENDIF.
ENDIF.
"refresh를 잊지말자
PERFORM alv_efresh_table_display USING grid2.
ENDFORM.
e_fieldvalue TYPE lvc_value
es_row_no TYPE lvc_s_roid
er_event_data TYPE REF TO cl_alv_event_data
et_bad_cells TYPE lvc_t_modi
e_display TYPE c.
DATA : ls_object TYPE objec,
ls_bad_cells TYPE lvc_s_modi,
lt_objects TYPE TABLE OF objec WITH HEADER LINE.
REFRESH : et_bad_cells, gt_fields.
CLEAR : gv_index, gv_svalue.
PERFORM alv_get_event_grid. "호출한 ALV 찾음
CASE gv_gui_obj.
WHEN grid2.
CASE e_fieldname.
WHEN 'RE_CODE'.
PERFORM CALL_ALV_F4_0100_RE_CODE USING es_row_no.
ENDCASE.
ENDCASE.
ENDFORM.
FORM CALL_ALV_F4_0100_RE_CODE USING pa_row TYPE lvc_s_roid.
DATA : lt_return TYPE TABLE OF ddshretval WITH HEADER LINE.
DATA: BEGIN OF LT_QPCD OCCURS 0,
KATALOGART LIKE QPCD-KATALOGART,
CODEGRUPPE LIKE QPCD-CODEGRUPPE,
CODE LIKE QPCD-CODE , "코드
KURZTEXT LIKE QPCT-KURZTEXT , "내역
END OF LT_QPCD.
DATA : lt_return_tab LIKE TABLE OF ddshretval WITH HEADER LINE.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE LT_QPCD
FROM QPCD
WHERE KATALOGART = GC_TYPE
AND CODEGRUPPE = GC_GROUP
.
LOOP AT LT_QPCD.
SELECT SINGLE KURZTEXT
INTO LT_QPCD-KURZTEXT
FROM QPCT
WHERE KATALOGART = LT_QPCD-KATALOGART
AND CODEGRUPPE = LT_QPCD-CODEGRUPPE
AND CODE = LT_QPCD-CODE
AND SPRACHE = SY-LANGU.
IF SY-SUBRC = 0.
MODIFY LT_QPCD TRANSPORTING KURZTEXT.
ENDIF.
ENDLOOP.
"아래 부분이 화면에 보여줄 SEARCH HELP LIST
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'CODE'
value_org = 'S'
TABLES
value_tab = LT_QPCD
return_tab = lt_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc = 0. " AND return_tab-fieldval <> ''.
READ TABLE lt_return INDEX 1.
IF SY-SUBRC = 0.
GT_DETAIL-RE_CODE = lt_return-fieldval.
SELECT SINGLE KURZTEXT
INTO GT_DETAIL-RE_CODETXT
FROM QPCT
WHERE KATALOGART = GC_TYPE
AND CODEGRUPPE = GC_GROUP
AND CODE = lt_return-fieldval
AND SPRACHE = SY-LANGU.
GT_DETAIL-RE_TYPE = GC_TYPE.
GT_DETAIL-RE_GROUP = GC_GROUP.
MODIFY GT_DETAIL INDEX pa_row-row_id
TRANSPORTING RE_TYPE RE_GROUP RE_CODE RE_CODETXT.
ENDIF.
ENDIF.
"refresh를 잊지말자
PERFORM alv_efresh_table_display USING grid2.
ENDFORM.
다음은 dictionary에서 직접 가져와서 설정하는 방법이다.
FORM CALL_ALV_F4_0100_LGORT USING pa_row TYPE lvc_s_roid.
DATA : lt_return_tab LIKE TABLE OF ddshretval WITH HEADER LINE.
READ TABLE GT_DATA INDEX pa_row-row_id.
CHECK sy-subrc = 0.
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = 'T001L'
fieldname = 'LGORT'
TABLES
return_tab = lt_return_tab.
LOOP AT lt_return_tab.
CASE lt_return_tab-FIELDNAME.
WHEN 'WERKS'.
GT_DATA-WERKS = lt_return_tab-FIELDVAL.
WHEN 'LGORT'.
GT_DATA-LGORT = lt_return_tab-FIELDVAL.
WHEN 'LGOBE'.
GT_DATA-LGOBE = lt_return_tab-FIELDVAL.
ENDCASE.
ENDLOOP.
READ TABLE GT_T001W WITH KEY WERKS = GT_DATA-WERKS.
IF SY-SUBRC = 0.
GT_DATA-NAME1 = GT_T001W-NAME1.
ENDIF.
MODIFY GT_DATA INDEX pa_row-row_id
TRANSPORTING WERKS LGORT LGOBE NAME1.
PERFORM alv_efresh_table_display USING grid1.
ENDFORM.
DATA : lt_return_tab LIKE TABLE OF ddshretval WITH HEADER LINE.
READ TABLE GT_DATA INDEX pa_row-row_id.
CHECK sy-subrc = 0.
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = 'T001L'
fieldname = 'LGORT'
TABLES
return_tab = lt_return_tab.
LOOP AT lt_return_tab.
CASE lt_return_tab-FIELDNAME.
WHEN 'WERKS'.
GT_DATA-WERKS = lt_return_tab-FIELDVAL.
WHEN 'LGORT'.
GT_DATA-LGORT = lt_return_tab-FIELDVAL.
WHEN 'LGOBE'.
GT_DATA-LGOBE = lt_return_tab-FIELDVAL.
ENDCASE.
ENDLOOP.
READ TABLE GT_T001W WITH KEY WERKS = GT_DATA-WERKS.
IF SY-SUBRC = 0.
GT_DATA-NAME1 = GT_T001W-NAME1.
ENDIF.
MODIFY GT_DATA INDEX pa_row-row_id
TRANSPORTING WERKS LGORT LGOBE NAME1.
PERFORM alv_efresh_table_display USING grid1.
ENDFORM.