SAP

[ABAP] 테이블명 변수로 테이블 데이터 가져와서 해당 데이터로 다른 테이블 업데이트

TheSapper 2026. 2. 27. 01:06
반응형
정답 스포일러 : move-corresponding과 정적 스트럭처(양쪽의 키와 업데이트할 필드값 보유)

 

0. 정적 스트럭처에 업데이트를 원하는 필드와 업데이트할 테이블의 키값, 다른 테이블 조회에 사용할 데이터를 넣는다.

DATA: lv_obj TYPE typename,
           lv_type type ddtypekind,
           lo_log type ref to data,
           lv_error.
           
 DATA: BEGIN OF ls_calid,
           callid TYPE sxmsqid,
           msgstate TYPE sxmspmstat,
           end of ls_calid.
           
FIELD-SYMBOLS <lt_log> TYPE STANDARD TABLE.

 

1. 아래처럼 동적으로 테이블 명을 가져온다. (데이터를 업데이트 해줄 테이블)

SELECT log_table
              FROM zwmift0040
              INTO TABLE @DATA(lt_table) .

SORT lt_table by log_table.
DELETE ADJACENT DUPLICATES FROM lt_table COMPARING log_table.

 

2. 다음과 같이 루프의 시작점에서 가져온 테이블 명으로 동적으로 오브젝트의 타입정보를 체크한다.

이후 코드는 해당루프의 안에 위치한다. 

LOOP AT lt_table INTO DATA (ls_table).
   lv_obj = ls_table-log_table.
   CLEAR lv_type.
   CALL FUNCTION 'DDIE_TYPEINFO_GET'
      EXPORTING
         typename = lv_obj
	IMPORTING
		typekind = lv_type.

	CHECK lv_type = 'TABL'.

* 여기서부터 코드 시작






endloop.

 

3. 루프의 내부에서  테이블 타입의 오브젝트를 생성하고, 해당 오브젝트를 Field symbol에 assign 한다.

CLEAR lo_log.
CREATE DATA lo log TYPE TABLE OF (ls_table-log_table) .
ASSIGN lo log->* TO <1t log>.

 

5. 루프의 내부에서 해당 테이블 의 데이터를 가져온다. (업데이트 대상 테이블 데이터)

TRY.
	SELECT *
		FROM (1s_table-log_table)
			WHERE zcrldate IN @s_date
			AND calid IS NOT INITIAL
			INTO CORRESPONDING FIELDS OF TABLE @<lt_log>.
CATCH cx root.
	lv error = 'X'.
ENDTRY.

CHECK lv error = ''.
CHECK <1t log> IS NOT INITIAL.

 

6.

 

1. 해당 테이블에 있는 데이터를 move-corresponding 통해 정적 타입 선언된 스트럭처로 옮기고 해당 정보를 이용해 원하는 데이터를 가져온다.

2. 그 다음 해당 정적 타입 데이터에서 업데이트할 할 부분을 업데이트 한다.

3. 다시 정적에서 동적 데이터로 move-corresponding으로 데이터를 옮겨준다.

4. modify를 사용해 업데이트 한다.

LOOP AT <lt log> ASSIGNING FIELD-SYMBOL (<ls_log>) .
	CLEAR ls calid.
	MOVE-CORRESPONDING <ls_log> TO ls calid.
	SELECT SINGLE msgstate FROM sxmspmast INTO @DATA (lv_msgstate)
		WHERE msgguid = @ls_calid-calid.
    IF sy-subrc = 0.
		ls_calid-msgstate = lv_msgstate.
		MOVE-CORRESPONDING 1s_calid TO <ls_log>.
		CALL FUNCTION 'SET CBO DATE SINGLE'
			CHANGING
				cs_data = <ls_log>.
    MODIFY (ls_table-log_table) FROM <ls_log>.
	ENDIF.
ENDLOOP.

FREE <lt log>.




반응형