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'               ' ',


다음은 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


이제 이벤트를 작성해준다.
  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.


  DATABEGIN 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.