1. CO88이란 무엇이며 왜 느려지는가?
CO88은 오더에 쌓여 있는 금액을 정산하기 위한 프로그램이다.
오더에 쌓여 있는 금액은 CO88, WBS요소에 쌓여 있는 금액은 CJ88로 처리한다.
쌓여있는 금액이라는 게 무슨 말인가?
이렇게 오더의 차변에 쌓인 금액을 말한다. 이렇게 쌓인 금액은 월말 결산 시점에 T-CODE: CO88, KO88을 통해서 리시버로 보내지는데, 이를 정산(Settlement)이라고 한다.
이에 대한 내용은 지난 글인 『오더 정산에 따른 Cost Component Split』에서 정리한 바가 있다. 자세한 내용은 거기서 또 살펴보시길.
그런데 이 T-CODE: CO88이나 S/4HANA에서 새로 나온 CO88H는 Deletion flag가 찍히지 않은 오더라면 모두 읽어오도록 되어 있다.
SAP Note인 『303234 - CO88: Performance with settlement via order groups』를 보면 과거에는 Deletion flag를 찍어도 무조건 포함해서 실행했었나보다(이 노트의 발행일이 2000년인 걸 보면 정말 옛날이긴 하다).
아무튼 그렇다면 우리는 매번 모든 오더에 삭제 플래그를 찍도록 관리를 해야 하는데, 현실적으로 그러기는 쉽지 않다. 특히나 원가취합처를 사용하는 by period 방식이라면 더더욱 그렇다. 자재의 생산버전별로 관리하는 원가취합처의 특성상 함부로 지우기는 어렵기 때문이다.
이렇게 되면 운영하면서 점점 시간이 지날수록 정산 대상 오더는 쌓이게 되고, 점점 CO88 트랜잭션에서 처리해야 할 오브젝트의 수도 늘어난다. 예전 경험으로는 심하면 4시간 가까이 걸리는 경우도 있었다.
어떻게 해결하면 좋을까? 나는 처음에는 S/4HANA의 신규 T-CODE인 CO88H가 대안이 될 줄 알았다. 아마 Code push-down으로 새로 개발한 걸로 아는데, 그럼으로써 HANA DB의 성능을 끌어내 빨라질 줄 알았다.
그런데 막상 해보니 느린 게 아닌가...
이와 관련해 SAP에 case를 쓰면서 담당자와 상담하다가 알아낸 방법이 있는데 그걸 소개해보고자 한다.
2. 해결 방법: 내가 직접 해당하는 오더를 골라주면 된다.
T-CODE: CO88에 해당하는 프로그램은 "RKO7CO88"이다. T-CODE: SE38에서 이 프로그램을 직접 실행해본 모습은 아래와 같다.
T-CODE: CO88로 실행했을 때와의 차이점이 보이는가? 플랜트 뿐만이 아니라 오더유형과 오더를 직접 선택할 수 있는 셀렉션 스크린이 보인다.
여기서 필요한 오더를 직접 입력하고 실행하면 된다.
그런데 그런 방식으로 딜리버리를 할 수는 없으니, 아래와 같은 아이디어를 생각해서 구현해봤다.
1. 프로그램 RKO7CO88를 감싸기 위한 별도의 CBO 프로그램을 생성한다.
2. 오더 리포트의 차/대변을 확인하여 금액이 있는 항목(=정산 대상)을 찾는다.
3. 해당 정산 대상만 실행하도록 SUBMIT한다.
이 중 3번 내용에 대한 소스 코드 예시도 보여드린다.
APPEND VALUE #( SELNAME = 'KOKRS' KIND = GC_P SIGN = GC_I OPTION = GC_EQ LOW = GV_KOKRS HIGH = '' ) TO GT_PARAMS.
LOOP AT LT_WERKS INTO DATA(LS_WERKS).
APPEND VALUE #( SELNAME = 'WERKS' KIND = GC_P SIGN = GC_I OPTION = GC_EQ LOW = LS_WERKS-WERKS HIGH = '' ) TO GT_PARAMS.
ENDLOOP.
LOOP AT LT_AUFNR INTO DATA(LS_AUFNR).
APPEND VALUE #( SELNAME = 'AUFNR' KIND = GC_P SIGN = GC_I OPTION = GC_EQ LOW = LS_AUFNR-AUFNR HIGH = '' ) TO GT_PARAMS.
ENDLOOP.
APPEND VALUE #( SELNAME = 'IN_FAUF' KIND = GC_P SIGN = GC_I OPTION = GC_EQ LOW = '' HIGH = '' ) TO GT_PARAMS.
APPEND VALUE #( SELNAME = 'IN_PIAUF' KIND = GC_P SIGN = GC_I OPTION = GC_EQ LOW = '' HIGH = '' ) TO GT_PARAMS.
APPEND VALUE #( SELNAME = 'IN_QMAUF' KIND = GC_P SIGN = GC_I OPTION = GC_EQ LOW = '' HIGH = '' ) TO GT_PARAMS.
APPEND VALUE #( SELNAME = 'P_GJAHR' KIND = GC_P SIGN = GC_I OPTION = GC_EQ LOW = GV_GJAHR HIGH = '' ) TO GT_PARAMS.
APPEND VALUE #( SELNAME = 'P_FROM' KIND = GC_P SIGN = GC_I OPTION = GC_EQ LOW = GV_PERBL HIGH = '' ) TO GT_PARAMS.
*
SUBMIT RKO7CO88 VIA SELECTION-SCREEN
WITH SELECTION-TABLE GT_PARAMS
AND RETURN.
위 소스에서 "IN_FAUF", "IN_PIAUF", "IN_QMAUF"는 각각 "생산오더 포함", "프로세스오더 포함", "QM오더 포함" 체크박스이다. 원가취합처만 선택하기 위해서 저렇게 처리했다.
3. 결과는?
이렇게 개선한 결과 4시간 걸리던 게 10분 내외로 줄어드는 드라마틱한 효과가 있었다.
정말 우연한 아이디어로 실행해봤는데 생각보다 좋은 결과가 나와서 너무 좋았던 기억이 있다.
참고로 이 테크닉은 CO88에서만 되는 게 아니라, 이와 유사한 아래 다른 프로그램에서도 통용된다.
T-CODE | 용도 | 대체 프로그램 |
CPTD | 템플릿 배부 | RKWTP_CPTD |
KKS1 | 차이계산 | RKKKS1N0 |
CON2 | 실제가격 재평가 | RKAZCON2 |
KKAO | 재공계산 | SAPKKA07 |
CO88 | 오더 정산 | RKO7CO88 |
※ 참고로 CJ88은 이 방법을 사용할 수 없고 T-CODE: CJ8G나 프로그램 RKO7CJ8G를 실행해도 별도 Variant를 만들어서 처리해야 한다.
부디 이 내용이 널리널리 퍼져서 여러 회사의 삶의 질이 달라지길 바란다.
'SAP CO > 미세먼지 팁' 카테고리의 다른 글
S/4HANA에서 S_ALR_87013611 리포트 퍼포먼스를 올리는 방법 (9) | 2023.04.22 |
---|---|
S/4HANA 자재원장의 테이블 구조 (9) | 2022.11.05 |
물류 처리 시 표준원가 체크 로직은 MBEW-STPRS를 써선 안 된다. (4) | 2022.09.04 |
CDS 뷰 "FCML_REP_V"에 기초재고와 기말재고 추가하기 (6) | 2022.07.12 |
T-CODE: KSPP 결과 리스트 저장하기(BADI 활용) (1) | 2022.05.17 |