펑션그룹 ( 오전 )

Beemajor·2024년 9월 6일


펑션그룹을 만들 때는 /nse37이 아니라
/nse80에서 만들어줍시다.
지금 보이는 화면과 같이 말이죠.


다음 화면은 이러한 화면이 나오는데요 펑션그룹은 프로그램이에요
그러니까 MASTER PROGRAM 누릅니다
여기서 팁 메인프로그램은 이벤트 프로그램과 모듈풀프로그램입니다.
이건 메인프로그램 급은 아니랍니다.


만들자마자 펑션그룹을 액티브 시켜야 해요.
펑션 모둘 만들고 펑션그룹을 액티브하면 에러가 납니다.
그리고 TOP을 들어가 볼까요?


여기 TOP에서 선언하면 글로벌 변수가 됩니다.
여러 모듈에서 공동으로 사용하는 변수는 여기서 쓰면 좋겠죠?


펑션 모듈은 /nse37에서 만들어도 되지만 지금 보이는
화면과 같이 만드는게 더 좋아요
갯누는 99개까지 만들 수 있는데, 보통 한 5~10개 정도가 적당합니다.


펑션모듈을 만들어봐요


이렇게 만들어집니다.


펑션모듈은 인쿠르드 프로그램입니다.


INCLUDE LZFG5A1210UXX. 에 들어가면

 INCLUDE LZFG5A1210U01.
                    "ZF5A_GET_DATA

이렇게 자동으로 들어가집니다.
다른 모듈도 추가하면 또 생기는데요.
이러한 이유로 모듈중 하나가 박살나면 펑션그룹이 박살나는겁니다.


REMOTE체크를 하면 RFC 펑션으로 쓸 수 있습니다
이게 바피라고 던지듯이 알려주시네요


받기만 할 변수는 IMPORT로 설정해주세요
Like 도 쓸 수 는 있는데 흠...
프로그램에서 살짝 막습니다.


보내줄 변수는 EXPORT로 설정해주세요
이터널 Table 이면 테이블 타입으로 정확하게 적어줘야합니다.
스트럭처구조로 선언하면 테이블이 생성 안되요


자 Import와 export를 잘 썼으면 코드를 작성해봅시다
위의 화면과 같이 쓰면 됨니다.


import에 받는다 하고 Optional 체크마저 안했으면
펑션을 쓰는사람은 무조건 던져줘야합니다. 안던져주면 덤프남.
하지만 optional 체크를 하면 값을 안줘도 정상작동 잘됩니다ㅎ


펑션에서도 서브루틴을 많이 씁니다.


이렇게 Table 타입을 써서 테이블을 가져가는 경우를 많이 씁니다.


처음에는 F01을 만들거냐 물어봅니다
꼭 만들어 줘야해요


자 그리고 서부 루틴은 지금과 같이 됩니다. 하하

TABLES   t_req STRUCTURE zs5a00910 " type zs5a00910_T

이거 잘 생각해보세요
strucure로 쓰면 스트럭처구조로 참조해줘야하며
type을 쓰면 테이블 구조로 참조해줘야합니다.

  clear: t_req[], t_req. " 테이블 구조. 스트럭처 

이것 도 잘 생각해보세요 tables로 선언한것은 헤더라인이 있는 테이블 구조입니다.
[] 이 모습이 네모난 테이블 같지 않나요? 이렇게 외워봅시다 하하

INTO CORRESPONDING FIELDS OF TABLE t_req

corresponding fields of 'TABLE'!!! 때문에 t_req 를 써도 테이블 구조로 선언이 되는 것입니다.


위의 export 선언을 tables 선언으로 바꿔보겠습니다.


이렇게 tables로 바꿀 수 있습니다.
뭐가 바뀌었죠?
일단 tables 선언에서는 스트럭처구조로 선언해도 정상적으로 잘 만들어지네요.
그리고 tables는 사용자가 만든 table을 받아서 쓰고 던져 줄 수 있습니다.
change와 비슷하네요.


지금과 같은 상태, 즉 필드를 직접 주는 선언도 물론 가능하지만
위 선언을 아래의 스트럭처 형태 선언으로 바꿀 수 있습니다.


이렇게 스트럭처 형태의 선언으로 바뀐 모습입니다


필드를 직접 선언한 기존 코드 입니다.


스트럭처 구조를 사용하면 코드가 위의 화면과 같이 바뀝니다.


그럼 펑션모듈을 사용할때 이렇게 바뀌게 될 겁니다.
위는 스트럭저 구조로 선언한 펑션을 사용한 모습.
아래는 필드타입으로 선언한 펑션을 사용한 모습.

위의 내용을 종합해 보자면 총 3가지입니다.

1) 펑션 그룹 기본 개념설명
2) 펑션 모듈에서 IMPORT, EXPORT, TABLES 사용방법
3) 펑션 모듈에서의 서브루틴화 사용방법.

이제 할것은 EXCEPTION이다.
펑션을 콜해서 쓸 때 SELECT의 성공여부를 바로 알 수 있는게 아니다.
즉, 펑션을 콜해서 들어갔다가 잘나오면 sy-subrc = 0 이다 비록 SQL을 통해 DATA가 안담기더라도.


해결방법1) EXPORT에서 ev_subrc선언한 뒤 펑션을 사용할 때 성공여부를 ev_subrc에 담아서 던져도 무방하다.


ev_subrc에 담아서 던져주는 경우의 코드를 작성한 것입니다.

READ TABLE t_req INDEX 1 TRANSPORTING NO FIELDS.

헤더라인 있는 테이블을 쓸때 보통 이 구문을 많이쓴데요


해결방법2) EXCEPTION을 활용하는 방법입니다.
EXCEPTION은 재미로 쓰지않아요 EXCEPTION 상황이 중요해서 작성하는거에요
EXCEPTION 선언만 하면 자동으로 처리되는건 절대 아닙니다.
다음과 같이 선언하고 나서 코드를 작성해줘야해요.

RAISE no_data.

라고 작성해줍니다.

  IF sy-subrc <> 0.
    RAISE no_data.
    p_subrc = 1.
    RETURN.
  ENDIF.

RAISE no_data. 이게 발생했다면 p_subrc = 1. 이것도 잘 실행됐을까요?
아뇨~ RAISE no_data.는 retrun 과 같아요.
만나면 바로 펑션을 빠져나갑니다.

EXCEPTION을 사용해서 폭탄을 처리해줬는데,
CALL 펑션쓰고 EXCEPTIONS를 쓰지않았다??
그럼 EXCEPTION 상황발생, 즉 RAISE no_data. 가 발생하게 되었을 때 덤프가 발생합니다.
EXCEPTIONS를 쓰면 EXCEPTION 상황이 발생되어도 덤프가 뜨지 않습니다.
하지만 EXCEPTIONS에 따른 처리를 해주지 않으면 사용자는 문제상황이 발생했는지 알지 못해요.
그니까 EXCEPTIONS에 대한 대응 처리를 꼭 해주세요

지금까지 했던 내용들을 어떻게 다 외워서 쓰죠?

IMPORT를 안써주면 덤프나고 EXCEPTIONS 처리 안해주면 덤프가 나죠...

그렇기 때문에 펑션을 사용할 때는 꼭 PATTEN을 써서 호출하도록 합시다.

자 이제 어려운 실무에서는 잘 사용하지 않는 어려운걸 해봅시다.


Range 타입인 STRUCTRUE를 만들었습니다.
그리고 이걸 활용해서 테이블을 만드세요.


만든 걸 활용해서 IMPORT에 넣어줍니다.
이걸 사용하면 RANGE 변수처럼 쓸 수 있겠죠?


선언한 IMPORT를 이용해서 코드를 써봅시다.


콜 펑션을 할때 이렇게 쓰면 잘사용됩니다.

  CALL FUNCTION 'ZF5A001003'
    EXPORTING
      it_dat = so_dat[]
    TABLES
      t_req  = gt_req.

so_dat[] 이렇게 쓴걸 잊지마세요.
SELECT-OPTIONS so_dat FOR gs_req-rdate. 는 헤더라인이 있는 선언입니다.
IMPORT와 똑같은 타입의 정보를 줘야 합니다.

SELECT-OPTIONS 와 TABLES의 차이점은 무엇일까요?
공통점은 둘다 헤더라인이 있는 인터널 테이블이라는 점입니다.
다른점은 SELECT-OPTIONS의 헤더라인은 첫번째 레코드의 정보를 자동으로 담는 다는 점 입니다.




이렇게 주는 상황에서는 에러는 떨어지지 않습니다.
하지만 펑션의 TABLES라는 선언의 특징인 정보를 가지고 담아오기 특징과
select-options의 헤더라인에 자동으로 정보를 담는 특징을 모두 고려해서 로직을 짜야 합니다.

헤더라인이 있는 테이블, 즉 TABLES는 실무에서 많이 쓰이는데 SAP에서는 권장하지 않습니다. 그래서 메소드에서는 TABLES를 사용할 수 없어요.

profile
i'm Graphic Designer

0개의 댓글