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

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

https://www.samplecodeabap.com/web-dynpro-alv-code-part-1/

 

 

My Experiments with ABAP


Code to go with Web Dynpro ALV – Part 1

· · , · Leave a comment

웹딘프로아밥 ALV는 컴포넌트 SALV_WD_TABLE를 사용하여 만듭니다. 보통 ALV를 만든후 모양을 조정하는 코드를 넣습니다. 아래 샘플 코드는 ALV에서 자주 사용하는 옵션을 위주로 작성되었습니다. 도움이 되시길 바랍니다.

ALV의 모양을 조정하기 위해서는 ALV configuration model의 API를 사용하여 메소드 호출을 해야 합니다. ALV configuration model을 가져오는 방법은 보통 마법사를 이용합니다. 아래 그림처럼 웹딘프로아밥 코드 마밥사를 이용하여 ALV 컴포넌트의 GET_MODEL 메소드를 호출합니다.

Web Dynpro Code Wizard for ALV Configuration Model

ALV Configuration Model 은 여러 인터페이스를 구현하고 있습니다. 각 인터페이스는 디스플레이 세팅, 툴바 세팅, 컬럼 세팅 등을 담당합니다.

ALV Configuration Model

ALV Configuration Model 

더 자세한 내용은 공식 헬프 사이트 help.sap.com 링크를 참고하세요.


 

 

 

테이블 디자인을 줄무늬(Alternating, zebra)로 변경하기

기본값은 줄무늬(alternating)가 아니고 스탠다드 디자인 입니다. 아래는 줄무늬로 변경하는 코드 입니다.

METHOD set_alternating .
 
*--------------------------------------------------------------------*
* Call method GET_MODEL of used component
* Code using web dynpro code wizard
*--------------------------------------------------------------------*
 
  DATA lo_interfacecontroller TYPE REF TO iwci_salv_wd_table .
  DATA lo_config_table        TYPE REF TO cl_salv_wd_config_table.
 
  lo_interfacecontroller =   wd_this->wd_cpifc_order_salv( ).
  lo_config_table = lo_interfacecontroller->get_model( ).
 
* Method call to set alternating design (zebra)
  lo_config_table->if_salv_wd_table_settings~set_design(
                         cl_wd_table=>e_design-alternating ) .
 
ENDMETHOD.

 

줄무늬(alternating) 외에 사용 가능한 디자인 값은 아래와 같습니다.

cl_wd_table=>e_design-standard
cl_wd_table=>e_design-transparent
cl_wd_table=>e_design-transparent_with_grid


 

 

빈 테이블 안내문구 변경하기

표시할 줄이 없어서 빈 테이블인 경우 원하는 안내문구가 나타나게 변경할 수 있습니다.

lo_config_table->if_salv_wd_table_settings~set_empty_table_text(
    value = 'No Order selected' ) .

 


 

 

ALV 헤더 변경하기

아래 코드를 이용하면 ALV 헤더를 변경할 수 있습니다.

METHOD set_header .
 
  DATA lo_interfacecontroller TYPE REF TO iwci_salv_wd_table .
  DATA lo_config_table        TYPE REF TO cl_salv_wd_config_table.
 
  lo_interfacecontroller =   wd_this->wd_cpifc_order_salv( ).
  lo_config_table = lo_interfacecontroller->get_model( ).
 
  DATA : lo_alv_header TYPE REF TO cl_salv_wd_header .
 
  lo_alv_header = lo_config_table->if_salv_wd_table_settings~create_header( ) .
 
  lo_alv_header->set_text( 'List of Sales Orders').
 
ENDMETHOD.

 


 

 

표시된 열(컬럼) 수 변경하기

기본적으로 ALV는 모든 컬럼을 표시하도록 동작합니다. 그래서 컬럼이 많은 경우 가로방향으로 계속 늘어나서 가로스크롤이 발생합니다. 오른쪽 끝에 있는 필터와 세팅이 보이지 않고 스크롤해서 찾아야 하는 불편함이 발생합니다. 이 문제를 해결하는 방법은 바로 표시된 열 옵션에 값을 지정하여 한번에 표시되는 열(컬럼)을 줄여서 스크롤이 발생하지 않도록 할 수 있습니다.

적당한 값을 얻기 위해서는 세팅 메뉴에서 값을 바꿔가며 테스트 해보세요.

image004

적당한 값을 찾았다면 이제 프로그램에 값을 고정하는 코딩을 추가 합니다.

METHOD set_width .
 
  DATA lo_interfacecontroller TYPE REF TO iwci_salv_wd_table .
  DATA lo_config_table        TYPE REF TO cl_salv_wd_config_table.
 
  lo_interfacecontroller =   wd_this->wd_cpifc_order_salv( ).
  lo_config_table = lo_interfacecontroller->get_model( ).
 
  lo_config_table->if_salv_wd_table_settings~set_scrollable_col_count( 10 ).
   
ENDMETHOD.

 

적당한 값이란 화면에 가로 스크롤바가 생기지 않는 컬럼 수 입니다. 이제 스크롤바는 ALV안에 있습니다.

image005


 

 

표시된 행(라인) 수 변경하기

아래 코드로 한번에 표시되는 행(라인)의 수를 변경 할 수 있습니다.

lo_config_table->if_salv_wd_table_settings~set_visible_row_count( 5 ) .

 


 

 

컬럼 헤더 변경하기

컬럼 헤더는 연결된 데이터 엘리먼트의 레이블이 자동으로 표시됩니다. 컬럼 헤더를 변경하는 바람직한 방법은 데이터 엘리먼트의 레이블을 변경하는 것입니다. 만약 ALV에서만 직접 컬럼 헤더를 변경하고자 한다면 아래의 두가지 방법이 있습니다.

방법 1: 클래스 CL_SALV_WD_COLUMN_HEADER 의 SET_TEXT 메소드로 직접 텍스트를 입력합니다.

METHOD change_column_header.
 
  DATA lo_interfacecontroller TYPE REF TO iwci_salv_wd_table .
  DATA lo_config_table        TYPE REF TO cl_salv_wd_config_table.
 
  lo_interfacecontroller =   wd_this->wd_cpifc_order_salv( ).
  lo_config_table = lo_interfacecontroller->get_model( ).
 
  DATA : lo_column TYPE REF TO cl_salv_wd_column .
  lo_column = lo_config_table->if_salv_wd_column_settings~get_column( 
                       'SD_DOC' ) .
 
  IF lo_column IS NOT INITIAL.
    DATA : lo_column_header TYPE REF TO cl_salv_wd_column_header .
    lo_column_header = lo_column->create_header( ) .
    lo_column_header->set_text( 'Sales Order' ) .
  ENDIF.
 
ENDMETHOD.

 

image006

방법 2: 컬럼 헤더에 다른 데이터 엘리먼트를 지정합니다.

클래스 CL_SALV_WD_COLUMN_HEADER 의 SET_PROP_DDIC_BINDING_ELEMENT 메소드로 헤더 텍스트를 위한 별도의 데이터 엘리먼트를 지정합니다.

METHOD change_column_header .
 
  DATA lo_interfacecontroller TYPE REF TO iwci_salv_wd_table .
  DATA lo_config_table        TYPE REF TO cl_salv_wd_config_table.
 
  lo_interfacecontroller =   wd_this->wd_cpifc_order_salv( ).
  lo_config_table = lo_interfacecontroller->get_model( ).
 
  DATA : lo_column TYPE REF TO cl_salv_wd_column .
  lo_column = lo_config_table->if_salv_wd_column_settings~get_column( 'SD_DOC' ) .
 
  IF lo_column IS NOT INITIAL.
    DATA : lo_column_header TYPE REF TO cl_salv_wd_column_header .
 
    lo_column_header = lo_column->get_header( ) .
    lo_column_header->set_prop_ddic_binding_element(
             EXPORTING value = 'EBELN').
  ENDIF.
 
ENDMETHOD.

 

image007


 

 

컬럼 숨기기

METHOD hide_column .
 
  DATA lo_interfacecontroller TYPE REF TO iwci_salv_wd_table .
  DATA lo_config_table        TYPE REF TO cl_salv_wd_config_table.
 
  lo_interfacecontroller =   wd_this->wd_cpifc_order_salv( ).
  lo_config_table = lo_interfacecontroller->get_model( ).
 
  DATA : lo_column TYPE REF TO cl_salv_wd_column .
  lo_column = lo_config_table->if_salv_wd_column_settings~get_column( 'MATERIAL' ) .
 
  IF lo_column IS NOT INITIAL.
    CALL METHOD lo_column->set_visible
      EXPORTING
        value = cl_wd_uielement=>e_visible-none.
  ENDIF.
ENDMETHOD.                    "change_column_header

 


 

 

컬럼 좌/우 고정

GUI ALV와는 다르게 웹딘프로아밥 ALV는 컬럼을 좌/우 양쪽 끝에 고정할 수 있습니다. 컬럼을 고정하기 위해서는 우선 SET_SCROLLABLE_COL_COUNT 메소드로 스크롤할 컬럼 수를 지정해야 합니다. 그런후 고정할 컬럼에 각자 SET_FIX_POSITION 메소드를 호출하여 고정시킵니다. 예를들어 이번 예제에서는 10 컬럼이 있고 이중 1 컬럼씩 좌/우 각각 고정하고자 합니다. 그래서 SET_SCROLLABLE_COL_COUNT 로 8을 지정하였습니다.

METHOD fix_columns .
 
  DATA lo_interfacecontroller TYPE REF TO iwci_salv_wd_table .
  DATA lo_config_table        TYPE REF TO cl_salv_wd_config_table.
 
  lo_interfacecontroller =   wd_this->wd_cpifc_order_salv( ).
  lo_config_table = lo_interfacecontroller->get_model( ).
 
  lo_config_table->if_salv_wd_table_settings~set_scrollable_col_count( 8 ) .
 
  DATA lo_column TYPE REF TO cl_salv_wd_column .
 
  lo_column = lo_config_table->if_salv_wd_column_settings~get_column( 'SD_DOC' ) .
  lo_column->set_fixed_position( cl_wd_abstr_table_column=>e_fixed_position-left ).
 
  lo_column = lo_config_table->if_salv_wd_column_settings~get_column( 'ITM_NUMBER' ) .
  lo_column->set_fixed_position( cl_wd_abstr_table_column=>e_fixed_position-right ) .
 
ENDMETHOD.

 

 

 

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

https://www.samplecodeabap.com/web-dynpro-alv-code-part-1/

+ Recent posts