본문 바로가기

Ⅰ. ERP/1. ABAP

[SAP ABAP] CCM 하면서 정리 ( ECC -> HANA 변화구문 )

728x90

CCM 할 경우 , 템플릿에 주석을 넣어두고 주석처리하면 편함 ( ex) sss-> *- --------------Start of S4hana Convby ____

 

1. 오라클 HINT 문 삭제
     - 오라클 HINT문은 SAP HANA에 맞지 않습니다.
     - 필요 시 HANA에서 사용가능한 Hints 구문을 추가합니다.
       %HINTS HDB ...
     - SELECT .. FOR ALL ENTRIES 검색 시 Hints를 사용하여 FDA(Fast Data Access) 기능의 사용 유무를 판단합니다 (Note 2399993 참고)

SELECT B~BUKRS, B~BLART,
         B~LIFNR, B~ZUONR, B~AUGBL,
         B~BELNR, B~BUZEI, B~BUDAT,     " , 추가 "
         B~WAERS, B~SHKZG, B~HKONT,
         B~DMBTR, B~WRBTR, B~EBELN,
         B~EBELP, B~XREF1, B~XREF3,
         B~REBZG, B~REBZZ, B~SGTXT
    INTO CORRESPONDING FIELDS OF TABLE IT_TAB
           FROM BSIK AS B INNER JOIN BKPF AS A
             ON A~BELNR = B~BELNR
            AND A~BUKRS = B~BUKRS
            AND A~GJAHR = B~GJAHR
          WHERE B~HKONT IN @R_HKONT
            AND B~BUKRS IN @R_BUKRS      "@의 newabap "
            AND B~BUDAT <= @P_DATUM     
            AND A~STBLG =  ''
            AND B~ZUONR IN P_KOSTL.
*%_HINTS ORACLE 'ORDERED'.

2. ORDER BY 없는 SELECT 

Check Message : LOOP AT itab. AT FIRST/LAST... ENDAT. for result of statement at ... line ...

                        MODIFY ... INDEX for result of SELECT statement at ... line ...

    - 기존 ECC에서의 ORDER BY 가 생략된 SELECT 문은 잘못된 데이터를 가져올 가능성이 있기 때문에

        SELECT 문에 ORDER BY를 넣거나 SORT 를 처리해주어 보완했습니다.

* SELECT SINGLE 은 ORDER BY 안됨. ( select ... up to 1 row ... order by primary key. endselect. 해야함 )  

 

3. 전표 금액 , 자재번호 등의 달라진 길이로 인한  write문 오류

Check Message : WRITE issue

       - ECC에서 CURR (13,2) 였던 금액 필드들이 S/4 HANA에서 CURR (23,2)로 변경 되면서 Write 문에서 글자가 잘리는 현상 발생

       - 기존 변수와 동일한 타입의 지역변수를 생성하여 write문에서 적용하여 해결한다.

 

 

 

 

 

 

-------------------------------------------------------------------------------------------------------------------------------------------

[ 추가로 알게된 ABAP 지식 ]

 

 1. Internal Table을 read할 때 발생하는 event 

- AT NEW f : Field가 새롭게 시작할 때, internal table 을 읽을 때 특정 필드의 값이 새롭게 바뀔 때 발생 

               SUM => 이후의 다른 필드가 나오기 전까지의 값을 모두 SUM 

 

- AT END OF f :  Field가 끝날 때,internal table 을 읽을 때 특정 필드의 값을 마지막으로 읽을 때 발생
                   SUM => 이전의 모든 동일 필드의 값을 모두 SUM, 즉 SUM함수의 결과값은 AT NEW f 이벤트에서 사용한 sum과 동일하다. 

                   다만 이벤트의 발생시점만 다르다.

                   Sum의 결과값은internal table 의 header에들어가며 이때 명시된f‘ 이외의 문자필드에는*******’ 로 채워진다. 


- AT FIRST : loop의 첫 행을 읽을 때 발생함. 숫자필드를 제외한 필드의 값이 새롭게바뀔때 발생
               SUM => 문자필드를 제외한 모든숫자필드의 값을 SUM. Internal table 의 헤더에는숫자필드의합계만이들어가고 나머지 ‘ 필드는 모두*********’ 로 채워짐.

- AT LAST : 마지막행을 읽을 때 발생함.
               SUM => AT FIRST 이벤트의 결과와 동일함
               ->위의 이벤트가 발생할 때 sum 함수에 의해 채워진internal table header의 값은 모두ENDAT. 구문을 만나면 현재reading하고 있는 행의 값으로 돌아가게 된다.

 

- ON CHANGE OFf1 OR f2 OR…. OR fn
: internal 전용의 이벤트는 아님
:기술된 f1…fn 을 키값으로 새로운 값이들어왔을 때 발생하는 이벤트
: SUM 함수를 이용한 부분합을낼 수 없슴.

 

2. DESCRIBE TABLE itab [KIND knd] [LINES lin] [OCCURS n]. 

 

1. DESCRIBE TABLE itab LINES tc-lines.                  ==> itab의 총라인수를 tc-lines에 넣는다.
2. DESCRIBE TABLE itab LINES tc-current_lines.        ==> itab의 총라인수를 tc-current_lines에 넣는다.

두가지 소스의 차이점은 인터널테이블의 총라인수를  1번은 테이블컨트롤의 총라인수를 의미하는 tc-lines에 넣는것이고

2번은 현재라인(커서가 위치하는 라인)에 넣어 주는 것입니다.

1번으로 pbo에 설정을 해주시면 테이블컨트롤(tc)에서 자동 계산해서 스크롤바가 자동으로 생성이 됩니다.

 

 

참조

https://blogs.sap.com/2022/03/31/handling-of-select-statements-on-simplified-tables-during-s-4-hana-conversion/

728x90