실행화면
조회조건을 사용자로부터 입력 받아 실행 버튼을 누르면 자재정보 변경 신청 현황 ALV 화면으로 이동한다.
자재번호
클릭시 자재정보 변경신청 프로그램의 화면200으로 이동한다. 모든 필드는 입력 불가능하게 막고 변경신청 아이콘도 보이지 않게 한다.
- 조회조건에서 입력 받은 해당 조건에 맞는 데이터를 (ZMARA_xx) 테이블에서 읽어 출력
- 자재명, 자재그룹, 자재유형명은 해당 코드의 텍스트 값을 출력, 언어는 로그인 언어
- 자재번호 핫스팟 클릭 시 자재정보 변경신청(ZMARA_xx) 화면 호출하여 클릭 한 라인의 자재정보를 화면에 출력(입력 필드들도 출력만 가능하도록 제어)
프로그램 로직
1. 초기화면 생성
TABLES: zmara_11.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-000..
SELECT-OPTIONS: s_matnr FOR zmara_11-matnr,
s_matkl FOR zmara_11-matkl,
s_mtart FOR zmara_11-mtart.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_aenam FOR zmara_11-aenam,
s_laeda FOR zmara_11-laeda.
SELECTION-SCREEN END OF BLOCK b2.
2. 데이터 담을 변수 선언
테이블의 필드와 텍스트 필드를 모두 포함하는 구조와 인터널테이블을 선언한다.
DATA: BEGIN OF gs_tab.
INCLUDE STRUCTURE zmara_11.
DATA: maktx TYPE makt-maktx,
wgbez TYPE t023t-wgbez, "자재그룹 명
mtbez TYPE t134t-mtbez, "자재유형 명
END OF gs_tab,
gt_tab LIKE TABLE OF gs_tab.
3. 데이터 SELECT
조회조건에서 입력 받은 해당 조건에 맞는 데이터를 (ZMARA_xx) 테이블에서 읽어 출력한다. 자재명, 자재그룹, 자재유형명은 해당 코드의 텍스트 값을 출력하고 언어는 로그인 언어로 출력한다.
화면이 실행됐을때 데이터를 가져와야하므로 START-OF-SELECTION에 구문을 넣어준다. 가독성을 위해 PERFORM으로 빼주는것을 추천한다.
SELECT * FROM zmara_11 AS a
INNER JOIN t023t AS b "자재그룹 명
ON a~matkl = b~matkl
INNER JOIN t134t AS c "자재유형 명
ON a~mtart = c~mtart
INNER JOIN makt AS d "자재명
ON a~matnr = d~matnr
INTO CORRESPONDING FIELDS OF TABLE gt_tab
WHERE a~matnr IN s_matnr
AND a~matkl IN s_matkl
AND a~mtart IN s_mtart
AND c~spras = sy-langu
AND b~spras = sy-langu
AND d~spras = sy-langu.
4. ALV 화면 생성
실행후 ALV를 뿌려줄 화면 100번을 생성한다. 화면에는 컨테이너를 그려준다. HD_CON
실행버튼을 눌렀을때 ALV 화면을 뿌려줘야하므로 데이터 SELECT 구문 이후에 구문을 입력한다.
CALL SCREEN 100.
5. ALV 관련 데이터 선언
DATA: g_alv TYPE REF TO cl_gui_alv_grid,
g_custom_con TYPE REF TO cl_gui_custom_container,
DATA: gs_fieldcat TYPE lvc_s_fcat,
gt_fieldcat TYPE lvc_t_fcat, "필드 카탈로그
gs_layo TYPE lvc_s_layo, "레이아웃 옵션
gs_sort TYPE lvc_s_sort, "정렬
gt_sort TYPE lvc_t_sort.
6. 오브젝트 생성
화면100
의 PBO에 작성한다.
CHECK g_custom_con IS INITIAL.
CREATE OBJECT g_custom_con
EXPORTING
container_name = 'HD_CON'.
CREATE OBJECT g_alv
EXPORTING
i_parent = g_custom_con.
7. 필드 카탈로그 구성
gs_fieldcat-fieldname = 'MATNR'.
gs_fieldcat-coltext = '자재번호'.
gs_fieldcat-just = 'C'.
gs_fieldcat-key = 'X'.
APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
gs_fieldcat-fieldname = 'MAKTX'.
gs_fieldcat-coltext = '자재 명'.
gs_fieldcat-just = 'C'.
APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
gs_fieldcat-fieldname = 'MTART'.
gs_fieldcat-coltext = '자재유형'.
gs_fieldcat-just = 'C'.
APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
gs_fieldcat-fieldname = 'MTBEZ'.
gs_fieldcat-coltext = '자재유형 명'.
gs_fieldcat-just = 'C'.
APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
gs_fieldcat-fieldname = 'MATKL'.
gs_fieldcat-coltext = '자재그룹'.
gs_fieldcat-just = 'C'.
APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
gs_fieldcat-fieldname = 'WGBEZ'.
gs_fieldcat-coltext = '자재그룹 명'.
gs_fieldcat-just = 'C'.
APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
gs_fieldcat-fieldname = 'ERSDA'.
gs_fieldcat-coltext = '생성일'.
gs_fieldcat-just = 'C'.
APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
gs_fieldcat-fieldname = 'ERNAM'.
gs_fieldcat-coltext = '생성자'.
gs_fieldcat-just = 'C'.
APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
gs_fieldcat-fieldname = 'LAEDA'.
gs_fieldcat-coltext = '변경일'.
gs_fieldcat-just = 'C'.
APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
gs_fieldcat-fieldname = 'AENAM'.
gs_fieldcat-coltext = '변경자'.
gs_fieldcat-just = 'C'.
APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
8. 자재번호 필드 정렬
gs_sort-spos = 1.
gs_sort-fieldname = 'MATNR'.
gs_sort-up = 'X'.
APPEND gs_sort TO gt_sort.
CLEAR gs_sort.
9. 레이아웃
gs_layo-zebra = 'X'.
gs_layo-smalltitle = 'X'.
gs_layo-cwidth_opt = 'X'. "너비 최적화
gs_layo-no_merging = 'X'. "셀병합 불가능
10. ALV 출력
필드 카탈로그 구성, 정렬, 레이아웃 로직은 가독성을 위해 FORM문으로 빼주었는데 ALV를 출력하기 전에 PERFORM해주어야 한다.
PERFORM make_fieldcat. "필드카탈로그 구성
PERFORM sort. "정렬
PERFORM layo. "레이아웃
CALL METHOD g_alv->set_table_for_first_display "인스턴스명
EXPORTING
is_layout = gs_layo
CHANGING
it_outtab = gt_tab
it_fieldcatalog = gt_fieldcat
it_sort = gt_sort
자재번호 hotspot
11. 이벤트 생성
CLASS lcl_event DEFINITION.
PUBLIC SECTION. "다른프로그램에서 접근가능
METHODS : handler_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id e_column_id es_row_no.
ENDCLASS.
CLASS lcl_event IMPLEMENTATION.
METHOD handler_hotspot_click.
PERFORM hotspot_click USING e_row_id e_column_id.
ENDMETHOD.
ENDCLASS.
DATA : g_application TYPE REF TO lcl_event.
12. 핸들러 등록
화면100의 ALV에서 이 이벤트가 발생하기 때문에 화면100의 ALV를 출력하기 전에 핸들러를 등록하는 구문을 넣어준다.
CREATE OBJECT g_application.
SET HANDLER g_application->handler_hotspot_click FOR g_alv.
13. 이벤트 발생할 필드에 옵션 추가
화면100의 자재번호
를 클릭했을때 이벤트가 발생하므로 필드카탈로그를 구성하는 판매문서 필드에 HOTSPOT 옵션 기능을 추가한다.
gs_fieldcat-fieldname = 'MATNR'.
gs_fieldcat-coltext = '자재번호'.
✔ gs_fieldcat-hotspot = 'X'.
APPEND gs_fieldcat TO gt_fieldcat. CLEAR: gs_fieldcat.
14. 핫스팟 구문
자재정보 변경신청 프로그램에 트랜잭션 코드를 하나 더 생성하고 (ZMARA_11_2
) 생성한 트랜잭션 코드를 불러온다.
FORM hotspot_click USING p_row_id p_column_id.
DATA: l_col(40).
FIELD-SYMBOLS <fs>.
READ TABLE gt_tab INTO gs_tab INDEX p_row_id.
CHECK sy-subrc = 0.
CONCATENATE 'GS_TAB-' p_column_id INTO l_col.
ASSIGN (l_col) TO <fs>.
CHECK NOT <fs> IS INITIAL.
CASE p_column_id.
WHEN 'MATNR'.
SET PARAMETER ID 'MAT' FIELD gs_tab-matnr.
CALL TRANSACTION 'ZMARA_11_2'AND SKIP FIRST SCREEN.
ENDCASE.
FREE MEMORY ID 'MAT'.
ENDFORM.
⭐ SET PARAMETER ID는 다른프로그램으로 값 넘겨줄 필드를 말한다. ALV화면의 자재번호 클릭시 이벤트가 발생하므로 값 넘겨줄 필드는 GS_TAB-MATNR
이 된다. GET은 받을 프로그램의 필드이므로 받을 필드는 전프로그램인 자재정보 변경신청 프로그램의 첫화면에 그린 필드 zmara_11-matnr
가 된다.
전프로그램 자재정보 변경신청 프로그램의 초기값 설정하는 부분에 GET PARAMETER ID를 구현해준다.
INITIALIZATION.
GET PARAMETER ID 'MAT' FIELD zmara_11-matnr.
15. CALL TRANSACTION 스크린 제어
자재번호 핫스팟 클릭 시 자재정보 변경신청 프로그램의 화면을 호출하여 클릭한 라인의 자재정보를 화면에 출력한다. 이때 입력 필드들도 출력만 가능하도록 제어하기 위해 스크린 제어 구문을 입력한다. SY-TCODE를 사용한다.
이때 이 구문은 자재정보 변경신청 프로그램
의 화면 200의 PBO에 입력한다.
DATA: LT_FCODE TYPE TABLE OF SY-UCOMM.
LOOP AT SCREEN.
IF sy-tcode = 'ZMARA_11'.
screen-input = 1.
ELSEIF sy-tcode = 'ZMARA_11_2'.
screen-input = 0.
APPEND 'SAVE' TO LT_FCODE.
SET PF-STATUS 'S200' EXCLUDING LT_FCODE.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
EXCLUDING을 사용해 변경신청
버튼도 안보이게 한다.
'ABAP' 카테고리의 다른 글
생산계획 엑셀업로드+BDC 프로그램 2 (0) | 2023.02.20 |
---|---|
생산계획 엑셀업로드+BDC 프로그램 1 (0) | 2023.02.20 |
온라인 프로그램 생성해보기 (0) | 2023.02.20 |
ALV Tree 2 (0) | 2023.02.20 |
ALV Tree (0) | 2023.02.20 |
댓글