쌓고 쌓다

F4IF_INT_TABLE_VALUE_REQUEST VALUE_ORG = 'C' 본문

SAP/ABAP

F4IF_INT_TABLE_VALUE_REQUEST VALUE_ORG = 'C'

승민아 2025. 8. 9. 16:39
반응형

목표

서치헬프

서치헬프 화면에서 김종국을 선택했을때

 

김종국의 사용자ID 뿐만 아니라

사용자명, 이메일 등 부가 정보들도 화면에 넣고 표시되길 원한다.

 

이를위해 서치헬프 펑션을 이용한다.

하지만 평소에 사용자ID처럼 하나의 값만 받아올 수 있음만 알았지만

 

위의 사진처럼 선택된 ROW의 여러 필드 정보들을

서치헬프의 여러개의 값들을

받아올 수 있다.

 

'F4IF_INT_TABLE_VALUE_REQUEST'

인풋 필드에 서치헬프를 달때

'F4IF_INT_TABLE_VALUE_REQUEST' 메소드를 사용한다.

 

이때 호출 파라미터중 VALUE_ORG에 값 'C'를 주게 된다면

선택한 서치헬프의 값을 여러개를 받아 올 수 있다.

 

( 'S'는 Structure로 DDIC_STRUCTURE 파라미터에 입력된 구조를 Hit List 구조로 사용하고,

'C'는 Cell By Cell로 FIELD_TABLE 파라미터에 입력된 구조로 HIt List를 구성한다.)

 

 

즉, 사용자ID에서 서치헬프를 통해

선택한 사용자ID 외에

사용자명, 사용자 주소, 사용자 메일 등 다양한 정보들을 반환 받을 수 있으며

이 정보들을 필드에 할당하여 화면에 표시할 수 도 있다.

 

그 과정을 작성하고자 한다.

 

회사에서 과제로 받은 요구중 일부가 포함되어있어

단순히 서치헬프를 달고 여러값을 반환받는것이 아닌

사용자ID 일부, 사용자명 일부를 통한 서치헬프가 포함되어 있음을 인지하자.

 

독자가 필요한 부분만 읽고 참고하면 될것 같다.!

 

스크린의 서치헬프는

POV 이벤트라고 PROCESS ON VALUE-REQUEST. 블럭에 작성하면된다.

 

서치헬프에 사용될 코드들은

'F4_BOOKING_USERID'라는 이름으로 모듈을 작성한다.

 

아래에서 이제 설명할 코드들은 이 모듈에 포함된 코드들이다.

 

1. 화면의 입력 값 읽어오기

 

'DYNP_VALUES_READ' 펑션을 통해서 화면의 값을 읽어올 수 있다.

SY-CPROG, SY-REPID가 유사한데 다음과 같이 차이가 있다.

 

SY-CPROG : 현재 프로그램을 호출한 프로그램의 ID

SY-REPID : 현재 프로그램의 ID

 

위의 평션을 통해 화면의 값들을 Internal Table 타입인 LT_DYNPFIELDS에 담는다.

 

2. 서치헬프에 표시할 데이터 SELECT (화면의 입력값을 조건으로 씀)

INTO 절에 사용된 Internal Table 타입

서치헬프 반환값으로 사용자ID, 사용자명, 이메일일 필요해서

로컬 타입으로 만들었다.

 

READ TABLE로 화면의 값들을 받아온 LT_DYNPFIELDS에서

필드명 FIELDNAME을 조건으로 사용자가 화면에 입력한 값을 읽어온다.

 

이 입력한 값으로 서치헬프에 표시할 데이터를 SELECT 한다.

 

과제에 사용자ID 또는 사용자명의 일부를 입력된 상황이라

입력값을 가져와서 LIKE 구문을 사용했다.

 

3-1 서치헬프에 뿌려줄 데이터 삽입

타입 선언

F4을 눌러 서치헬프가 떴을때

들어가 있는 데이터들을 삽입해야한다.

 

이를 위해서 위처럼 C 타입으로 화면에 표시될 데이터를 가진 Internal Table을 만든다.

LENGTH는 표시될 데이터 타입의 최대 길이로 설정했다.

사용자ID, 사용자명, 이메일중 이메일이 241자리라서 241로했다.

 

서치헬프에 보여줄 데이터를 LT_USER_SHELP에 담아주면 된다.

이때 서치헬프에 사용자ID, 사용자명, 이메일 순서로 컬럼이 표시되길 원해서

순서에 유의해서 LT_USER_SHELP에 넣는다.

 

3-2 필드 속성 정의

서치헬프에서 컬럼으로 정렬을할때 해당 필드에 대한 속성 정보가 없으면

덤프가 발생한다.

 

필드의 속성을 정의해보자.

 

변수 선언

LT_TABFIELD : 테이블을 통해 가져온 필드 정보들이 담길 Internal Table

LT_SEHFIELD : 서치헬프에 사용될 필드 정보들이 담길 Internal Table

 

'DDIF_FIELDINFO_GET' 펑션을 통해서

테이블에 정의된 필드들을 가지고 필드 속성 정보들을 가져올 수 있다.

 

이렇게 가져온 필드 속성 정보들중에

READ TABLE을 사용하여 내가 서치헬프에 사용할 필드 정보를 가져와

서치헬프에 넘겨줄 필드 속성 정보를 Internal Table에 담아두자.

 

4. 결과 매핑하기

F4를 누르고 서치헬프 창이 뜰텐데

이 창을 통해서 선택한 ROW의 결과 값들을 Internal Table로 받을건데

어떤 필드들의 값들을 결과 Internal Table에 받을 것인지 명시해야한다.

 

변수 선언

 

LS_MAP의

FLDNAME : 서치헬프에 존재하는 필드중 반환 받을 필드명

 

DYFLDNAME는 어디에 사용하는지 모르겠다. 없어도, 이상한 값을 넣어도

서치헬프 결과 값을 반환 받는데는 문제가 없다.

우선 화면에 받을 필드명을 써주었다.

 

DYFLDNAME에 써놓은 값이

나중에 서치헬프 펑션을 통해 결과 값을 받았을때

RETFIELD에 명시되어 결과를 받긴한다.

 

5. 서치헬프 펑션 'F4IF_INT_TABLE_VALUE_REQUEST' 호출

마지막으로

이때까지 설정한 값들을 넣어둔 Internal Table들을 넘겨주면 된다.

 

RETFIELD : 서치헬프에서 반환 받을 필드명

DYNPPROG : 프로그램 ID

DYNPNR : 스크린 번호

VALUE_ORG : 우리는 여러개의 셀 반환값을 받길 원하기에 'C'를 넘겨준다.

 

VALUE_TAB : 서치헬프에 표시될 데이터

FIELD_TAB : 서치헬프 필드 속성 정보

RETURN_TAB : 서치헬프 선택 결과 테이블. 여기에 여러개의 필드값들이 들어온다.

DYNPFLD_MAPPING : 매핑 정보? 아직 이해는 안가나 서치헬프에 받환 받을 필드를 명시한다. 그외는 모르겠다.

 

이까지만하면 RETURN_TAB에서 선택한 ROW의

필드 값들이 들어 있다.

 

이제 화면에 업데이트하는 과정을 보자.

 

6. 화면의 필드에 값 담아주기

변수 선언

 

화면의 값들을 읽을때 LT_DYNPFIELDS를 사용했고

이제 화면의 필드 업데이트를 위해 LT_UPDATE를 사용한다.

 

LS_UPDATE-FIELDNAME : 화면에 업데이트할 필드명을 작성했다.

 

LT_RETURN에는 서치헬프로 선택된 ROW의 여러 필드 값들이 담겨있다.

READ TABLE LT_RETURN으로 화면에 업데이트할 필드값이 담긴 데이터를 찾아주면 된다.

앞전에 LS_MAP-DYFLDNAME에 작성한 값이

LT_RETURN의 RETFIELD에 들어갔으므로

이를 이용해 원하는 필드의 값을 읽어왔다.

 

쉽게 위의 코드는

LS_UPDATE-FIELDNAME : 화면에 업데이트할 필드명

LS_UPDATE-FIELDVALUE : 화면에 업데이트할 필드값

을 설정하는 부분이다.

 

7. 화면의 필드 값 업데이트(반영)

'DYNP_VALUES_UPDATE' 펑션으로 화면에 넣어준 값들을

업데이트하여 화면에 반영해줄 수 있다.

 

DYNPFIELDS에 화면에 업데이트할 값들을 설정해주면 된다.

 

내 기억상 기존에 있는 값들도 LT_UPDATE에 넣어주어야한다.

넣어주지 않으면 기존에 있는 값들은 없어진다.

LT_UPDATE에 명시된 값들로 새로 화면을 그린다고 보면 될 것 같다.

 

전체 코드

더보기

*  C 방법 - 여러개 셀을 반환
  TYPES: BEGIN OF TS_USER,
           USERID   TYPE ZS4H086T04-USERID,
           USERNAME TYPE ZS4H086T04-USERNAME,
           EMAIL    TYPE ZS4H086T04-EMAIL,
         END OF TS_USER.

  TYPES: BEGIN OF TS_VALUE,
           VALUE TYPE C LENGTH 241,
         END OF TS_VALUE.

* 데이터 조회용 테이블
  DATA: LT_USER TYPE TABLE OF TS_USER.

* 화면(서치헬프)에 보여줄 데이터를 가지고 있는 테이블
  DATA: LT_USER_SHELP TYPE TABLE OF TS_VALUE,
        LS_USER_SHELP LIKE LINE OF LT_USER_SHELP.

* 리턴 테이블
  DATA: LT_RETURN TYPE TABLE OF DDSHRETVAL,
        LS_RETURN LIKE LINE OF LT_RETURN.

* 화면 값 읽기, 변경
  DATA: LT_DYNPFIELDS TYPE TABLE OF DYNPREAD,
        LS_DYNPFIELDS LIKE LINE OF LT_DYNPFIELDS,
        LT_UPDATE     TYPE TABLE OF DYNPREAD,
        LS_UPDATE     LIKE LINE OF LT_UPDATE.

* 테이블의 필드 정보 가져올 테이블과 서치헬프의 필드 정보 정의 테이블
  DATA: LT_TABFIELD TYPE TABLE OF DFIES,
        LS_TABFIELD LIKE LINE OF LT_TABFIELD,
        LT_SEHFIELD TYPE TABLE OF DFIES,
        LS_SEHFIELD LIKE LINE OF LT_SEHFIELD.

* RETURN값 MAPPING 용 테이블
  DATA: LT_MAP TYPE TABLE OF DSELC,
        LS_MAP LIKE LINE OF LT_MAP.

  DATA: LV_USERID_INPUT  TYPE STRING,
        LV_USERID_LIKE   TYPE STRING,
        LV_USERNAME_LIKE TYPE STRING.

* 화면의 값을 읽어옴
  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      DYNAME               = SY-CPROG " SY-CPROG : 현재 프로그램을 호출한 프로그램의 ID, SY-REPID : 현재 프로그램의 ID
      DYNUMB               = SY-DYNNR " SY-DYNNR : 현재 스크린 number
      TRANSLATE_TO_UPPER   = 'X'
      REQUEST              = 'A'
    TABLES
      DYNPFIELDS           = LT_DYNPFIELDS " 화면의 값을 반환 받을 Internal Table
    EXCEPTIONS
      INVALID_ABAPWORKAREA = 1
      INVALID_DYNPROFIELD  = 2
      INVALID_DYNPRONAME   = 3
      INVALID_DYNPRONUMMER = 4
      INVALID_REQUEST      = 5
      NO_FIELDDESCRIPTION  = 6
      INVALID_PARAMETER    = 7
      UNDEFIND_ERROR       = 8
      DOUBLE_CONVERSION    = 9
      STEPL_NOT_FOUND      = 10
      OTHERS               = 11.
  IF SY-SUBRC <> 0.
    MESSAGE '화면의 값들을 읽어올 수 없습니다.' TYPE 'I' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

* 필드명으로 화면의 값을 읽어옴
  READ TABLE LT_DYNPFIELDS INTO LS_DYNPFIELDS WITH KEY FIELDNAME = 'ZS4H086T04-USERID'.

  LV_USERID_INPUT = LS_DYNPFIELDS-FIELDVALUE.

  CONCATENATE '%' LV_USERID_INPUT '%' INTO LV_USERID_LIKE.
  CONCATENATE '%' LV_USERID_INPUT '%' INTO LV_USERNAME_LIKE.

* 조건과 일치하는 사용자 정보를 가져옴
  SELECT *
    FROM ZS4H086T04
    INTO CORRESPONDING FIELDS OF TABLE LT_USER
    WHERE USERID LIKE LV_USERID_LIKE
       OR USERNAME LIKE LV_USERNAME_LIKE
    ORDER BY USERID DESCENDING.

* 1. 화면에 뿌려줄 데이터 가공
  LOOP AT LT_USER ASSIGNING FIELD-SYMBOL(<FS_USER>).
    CLEAR LS_USER_SHELP.
    LS_USER_SHELP-VALUE = <FS_USER>-USERID.
    INSERT LS_USER_SHELP INTO TABLE LT_USER_SHELP.

    CLEAR LS_USER_SHELP.
    LS_USER_SHELP-VALUE = <FS_USER>-USERNAME.
    INSERT LS_USER_SHELP INTO TABLE LT_USER_SHELP.

    CLEAR LS_USER_SHELP.
    LS_USER_SHELP-VALUE = <FS_USER>-EMAIL.
    INSERT LS_USER_SHELP INTO TABLE LT_USER_SHELP.
  ENDLOOP.

* 2. 화면에 뿌려줄 필드정보 정의
  CALL FUNCTION 'DDIF_FIELDINFO_GET'
    EXPORTING
      TABNAME        = 'ZS4H086T04'
    TABLES
      DFIES_TAB      = LT_TABFIELD
    EXCEPTIONS
      NOT_FOUND      = 1
      INTERNAL_ERROR = 2
      OTHERS         = 3.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

  CLEAR LS_TABFIELD.
  READ TABLE LT_TABFIELD INTO LS_TABFIELD WITH KEY FIELDNAME = 'USERID'.
  INSERT LS_TABFIELD INTO TABLE LT_SEHFIELD.

  CLEAR LS_TABFIELD.
  READ TABLE LT_TABFIELD INTO LS_TABFIELD WITH KEY FIELDNAME = 'USERNAME'.
  INSERT LS_TABFIELD INTO TABLE LT_SEHFIELD.

  CLEAR LS_TABFIELD.
  READ TABLE LT_TABFIELD INTO LS_TABFIELD WITH KEY FIELDNAME = 'EMAIL'.
  INSERT LS_TABFIELD INTO TABLE LT_SEHFIELD.

* 3. 사용자가 데이터 선택 후 화면 필드와 매핑 시킬 데이터 추가
  CLEAR: LS_MAP.
  LS_MAP-FLDNAME = 'USERID'.
  LS_MAP-DYFLDNAME = 'ZS4H086T04-USERID'.
  INSERT LS_MAP INTO TABLE LT_MAP.

  CLEAR: LS_MAP.
  LS_MAP-FLDNAME = 'USERNAME'.
  LS_MAP-DYFLDNAME = 'ZS4H086T04-USERNAME'.
  INSERT LS_MAP INTO TABLE LT_MAP.

  CLEAR: LS_MAP.
  LS_MAP-FLDNAME = 'EMAIL'.
  LS_MAP-DYFLDNAME = 'ZS4H086T04-EMAIL'.
  INSERT LS_MAP INTO TABLE LT_MAP.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD        = 'USERID'
      DYNPPROG        = SY-REPID " 현재 실행중인 프로그램 이름
      DYNPNR          = SY-DYNNR " 현재 스크린 번호
      VALUE_ORG       = 'C'
    TABLES
      VALUE_TAB       = LT_USER_SHELP
      FIELD_TAB       = LT_SEHFIELD
      RETURN_TAB      = LT_RETURN
      DYNPFLD_MAPPING = LT_MAP
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.

  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

* 화면에 업데이트할 필드명과 값을 설정
  LS_UPDATE-FIELDNAME = 'ZS4H086T04-USERID'.
  READ TABLE LT_RETURN INTO LS_RETURN WITH KEY RETFIELD = LS_UPDATE-FIELDNAME.
  IF SY-SUBRC = 0.
    LS_UPDATE-FIELDVALUE = LS_RETURN-FIELDVAL.
    INSERT LS_UPDATE INTO TABLE LT_UPDATE.
  ENDIF.

  LS_UPDATE-FIELDNAME = 'ZS4H086T04-USERNAME'.
  READ TABLE LT_RETURN INTO LS_RETURN WITH KEY RETFIELD = LS_UPDATE-FIELDNAME.
  IF SY-SUBRC = 0.
    LS_UPDATE-FIELDVALUE = LS_RETURN-FIELDVAL.
    INSERT LS_UPDATE INTO TABLE LT_UPDATE.
  ENDIF.

  LS_UPDATE-FIELDNAME = 'ZS4H086T04-EMAIL'.
  READ TABLE LT_RETURN INTO LS_RETURN WITH KEY RETFIELD = LS_UPDATE-FIELDNAME.
  IF SY-SUBRC = 0.
    LS_UPDATE-FIELDVALUE = LS_RETURN-FIELDVAL.
    INSERT LS_UPDATE INTO TABLE LT_UPDATE.
  ENDIF.

  CALL FUNCTION 'DYNP_VALUES_UPDATE'
    EXPORTING
      DYNAME               = SY-CPROG
      DYNUMB               = SY-DYNNR
    TABLES
      DYNPFIELDS           = LT_UPDATE
    EXCEPTIONS
      INVALID_ABAPWORKAREA = 1
      INVALID_DYNPROFIELD  = 2
      INVALID_DYNPRONAME   = 3
      INVALID_DYNPRONUMMER = 4
      INVALID_REQUEST      = 5
      NO_FIELDDESCRIPTION  = 6
      UNDEFIND_ERROR       = 7
      OTHERS               = 8.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

이상입니다.

반응형