메뉴 건너뛰기

SAP 한국 커뮤니티



ABAP [Dictionary] Search Help Coding

문바이 2012.04.02 22:21 조회 수 : 12886 추천:3

누구나 알고있는 내용을 정리해 보았습니다.

 

Search Help개체를 사용하지 않고 프로그램을 구성하는 방법.


1) Selection-Screen을 구상한후 명령어를 통해 해당 화면을 구성한다. 
2) Selection-Screen의 구성원중 F4(Input Help)를 구성할 항목을 선택한 후 Event 처리 루틴을 삽입한다.
 사용자가 F4(Input Help/ Possible Entry)를 누른경우를 Event처리한다.

At SELECTION-SCREEN On VALUE-REQUEST FOR s_connid-low.
   PERFORM SS_VALUE_REQUEST_S_CONNID.

 

  문법설명(Type-1 Event처리에 대한 이해가 필요합니다. 영문법으로 나누어 봅시다)

   At SELECTION-SCREEN : At (Selection-Screen)  => Selection Screen에서
   On Value-Request : On ( Value-Request) => Value-Request(값의 요청, Input Help, F4, Possible Entry)에 대해서.
   FOR s_connid : For( s_connid) => 개체 s_connid-low 를 위해서.
   Perform ss_value_request_s_connid. 를 수행해라.


3) Perform SS_VALUE_REQUEST_S_CONNID를 구성한다.
   가) 현시점에서의 Selection-Screen에 있는 화면 Field의 내용을 읽어들인다.
       CALL FUNCTION 'DYNP_VALUES_READ'
         EXPORTING
           DYNAME                               = sy-cprog
           DYNUMB                               = sy-dynnr
           TRANSLATE_TO_UPPER         = 'X'
           REQUEST                              = 'A'
         TABLES
           DYNPFIELDS                           = LT_DYREAD .
    
       READ TABLE LT_DYREAD WITH KEY fieldname = 'S_CARRID-LOW'.
       lt_carrid = LT_DYREAD-fieldvalue.            
   나) 앞선 데이타를 기준으로 Data Select를 수행한다.
       if lv_s1 is INITIAL.
         lv_s1 = '%'.
       endif.
       SELECT CONNID FLDATE
           INTO CORRESPONDING FIELDS OF TABLE lt_v1
         FROM SFLIGHT
       WHERE CARRID like LV_S1.            
   다-1) 화면에 표시할수 방법(1)

     [VALUE_ORG       = 'S'  ] / 장점 : 쉽고 빠르게 적용할수 있다 / 단점 : Return값이 1개이고, Field이름을 정의가 안된다
       CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
         EXPORTING
           RETFIELD           = 'CD'                     Value_tab 의 Internal Table에서 사용자가 선택후 되돌려줄 Field Name.
           DYNPPROG        = SY-REPID
           DYNPNR             = SY-DYNNR
           DYNPROFIELD    = 'S_PROD3'           RETFIELD 에 의해 선택된 값이 화면상에 들어올 개체이름. -Low/-High가 의미가 없음
           WINDOW_TITLE   = '제품그룹3 선택'     PopUp 제목
           VALUE_ORG       = 'S'                      Return종류 C [Cell], S[Structure]
         TABLES
           VALUE_TAB       = LT_F4                  화면에 표시될 itab (내 마음대로 정의한 itab사용가능)
           RETURN_TAB      = LT_F4_RETURN    POP후 선택된 값이 들어올 테이블.
         EXCEPTIONS
           PARAMETER_ERROR = 1
           NO_VALUES_FOUND = 2
           OTHERS          = 3.            
   다-2) 화면에 표시할수 방법(2)

    [VALUE_ORG       = 'C'  ] / 장점 : Return값이 n개 이상 이고/ Field이름을 정의가 된다 / 단점 : 다소복잡하다
        화면에 Display되어 있는 데이타를 읽어들인다.
           CALL FUNCTION 'DYNP_VALUES_READ'
             EXPORTING
               DYNAME                               = sy-cprog
               DYNUMB                               = sy-dynnr
               TRANSLATE_TO_UPPER                   = 'X'
               REQUEST                              = 'A'
             TABLES
               DYNPFIELDS                           = LT_DYREAD.
          
            READ TABLE LT_DYREAD WITH KEY FIELDNAME = 'P_USER01'.
            IF not lt_dyread-fieldvalue is INITIAL.
              lv_carrid = lt_dyread-fieldvalue.
            ELSE.
              lv_carrid = '%'.
            ENDIF.            

        화면에 읽어온 데이타를 바탕으로 화면에 뿌려줄 데이타를 가공한다.
            DATA : BEGIN OF lt_popup OCCURS 0,  팝업의 데이타를 가지고 있을 테이블
                             datas(20) type c,
                       END OF lt_popup.

 

        팝업으로  뿌려줄 데이타를 가공한다.
           SELECT *
             FROM SFLIGHT
             INTO CORRESPONDING FIELDS OF TABLE lt_sflight
            WHERE CARRID LIKE lv_carrid.
       
           데이타를 가공한다. (열로 나열한다)
           LOOP AT lt_sflight.
             lt_popup-datas = lt_sflight-carrid.
             append lt_popup.
             lt_popup-datas = lt_sflight-connid.
             append lt_popup.
             lt_popup-datas = lt_sflight-fldate.
             append lt_popup.
           ENDLOOP.     

        
        화면에 뿌려질 Field Cataloge를 작성한다.
            DATA : lt_field like STANDARD TABLE OF DFIES      INITIAL SIZE 0 with HEADER LINE.

             화면에 표시될 Field정보를 가공한다.
              CALL FUNCTION 'DDIF_FIELDINFO_GET' 테이블 명과 field명을 제공하면 기본정보를 가져온다
                EXPORTING
                  TABNAME    = 'SFLIGHT'
                  FIELDNAME  = 'CARRID'
                  LFIELDNAME = 'CARRID'
              IMPORTING
                DFIES_WA = lt_field.
         
              LT_FIELD-SCRTEXT_S = '내맘대로001'.
              LT_FIELD-SCRTEXT_M = '내맘대로001'.
              LT_FIELD-SCRTEXT_L = '내맘대로001'.
              LT_FIELD-REPTEXT   = '내맘대로001'.
              APPEND LT_FIELD.     

        
        Return값을 늘리기 위해 Mapping 용 테이블에 데이타를 넣는다.
             DATA : lt_map   like STANDARD TABLE OF DSELC      INITIAL SIZE 0 with HEADER LINE.

             사용자가 데이타를 선택한후 화면필드와 매치시킬 mapping을 작성한다.
             lt_map-fldname   = 'CARRID'.
             lt_map-dyfldname = 'P_USER01'.
             append lt_map.
         
             lt_map-fldname   = 'CONNID'.
             lt_map-dyfldname = 'P_USER02'.
             append lt_map.            


        화면에 Popup을 올린다.
             CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
               EXPORTING
                 RETFIELD               = 'FLDATE'
                 WINDOW_TITLE           = 'SFLIGHT 필터링된내용' 팝업제목
               TABLES
                 VALUE_TAB              =  lt_popup
                 FIELD_TAB              =  lt_field
                 RETURN_TAB             =  lt_rtn
                 DYNPFLD_MAPPING        =  lt_map

             
        가져온 데이타를 화면에 넣어준다.
             DATA : LT_UPDATE LIKE DYNPREAD OCCURS 0 WITH HEADER LINE. Dynp_values_read/화면데이타 쓰기용

             lt_update-FIELDNAME   = 'P_USER01'.
             READ TABLE lt_rtn with key RETFIELD = lt_update-fieldname.
             IF SY-SUBRC = 0.
               lt_update-FIELDVALUE  = lt_rtn-fieldval.
               APPEND lt_update.
             endif.
        
             lt_update-FIELDNAME   = 'P_USER02'.
             READ TABLE lt_rtn with key RETFIELD = lt_update-fieldname.
             IF SY-SUBRC = 0.
               lt_update-FIELDVALUE  = lt_rtn-fieldval.
               APPEND lt_update.
             endif.
        
             화면에 데이타를 기록한다.
             CALL FUNCTION 'DYNP_VALUES_UPDATE'
               EXPORTING
                 DYNAME                     = SY-CPROG
                 DYNUMB                     = SY-DYNNR
               TABLES
                 DYNPFIELDS                 = lt_update.