[SAP] 1. Program 표준 템플릿

SAPCO·2024년 3월 25일
0

- [SAP]

목록 보기
11/17

1. WRITE

1-1. Declarations

*********************************************************
* SAP Module : XX
* Description : XXXXXXXXXXXXXXXXXXXXX
* Created by : XX XX XX
* Created on : YYYY/MM/DD.
* Modification Log:
* Date
*********************************************************
*--------------------------------------------------------
* REPORT IDENTIFICATION
* 리포트 선언부. 리포트 전체 라인 사이즈와 Message ID를 정의.
* Line-Size : 한 라인당 칼럼 수를 정의.
* Line-count : 한 페이지당 라인 수를 정의.
* Message-id : 메시지 구문을 모아서 정의한 Message Set을 정의.
*--------------------------------------------------------
REPORT ZREPORT
* 	NO STANDARD PAGE HEADING
*	LINE-SIZE <XX> LINE-COUNT <YY>
*	MESSAGE-ID <ZC>.

*--------------------------------------------------------
* TABLES : 프로그램에서 이용하는 테이블을 정의한다.
*--------------------------------------------------------
TABLES :

*--------------------------------------------------------
* CONSTANTS : 프로그램에서 상수로 이용할 변수를 지정
*--------------------------------------------------------
CONSTANTS :

*--------------------------------------------------------
* TYPES : 프로그램에서 사용할 타입을 미리 선언.
*--------------------------------------------------------
TYPES :  begin of st_xyz,
	 	 end   of st_xyz.

*--------------------------------------------------------
* TABLE TYPES : 프로그램에서 사용할 테이블 타입을 미리 선언.
*--------------------------------------------------------
TYPES : tt_xyz 	type standard table of st_xyz.

*--------------------------------------------------------
* INTERNAL TABLES
* 프로그램에서 사용할 인터널 테이블의 선언부.
* 테이블에서 데이터를 선택해서 저장하고, 연산하기 위한 DATA SET* 저장하는 데이터의 평태로 지정한 필드들의 값 세트를 n*m 
* 형태의 여러 라인으로 가진다.
*--------------------------------------------------------
DATA : gi_xyz	type tt_xyz.

*--------------------------------------------------------
* GLOBAL VARIABLES
* 프로그램 전체에서 사용할 수 있는 전역변수의 선언. 
*--------------------------------------------------------
DATA : g_xyz type st_xtz.

1-2. Dialog Module

*--------------------------------------------------------
* SELECTION-SCREEN
* 프로그램 실행 시 초기 화면의 형태를 구성.
*--------------------------------------------------------
SELECTION-SCREEN BEGION OF BLOCK 1 WITH FRAME TITLE TEXT-XXX.
	SELECT-OPTIONS : <SELFIELD1> FOR <TABLE1-FIELD>
    								 OBLIGATORY
                                     DEFAULT <XXX>.
    PARAMETER : <P_RB01> RADIOBUTTON GROUP <G1> DEFAULT 'X',
    			<P_RB02> RADIOBUTTON GROUP <G1>,
                <CHK_BOX1> AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK 1

1-3. Event Block

*--------------------------------------------------------
* AT SELECTION-SCREEN OUTPUT
* SELECTION-SCREEN의 PBO와 같은 역할로
* 화면이 처음 실행될 떄, 사용자가 enter키를 칠때 작동하는 이벤트.
*--------------------------------------------------------
AT SELECTION-SCREEN OUTPUT.
	PERFORM ATSELOUT_MODIFY_SCREEN.

*--------------------------------------------------------
* INITIALIZATION
* SELECTION-SCREEN이 출력되기 전에 실행되는 이벤트.
* SELECTION-SCREEN의 필드값과 변수, 인터널 테이블을 초기화하는 이벤트.
*--------------------------------------------------------
INITIALIZATION.
	PERFORM INIT_VARIABLES.

*--------------------------------------------------------
* AT-SELECTION-SCREEN.
* SELECTION-SCREEN에서 입력한 필드값에 이상이 있거나, 
* 범위외 또는 타입에 맞지 않는 값을 입력했을 경우에 
* 이상 여부를 체크하여 오류메시지를 사용자에게 보여주도록 설정 가능.
*--------------------------------------------------------
AT SELECTION-SCREEN ON selfield1.
	IF SELFIELD1 <logical expression>.
		MESSAGE E002 WITH TEXT-003.
	ENDIF.

*--------------------------------------------------------
* START-OF-SELECTION
* 주로 이 부분에서 데이터를 처리한다.
*--------------------------------------------------------
START-OF-SELECTION.
*	SET PF-STATUS <'XXXX'>.
*   CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
*    	EXPORTING
*        	TEXT = T2
*        EXCEPTIONS
*        	OHERS = 1.
    PERFORM READ_DATA.

*--------------------------------------------------------
* END-OF-SELECTION
* SELECTION 부분이 종료된 후 실행하는 이벤트.
*--------------------------------------------------------
END-OF-SELECTION.
	PERFORM WRITE_REPORT.
* CLEAR <ITAB1-FIELD1>.

*--------------------------------------------------------
* TOP-OF-PAGE
* 리포트 출력 시 헤더의 위치에 출력되는 내용을 정의하는 이벤트.
*--------------------------------------------------------
TOP-OF-PAGE.
	PERFORM WIRTE_REPORT_HEADER.
*--------------------------------------------------------
* END-OF-PAGE
* 리포트 데이터 부분 아래에 미주형태로 출력 내용을 정의하는 이벤트.
*--------------------------------------------------------
END-OF-PAGE.
	PERFORM WIRTE_REPORT_FOOTER.

*--------------------------------------------------------
* AT USER-COMMAND
* 사용자가 특정 버튼을 클릭하거나 액션을 취할 때 처리하는 이벤트
* 연계하여 실행할 프로그램이나 데이터를 처리할 때 사용.
*--------------------------------------------------------
AT USER-COMMAND.
	CASE SY-UCOMM.
    	WHEN 'XXX'.
        	PERFORM <XXX>.
        WHEN 'YYY'.
        	PERFORM <YYY>.
    ENDCASE.
    
*--------------------------------------------------------
* AT LINE-SELECTION
* 리포트의 특정 라인을 선택하여 취하려는 경우에 사용하는 이벤트.
* 인터널 테이블 정보를 기반으로 다른 프로그램에 정보를 전달하여 사용.
*--------------------------------------------------------
AT LINE-SELECTION.
	CHECK NOT <ITAB1-FIELD1> IS INITIAL.
    PERFORM <ZZZZ>.
    CLEAR <ITAB1-FIELD1>.

1-3. Procedure

*--------------------------------------------------------
* FORM ATSELOUT_MODIFY_SCREEN
* AT SELECTION-SCREEN OUTPUT 의 PERFORM.
* SELECTION-SCREEN 변경할 떄 사용하는 수행문.
*--------------------------------------------------------
FORM ATSELOUT_MODIFY_SCREEN.
ENDFORM.

*--------------------------------------------------------
* FORM INIT_VARIABLES
* 프로그램 시작 전 프로그램에서 사용하는 모든 변수나, 
* 인터널 테이블 등을 초기화하는 수행문.
* SELECTION-SCREEN의 필드값을 정할 수 있다.
*--------------------------------------------------------
FORM INIT_VARIABLES.
	DATA : year(4) TYPE c,
    	   month(2) TYPE c,
           day(2) TYPE c.

	MOVE sy-datum+0(4) TO year. "offset에서 4자리
   	MOVE sy-datum+4(2) TO month. "offset 4에서 2자리
    MOVE : 'I' TO s_year-sign,
    	   'EQ' TO s_year-option,
           year TO s_year-low.
    APPEND s_year.
    
    MOVE : 'I' TO s_month-sign, 
    	   'EQ' TO s_month-option,
           month TO s_month-low.
    APPEND s_md.
    
    REFRESH gi_xyz. "인터널 테이블 초기화.
    CLEAR g_xyz.	"변수나 인터널 테이블 헤드 초기화.
ENDFORM.

*--------------------------------------------------------
* FORM READ_DATA
* sql문을 이용하여 데이터베이스 테이블로부터 데이터를 읽어와서
* 인터널 테이블에 저장하는 수행문.
*--------------------------------------------------------
FORM READ_DATA.
	SELECT zzz yyy
      FROM databasetable
      INTO TABLE gi_xyz
     WHERE zzz in <selfield1>.
ENDFORM.

*--------------------------------------------------------
* FORM WRITE_REPORT_HEADER
* 리포트의 머리글 부분에 쓸 내용 정의.
*--------------------------------------------------------
FORM WRITE_REPORT_HEADER.
	FORMAT COLOR COL_HEADING.
    WRITE AT (10) <TEXT1>.
    WRITE AT (20) <TEXT2>.
    ULINE.
ENDFORM.

*--------------------------------------------------------
* FORM WIRTE_REPORT_FOOTER
* 리포트의 바닥글 부분에 쓸 내용을 정의.
*--------------------------------------------------------
FORM WRITE_REPORT_FOOTER.
	WRITE : / <TEXT4>.
ENDFORM.


*--------------------------------------------------------
* FORM WRITE REPORT
* 실제 리포트 상세 내역을 화면에 출력. 
* 인터널 테이블에 여러 데이터가 있어써 반복문을 이용하여 출력.
*--------------------------------------------------------
FORM WRITE REPORT.
	LOOP AT gi_xyz into g_xyz.
    	WRITE : /AT 10<ITAB1-FIELD1> COLOR COL_KEY INTENSIFIED.
		FORMAT RESET.
        
        FORMAT COLOR COL_NORMAL.
        WRITE : /AT 25 gi_xyz-field1.
		WRITE : /AT 40 gi_xyz-field2.
        HIDE <ITAB1-FIELD1>.
        
        NEW-LINE.
    ENDLOOP.
		

2. ALV

2-1. Declarations

*********************************************************
* SAP Module : XX
* Description : XXXXXXXXXXXXXXXXXXXXX
* Created by : XX XX XX
* Created on : YYYY/MM/DD.
* Modification Log:
* Date
*********************************************************
*--------------------------------------------------------
* REPORT IDENTIFICATION
* 리포트 선언부. 리포트 전체 라인 사이즈와 Message ID를 정의.
* Line-Size : 한 라인당 칼럼 수를 정의.
* Line-count : 한 페이지당 라인 수를 정의.
* Message-id : 메시지 구문을 모아서 정의한 Message Set을 정의.
*--------------------------------------------------------
REPORT ZREPORT
* 	NO STANDARD PAGE HEADING
*	LINE-SIZE <XX> LINE-COUNT <YY>
*	MESSAGE-ID <ZC>.

*--------------------------------------------------------
* TABLES : 프로그램에서 이용하는 테이블을 정의한다.
*--------------------------------------------------------
TABLES :

*--------------------------------------------------------
* CONSTANTS : 프로그램에서 상수로 이용할 변수를 지정
*--------------------------------------------------------
CONSTANTS :

*--------------------------------------------------------
* TYPES : 프로그램에서 사용할 타입을 미리 선언.
*--------------------------------------------------------
TYPES :  begin of st_xyz,
	 	 end   of st_xyz.

*--------------------------------------------------------
* TABLE TYPES : 프로그램에서 사용할 테이블 타입을 미리 선언.
*--------------------------------------------------------
TYPES : tt_xyz 	type standard table of st_xyz.

*--------------------------------------------------------
* INTERNAL TABLES
* 프로그램에서 사용할 인터널 테이블의 선언부.
* 테이블에서 데이터를 선택해서 저장하고, 연산하기 위한 DATA SET* 저장하는 데이터의 평태로 지정한 필드들의 값 세트를 n*m 
* 형태의 여러 라인으로 가진다.
*--------------------------------------------------------
DATA : gi_xyz	type tt_xyz.

*--------------------------------------------------------
* GLOBAL VARIABLES
* 프로그램 전체에서 사용할 수 있는 전역변수의 선언. 
*--------------------------------------------------------
DATA : g_xyz type st_xtz.

2-2. Dialog Module

*--------------------------------------------------------
* SELECTION-SCREEN
* 프로그램 실행 시 초기 화면의 형태를 구성.
*--------------------------------------------------------
SELECTION-SCREEN BEGION OF BLOCK 1 WITH FRAME TITLE TEXT-XXX.
	SELECT-OPTIONS : <SELFIELD1> FOR <TABLE1-FIELD>
    								 OBLIGATORY
                                     DEFAULT <XXX>.
    PARAMETER : <P_RB01> RADIOBUTTON GROUP <G1> DEFAULT 'X',
    			<P_RB02> RADIOBUTTON GROUP <G1>,
                <CHK_BOX1> AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK 1

2-3. Event Block

*--------------------------------------------------------
* AT SELECTION-SCREEN OUTPUT
* SELECTION-SCREEN의 PBO와 같은 역할로
* 화면이 처음 실행될 떄, 사용자가 enter키를 칠때 작동하는 이벤트.
*--------------------------------------------------------
AT SELECTION-SCREEN OUTPUT.
	PERFORM ATSELOUT_MODIFY_SCREEN.

*--------------------------------------------------------
* INITIALIZATION
* SELECTION-SCREEN이 출력되기 전에 실행되는 이벤트.
* SELECTION-SCREEN의 필드값과 변수, 인터널 테이블을 초기화하는 이벤트.
*--------------------------------------------------------
INITIALIZATION.
	PERFORM INIT_VARIABLES.

*--------------------------------------------------------
* AT-SELECTION-SCREEN.
* SELECTION-SCREEN에서 입력한 필드값에 이상이 있거나, 
* 범위외 또는 타입에 맞지 않는 값을 입력했을 경우에 
* 이상 여부를 체크하여 오류메시지를 사용자에게 보여주도록 설정 가능.
*--------------------------------------------------------
AT SELECTION-SCREEN ON selfield1.
	IF SELFIELD1 <logical expression>.
		MESSAGE E002 WITH TEXT-003.
	ENDIF.

*--------------------------------------------------------
* START-OF-SELECTION
* 주로 이 부분에서 데이터를 처리한다.
*--------------------------------------------------------
START-OF-SELECTION.
*	SET PF-STATUS <'XXXX'>.
*   CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
*    	EXPORTING
*        	TEXT = T2
*        EXCEPTIONS
*        	OHERS = 1.
    PERFORM READ_DATA.

*--------------------------------------------------------
* END-OF-SELECTION
* SELECTION 부분이 종료된 후 실행하는 이벤트.
*--------------------------------------------------------
END-OF-SELECTION.
	PERFORM EDIT_DATA.
* CLEAR <ITAB1-FIELD1>.

2-4. Procedure

*--------------------------------------------------------
* FORM READ_DATA
* sql문을 이용하여 데이터베이스 테이블로부터 데이터를 읽어와서
* 인터널 테이블에 저장하는 수행문.
*--------------------------------------------------------
FORM READ_DATA.
	SELECT zzz yyy
      FROM databasetable
      INTO TABLE gi_xyz
     WHERE zzz in <selfield1>.
ENDFORM.

*--------------------------------------------------------
* FORM EDIT_DATA
* data의 내용을 화면에 출력. ALV 형태에 맞게 조정하여 출력한다.
*--------------------------------------------------------
FORM edit_data.
	PERFORM fieldcat_crt_rtn.
    PERFORM layout_edit_rtn.
    PERFORM header_edit_rtn.
    PERFORM event_edit_rtn CHANGING g_eventcat.
    
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    	EXPORTING
        	i_callback_program			= g_pgm
            i_callback_pf_status_set	= 'SET_PF_STATUS'=
			is_layout					= g_layout
            it_fieldcat					= g_field_cat[]
            it_sort						= g_sortcat
            it_events					= g_eventcat[]
            is_print					= g_print_cat
         TABLES
         	t_outtab					= gi_list.
ENDFORM.

2-5. procedure of ALV

*--------------------------------------------------------
* FORM ALV_HEADER
* ALV의 헤더 부분을 세팅
*--------------------------------------------------------
FORM top_of_page.
	CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    	EXPORTING
        	it_list_commentary = g_top_of_page.
ENDFORM.

*--------------------------------------------------------
* FORM SET_PF_STATUS
* 리포트의 머리글 부분에 쓸 내용 정의.
*--------------------------------------------------------
FORM SET_PF_STATUS USING extab TYPE slis_t_extab.
	SET PF-STATUS 'ALV_PF'.
    SET TITLEBAR 'ALV_TITLE'.
ENDFORM.

*--------------------------------------------------------
* FORM FIELDCAT_CRT_RTN
+ ALV 화면에 출력할 필드 정의
* 컬럼병은 반드시 대문자로 써야한다.
*--------------------------------------------------------
FORM fieldcat_crt_rtn.
* FIELD CATALOG -----------------------------------------
*       P_FNAM P_TEXT P_TYPE P_OLEN P_FIXC P_NOUT P_CAT
	PERFORM fieldcat_edit_rtn USING :
    	'PSPID'	'Project No ' 	' ' 	'15' 	'X'  ' '  'C1',
    	'PSPID'	'WBS elem	' 	' ' 	'15' 	'X'  ' '  'C1',
    	'POST1'	'WBS 명	    '   ' '     '50'    ' '  ' '  'C1',
    	'INTR '	'이자       '   ' '     '15'     ' '  ' '  'C1'.
ENDFORM.

*--------------------------------------------------------
* FORM LAYOUT_EDIT_RTN
* ALV 화면에 출력할 레이아웃 속성 정의
*--------------------------------------------------------
FORM layout_edit_rtn.
* LAYOUT OPTIONS ----------------------------------------
	g_layout-box_fieldname 			= 'CHK'.
	g_layout-box_tabname   			= 'GI_LIST'.
	g_layout-totals_before_items 	= 'X'.
	g_layout-totals_only 			= 'X'.
	g_layout-totals_text 			= 'Total'.
	g_layout-subtotals_text 		= 'Sub Total'.
	g_layout-colwidth_optimize		= 'X'.
	g_layout-zebra 					= 'X'.
	g_layout-NO_VLINE 				= 'X'.
	g_layout-F2CODE 				= '&ETA'.
	g_layout-MAX_LINESIZE 			= '1000'
    g_layout-DEF_STATUS 			= 'ALV_PF.

* GRID OPTIONS ----------------------------------------
	g_layout-cell_merge 			= 'X'.
	g_layout-EDIT 					= 'X'.
	g_layout-edit_mode 				= 'X'.
	g_layout-WINDOW_TITLEBAR 		= SY-TITLE.
	g_layout-NO_ULINE_HS 			= 'X'.
	g_layout-KEY_HOTSPOT 			= SPACE.
	g_layout-COLTAB_FIELDNAME 		= 'T-FLD'.
	g_layout-LIST_APPEND 			= SPACE.
    
* PRINT OPTIONS ----------------------------------------
 	S_SELFIELD-REFRESH				= 'X'.
	g_print_cat-no_print_selinfos	= 'X'.
    g_print_cat-no_print_listinfos	= 'X'.
    g_print_cat-no_coverpage		= 'X'.
    g_print_cat-no_new_page			= 'X'.
ENDFORM.

*--------------------------------------------------------
* FORM HEADER_EDIT_RTN
* ALV 화면에 출력할 헤더 속성 정의
*--------------------------------------------------------
FORM HEADER_EDIT_RTN.
	DATA : lv_date(10) TYPE c.

* TOP Description Edit
	CLEAR : g_sline, g_top_of_page.
    g_sline-typ	= 'H".
    g_sline-info = '계획 Report'.
    APPEND g_sline to g_top_of_page.
    
* Project Description
	g_sline-typ	= 'H'.
    g_sline-info = 'Project No. :'.
    g_sline-info+15(20)	= p_pspid.
    APPEND g_sline TO g_top_of_page.
    
* Date Description
	DATA : lv_time(20) TYPE c.
    CONCATENATE sy-datum+0(4) '.' sy-datum+4(2) '.' sy-datum+6(2)
    	INTO lv_date.
    CONCATENATE sy-uzeit+0(2) ':' sy-uzeit+2(2) ':' sy-uzeit+4(2)
    	INTO lv_time.
        
    g_sline-typ = 'S'.
    g_sline-info = 'DATE : '.
    g_sline-info+10(20) = lv_date.
    g_sline-info+30(10) = '/ TIME : '.
    g_sline-info+40(20) = lv_time.
    APPEND g_sline TO g_top_of_page.
    
* User Description
	g_sline-typ	= 'S'.
    g_sline-info = 'USER :'.
    g_sline-info+15(20)	= sy-uname.
    APPEND g_sline TO g_top_of_page.
ENDFORM.

*--------------------------------------------------------
* FORM EVENT_EDIT_RTN
* ALV 화면에 출력할 이벤트 속성 정의
*--------------------------------------------------------
FORM event_edit_rtn CHANGING p_event_cats TYPE slis_t_event.
	CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    	EXPORTING
        	i_list_type = 0
        IMPORTING
        	et_events = g_eventcat.

	READ TABKE g_eventcat WITH KEY name = slis_ev_tio_of_page
    	INTO g_event_ccat.
    IF sy-subrc = 0.
    	MOVE s_form_top_of_page TO g_event_cat-form.
        APPEND g_event_cat TO g_eventcat.
    ENDIF.
ENDFORM.

*--------------------------------------------------------
* FORM FIELDCAT_EDIT_RTN
* ALV 화면에 출력할 필드 속성 정의
*--------------------------------------------------------
FORM fieldcat_edit_rtn USING
	p_fnam p_text p_type p_olen p_fixc p_nout p_cat.
    
    g_pos					= g_pos +1.
    g_fieldcat-col_pos 		= p_pos.
    g_fieldcat-fieldname 	= p_fnam.
    g_fieldcat-reptext_ddic	= p_text.
    g_fieldcat-datatype		= p_type.
	g_fieldcat-outputlen	= p_olen.
    g_fieldcat-fix_column	= p_fixc.
    g_fieldcat-no_out		= p_nout.
    g_fieldcat-input		= p_edit.
    g_fieldcat-edit			= p_edit.
    g_fieldcat-no_zero		= 'X'.
    
* 특정한 칼럼의 필드에 속성을 지정
	CASE p_fnam.
    	WHEN 'WKGBTR'.
        	g_fieldcat-just	= 'R'.	* 위치 정렬
            g_fieldcat-edit_mask	= '____%'.
        WHEN 'SUM_WKG'.
        	g_fieldcat-just	= 'R'.	* 위치 정렬
        WHEN 'RATE1'.
        	g_fieldcat-just	= 'R'.	* 위치 정렬
        WHEN 'INTR'.
        	g_fieldcat-just	= 'R'.	* 위치 정렬
	ENDCASE.
    
	CASE p_cat.
    	WHEN 'C1'.
        	APPEND : g_fieldcat TO g_field_cat.
    ENDCASE.
    
* SORT CATALOG 특정 칼럼의 필드에 정렬 속성을 지정함
	CASE p_fnam.
    	WHEN 'PSPID'.
        	PERFORM sort_cat_edit_rtn USING :
            	p_fnam g_pos 'X' ' ' 'X'.
        WHEN 'POSID'.
        	PERFORM sort_cat_edit_rtn USING :
            	p_fnam g_pos 'X' ' ' 'X'.
        WHEN 'POST1'.
        	PERFORM sort_cat_edit_rtn USING :
            	p_fnam g_pos 'X' ' ' 'X'.
    ENDCASE.
    CLEAR : g_fieldcat.
EMDFORM.

*--------------------------------------------------------
* FORM sort_cat_edit_rtn
* ALV 화면에 출력될 Column Sort 속성 정의
*--------------------------------------------------------
FORM sort_cat_edit_rtn USING p_fname p_pos p_up p_down p_subtot.
	g_sort_cat-spos			= p_pos.	* 필드위치
    g_sort_cat-fieldname	= p_fname.	* 필드 Name
    g_sort_cat-up			= p_up.		* Ascending Sort(Space or 'X')
    g_sort_cat-down			= p_down.	* Descending Sort(Space or 'X')
    g_sort_cat-subtot		= p_subtot.	* Sub Total(Space or 'X')
    APPEND g_sort_cat TO g_sortcat.		* X로 체크하면 설정됨.
ENDFORM.

2-6. GUIs of Screens

생략.

3. 다이얼로그 프로그래밍(모듈풀)

3-1. Declarations

*********************************************************
* SAP Module : XX
* Description : XXXXXXXXXXXXXXXXXXXXX
* Created by : XX XX XX
* Created on : YYYY/MM/DD.
* Modification Log:
* Date
*********************************************************
*--------------------------------------------------------
* REPORT IDENTIFICATION
* 프로그램 선언부. Message ID를 정의.
* Message-id : 메시지 구문을 모아서 정의한 Message Set을 정의.
*--------------------------------------------------------
REPORT ZREPORT
*	MESSAGE-ID <ZC>.

*--------------------------------------------------------
* TABLES : 프로그램에서 이용하는 테이블을 정의한다.
*--------------------------------------------------------
TABLES :

*--------------------------------------------------------
* CONSTANTS : 프로그램에서 상수로 이용할 변수를 지정
*--------------------------------------------------------
CONSTANTS :

*--------------------------------------------------------
* STANDARD TYPES : 프로그램에서 사용할 타입을 미리 선언.
*--------------------------------------------------------
TYPES :  begin of st_xyz,
	 	 end   of st_xyz.

*--------------------------------------------------------
* TABLE TYPES : 프로그램에서 사용할 테이블 타입을 미리 선언.
*--------------------------------------------------------
TYPES : tt_xyz 	type standard table of st_xyz.

*--------------------------------------------------------
* INTERNAL TABLES
* 프로그램에서 사용할 인터널 테이블의 선언부.
* 테이블에서 데이터를 선택해서 저장하고, 연산하기 위한 DATA SET* 저장하는 데이터의 평태로 지정한 필드들의 값 세트를 n*m 
* 형태의 여러 라인으로 가진다.
*--------------------------------------------------------
DATA : gi_xyz	type tt_xyz.

*--------------------------------------------------------
* GLOBAL VARIABLES
* 프로그램 전체에서 사용할 수 있는 전역변수의 선언. 
*--------------------------------------------------------
DATA : g_xyz type st_xtz.

3-2. Dialog Module

*--------------------------------------------------------
* SELECTION-SCREEN
* 프로그램 실행 시 초기 화면의 형태를 구성.
*--------------------------------------------------------
SELECTION-SCREEN BEGION OF BLOCK 1 WITH FRAME TITLE TEXT-XXX.
	SELECT-OPTIONS : <SELFIELD1> FOR <TABLE1-FIELD>
    								 OBLIGATORY
                                     DEFAULT <XXX>.
    PARAMETER : <P_RB01> RADIOBUTTON GROUP <G1> DEFAULT 'X',
    			<P_RB02> RADIOBUTTON GROUP <G1>,
                <CHK_BOX1> AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK 1

3-3. Event Block

*--------------------------------------------------------
* AT SELECTION-SCREEN OUTPUT
* SELECTION-SCREEN의 PBO와 같은 역할로
* 화면이 처음 실행될 떄, 사용자가 enter키를 칠때 작동하는 이벤트.
*--------------------------------------------------------
AT SELECTION-SCREEN OUTPUT.
	PERFORM ATSELOUT_MODIFY_SCREEN.

*--------------------------------------------------------
* INITIALIZATION
* SELECTION-SCREEN이 출력되기 전에 실행되는 이벤트.
* SELECTION-SCREEN의 필드값과 변수, 인터널 테이블을 초기화하는 이벤트.
*--------------------------------------------------------
INITIALIZATION.
	PERFORM INIT_VARIABLES.

*--------------------------------------------------------
* AT-SELECTION-SCREEN.
* SELECTION-SCREEN에서 입력한 필드값에 이상이 있거나, 
* 범위외 또는 타입에 맞지 않는 값을 입력했을 경우에 
* 이상 여부를 체크하여 오류메시지를 사용자에게 보여주도록 설정 가능.
*--------------------------------------------------------
AT SELECTION-SCREEN ON selfield1.
	IF SELFIELD1 <logical expression>.
		MESSAGE E002 WITH TEXT-003.
	ENDIF.

*--------------------------------------------------------
* START-OF-SELECTION
* 주로 이 부분에서 데이터를 처리한다.
*--------------------------------------------------------
START-OF-SELECTION.
*	SET PF-STATUS <'XXXX'>.
*   CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
*    	EXPORTING
*        	TEXT = T2
*        EXCEPTIONS
*        	OHERS = 1.
    PERFORM READ_DATA.

*--------------------------------------------------------
* END-OF-SELECTION
* SELECTION 부분이 종료된 후 실행하는 이벤트.
*--------------------------------------------------------
END-OF-SELECTION.
	PERFORM EDIT_DATA.
* CLEAR <ITAB1-FIELD1>.

3-4. Procedure

*--------------------------------------------------------
* FORM ATSELOUT_MODIFY_SCREEN
* AT SELECTION-SCREEN OUTPUT 의 PERFORM.
* SELECTION-SCREEN 변경할 떄 사용하는 수행문.
*--------------------------------------------------------
FORM ATSELOUT_MODIFY_SCREEN.
ENDFORM.

*--------------------------------------------------------
* FORM INIT_VARIABLES
* 프로그램 시작 전 프로그램에서 사용하는 모든 변수나, 
* 인터널 테이블 등을 초기화하는 수행문.
* SELECTION-SCREEN의 필드값을 정할 수 있다.
*--------------------------------------------------------
FORM INIT_VARIABLES.
	DATA : year(4) TYPE c,
    	   month(2) TYPE c,
           day(2) TYPE c.

	MOVE sy-datum+0(4) TO year. "offset에서 4자리
   	MOVE sy-datum+4(2) TO month. "offset 4에서 2자리
    MOVE : 'I' TO s_year-sign,
    	   'EQ' TO s_year-option,
           year TO s_year-low.
    APPEND s_year.
    
    MOVE : 'I' TO s_month-sign, 
    	   'EQ' TO s_month-option,
           month TO s_month-low.
    APPEND s_md.
    
    REFRESH gi_xyz. "인터널 테이블 초기화.
    CLEAR g_xyz.	"변수나 인터널 테이블 헤드 초기화.
ENDFORM.

*--------------------------------------------------------
* FORM READ_DATA
* sql문을 이용하여 데이터베이스 테이블로부터 데이터를 읽어와서
* 인터널 테이블에 저장하는 수행문.
*--------------------------------------------------------
FORM READ_DATA.
	SELECT zzz yyy
      FROM databasetable
      INTO TABLE gi_xyz
     WHERE zzz in <selfield1>.
ENDFORM.

*--------------------------------------------------------
* FORM EDIT_DATA
* data의 내용을 화면에 출력.
*--------------------------------------------------------
FORM EDIT_DATA.
	CALL SCREEN 0100.
ENDFORM.

3-5. Define of Screens

Screen Attribute 설정 -> Layout 설정 -> FLOW LOGIC
*--------------------------------------------------------
* FLOW LOGIC
* data의 내용을 화면에 출력.
*--------------------------------------------------------
PROCESS BEFORE OUTPUT.
	MODULE status_0100.
    LOOP AT it_zsd0003 WITH CONTROL tcl
    	CURSOR tcl-current_line.
        MODULE modify_screen_0100.
    ENDLOOP.
    
PROCESS AFTER INPUT.
	MODULE exit AT EXIT-COMMAND.
    LOOP AT it_zsd00003.
    	MODULE modify_tcl.
    ENDLOOP.
    MODULE user_command_0100.
	

3-6. Modules of Screens

*--------------------------------------------------------
* MODULE STATUS_100 OUTPUT
* Status(menubar, toolbar, function key) 지정.
*--------------------------------------------------------
MODULE STATUS_0100 OUTPUT.
	SET PF-STATUS 'SCREEN0100'.
    SET TITLEBAR 'SCREEN0100'.
* Setting the number of line of the table control
	DESCRIBE TABLE it_zsd00003 LINES tcl-lines.
* Optional : Place the cursor on line g_current_line e.g.
* after a validation error has occured
	IF NOT (g_current_line IS INITIAL).
    	tcl-top_line = g_current_line.
        CLEAR g_current_line.
    ENDIF.

ENDMODULE.

*--------------------------------------------------------
* MODULE STATUS_100 OUTPUT
* 화면 속성 변경
*--------------------------------------------------------
MODULE modify_screen_0100 OUTPUT.
* Optional : Protect some of the coulumns on the table control
	LOOP AT SCREEN.
    	IF screen-group1 = 'X'.
        	screen-input = 0.
            MODIFY SCREEN.
        ENDIF.
    ENDLOOP.
ENDMODULE.

*--------------------------------------------------------
* MODULE EXIT INPUT.
* 화면 Exit 처리
*--------------------------------------------------------
MODULE EXIT INPUT.
	CASE sy-ucomm.
    	WHEN 'EXIT'.
        	LEAVE PROGRAM.
    	WHEN 'BACK'.
        	SET SCREEN 0.
        	LEAVE SCREEN.
    	WHEN 'CANC'.
        	SET SCREEN 0.
        	LEAVE SCREEN.
    ENDCASE.
    CLEAR : sy-ucomm.
ENDMODULE.

*--------------------------------------------------------
* MODULE MODIFY_TCL INPUT.
* Table control 속성 변경.
*--------------------------------------------------------
MODULE MODIFY_TCL INPUT.
* Modify an existing entry
	MODIFY it_zsd00003 INDEX tcl-current_line.
* OR 
* Appending a anew entry
	APPEND it_zsd00003.
    
ENDMODULE.

*--------------------------------------------------------
* MODULE USER_COMMAND_0100 INPUT
* 사용자 함수 키 처리.
*--------------------------------------------------------
MODULE user_command_0100 INPUT.
	cASE sy-ucomm.
    	WHEN 'SAVE'.
    	WHEN 'INSR'.
    	WHEN 'CHAN'.
    	WHEN 'DELE'.
    	WHEN 'UPLD'.
    	WHEN 'LOGD'.
    	WHEN 'EXCE'.
    	WHEN 'DOWN'.
    	WHEN 'SORT'.
    ENDCASE.
    CLEAR : sy-ucomm.

ENDMODULE.

3-7. GUIs of Screens

Menu Bar -> Application Bar -> Function Keys -> Title 설정

4. BDC

4-1. Declarations

*********************************************************
* SAP Module : XX
* Description : XXXXXXXXXXXXXXXXXXXXX
* Created by : XX XX XX
* Created on : YYYY/MM/DD.
* Modification Log:
* Date
*********************************************************
*--------------------------------------------------------
* REPORT IDENTIFICATION
* 프로그램 선언부. Message ID를 정의.
* Message-id : 메시지 구문을 모아서 정의한 Message Set을 정의.
*--------------------------------------------------------
REPORT ZBDC
*	MESSAGE-ID <ZC>.

*--------------------------------------------------------
* TABLES : 프로그램에서 이용하는 테이블을 정의한다.
*--------------------------------------------------------
TABLES :

*--------------------------------------------------------
* CONSTANTS : 프로그램에서 상수로 이용할 변수를 지정
*--------------------------------------------------------
CONSTANTS :

*--------------------------------------------------------
* STANDARD TYPES : 프로그램에서 사용할 타입을 미리 선언.
*--------------------------------------------------------
TYPES :  begin of st_xyz,
	 	 end   of st_xyz.

*--------------------------------------------------------
* TABLE TYPES : 프로그램에서 사용할 테이블 타입을 미리 선언.
*--------------------------------------------------------
TYPES : tt_xyz 	type standard table of st_xyz.

*--------------------------------------------------------
* INTERNAL TABLES
* 프로그램에서 사용할 인터널 테이블의 선언부.
* 테이블에서 데이터를 선택해서 저장하고, 연산하기 위한 DATA SET* 저장하는 데이터의 평태로 지정한 필드들의 값 세트를 n*m 
* 형태의 여러 라인으로 가진다.
*--------------------------------------------------------
DATA : gi_xyz	type tt_xyz.

*--------------------------------------------------------
* BDC TABLE
* BDC를 실행하기 위한 DATA TEMPLAT INTERNAL TABLE. 
*--------------------------------------------------------
DATA : BEGIN OF bdc_tab OCCURS 0.
		INCLUDE STRUCTURE BDCDATA.
DATA : END OF bdc_tab.

*--------------------------------------------------------
* BDC MESSAGE TABLE
* BDC를 실행한 후 결과 메시지를 되돌려받기 위한 INTERNAL TABLE. 
*--------------------------------------------------------
DATA : BEGIN OF GT_ITAB OCCURS 10.
		INCLUDE STRUCTURE BDCMSGCOLL.
DATA : END OF GT_ITAB.

*--------------------------------------------------------
* GLOBAL VARIABLES
* 프로그램 전체에서 사용할 수 있는 전역변수의 선언. 
*--------------------------------------------------------
DATA : g_xyz type st_xtz.

4-2. Dialog Module

*--------------------------------------------------------
* SELECTION-SCREEN
* 프로그램 실행 시 초기 화면의 형태를 구성.
*--------------------------------------------------------
SELECTION-SCREEN BEGION OF BLOCK 1 WITH FRAME TITLE TEXT-XXX.
	SELECT-OPTIONS : <SELFIELD1> FOR <TABLE1-FIELD>
    								 OBLIGATORY
                                     DEFAULT <XXX>.
    PARAMETER : <P_RB01> RADIOBUTTON GROUP <G1> DEFAULT 'X',
    			<P_RB02> RADIOBUTTON GROUP <G1>,
                <CHK_BOX1> AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK 1

4-3. Event Block

*--------------------------------------------------------
* AT-SELECTION-SCREEN.
* SELECTION-SCREEN에서 입력한 필드값에 이상이 있거나, 
* 범위외 또는 타입에 맞지 않는 값을 입력했을 경우에 
* 이상 여부를 체크하여 오류메시지를 사용자에게 보여주도록 설정 가능.
*--------------------------------------------------------
AT SELECTION-SCREEN ON selfield1.
	IF SELFIELD1 <logical expression>.
		MESSAGE E002 WITH TEXT-003.
	ENDIF.

*--------------------------------------------------------
* INITIALIZATION
* SELECTION-SCREEN이 출력되기 전에 실행되는 이벤트.
* SELECTION-SCREEN의 필드값과 변수, 인터널 테이블을 초기화하는 이벤트.
*--------------------------------------------------------
INITIALIZATION.
	PERFORM INIT_VARIABLES.


*--------------------------------------------------------
* START-OF-SELECTION
* 주로 이 부분에서 데이터를 처리한다.
*--------------------------------------------------------
START-OF-SELECTION.
*	SET PF-STATUS <'XXXX'>.
*   CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
*    	EXPORTING
*        	TEXT = T2
*        EXCEPTIONS
*        	OHERS = 1.
    PERFORM READ_DATA.

*--------------------------------------------------------
* END-OF-SELECTION
* SELECTION 부분이 종료된 후 실행하는 이벤트.
*--------------------------------------------------------
END-OF-SELECTION.
	PERFORM EDIT_DATA.
* CLEAR <ITAB1-FIELD1>.

4-4. Procedure

*--------------------------------------------------------
* FORM ATSELOUT_MODIFY_SCREEN
* AT SELECTION-SCREEN OUTPUT 의 PERFORM.
* SELECTION-SCREEN 변경할 떄 사용하는 수행문.
*--------------------------------------------------------
FORM ATSELOUT_MODIFY_SCREEN.
ENDFORM.

*--------------------------------------------------------
* FORM INIT_VARIABLES
* 프로그램 시작 전 프로그램에서 사용하는 모든 변수나, 
* 인터널 테이블 등을 초기화하는 수행문.
* SELECTION-SCREEN의 필드값을 정할 수 있다.
*--------------------------------------------------------
FORM INIT_VARIABLES.
	DATA : year(4) TYPE c,
    	   month(2) TYPE c,
           day(2) TYPE c.

	MOVE sy-datum+0(4) TO year. "offset에서 4자리
   	MOVE sy-datum+4(2) TO month. "offset 4에서 2자리
    MOVE : 'I' TO s_year-sign,
    	   'EQ' TO s_year-option,
           year TO s_year-low.
    APPEND s_year.
    
    MOVE : 'I' TO s_month-sign, 
    	   'EQ' TO s_month-option,
           month TO s_month-low.
    APPEND s_md.
    
    REFRESH gi_xyz. "인터널 테이블 초기화.
    CLEAR g_xyz.	"변수나 인터널 테이블 헤드 초기화.
ENDFORM.

*--------------------------------------------------------
* FORM READ_DATA
* sql문을 이용하여 데이터베이스 테이블로부터 데이터를 읽어와서
* 인터널 테이블에 저장하는 수행문.
*--------------------------------------------------------
FORM READ_DATA.
	SELECT zzz yyy
      FROM databasetable
      INTO TABLE gi_xyz
     WHERE zzz in <selfield1>.
ENDFORM.

*--------------------------------------------------------
* FORM EDIT_DATA
* data의 내용을 화면에 출력.
*--------------------------------------------------------
FORM EDIT_DATA.
ENDFORM.

4-5. procedure of bdc


*--------------------------------------------------------
* FORM BDC_RUN
* BDC 실행 데이터 생성 및 실행하는 form
* BDC프로그램을 실행하기 위한 데이터를 생성 및 설정하고 BDC를 실행.
*--------------------------------------------------------
FORM BDC_RUN.
	PERFORM DYNPRO USING : 
*    	<DYNBEGIN> <BDC_TAB-PROGRAM> <BDC_TAB-DYNPRO>,
*		'X'	'SAPMF77a'	'2100',
*		' '	'BDC_OKCODE'	'/00',
*		' ' 'VTB_HEADER-BUKRS'	IT_DATA-BUKRS,
*		' ' 'VTB_HEADER-SGSART'	'60A',
*--------------------------------------------------------
* 실행시 mode option : 'A' - BDC all 과정
					  'E' - error시 BDC를 멈추고 보여줌
                      'N' - BDC 과정 보지 않음.
					
* 실행시 update option : 'A' 'S' 'L'
*--------------------------------------------------------
CALL TRANSACTION <실행t-code>
	USING 	BDC_TAB
    MODE	mode_option
    UPDATE	update_option
    MESSAGES INTO 메시지 internal_table
ENDFORM.

*--------------------------------------------------------
* FORM DYNPRO
* BDC로 실행할 데이터를 BDC TAB에 SAVE하는 form.
*--------------------------------------------------------
FORM DYNPRO USING DYNBEGIN NAME VALUE.
	IF DYNBEGIN = 'X'.
    	CLEAR BDC_TAB.
        MOVE : NAME TO BDC_TAB-PROGRAM,
        	   VALUE TO BDC_TAB-DYNPRO,
               'X' TO BDC_TAB-DYNBEGIN.
        APPEND BDC_TAB.
    ELSE.
    	CLEAR BDC_TAB.
       	MOVE : NAME TO BDC_TAB-FNAM,
        	   VALUE TO BDC_TAB-FVAL.
        APPEND DBC_TAB>.
    ENDIF.
ENDFORM.

4-6. Define of Screens

Screen Attribute 설정 -> Layout 설정 -> FLOW LOGIC
*--------------------------------------------------------
* FLOW LOGIC
* data의 내용을 화면에 출력.
*--------------------------------------------------------
PROCESS BEFORE OUTPUT.
	MODULE status_0200.
    MODULE SCREEN_DETAIL_DISPLAY_100.
    
PROCESS AFTER INPUT.
	MODULE exit AT EXIT-COMMAND.
    
*--------------------------------------------------------
* CHAIN ~ ENDCHAIN.
* 스크린 필드에 값이 입력되면 바로 그 값을 이용해서
* 어떤 작업이 필요하거나 다른 필드에 자동으로 값이 입력되는 경우에 이용.
*--------------------------------------------------------
CHAIN.
*	FIELD : <screen field명> MODULE <module명> ON CHAIN-REQUEST.
    FIELD : IT_DATA-XDVALUTA MODULE IT_DATA-VALUE_DATE_CHECK ON CHAIN-REQUEST.
ENDCHAIN.

MODULE USER_COMMAND_2000.

*--------------------------------------------------------
* VALUE-REQUEST
* 필드값이 정해지면 값에 따라 다른 필드의 값의 범위가 달라지는 경우 
* 정의하기 위한 모듈
*--------------------------------------------------------
PROCESS ON VALUE-REQUEST.
* FIELD : <screen field명> 	MODULE <module명>
* FIELD : IT_DATA-HBKID 	MODULE P_ENTRY_BANK.

4-7. Modules of Screens

*--------------------------------------------------------
* MODULE STATUS_200 OUTPUT
* Status(menubar, toolbar, function key) 지정.
*--------------------------------------------------------
MODULE STATUS_0200 OUTPUT.
	SET PF-STATUS 'ZT' EXCLUDING PFS.
* excluding 인터널 테이블에 선언된 GUI-status는 제외되고 화면에 나타난다.
    SET TITLEBAR 'ZT'.
ENDMODULE.

*--------------------------------------------------------
* MODULE EXIT INPUT.
* 화면 Exit 처리
*--------------------------------------------------------
MODULE EXIT INPUT.
	CASE sy-ucomm.
    	WHEN 'EXIT'.
        	LEAVE PROGRAM.
    	WHEN 'BACK'.
        	SET SCREEN 0.
        	LEAVE SCREEN.
    	WHEN 'CANC'.
        	SET SCREEN 0.
        	LEAVE SCREEN.
    ENDCASE.
    CLEAR : sy-ucomm.
ENDMODULE.

*--------------------------------------------------------
* MODULE USER_COMMAND_0200 INPUT
* 사용자 함수 키 처리.
*--------------------------------------------------------
MODULE user_command_0100 INPUT.
	cASE sy-ucomm.
    	WHEN 'CRET'.
* BDC_Run.
* Screen에서 입력받은 데이터를 BDC로 실행하는 PERFORM문 호출.
		PERFORM BDC_Run.
	ENDCASE.
ENDMODULE.

4-8. GUIs of Screens

Menu Bar -> Application Bar -> Function Keys -> Title 설정

profile
SAP CO

0개의 댓글

관련 채용 정보