본문 바로가기
ERP-SAP/ABAP

se16n 처럼 동적 DB 조회 스크린을 포함한 동적DB 생성/삭제/조회/변경 CRUD 프로그램 만들기.

by 행복한워니의 기록 2021. 1. 8.
728x90
반응형

 

요건사항
se16n에서 &SAP_EDIT를 쓰면 스텐다드에 로그가 남는다
로그남는 Db 는 se16n_cd_key 이고 se16n_cd_data 에 세부 값들도도 남는다.

물론 이게 로그도 남고 좋을수 있지만
정책상 운영은 강제수정을
원하지 않고 관리자들은 강제수정을 해줘야만하는
(특히 CBO들) 상황이 생긴다.

그럴때 필요한 동적으로 셀렉션 스크린을 만들어서 원하는 조건값을 주고 데이터들을 가져와서
뿌려주고 그걸 수정하는....
SE16N 과 같이 만들어 주려 한것이다.

동적 셀렉션 스크린은 Sap 내에도 있을것 같았고
나보고 만들라면 어휴 GG 칠것인데...
역시나 존재했기에 갖다 쓰기 편했다.

이것만 있으면 나머지는 쉬울것이다

아래는 내가 작성한 레포트 프로그램 메인이고
그 아래는 TOP 선언부다.. (언제나 선언이 중요하지..)

첫 스크린에 DB명과 조회 건수를 받아야
동적 셀렉션 스크린을 만들 수 있으니
그걸 받는 화면을 만들었다. (위 사진들중 아래 사진..)

자 다음.... 동적 셀렉션 스크린은

At selection screen 에 만글었다.


위 사진들이 동적 셀렉션 스크린을 만들기 위해
해둔 코딩이다.

코딩 몇년차들은 키포인트 펑션은

FREE_SELECTIONS_INIT

FREE_SELECTIONS_WHERE_2_EX

FREE_SELECTIONS_DIALOG

이 세개로 구성이 가능하다는걸 바로 알 것이다.

이 세개로 WHERE USE 해서 스텐다드에서
쓰는걸 찾아 코딩 카피를 하는걸 추천한다.
내 블로그는 그냥 아 이런식으로 했구나...
보기만 하면 좋겠다.

(폰으로 작성중이라.. 코딩을 가져올수없다..)

암튼 위에 화면으로 데이터값을 받으면

코딩상에서 동적으로 Db 를 가져와서
동적으로 WHERE 조건 넣고
동적 itab에 넣어줘야하는거다.

이거 어찌하는지는 많이 있는디...
아래 사진참조하라..


팝업투 컨펌은 뭐 설명 안해도 아니까 패스..
저거 동적 셀렉션에 조회조건 없으면
드릅게 느려질 가능성이 있기 때문에
너 진짜 조건 안주냐? 그럼 맥시멈 1000건만
갖고올꾸야.. 알림팝업 만든것임...

동적 쿼리 보면 전부 괄호에
INTO TABLE <F_Fs> 인
필드심볼들을 썼다..
원래 저렇게 하는거다....
저방법뿐이다..
다이나믹하게 구현해야 하기에..

여기서도 포인트는

CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( P_TAB )

이런거겠다...

해석하자면
내가 원하는 Db명에대해 로우타입(1라인) 을 가져와서
테이블 타입을 또 만들어 주는데 쓴거다..

위 사진상 REF_ROWTYPE / REF_TABLETYPE
코딩들이 그거다...

그 후에 create data 로 선언을 하는거지...

DATA : LT_XXXX TYPE TABLE OF XXXXX

이런걸 동적정보들로 만들어여 하니까..
나도 이거 만들때 맨날 햇깔려서 ... 내가 해둔걸 보고
만든다...
외우라는게 아니라.. 아 이렇게 해야한다만
이해하면 된다.
이런 과정이 있어야 한다.. 라고...

어짜피 코딩은 카피엔 페이스트 아닌가.... ㅡㅡ
누군가가 이미 다 해놨다..
원리만 깨우쳐두면 된다.

물론 초보때는 딱 50번만 손으로 코딩해보라...
그러면 이해안가던게 이해가 간다... (진짜임)

자 다시 본론으로 돌아와서

동적 셀렉스크린 -> 조건값 받고 실행 -> 동적 Db selection 및 동적 ITAB에 담기

까지 했으니 이제 ALV 로 쀼리면 된다.

그거 보여주기전에 첫 화면에 log report 버튼 어찌만들었나 묻는다면

AT SELECTION SCREEN OUTPUT.

Perform set_button_in_app_toolbar.
에 만들어놨다.

at selection screen on p_tab.
은 DB 명이 있는건지 체크하는 코딩을 넣었다. 하단사진

CBO가 아닌 것들은 주의 메세지를 뿌렸다.

이제 Start of selection

메인 부분을 볼 차롄데..
어라? perform genr_scr 을 그대로 넣었네?
이거 위에 설명한 동적 화면 선택코딩들이다.

오옹..
사실 at selection screen 게 동작안하고
start of selection게 뜨는거다 ..

이유가 있었는데 스킵..

암튼 데이터 담으면

end of selection 아래
call screen 300으로 간다.



버튼 액션은 아래와 같이..


SAVE 코딩과 Delete 코딩은
빡샜다..
로그db 를 헤더와 아이템으로 만들어서
변경전후 필드값을 저장하고 해당 DB 키값을 저장해두는
코딩을 했다..
사실 이런 코딩이 백배 더 빡센 코딩이다..
설계 분석 개발 다 해야하니...
살짝 보여주면..
내 컨셉은
기존값과 현재값을 전부 필드마다 비교해서
전후값을 저장하는건데..

이거 사실 ALV 기능중에 핸들 데이터 체인지드
쓰면 바뀐 라인의 값이 나온다...
근데 쿼리상 어쨌든 해당 라인을 불러와서
키값저장하고 하는건 쿼리가 필요하기에..

나는 내가 선언한 ITAB들에 저장하고 있다가
비교후 로그에 넣는 방식을 선택했다.

아래 컨셉 확인해보라

위처럼 모든 필드를 다이나믹하게 비교한다 .
그런데 여기서 또 살짝쿵 기술이 ..

해당 Db에 키필드가 뭔지.. 키값이 뭔지
어찌 가져올까???
동적DB인데...
그건 위 사진중 힌트가 있었는디

바로 Dd03l db에 있다.

이렇게 위에처럼 Gt_field에 담아두고

아래처럼 키필드들의 값을
키필드 : 값 / 키필드:값 .....
으로 저장했다. ㅋㅋㅋㅋ

저러면 언제든 저걸 붙여넣어서 가져옴 되니...



삭제버튼도 머리쓰며 코딩했는데....
alv 툴바 버튼의 삭제를 누른거니
해당 이벤트타고 처리할까 하다가
버튼은 한대 모아두자.. 해서
300스크린 커맨드 안에 심도록 코딩했다


저 set new ok code 가 그리로 보내준다..

하 정리 끝...

나머지는 당신의 능력것 짜면 된당 ㅎㅎㅎ

문의사항은 언제나 댓글로.....

728x90
반응형