이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2015/04/03/calling-tcode-from-web-dynpro-abap-and-passing-the-values-to-it/

 

Calling Tcode from Web Dynpro ABAP and passing the values to it.

April 3, 2015 

이 문서는 웹딘프로아밥에서 파라미터를 전달하며 티코드를 호출하는 방법에 대해서 설명하고 있습니다.

 

예제를 통해서 판매 오더 변경 티코드 VA02를 호출하겠습니다. 웹딘프로아밥 어플리케이션에서 판매 오더 번호를 가져와서 파라미터로 넘깁니다. 그리고 VA02 티코드의 초기화면을 건너띄고 변경화면으로 직접 이동하도록 합니다.

 

  • 웹딘프로 컴포넌트를 생성합니다.
  • 메인 뷰에서 판매 오더 번호를 입력할 입력 필드를 하나 만들고 티코드를 호출할 버튼을 하나 만듭니다.
  • 판매 오더 번호를 넘겨서 티코드를 호출할 버튼에 이벤트를 만듭니다.Untitled.png
  • 버튼 이벤트에 아래 코드를 입력합니다:

Untitled.png

METHOD onactionon_edit .

DATA lo_el_context            TYPE REF TO if_wd_context_element.
DATA ls_context                TYPE               wd_this->element_context.
DATA lv_vbeln                   LIKE                ls_context–vbeln.

DATA lo_window_manager TYPE REF TO if_wd_window_manager.
DATA lo_api_component    TYPE REF TO if_wd_component.
DATA lo_window               TYPE REF TO if_wd_window.

DATA lv_url                       TYPE        string.
DATA lv_host                    TYPE        string.
DATA lv_port                     TYPE string.

lo_el_context = wd_context->get_element(  ).

lo_api_component = wd_comp_controller->wd_get_api( ).
lo_window_manager = lo_api_component->get_window_manager( ).

lo_el_context->get_attribute(
EXPORTING
name =  `VBELN`
IMPORTING
value = lv_vbeln ).

* Call below method to get host and port

CLEAR : lv_host , lv_port.

cl_http_server=>if_http_server~get_location(
IMPORTING
host = lv_host
port = lv_port ).

* Creating URL

CONCATENATE       'http'
'://'
lv_host
':'
lv_port
'/sap/bc/gui/sap/its/webgui/?sap-client=&~transaction=*VA02%20VBAK-VBELN='
lv_vbeln
';DYNP_OKCODE=/00'
INTO lv_url.

*  calling the url which we created above as a popup

lo_window_manager->create_external_window(
EXPORTING
url = lv_url
RECEIVING
window = lo_window ).

lo_window->open( ).

ENDMETHOD.

 

 

  • 실행하기 위해 웹딘프로아밥 어플리케이션을 만듭니다. 지금까지 개발한 것을 모두 활성화 시킨후 어플리케이션을 실행합니다. 판매 오더 번호를 입력하고 edit 버튼을 누르면 판매 오더 변경 화면이 웹브라우저 새창으로 뜹니다. 판매 오더 번호가 파라미터로 전달되고 초기화면은 건너띄고 변경화면으로 이동하였습니다.

Untitled.png

Untitled.png

 

– Gowtham

 

번역자의 추가설명:
web GUI 라고 부르는 SAP GUI for HTML 을 실행하는 것입니다.
URL 주소는 /sap/bc/gui/sap/its/webgui 입니다.
URL 파라미터로 transaction=*VA02 식으로 *티코드를 입력하는 방식입니다.
뒤에 VBAK-VBELN 이 부분은 VA02 티코드에서 화면필드 이름이고 F1 기술정보로 찾을 수 있습니다. (또는 BDC 레코딩을 해도 알 수 있습니다.)
다른 티코드도 이런식으로 화면필드를 알면 값을 전달 할 수 있습니다.

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://blogs.sap.com/2015/04/03/calling-tcode-from-web-dynpro-abap-and-passing-the-values-to-it/

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://www.sapnuts.com/courses/core-abap/badi-sap/real-time-of-using-badi.html

 

 

Real time example of using BADI in SAP

 

SAP 벤더 마스터(XK01) BADI 예제, XK01용 BADI 구현

 

 
요구사항: 벤더가 독일인데 지역이 비어있으면 에러 메시지를 출력합니다.

요구사항 분석

SAP에서는 티코드 XK01로 벤더를 생성합니다. 생성된 벤더는 LFA1 (벤더 마스터 테이블)에 저장 됩니다. XK01로 벤더를 생성할때 (그리고 XK02로 벤더를 변경할때도) 로직을 추가하여 지역이 올바르게 입력되었는지 검사해야 합니다. 그러기 위해서 BADI를 사용하겠습니다.

XK01용 BADI를 구현하기 위해서, 다음 단계를 따라야 합니다.

단계1: BADI를 찾습니다.

단계2: 적절한 BADI를 선택합니다.

단계3: BADI를 구현합니다.

단계4: BADI를 테스트 합니다.

 

XK01/XK02용 BADI를 찾아봅시다.

BADI 구현을 위한 첫 단계는 먼저 BADI를 찾는 것입니다.

티코드 SE24로 이동하여 CL_EXITHANDLER 클래스의 GET_INSTANCE 메소드에 브레이크포인트를 겁니다.

LFA1 테이블에서 벤더 넘버를 하나 구해두고 티코드 XK02로 가서 벤더 넘버를 입력합니다.

Implementing BADI for XK01

엔터키를 눌러 다음 화면으로 이동합니다. 적당히 값을 입력하고 저장 버튼을 누릅니다(또는 컨트롤 S).

BADI for XK01

브레이크포인트에 멈추고 디버거가 실행됩니다. BADI 이름을 모두 적어 둡니다.

BADI for Vendor in SAP

아래 처럼 BADI 이름을 다 적었습니다.

  • VENDOR_FIELDSTATUS
  • GOS_SRV_SELECT
  • ADDRESS_CHECK
  • ADDR_TXJCD_CHECK
  • CVI_CALL_BTE
  • ADDRESS_UPDATE
  • VENDOR_ADD_DATA

 

적절한 BADI를 선택하고 검증해 봅시다.

적절한 BADI를 찾기 위해서, 티코드 SE18로 이동하여 BADI 이름을 입력하고 살펴봅니다.

내역에 명시된 설명을 바탕으로 추측합니다. 인터페이스에 메소드 파라미터도 참고합니다. 이런식으로 몇몇 BADI를 선택할 수 있습니다.

요구사항에 맞는 적절한 BADI로 VENDOR_ADD_DATA를 선택하겠습니다.

 

BADI를 구현해 봅시다.

BADI는 객체 지향 프로그래밍(OOP) 방법을 사용합니다. BADI 자체는 인터페이스에 지나지 않습니다. BADI를 구현하는 것은 즉, 그 인터페이스를 구현하는 것입니다.

BADI를 구현하기 위해서 티코드 SE19(BADI Builder)로 이동하여 BADI 이름을 입력하고 create implementation 버튼을 누릅니다.

Implement BADI for XK01

팝업창이 나타나면 implementaion name을 입력합니다. 예: ZVENDOR_ADD_DATA

Vendor BADI implementation

내역을 입력하고, 메소드 목록에서 적절한 메소드를 선택하여 더블클릭합니다.

 

여기서는 CHECK_ALL_DATA 메소드가 점검 로직을 넣기에 적절해 보입니다.

METHOD IF_EX_VENDER_ADD_DATA~CHECK_ALL_DATA.
BREAK-POINT.
ENDMETHOD.

티코드 XK02로 이동하여 벤더 넘버를 입력하고 주소 체크박스에 체크를 합니다. 엔터키를 눌러 주소 화면으로 이동하고 아무거나 변경한 다음 저장합니다. 이제 위 브레이크 포인트에 걸려서 디버거가 뜨는지 확인합니다. 요구사항에 맞는 아주 적절한 구현 위치를 찾은것 같습니다. 테스트로 넣은 브레이크 포인트 구문을 지우고 실제 필요한 아래 코드를 입력합니다.

METHOD IF_EX_VENDER_ADD_DATA~CHECK_ALL_DATA.
IF I_LFA1=LAND1= 'DE' AND I_LFA1-REGIO= ' '.
MESSAGE 'Region is required for German Vendors'  TYPE  'E'.
ENDMETHOD.

저장하고 활성화 합니다.

BADI 구현이 끝났습니다.

 

BADI가 잘 작동하는지 테스트해 봅시다.

BADI를 테스트하기 위해 티코드 XK02로 이동합니다. 벤더 넘버를 입력하고 엔터키를 누릅니다.

국가를 DE로 변경하고 지역은 빈값으로 입력합니다.

 

저장 (컨트롤 S).

 

에러 메시지가 뜹니다.

BADI in SAP

 

BADI를 잘 만든 것으로 확인됩니다.

 

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
https://www.sapnuts.com/courses/core-abap/badi-sap/real-time-of-using-badi.html

WDR_TASK

 

SAP internal로 비공식이지만 유용한 웹딘의 시스템변수(SY)급이예요.
참고: https://help.sap.com/saphelp_nw75/helpdata/en/c4/b3670f72ff42eb8d4a508defd7f7a1/content.htm
여러해 경험으로 봐서는 버전별로 약간의 변화가 있지만 모양을 잘 유지하고 있습니다.

 

가장 흔히 쓰는 구문은 SAP GUI 인지 웹딘프로인지 IF로 분기하는 것입니다.

IF wdr_task=>application_name IS INITIAL.
  " GUI
ELSE.
  " WD
ENDIF.

 

wdr_task=>application_name 자체는 sy-tcode 와 비슷하게 실행중인 웹딘프로아밥 어플리케이션 이름을 알 수 있습니다.

 

메시지 출력시 컴포넌트 컨트롤러를 wdr_task 에서 가져오면, 펑션 내부 처럼 웹딘이 아닌 다른 곳에서도 메시지 출력을 쉽게 할 수 있습니다. wdr_task=>application->component

* get message manager
DATA lo_api_controller TYPE REF TO if_wd_controller.
DATA lo_message_manager TYPE REF TO if_wd_message_manager.
* lo_api_controller ?= io_view_api.
lo_api_controller ?= wdr_task=>application->component.
CALL METHOD lo_api_controller->get_message_manager
  RECEIVING
    message_manager = lo_message_manager.
* report message
CALL METHOD lo_message_manager->report_message
......

 

메시지를 팝업창으로 띄울때는 wdr_task=>application->if_wd_window_manager~create_popup_to_confirm 메소드를 실행하면 됩니다.

 

URL 파라미터를 읽을 때는 wdr_task=>client_window->if_wdr_client_info_object~parameters 에서 가져올 수 있습니다.

 

HTTP 헤더를 읽을 때는 wdr_task=>client_window->if_wdr_client_info_object~header_fields 에서 가져올 수 있습니다.

 

파일다운로드시 사용하는 cl_wd_runtime_services=>attach_file_to_response 내부에서 wdr_task=>client_window->client->attach_file_to_response 를 사용하고 있습니다.

 

컴포넌트 컨트롤러의 컨텍스트는 wdr_task=>application->component->if_wd_context~root_node 로 접근할 수 있습니다.

 

웹딘프로아밥 테마 관련 문서 입니다.

저작권은 SAP 에 있습니다.

 

custom-themes-for-web-dynpro-abap-applications-without-sap-enterprise-portal.pdf

How To Customize the SAP User Interface Using Theme Editor.pdf

How To Edit Web Dynpro Themes.pdf

Portal Integration of Web Dynpro Applications.pdf

 

theme editor 는 단종되어서 더이상 구할 수 없었습니다.

그래서 저는 노트패드++으로 css 수정 작업했습니다. ^^;;

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다

https://archive.sap.com/documents/docs/DOC-70025

 

  • SAP Employee

 

90일짜리 Minisap 라이센스 키를 SAP 넷위버 서버에 설치하는 방법?

4. 잠시후 이메일로 라이센스 정보를 받습니다.
5. SAP GUI로 서버에 접속하여 다시 티코드 SLICENCE를 실행합니다.
6. Install new License를 실행하고 단계4에서 받은 라이센스를 입력합니다.
7. 라이센스 설치가 끝나면 티코드 SECSTORE를 실행합니다. F8키를 눌러서 전체 검사를 실행합니다.
installation number를 INITIAL에서 DEMOSYSTEM으로 변경한 후 반드시 RFC를 활성화 해야 합니다.
 
Minisap 라이센스를 설치하면 installation number가 INITIAL에서 DEMOSYSTEM으로 변경됩니다. DEMOSYSTEM의 사용자 DEVELOPER에 대한 개발자 키는 시스템에 이미 적용되어 있습니다. 사용자 DEVELOPER로 접속하여 Z* 프로그램을 바로 개발 시작할 수 있습니다.
 
Minisap 라이센스는 기간이 정해져 있는데 (보통 90일) 그 기간이 만료 되면 다시 한번 위 방법으로 라이센스를 갱신하면 됩니다.
 

 

90일짜리 Minisap 라이센스 키를 SAP HANA에 설치하는 방법?
1. SAP HANA Studio를 실행합니다. perspective를 HANA Development perspective로 변경합니다.
2. 시스템 뷰에서 서버를 선택하고 마우스 오른쪽 버튼을 누릅니다.
3. Properties를 선택하고 라이센스 탭으로 이동합니다.
4. 다음 주소에서 Minisap 라이센스를 구합니다. http://www.sap.com/minisap .
  • 시스템 ID는 가이드 목록에 제시된 아이디 중에서 우리가 설치한 서버에 맞게 선택합니다.
  • 하드웨어 키는 라이센스 탭에 표시된 하드웨어 키를 입력합니다.
5. 라이센스 키 파일을 받은 후 Delete License Key를 먼저 실행하고 Install License Key를 실행합니다.
 
SAP HANA Studio Developer Edition은 어떻게 설치하나요?
다음 주소에서 다운로드 받습니다. SAP HANA Tools .
 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다

https://archive.sap.com/documents/docs/DOC-70025

해당 노트에 첨부파일 pdf 가 들어 있습니다.

 

소개 부부만 번역해보았습니다.

 

SAP의 select options에서 여러줄 붙여넣기 기능은 여러값을 한꺼번에 검색할때 매우 유용합니다. ALV에서나 엑셀이나 메모장 에서 여러줄을 복사하여 select options에 붙여넣기하는 식입니다. 사용자는 클립보드의 복사 붙여넣기 표준기능(컨트롤-C 와 컨트롤-V)을 사용 합니다.

 

웹딘프로아밥의 select options 1.0 에는 SAP NetWeaver 7.31 SP07 and 7.40 SP2 버전 이후에만 여러줄 붙여넣기 기능을 사용 가능합니다. 만약 더 이전 버전을 사용중이라면 기본적으로 사용이 불가능하지만 인핸스먼트로 구현하면 여러줄 붙여넣기를 할 수 있습니다. 이 문서는 최신 버전의 select options 1.0 에서 여러줄 붙여넣기가 어떻게 동작하는지 설명합니다. 그리고 이전 버전(SAP NetWeaver 7.0, 7.01 and 7.02)에서도 동일한 기능을 구현 할 수 있는 방법을 보고 따라할 수 있게 상세히 설명해드립니다.

 

 

첨부파일은 아래에 있습니다.

How to Implement Multi Value Paste for Select Options 1.0

Multi Value Paste for Select Options 1.0.pdf

 

SAP YARD의 OOP 동영상 강좌 입니다.

 

http://www.sapyard.com/15-minutes-per-session-videos-for-abap-object-oriented-programming-refresher/

 

15 minutes per session Videos for ABAP Object Oriented Programming Refresher

TOPICS:

sap abap objects

http://help.sap.com/abapdocu_750/en/

 

ABAP F1 도움말과 똑같습니다.

티코드 ABAPHELP 도 있습니다.

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
http://blogs.sap.com/2008/02/01/practical-tips-for-developing-with-abap-webdynpro/

 

 

 

웹딘프로아밥 강의를 다 들었고 이제 막 프로그램 몇개 만들어 보셧겠죠? 지금쯤 더 복잡하고 먼가 근사한 프로그램을 만들고 싶다는 욕구가 꿈틀꿈틀 할겁니다. 강의에 나온건 나의 질문에 대한 대답이 안되는 상황입니다. 만약 이런 상황이 당신에게 딱 맞다고 생각한다면, 이 블로그는 상당히 도움이 될 것입니다.

이글에서는 이미 여러군데에서 나와있는 정보를 반복하여 설명하지 않겠습니다. 이글은 개발 가이드가 아닙니다. 커뮤니티 글이나 SAP 노트 그리고 SAP help 사이트에 개발 가이드가 많이 있습니다.

팁은 간결해야 한다고 생각합니다. 장황한 설명보다는 포인트만 꼭 집어 설명하겠습니다. 추가적으로 자세한 설명이 필요한 경우 댓글로 피드백을 주시면 더 설명드리겠습니다. 그리고 대부분 주제에 관련 SAP help 사이트 링크가 걸려있습니다. 상세 내용은 이걸 참고하시면 되겠습니다.

자 그럼 시작하겠습니다…

 

윈도우와 뷰

제가 개발을 시작할때 이둘은 햇갈리는 존재였습니다. 뷰 하나당 윈도우 하나가 반드시 필요한걸까요? 기본적으로는:

윈도우는 관련된 뷰들의 집합입니다.

  • 뷰들 사이의 화면이동(navigation)을 윈도우에서 정의합니다.

예를들어 개발할 어플리케이션이 초기화면 뷰, 결과 뷰, 상세 뷰를 가지고 있다고 합시다. 사용자는 한번에 하나의 뷰만 전체화면으로 보게 됩니다. 이 경우 3개의 뷰가 있고 이들 사이에 화면이동(navigation)을 정의한 단 1개의 윈도우가 필요합니다.

코드 가독성을 위해서 윈도우와 뷰는 네이밍 규칙을 가지는게 좋습니다. 예를들어 뷰는 'V_' 로 시작하고 윈도우는 'W_'로 시작하는 규칙을 정할 수 있습니다.

추가 윈도우가 필요한 경우중 하나는 팝업 창을 위한 것입니다.

 

팝업

앞의 예에서 조금 변형하여 상세뷰를 팝업 형태로 보여주기로 해봅시다. 이런 경우 팝업창을 위해 두번째 윈도우가 필요합니다.

참고: 웹딘프로아밥 코드 마법사에는 팝업 생성 기능이 있습니다. 윈도우만 지정하면 팝업 호출 코드가 생성됩니다.

http://help.sap.com/saphelp_nw70/helpdata/en/43/bcd2b8e326332ee10000000a11466f/content.htm

예제 컴포넌트 WDR_TEST_POPUPS_RT_00가 있습니다.

 

뷰 레이아웃

3가지 종류의 뷰 레이아웃이 가능합니다.(버전에 따라 종류가 더 많을 수 있습니다) 개인적으로 매트릭스 레이아웃을 선호합니다. 매트릭스 레이아웃으로 잘 정돈된 화면 배치를 만들 수 있습니다. 다른 레이아웃은 필요없다는 뜻은 아닙니다. 각자 필요한 상황이 있습니다. 예를들어 '시작'과 '종료'로 범위를 나타낼때 플로우 레이아웃을 사용하곤 합니다.

저는 배치를 위해 트랜스페어런트 컨테이너를 많이 사용합니다:

image

 

위 예에서 보이듯이 'item basic data'를 두개의 컬럼으로 나누어 각각 트랜스페어런트 컨테이너를 배치하였습니다. 그리고 각 컬럼에 3개씩 그룹을 배치하였습니다. 각 컨테이너에는 각자의 레이아웃을 독립적으로 지정할 수 있습니다. 일부는 매트릭스 레이아웃을, 일부는 플로우나 그리드 레이아웃을 지정하여 구성하는 것도 가능합니다.

'ITEMBASICDATA' 컨테이너에서는 horizontal stretch(가로 늘림) 옵션에 체크하고 width(넓이)를 100%로 주었습니다:

image

 

그룹에는 모두 width(넓이)를 100%로 주었습니다. 이렇게 하면 안에 있는 필드 크기 만큼의 크기로 나타나는게 아니라 두 컬럼은 화면을 가득 채우게 됩니다. 그룹에는 horizontal stretch(가로 늘림) 옵션을 사용하지 않았습니다. 그래서 레이블과 필드는 컬럼내에 넓게 퍼지는 것이 아니라 좌측정렬이 됩니다:

image

 

어시스턴스 클래스

http://help.sap.com/saphelp_nw70/helpdata/en/43/bcd2b8e326332ee10000000a11466f/frameset.htm

웹딘프로아밥 컴포넌트에 하나의 어시스턴스 클래스를 만들 수 있습니다. 이 클래스는 CL_WD_COMPONENT_ASSISTANCE를 상속받아야 합니다. 클래스 이름을 입력하는 곳은 바로 웹딘프로 컴포넌트 정의(definition) 부분입니다. 아래 그림을 보세요:

image

 

이 클래스의 인스턴스는 어플리케이션 실행시 자동으로 생성됩니다. 내장된 WD_ASSIST 어트리뷰트를 통해서 이 클래스에 접근할 수 있습니다.

어시스턴스 클래스의 장점은 웹딘프로아밥에서 텍스트 심볼을 사용할 수 있다는 것입니다. 텍스트 심볼은 바로 어시스턴스 클래스의 텍스트 풀에 저장 됩니다.

텍스트 외에도, 어떤 것은 어시스턴스 클래스에 넣고 어떤 것은 웹딘프로 컨트롤러(컴포넌트,뷰등)에 넣어야 하는 지 결정해야 하는 문제가 있습니다. 아래 사항에 유의하여 결정해 보세요:

  • 어시스턴스 클래스는 여러 웹딘프로 컴포넌트에 걸쳐서 공유하여 사용할 수 있습니다. 그러므로 여러 웹딘프로 컴포넌트에 공유하는 재사용 가능한 메소드, 어트리뷰트, 상수를 어시스턴스 클래스에 넣어 둘 수 있습니다. 원래는 'faceless' 컴포넌트가 이런 목적에 사용하도록 만들어졌지만, 실제 사용하기에 어시스턴스 클래스가 더 편리합니다. ( faceless참고 http://help.sap.com/saphelp_nw70/helpdata/en/e0/202d4108f08739e10000000a1550b0/frameset.htm )
  • 메소드와 어트리뷰트는 웹딘프로 컴포넌트의 전역에서 접근이 가능합니다. 즉 컴포넌트와 뷰 컨트롤러 어디서든 모두 접근할 수 있습니다.
  • 웹딘프로 컨텍스트 노드나 엘리먼트를 어시스턴스 클래스 메소드의 파라미터로 전 달하여 사용할 수 있습니다. 클래스의 어트리뷰트로 저장하지 말고 메소드의 파라미터로 사용해야합니다. 컨텍스트는 실행중 변경될 수 있기 때문입니다.

컨텍스트에 관하여

딘프로(SAP GUI기반의 ABAP 프로그램) 개발자 출신으로 개발 초기에는 컨텍스트의 개념을 이해하기가 매우 어려웠습니다. 이어지는 설명은 모두 저의 개인적인 생각으로 혹시나 다른 생각이 있다면 망설이지 말고 댓글로 알려주세요.

컨텍스트와 관련된 용어를 우선 명확히 정의하고 진행하도록 하겠습니다:

노드(NODE) - 컨텍스트에서 사용하는 데이터 스트럭쳐.

어트리뷰트(ATTRIBUTE) - 노드 아래에 있는 하나의 데이터 필드

엘리먼트(ELEMENT) - 노드의 인스턴스 (다수일 수 있음, 예를들어 인터널 테이블)

컨텍스트에 대한 주의사항:

  • 뷰에서 보이는 데이터는 반드시 해당 뷰의 컨텍스트에 있어야 합니다.
  • 컨텍스트 어트리뷰트를 이용하여 UI 속성을 동적으로 변경할 수 있습니다. (향후 자세히 설명함).
  • 모든 데이터를 컨텍스트에 저장할 필요는 없습니다.

마지막건 저의 실수를 바탕으로 알게 되었습니다. 서비스 호출 마법사로 BAPI를 호출하는 프로그램을 만든적이 있는데, 컨텍스트 보다는 컨트롤러 어트리뷰트나 어시스턴스 클래스에 데이터를 저장하는 것이 더 효율적이고 코딩하기도 쉽다는 것을 느겼습니다. (요즘은 어시스턴스 클래스에 저장합니다).

컨텍스트로 UI 속성을 동적으로 변경할 수 있다는 점은 잠시 제쳐두겠습니다.
딘프로에서 스크린 스트럭쳐를 컨텍스트와 동일하다고 생각하면 쉽습니다. 뷰를 보여주기전에 컨텍스트에 현재 데이터를 채워넣는 식입니다. 예를 들어 이벤트가 발생하면 우선 컨텍스트를 읽어서 (변경사항 확인을 위해), 로컬 데이터 스트럭처에 복사를 합니다. 이제부터 로컬 변수에 접근하여 데이터를 변경하는 로직을 실행하면 됩니다. 계속하여 컨텍스트를 읽는 것 보다 한번 로컬 변수에 넣고 이를 사용하는 것이 좋습니다.

 

  • 뷰에 보이는 것과 동일한 구조의 스트럭쳐를 컨텍스트에 사용하는것이 좋습니다.

예를들어, 탭이 여러개인 화면에 데이터를 표시한다고 생각해 봅시다. 이럴때 각 탭별로 노드를 별도로 만들면 여러모로 장점이 있습니다.

 

  • 컨텍스트 노드 생성시 싱글턴이 기본으로 체크되어 있는데, 싱글턴을 끄고 사용하기를 바랍니다. 이유는 다음 글을 읽어보세요:

Basic Concepts – The Pain With Using Singleton Context Nodes

 

컨텍스트에 대한 더 많은 설명은 다음의 SAP Help를 읽어 보세요:

http://help.sap.com/saphelp_nw04s/helpdata/en/8c/a0fa495f9a480bae29bf43474ccb79/content.htm

http://help.sap.com/saphelp_nw04s/helpdata/en/7a/787e40417c6d1de10000000a1550b0/content.htm

 

서비스 호출 마법사 vs. 펑션 모듈 호출

웹딘프로아밥에는 서비스 호출 마법사가 있습니다. 이 마법사로 웹서비스, 펑션 모듈, 클래스 메소드를 호출하는 코드를 만들 수 있습니다. 마법사는 컴포넌트 컨트롤러나 커스텀 컨트롤러에서만 사용하도록 합니다. MVC 모델을 따르기 때문입니다. 뷰 컨트롤러에서 서비스 호출을 하지 않도록 합시다. 뷰 컨트롤러는 화면에 데이터를 보여주는 것에만 집중하도록 해주세요. 그리고 반드시 서비스 호출 마법사를 사용해야 하는건 아닙니다. 마법사 없이 직접 코딩 하는 것도 가능합니다.

image

 

서비스 호출 마법사에서 BAPI의 파라미터를 컨텍스트 노드로 생성하여 사용할 수 있습니다. 각 파라미터 별로 어떻게 저장할지 선택할 수 있습니다:

image

 

별로 중요한건 아니지만, 컨트롤러 어트리뷰트와 컨텍스트 모두 화면에 보이기는 'Cont'로 줄어들어 보입니다. 둘중에 무엇을 선택하였는지 명확하게 보이지 않습니다. 그러므로 이 필드의 길이를 늘려서 정확히 어떤 것을 선택하였는지 보이도록 하는게 좋습니다.

모든걸 컨텍스트에 넣으려는 실수를 하지 마십시오:

  • 대부분 파라미터는 화면에 보이거나 UI 속성에 사용할 필요가 없습니다. 이런건 컨텍스트에 있을 필요가 없습니다.
  • 화면에 보이는 구조와 동일한 컨텍스트 구조를 가지는게 좋습니다. 그러므로 서비스 파라미터 구조로 컨텍스트를 만들지 않습니다.

컨텍스트 외에도 2가지 선택사항(메소드 파라미터, 컨트롤러 어트리뷰트)도 마법사로 만들 수 있습니다. 이것도 유용하긴 합니다만 그렇게까지 효율이 좋은건 아닙니다. 개인적으로 펑션 모듈 호출을 마법사 없이 직접 코딩하는걸 더 좋아합니다. 마법사의 컨트롤을 따르지 않고 직접 컨트롤 할 수 있기 때문이죠.

 

필수 입력 필드

웹딘프로에서 UI 입력 필드는 상태(status)값 '필수'를 지정할 수 있습니다. 필수로 지정된 필드는 화면에 빨간 별표가 레이블뒤에 붙습니다.

image

 

딘프로와 달리 필수 표시를 하더라도 체크가 자동으로 되지 않습니다. 체크를 하기 위해서, 한가지 방법은 각 입력 필드를 하나씩 검사하는 로직을 만드는 방법이 있습니다. 하지만 입력 필드의 필수 여부가 동적으로 변한다면 체크 로직도 따라서 동적으로 동작하도록 만들어야 합니다. 다행히도 아래 메소드를 이동하면 간단히 필수 체크를 할 수 있습니다:

cl_wd_dynamic_tool=>check_mandatory_attr_on_view

– 데이터를 입력하지 않은 필드에 대해 에러 메시지가 출력되고 필드 자체에 빨간바탕으로 강조표시가 됩니다.

 

에러 메시지

메시지는 인터페이스 IF_WD_MESSAGE_MANAGER에 있는 메소드를 이용하여 출력합니다.

  • REPORT_ATTRIBUTE_* 메소드를 이용하면 메시지와 입력 필드를 서로 연결할 수 있습니다. 메시지 출력시 입력 필드에 강조 표시가 됩니다.
  • 딘프로와 다르게, 에러 메시지를 발생하더라도 이후 로직이 중단 되지 않습니다. 그러므로 에러가 발생한후 exit 으로 빠저나가거나 다른 에러도 한꺼번에 표시해야 한다면 계속 진행하거나 선택해야 합니다.
  • 또한, 에러 메시지가 발생하더라도 화면 이동이 중단 되지 않습니다. 만약 화면 이동을 중단하고 예전 화면에 계속 멈춘 상태로 메시지를 표시하고 싶다면 'CANCEL_NAVIGATION' 파라미터를 사용하면 됩니다.

사용자 입력에 즉각 반응하기

딘프로에서는 PAI에서 사용자 입력에 반응하는 것이 가능합니다. 'on input'과 'on request' 옵션으로 특정 필드의 값 변경을 확인하고 대응할 수 있습니다. 이런 기능이 웹딘프로 아밥에도 있으면 좋을 텐데요. 우리는 어떻게 값 변경을 인식할 수 있을까요?

다행히, 컨텍스트 변경 로그가 있습니다:

http://help.sap.com/saphelp_nw2004s/helpdata/en/ae/f95e42ff93c153e10000000a1550b0/content.htm

인터페이스 IF_WD_CONTEXT에 있는 메소드로 이 로그를 켜고 끄고 할 수 있습니다. 변경사항에 대해서 인터널 테이블 형태로 제공이 됩니다. 어떤 컨텍스트 어트리뷰트가 변경되었고, 이전 값과 새 값을 알려줍니다.

딘프로에서는 PAI가 사용자 입력후에 실행됩니다. 엔터키를 누르거나, 서치헬프를 호출하거나, 버튼을 클릭하거나 등의 입력이 있을 수 있습니다. 웹딘프로에서는 우리가 지정해주어야 합니다. 뷰 레이아웃에서 각 UI 엘리먼트는 이벤트 종류의 속성을 가지고 있습니다. 예를들어 입력 필드는 사용자가 '엔터' 키를 입력하면 반응 할 수 있습니다:

image

 

위 예제에서, 이벤트 'SUBMIT' 을 만들었습니다. 사용자 입력에 반응해야 하는 모든 UI 엘리먼트에 동일한 이벤트를 지정하였습니다. 이벤트 핸들러 메소드에는 컨텍스트의 변경 로그를 읽어서 값 변경에 대응하는 코딩을 했습니다.

 

자동 새로고침

사용자의 동작없이 주기적으로 자동 새로고침이 되는 어플리케이션이 필요한 경우가 있습니다. 이럴때는 타임드트리거(TimedTrigger) UI 엘리먼트를 사용하세요:

http://help.sap.com/saphelp_nw04s/helpdata/en/da/a6884121a41c09e10000000a155106/content.htm

 

드릴 다운

SAPGUI 어플리케이션에서 ALV표시후 드릴 다운은 일반적인 방식입니다. 예를들어 오더 넘버를 ALV로 출력하고 그중 한 오더넘버를 클릭하여 오더 상세 화면으로 이동하는 식입니다. 웹딘프로에서 이런 방식으로 만드는건 쉽지 않습니다(다른 웹딘프로 화면으로 이동하고 다시 돌아오는 것이 어려움). 커뮤니티의 다음 글을 참고하세요:

Web Dynpro ABAP call transaction in the foreground

그중 한가지 해결책은 바로가기(shortcut)를 만드는 것입니다. 바로가기를 호출하면 SAPGUI가 열리고 트랜잭션으로 이동합니다. 초기화면에 파라미터를 전달 하는것도 가능합니다. 아쉽게도 초기화면을 건너띄는 것을 불가능해 보입니다. 펑션 SWN_CREATE_SHORTCUT 으로 바로가기를 만들 수 있습니다.

동적으로 UI 엘리먼트 변경하기

사용자 입력에 대한 반응으로 UI 엘리먼트의 속성을 동적으로 변경해야 하는 경우가 있습니다. 특히 이런 속성을 주로 변경합니다:

  • Visibility
  • Read Only
  • Required
  • Enabled

여기서는 3가지 방법을 제안합니다:

1) 컨텍스트 어트리뷰트를 바인딩하기

이 방법은 컨텍스트 어트리뷰트를 만들고 그것을 UI 엘리먼트의 속성에 바인딩하는 방법입니다. 많은 UI 엘리먼트를 한꺼번에 동일한 속성으로 변경하려는 경우에 유용합니다. 예를 들어 '수정'과 '조회' 모드를 가진 프로그램을 생각해 보겠습니다. 컨텍스 어트리뷰트로 'readonly' 하나만 만들고 모든 UI의 readOnly 속성에 바인딩을 합니다. 사용자가 수정 또는 조회 모드로 변경할때 우리는 단지 그 컨텍스트 어트리뷰트 하나의 값만 변경하면 됩니다.

2) 컨텍스트 어트리뷰트의 속성을 바인딩하기

좀더 복잡한 경우를 생각해 보겠습니다. 각 입력 필드의 4가지 속성을 각각 다르게 변경해야 합니다. 이때 1번 방법으로 한다면 엄청난 양의 컨텍스트 어트리뷰트(4 곱하기 입력필드 수)를 만들어야 합니다. 그렇게 안 해도 됩니다. 다른 방법은 컨텍스트 어리뷰트의 속성을 이용하는 것입니다. 어트리뷰트는 4가지 속성을 가지고 있습니다:

http://help.sap.com/saphelp_nw04s/helpdata/en/45/d44e0cdff073b1e10000000a11466f/content.htm

컨텍스트 어트리뷰트 속성을 이용하기 위해서는 바인딩 할때 컨텍스트 어트리뷰트를 선택하고 아래에 옵션중 'Bind to the Property of the Selected Attiribute'을 선택하고 드롭다운에서 필요한 속성을 선택하면 됩니다.

image

 

3) WDDOMODIFYVIEW 메소드에 다이나믹 프로그래밍 코딩하기

후크 메소드 WDDOMODIFYVIEW 에는 파라미터 view가 있습니다. 뷰 자체를 의미하는 view 파라미터를 이용하면 해당 뷰에 있는 UI 엘리먼트 참조변수를 얻을 수 있습니다. UI 엘리먼트 참조변수를 통해 각 UI 엘리먼트 클래스에 있는 메소드를 호출할 수 있습니다. 여러 메소드를 통해 UI 엘리먼트 속성을 바로 변경할 수 있습니다. 이 방법은 컨텍스트를 바인딩 하지 않아도 됩니다.

WDDOMODIFYVIEW 메소드가 view 변수를 얻을 수 있은 유일한 메소드 이고, UI 엘리먼트 속성 변경하는 일도 오직 이 메소드에서만 하여야 한다는 점을 주의하세요.

바인딩 없이 UI 엘리먼트 속성을 변경할 수 있다는 특징이 있습니다. 속성 변경하는 로직이 실행되기 전까지는 속성의 기본값이 유지되므로 기본값을 사용할 수 있는 장점도 있습니다. 평소에 기본값을 유지하다가 다이나믹 프로그래밍으로 속성을 변경하는 방식으로 사용하기에 유용합니다.

 

지금까지 설명한 3가지 방법은 각각 장단점이 있습니다. 그러므로 상황에 따라 최적의 방법은 다른 수 있습니다. 만약 UI 속성을 컨트롤 하는 DB 테이블을 만들고자 하는 경우 이런 필드가 필요합니다:

  • 변경에 영향을 미치는 데이터 필드. 예를들어 문서유형, 회사코드, 실행모드 등이 있겠죠. 테이블의 키 필드 입니다.
  • UI 엘리먼트의 ID에 관한 필드. 여기에는 컴포넌트, 뷰, UI엘리먼트 필드가 필요합니다. 이것도 키 필드 입니다.
  • 4가지 속성에 대해 각각 true, false를 나타낼 필드.
  • 비고. 자유롭게 설명을 적어 놓을 필드.

저는 이렇게 만든 테이블을 다이나믹 프로그래밍과 조합하여 사용하였습니다. 뷰 레이아웃에서 지정한 기본값은 그대로 살리면서 테이블에 입력한 데이터에 따라 UI 속성을 변경하도록 하였습니다. 예를들어 조회 모드에서 전체 필드 처럼 전체를 표현하기 위해서 빈값으로 전체 의미를 표시했습니다. 이렇게 하면 모든 키필드 조합으로 테이블에 입력할 필요가 없습니다. 셀렉트 구문에 빈값을 인식하도록 조금 고쳐주었습니다:

  select *
    from zmsd_wbd_fields
    into table wd_this->gt_field_config
   where auart          in (space, x_auart)
     and vbtyp          in (space, x_vbtyp)
     and poart          in (space, x_poart)
     and appl_mode      in (space, x_appl_mode)

 

이 테이블을 사용하면서 다이나믹 프로그래밍이 아닌 컨텍스트 어트리뷰트 속성을 바인딩 하는 방법(방법2)도 함께 사용할 수 있습니다. 하지만 그렇게 하면 기본값을 지정할 수 없기 때문에 테이블에 더 많은 레코드를 입력해 두어야 할 것입니다.

 

입력도움을 동적으로 호출하기

다양한 방법으로 입력도움을 구현할 수 있습니다. 아래 SAP Help를 참고하세요:

http://help.sap.com/saphelp_nw04s/helpdata/en/9b/c51c42735b5133e10000000a155106/content.htm

메소드 코딩중에 입력도움을 동적으로 호출하기를 원한다면 어떻게 해야 할까요? 예를 들어 입력 필드에 값을 변경하면 자동으로 입력도움이 나타나도록 만들고 싶습니다. 가능한 방법이 있긴 하지만 SAP 내부용 비공식 메소드를 사용합니다:

cl_wdr_value_help_handler=>handle_value_help

사용법은 파라미터로 컨텍스트 엘리먼트와 어트리뷰트 이름을 넘겨주면 됩니다. 그러면 컨텍스트에서 엘리먼트와 어트리뷰트에 지정된 입력도움을 찾아서 실행해 줍니다.

하지만 SAP 내부용 이기 때문에 버전이 올라가면 이 메소드는 변경되거나 없어질 수 있습니다. 혹시 여러분이 입력도움 팝업을 띄우는 더 좋은 방법을 찾는다면 알려주시기 바랍니다. 좋은 방법을 찾는다면 이글을 업데이트 하겠습니다.

 

어플리케이션 파라미터

웹딘프로 어플리케이션을 만들때 파리머터 탭에서 어플리케이션 동작에 영향을 미치는 파라미터를 지정할 수 있습니다:

image

 

http://help.sap.com/saphelp_nw70/helpdata/en/7b/fb57412df8091de10000000a155106/content.htm

일부 옵션들은 룩앤필을 변경하기도 합니다.

흥미로운 몇가지 파라미터는 다음과 같습니다:

  • WDDELTARENDERING (performance)
  • WDSHAREDREPOSITORY (performance)
  • WDPROTECTEDAPPLICATION (security)

컨피규레이션

컨피규레이션은 개발 후 추가적으로 뷰 레이아웃을 변경하는 기능입니다. 딘프로에서 트랜잭션 배리언트와 유사하다고 생각하면 됩니다. 컨피규레이션에서는 앞서 설명한 동적으로 UI 엘리먼트 속성 변경하기와 같은 속성을 변경할 수도 있습니다.

http://help.sap.com/saphelp_nw70/helpdata/EN/22/719f42f2ff7e5fe10000000a155106/content.htm

image

컨피규레이션을 만든후 어플리케이션에 연결하는 방법은 파리미터 WDCONFIGURATIONID 에 값을 입력하는 것입니다. 동일한 컴포넌트를 기반으로 여러 버전의 어플리케이션을 다양하게 만들 수 있다는 장점이 있습니다.

제가 알기로는 컨피규레이션을 실행중에 동적으로 변경할수 없습니다. 그러므로 예를들어 '조회' 모드와 '수정' 모드 두가지 컨피규레이션을 만든다면 사용자가 실행중에 모드를 변경하는 것이 불가능하게 됩니다. 이런 경우에는 컨피규레이션이 적절하지 않고 앞서 설명한 동적으로 UI 엘리먼트 속성변경하기 방법이 더 좋습니다.

 

룩앤필

웹딘프로아밥 어플리케이션의 룩앤필은 테마를 적용하여 변경할 수 있습니다. 테마는 스타일시트(.CSS 파일)의 집합이라고 할 수 있습니다.

테마의 효과는 극명합니다. 어플리케이션이 더이상 스탠다드 SAP 룩앤필을 따르지 않아도 됩니다. 글자 크기 변경 같은 작은 변화는 테마 에디터로 쉽게 적용할 수 있습니다. 만약 CSS에 대한 지식이 좀 더 있다면, 전반적인 룩앤필을 변경할 수 있습니다. 기업 이미지를 부각하기 위해서는 반드시 테마를 사용해야 한다고 생각됩니다.

포털을 통해서 웹딘프로를 실행하다면 어플리케이션 파라미터 WDFORCEEXTERNALSTYLESHEET는 포털에서 제공하는 스타일시트를 사용하여 동일하게 적용하는 작용을 합니다. 포털에서 제공하는 테마 에디터로 테마를 만들 수 있습니다:

http://help.sap.com/erp2005_ehp_03/helpdata/EN/95/8bfe40f652f323e10000000a155106/content.htm

반면 WDTHEMEROOT 파라미터는 포털의 테마 대신 웹딘프로의 테마를 지정합니다. 몇가지 스탠다드 테마 중에서 선택할 수 있습니다. 테마가 어떻게 선택되는지 정확한 설명은 아래 SAP help와 커뮤니티 글을 참고하세요:

http://help.sap.com/saphelp_nw04s/helpdata/en/46/89af7fbe4d429ee10000000a1553f7/content.htm

EP 7 Portal stylesheet with WD ABAP

 

포털이 없어도 우리가 원하는 테마를 만들고 적용할 수 있습니다. 테마 에디터는 포털에서 함께 제공되는데 포털 없이도 단독으로 실행 가능 합니다. 아래 링크에서 테마 에디터를 다운로드 받을 수 있습니다:

http://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/136dd890-0201-0010-1b9d-bd09a0d3b1d8 

단독 실행 테마 에디터 설치는 다소 복잡한 작업이 필요합니다. 우선 자바와 이클립스를 설치해야 합니다. 이클립스에 테마 에디터 플러그인을 추가 설치해야 합니다. 한번 설치를 완료하면 스탠다드 테마를 복사하여 수정하는 것이 가능합니다.

자바와 이클립스 설치시 버전을 반드시 확인하세요. 너무 최신 버전은 동작하지 않을 수 있습니다. 만약 자바 런타임이 여러개 설치되어 있다면, '-vm' 파라미터로 어떤 자바 런타임을 사용할지 지정해 주어야 합니다:

Re: Eclipse Theme Editor

저의 경우에는 이클립스 바로가기에다가 파라미터 넣는것이 어려운 작업이라, 대신에 .cmd 파일을 만들어서 아래 스크립트를 입력했습니다:

C:
cd 
cd Program FilesEclipse
eclipse.exe -vm “C:Program FilesJavaj2re1.4.2_17 injavaw.exe” -consolelog -vmargs -Xmx512M 

테마를 만든 후에는 MIME 저장소에 업로드 해야 합니다. 업로드 하는 방법은 아래 글을 참고하세요. by Bastian Preissler and Matthias Grün:

http://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/7015b1f9-535c-2910-c8b7-e681fe75aaf8

두가지 파라미터에 대응하는 URL 파라미터를 찾았습니다. 'SAP-EP-THEMEROOT' 와 'SAP-CSSURL' 입니다. 

심지어 테마를 변경하는 코드를 작성하는 것도 가능합니다. 이 기능은 매우 강력합니다. 만약 필요하다면 어플리케이션 실행중에 사용자가 테마를 선택하여 변경하는 것도 가능합니다.

테마를 수정한 예를 보여 드리겠습니다. 아래 그림을 보면 글자 크기가 기본 보다 켜졌고 테이블에 사용된 색상이 변경된 것을 볼 수 있습니다:

image

 

SAP GUI에서 웹딘프로 아밥 실행 시키기

웹딘프로 아밥 어플리케이션을 실행시키는 SAP GUI 트랜잭션을 만드는 방법을 알려드리겠습니다. 트랜잭션을 만들기 위해 SE93을 실행합니다. 트랜잭션 호출 WDYID을 선택하고 파라미터로 어플리케이션 이름을 넘겨주면 됩니다. (이 팁을 알려준 Glen Simpson 에게 감사):

http://help.sap.com/saphelp_nw04s/helpdata/en/43/27ca50d51e0b19e10000000a1553f6/content.htm 

트랜잭션 WDYID는 내부에서 펑션 모듈 WDY_EXECUTE_IN_PLACE를 실행합니다. 이 펑션은  딘프로 스크린에 웹 브라우저 컨트롤을 넣어서 그 브라우저에서 웹딘프로 어플리케이션을 열어 줍니다.

http://help.sap.com/saphelp_erp2005/helpdata/en/43/2f1a63cb883575e10000000a11466f/content.htm

 

디버깅

웹딘프로아밥 코드는 external breakpoint로 디버깅 할 수 있습니다. 브레이크포인트에 도달하면 멈추고 디버거 창이 뜹니다. 주의할 점은 SAP GUI 세션의 수가 최대치(주로 6)에 도달 했는지 확인해야 합니다. 최대치에 도달한 경우 디버거는 실행되지 않고 어플리케이션이 멈추지 않고 그냥 진행됩니다.

디버거에서 웹딘프로 디버깅에 도움이 되는 special tool이 있습니다. 아래를 참고하세요:

image

http://help.sap.com/saphelp_nw04s/helpdata/en/43/95a6c84f7c60b7e10000000a11466f/content.htm

 

예제 웹딘프로 어플리케이션

나름 규모가 있고 복잡한 웹딘프로 예제는 LORD_MAINTAIN_COMP 가 있습니다. 이 어플리케이션은 판매 문서를 생성, 수정, 조회 하는 기능이 있습니다.

앞으로의 미래 (역자주: 이글이 써진 2008년 기준으로 현재 다 실현되었습니다)

웹딘프로아밥은 계속 진화하는 중입니다. 넷위버 버전 NW 7.01 에는 새로운 기능이 많이 추가될 예정입니다. 그중 눈길을 끄는 몇가지 살펴보겠습니다:

  • ‘Light Speed’ rendering. 'Light Speed' 렌더링. 웹 2.0 룩앤필에 가깝습니다. 또한 성능도 향상됩니다.
  • Drag & Drop: 드래그앤드랍. 드래그앤드랍이 불가능 했는데 7.01 부터 드래그앤드랍이 가능합니다. 편집용 ALV 나 트리에서도 드래그앤드랍을 사용할 수 있습니다, check out David Lees’ excellent blog describing drag and drop using dynpro controls technology: ABAP Controls, Tree’s and editable ALV with drag & drop
  • Flash Islands: 플래쉬 아일랜드. Adobe Flash 를 웹딘프로에 넣어서 사용할 수 있습니다.

저는 아직 7.01 시스템에 접근할 수 없어서 정확히 모르겠습니다. 업그레이드된 기능에 대해서 SAP help에서 자세히 알 수 있습니다:

http://help.sap.com/saphelp_nw70ehp1/helpdata/en/48/01661984ff4aa5e10000000a421937/frameset.htm

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다
http://blogs.sap.com/2008/02/01/practical-tips-for-developing-with-abap-webdynpro/

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다

https://sites.google.com/site/vivekgoenka/web-dynpro-abap/sample-codes

 

Sample Codes

1. 접속한 컴퓨터의 IP 주소를 가져오는 방법
   DATA lo_request TYPE REF TO if_http_request.
   DATA lv_ip_address TYPE string.

   lo_request = wdr_task=>request.

   CALL METHOD lo_request->get_header_field
     EXPORTING
       name  = '~remote_addr'
     RECEIVING
       value = lv_ip_address.
2. URL 파라미터를 하나씩 읽는 방법
   DATA lv_para_value TYPE string.

   CALL METHOD wdr_task=>client_window->if_wdr_client_info_object~get_parameter
     EXPORTING
       name  = 'ParaName'
     RECEIVING
       value = lv_para_value.
[주의: 파라미터 이름은 대소문자를 구분하지 않지만 값은 대소문자 구분함.]
                            또는
 lv_para_value = CL_WD_RUNTIME_SERVICES=>GET_URL_PARAMETER( 'ParaName').

3. URL 파라미터 전체를 인터널 테이블로 읽는 방법


   DATA lt_parameters TYPE wdr_name_value_list_sorted.
   lt_parameters = wdr_task=>client_window->if_wdr_client_info_object~parameters.


4. HTTP 헤더 필드 전체를 인터널 테이블로 읽는 방법


   DATA lo_request TYPE REF TO if_http_request.
   DATA lt_param TYPE tihttpnvp.

   lo_request = wdr_task=>request.

   CALL METHOD lo_request->get_header_fields
     CHANGING
       fields = lt_param.



5. 파일 다운로드 하는 방법


   CL_WD_RUNTIME_SERVICES=>ATTACH_FILE_TO_RESPONSE



6. iView 에서 포탈 접속 ID를 웹딘프로아밥 어플리케이션에 전달하는 방법


  아래 그림처럼 포털 접속 ID는 파라미터 "iv_user"로 전달 됩니다.
  이 스크린샷은 포탈에서 웹딘프로아밥 iView 설정창 입니다.



7. 액션/이벤트 핸들러 메소드에 파라미터 전달하는 방법


이벤트 핸들러 메소드에서 파라미터를 동일한 이름으로 만들어 놓습니다. 아래 예제 코드는 입력 파라미터 MYID를 타입 string으로 만드는 예제입니다. 

아래 코드를 wddomodifyview( ) 메소드에 넣습니다.


METHOD wddomodifyview .
   DATA:
    lt_parameters LIKE if_wd_event=>parameters,
    parameter     LIKE LINE OF lt_parameters,
    lr_link1      TYPE REF TO cl_wd_link_to_action,
    lr_link2      TYPE REF TO cl_wd_link_to_action.

   CHECK first_time = abap_true.

* LINK_IMG1 & LINK_IMG2 are the UI element ID
   lr_link1 ?= view->get_element( 'LINK_IMG1' ).
   lr_link2 ?= view->get_element( 'LINK_IMG2' ).

   parameter-name  = 'MYID'.
   parameter-value = 1.
   parameter-type  = 'g'. " g = String
   INSERT parameter INTO TABLE lt_parameters.
   lr_link1->map_on_action( lt_parameters ).

   CLEAR lt_parameters[].

   parameter-name  = 'MYID'.
   parameter-value = 2.
   parameter-type  = 'g'. " g = String
   INSERT parameter INTO TABLE lt_parameters.
   lr_link2->map_on_action( lt_parameters ).

ENDMETHOD.
  • 인풋필드의 "State" 속성을 "required"로 지정합니다.
  • 아래 코드를 체크를 실행할 메소드에 넣습니다.
   DATA: lt_msg TYPE cl_wd_dynamic_tool=>t_check_result_message_tab,
         lo_view_controller TYPE REF TO if_wd_view_controller.

   lo_view_controller ?= wd_this->wd_get_api( ).
   cl_wd_dynamic_tool=>check_mandatory_attr_on_view(
     EXPORTING
       view_controller = lo_view_controller
       display_messages = abap_true
     IMPORTING
       messages = lt_msg
   ).

9. 웹딘프로 어플리케이션의 프로토콜, 호스트, 포트 정보 얻는 방법


   DATA lv_protocol TYPE string.
   DATA lv_host TYPE string.
   DATA lv_port TYPE string.

  CALL METHOD cl_http_server=>get_location
     EXPORTING
       server       = cl_wdr_task=>server
     IMPORTING
       host         = lv_host
       port         = lv_port
       out_protocol = lv_protocol.






10. 웹브라우저 창을 닫는 방법


선행조건
  • 윈도우에 "Exit" 타입의 아웃바운드 플러그에 파라미터 "URL"을 string 타입으로 만듭니다.
  • 윈도우는 "Properties" 탭의 "Used Controllers/Components"에 추가 합니다.
 
  DATA cached_response TYPE REF TO if_http_response.
  DATA lv_str_java_script TYPE string.
  DATA lv_file_content TYPE xstring.
  DATA lv_host TYPE string.
  DATA lv_port TYPE string.
  DATA lv_protocol TYPE string.
  DATA url TYPE string.
  DATA guid TYPE guid_32.

  lv_str_java_script = ''.

  CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
    EXPORTING
      text   = lv_str_java_script
    IMPORTING
      buffer = lv_file_content.

  CREATE OBJECT cached_response
    TYPE
      cl_http_response
    EXPORTING
      add_c_msg        = 1.

  cached_response->set_data( lv_file_content ).

  cached_response->set_header_field( name  = if_http_header_fields=>content_type
                                     value = 'text/html' ).

  cached_response->set_status( code = 200 reason = 'OK' ).
***Set the Cache Timeout - 60 seconds
  cached_response->server_cache_expire_rel( expires_rel = 60 ).

  CALL METHOD cl_http_server=>get_location
    EXPORTING
      server       = cl_wdr_task=>server
    IMPORTING
      host         = lv_host
      port         = lv_port
      out_protocol = lv_protocol.



***Using Guid as random filename

  CALL FUNCTION 'GUID_CREATE'
    IMPORTING
      ev_guid_32 = guid.


  CONCATENATE
    lv_protocol '://' lv_host ':' lv_port '/sap/bc/webdynpro/sap/'
    guid '.html'
    INTO url.

  cl_http_server=>server_cache_upload( url      = url
                                       response = cached_response ).

  DATA lo_win TYPE REF TO ig_ .
  lo_win = wd_this->get__ctr( ).

  lo_win->fire__plg(
    url = url     " string
  ).
[주의: 위 코드는 파이어폭스에서 동작하지 않습니다. 파이어폭스는 웹브라우저를 닫는 스크립트를 지원하지 않습니다]

 

이글은 아래 링크의 원본 글에 대한 한글 번역 입니다

https://sites.google.com/site/vivekgoenka/web-dynpro-abap/sample-codes

+ Recent posts