REPORT YX8852_FIND.
************************요구사항 *****************
" FO 하드코딩으로 넣어서 "FO 찾고 "FO ITEM 찾아서
" tur pkg prd 순으로 연결해준다(4 tur이 없으면 pkg가 기준이다)
" db_key를 정렬함으써 순서도 지켜준다
" TUR(할아버지) <- PKG(아빠) <- PRD(딸) 순으로 채번
" 10 20 30
" 40
" 50 60
" 70
"product_id는 발췌 item_id parent는 직접 10단위로 넣고 10증가

*********************************** 코드 ***********************
DATA: BEGIN OF LS_ITEM2,
TOR_ID TYPE /SCMTMS/TOR_ID,
ITEM_CAT TYPE /SCMTMS/ITEM_CATEGORY,
ITEM_ID TYPE ZLOSA00072-ITEM_ID,
ITEM_PARENT_ID TYPE ZLOSA00072-ITEM_PARENT_ID,
PRODUCT_ID TYPE /SCMTMS/PRODUCT_ID,
ITEM_DESCR TYPE /SCMTMS/ITEM_DESCRIPTION,
END OF LS_ITEM2.
DATA: LT_ITEM2 LIKE TABLE OF LS_ITEM2.
DATA: LV_ITEM_ID TYPE ZLOSA00072-ITEM_ID,
LV_ITEM_GRANDPA_ID TYPE ZLOSA00072-ITEM_ID,
LV_ITEM_PARENT_ID TYPE ZLOSA00072-ITEM_PARENT_ID.
"FO 발췌
SELECT DB_KEY, TOR_ID
FROM /SCMTMS/D_TORROT
WHERE TOR_ID LIKE '%6700001061'
INTO TABLE @DATA(LT_ROOT).
"FO ITEM 발췌
SELECT PARENT_KEY AS FO_KEY,
DB_KEY,
ITEM_PARENT_KEY, "매핑 데이터
ITEM_CAT,
PRODUCT_ID,
ITEM_DESCR
FROM /SCMTMS/D_TORITE
FOR ALL ENTRIES IN @LT_ROOT
WHERE PARENT_KEY = @LT_ROOT-DB_KEY
AND ( ITEM_CAT EQ 'TUR' OR ITEM_CAT EQ 'PKG' OR ITEM_CAT EQ 'PRD' )
INTO TABLE @DATA(LT_ITEM).
"TUR/PKG/PRD 유무 체크
IF LINE_EXISTS( LT_ITEM[ ITEM_CAT = 'TUR' ] ).
DATA(LV_TUR) = ABAP_TRUE.
ELSEIF LINE_EXISTS( LT_ITEM[ ITEM_CAT = 'PKG' ] ).
DATA(LV_PKG) = ABAP_TRUE.
ELSE.
DATA(LV_PRD) = ABAP_TRUE.
ENDIF.
DATA(LT_PKG) = LT_ITEM.
CLEAR LT_PKG[].
DATA(LT_PRD) = LT_ITEM.
CLEAR LT_PRD[].
LOOP AT LT_ITEM INTO DATA(LS_ITEM3).
CASE LS_ITEM3-ITEM_CAT.
WHEN 'PKG'.
APPEND INITIAL LINE TO LT_PKG ASSIGNING FIELD-SYMBOL(<FS_S_ITEM>).
<FS_S_ITEM> = CORRESPONDING #( LS_ITEM3 ).
WHEN 'PRD'.
APPEND INITIAL LINE TO LT_PRD ASSIGNING <FS_S_ITEM>.
<FS_S_ITEM> = CORRESPONDING #( LS_ITEM3 ).
ENDCASE.
ENDLOOP.
SORT LT_ITEM BY DB_KEY FO_KEY. "2개 key 로 sort
SORT LT_PKG BY ITEM_PARENT_KEY.
SORT LT_PRD BY ITEM_PARENT_KEY.
LOOP AT LT_ROOT INTO DATA(LS_ROOT).
"1. TUR 있는 경우
IF LV_TUR IS NOT INITIAL.
* 1) TUR 루프
READ TABLE LT_ITEM INTO DATA(LS_ITEM) WITH KEY FO_KEY = LS_ROOT-DB_KEY "sort 키와 read table 키가 다르기에 binary search 어려움.
ITEM_CAT = 'TUR'
TRANSPORTING ALL FIELDS.
IF SY-SUBRC = 0.
LOOP AT LT_ITEM INTO LS_ITEM FROM SY-TABIX.
IF LS_ITEM-FO_KEY <> LS_ROOT-DB_KEY.
EXIT.
ENDIF.
IF LS_ITEM-ITEM_CAT <> 'TUR'.
CONTINUE.
ENDIF.
LV_ITEM_ID = LV_ITEM_ID + 10.
LS_ITEM2 = CORRESPONDING #( LS_ITEM ).
LS_ITEM2 = CORRESPONDING #( BASE ( LS_ITEM2 ) LS_ROOT ).
LS_ITEM2-ITEM_ID = LV_ITEM_ID.
APPEND LS_ITEM2 TO LT_ITEM2. CLEAR: LS_ITEM2.
" TUR 초기값
IF LV_ITEM_GRANDPA_ID IS INITIAL." AND LS_ITEM-ITEM_CAT = 'TUR'.
LV_ITEM_GRANDPA_ID = LV_ITEM_ID.
" TUR 바꼈을 떄 UPDATE
ELSEIF LV_ITEM_GRANDPA_ID IS NOT INITIAL." AND LS_ITEM-ITEM_CAT = 'TUR'.
LV_ITEM_GRANDPA_ID = LV_ITEM_ID.
ENDIF.
* 2) 당해 TUR 관련된 PKG 루프
**** 2-1) TUR - PKG - PRD
READ TABLE LT_PKG INTO DATA(LS_PKG) WITH KEY ITEM_PARENT_KEY = LS_ITEM-DB_KEY
BINARY SEARCH.
IF SY-SUBRC = 0.
LOOP AT LT_PKG INTO LS_PKG FROM SY-TABIX.
IF LS_PKG-ITEM_PARENT_KEY <> LS_ITEM-DB_KEY.
EXIT.
ENDIF.
IF LS_PKG-ITEM_CAT <> 'PKG'.
CONTINUE.
ENDIF.
LV_ITEM_ID = LV_ITEM_ID + 10.
LS_ITEM2 = CORRESPONDING #( LS_PKG ).
LS_ITEM2 = CORRESPONDING #( BASE ( LS_ITEM2 ) LS_ROOT ).
LS_ITEM2-ITEM_PARENT_ID = LV_ITEM_GRANDPA_ID.
LS_ITEM2-ITEM_ID = LV_ITEM_ID.
LV_ITEM_PARENT_ID = LS_ITEM2-ITEM_ID.
APPEND LS_ITEM2 TO LT_ITEM2. CLEAR: LS_ITEM2.
* 3) 당해 TUR-PKG 관련된 PRD 루프
READ TABLE LT_PRD INTO DATA(LS_PRD) WITH KEY ITEM_PARENT_KEY = LS_PKG-DB_KEY " // tur x pkg db_key 필요..
BINARY SEARCH.
IF SY-SUBRC = 0.
LOOP AT LT_PRD INTO LS_PRD FROM SY-TABIX.
IF LS_PRD-ITEM_PARENT_KEY <> LS_PKG-DB_KEY.
EXIT.
ENDIF.
IF LS_PRD-ITEM_CAT <> 'PRD'.
CONTINUE.
ENDIF.
LV_ITEM_ID = LV_ITEM_ID + 10.
LS_ITEM2 = CORRESPONDING #( LS_PRD ).
LS_ITEM2 = CORRESPONDING #( BASE ( LS_ITEM2 ) LS_ROOT ).
LS_ITEM2-ITEM_PARENT_ID = LV_ITEM_PARENT_ID.
LS_ITEM2-ITEM_ID = LV_ITEM_ID.
APPEND LS_ITEM2 TO LT_ITEM2. CLEAR: LS_ITEM2.
ENDLOOP.
ENDIF.
ENDLOOP.
**** 2-2) TUR - PRD
ELSE.
READ TABLE LT_PRD INTO LS_PRD WITH KEY ITEM_PARENT_KEY = LS_ITEM-DB_KEY
ITEM_CAT = 'PRD'
TRANSPORTING ALL FIELDS.
IF SY-SUBRC = 0.
LOOP AT LT_PRD INTO LS_PRD FROM SY-TABIX.
IF LS_PRD-ITEM_PARENT_KEY <> LS_ITEM-DB_KEY.
EXIT.
ENDIF.
IF LS_PRD-ITEM_CAT <> 'PRD'.
CONTINUE.
ENDIF.
LV_ITEM_ID = LV_ITEM_ID + 10.
MOVE-CORRESPONDING LS_PRD TO LS_ITEM2.
MOVE-CORRESPONDING LS_ROOT TO LS_ITEM2.
LS_ITEM2-ITEM_PARENT_ID = LV_ITEM_GRANDPA_ID.
LS_ITEM2-ITEM_ID = LV_ITEM_ID.
APPEND LS_ITEM2 TO LT_ITEM2. CLEAR: LS_ITEM2.
ENDLOOP.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
"2. TUR 없고, PKG 있는 경우
ELSEIF LV_PKG IS NOT INITIAL.
READ TABLE LT_ITEM INTO LS_ITEM WITH KEY FO_KEY = LS_ROOT-DB_KEY "기준이 되는 당해 tur 정보 담김
ITEM_CAT = 'PKG' " tur만 보면 되지...
TRANSPORTING ALL FIELDS.
IF SY-SUBRC = 0.
LOOP AT LT_ITEM INTO LS_ITEM FROM SY-TABIX.
IF LS_ITEM-FO_KEY <> LS_ROOT-DB_KEY.
EXIT.
ENDIF.
IF LS_ITEM-ITEM_CAT <> 'PKG'.
CONTINUE.
ENDIF.
LV_ITEM_ID = LV_ITEM_ID + 10.
LS_ITEM2 = CORRESPONDING #( LS_ITEM ).
LS_ITEM2 = CORRESPONDING #( BASE ( LS_ITEM2 ) LS_ROOT ).
LS_ITEM2-ITEM_ID = LV_ITEM_ID.
LV_ITEM_PARENT_ID = LS_ITEM2-ITEM_ID.
APPEND LS_ITEM2 TO LT_ITEM2. CLEAR: LS_ITEM2.
READ TABLE LT_PRD INTO LS_PRD WITH KEY ITEM_PARENT_KEY = LS_ITEM-DB_KEY
ITEM_CAT = 'PRD'
TRANSPORTING ALL FIELDS.
IF SY-SUBRC = 0.
LOOP AT LT_PRD INTO LS_PRD FROM SY-TABIX.
IF LS_PRD-ITEM_PARENT_KEY <> LS_ITEM-DB_KEY.
EXIT.
ENDIF.
IF LS_PRD-ITEM_CAT <> 'PRD'.
CONTINUE.
ENDIF.
LV_ITEM_ID = LV_ITEM_ID + 10.
LS_ITEM2 = CORRESPONDING #( LS_PRD ).
LS_ITEM2 = CORRESPONDING #( BASE ( LS_ITEM2 ) LS_ROOT ).
LS_ITEM2-ITEM_PARENT_ID = LV_ITEM_PARENT_ID.
LS_ITEM2-ITEM_ID = LV_ITEM_ID.
APPEND LS_ITEM2 TO LT_ITEM2. CLEAR: LS_ITEM2.
ENDLOOP.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
ENDLOOP.
IF SY-SUBRC = 0.
ENDIF.
'SAP > ABAP' 카테고리의 다른 글
select - case 문 ( 공백일 때 특정 문자 넣어서 발췌 / 값에 따른 신호등 처리 ) (0) | 2022.07.19 |
---|---|
주요 Function 모음 (0) | 2022.06.03 |
[SAP ABAP] Text Symbol (0) | 2021.07.21 |
[SAP ABAP] 상수 Constant (0) | 2021.07.21 |
SAP ERP란? (0) | 2021.07.20 |