웹딘프로아밥 Application Parameters 전체 세팅 WD_GLOBAL_SETTING (http://boy0.tistory.com/18)
와 같은 내용에 업그레이드 된 7.02 기준의 문서입니다.

http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/9010b5e3-75b3-2e10-1cb1-c5c8a8b82672
7.02에서 변화가 보이네요.
전체 세팅하는 프로그램도 WD_GLOBAL_SETTING 에서 WD_GLOBAL_PARAMETERS 으로 변경되었습니다.

 

구글 검색하면 많이 나오는 내용이긴 합니다만, 웹딘프로아밥에서 필수값 체크하는 방법입니다.

http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/207e4467-227e-2e10-6fbb-e3a562038296

링크에 나온 내용처럼 wdDoBeforeAction에 넣어도 되고,
그냥 필요할때 이벤트처리 메소드에 넣어도 무방합니다.


cl_wd_dynamic_tool=>check_mandatory_attr_on_view( wd_this->wd_get_api( ) ).

중요한 키워드는 사실 위 한줄이죠.
 

ABAP 에는 pointer 개념의 reference 와 field-symbol 있는데,
그 사용법이 참... 까다롭네요.

reference는 주로 파라미터 전달을 위해 사용합니다. 참조 주소를 전달할 수 있기 때문이죠.
generic reference로 값을 받으면 읽기 위해선 field-symbol 을 사용해야 한다는 부분을 주의하세요.

REPORT  y_ref_fs_data.




DATA: lt_sflight TYPE TABLE OF sflight,
      ls_sflight TYPE sflight,
      lv_carrid TYPE sflight-carrid,
      ltr_sflight TYPE REF TO sflight_tab1,
      lsr_sflight TYPE REF TO sflight,
      lvr_carrid TYPE REF TO sflight-carrid,
      lr_data TYPE REF TO data.   " generic type ref
FIELD-SYMBOLS: <lt_sflight> TYPE sflight_tab1,
               <ls_sflight> TYPE sflight,
               <lv_carrid> TYPE sflight-carrid,
               <lt_data> TYPE ANY TABLE, " generic table type <fs>
               <ls_data> TYPE data,  " generic type <fs>
               <l_data> TYPE data.   " generic type <fs>


 

* select data.
SELECT * FROM sflight INTO TABLE lt_sflight.
READ TABLE lt_sflight INDEX 1 INTO ls_sflight.
lv_carrid = ls_sflight-carrid.


 

* 1. data -->  ref
GET REFERENCE OF lt_sflight INTO ltr_sflight.
GET REFERENCE OF ls_sflight INTO lsr_sflight.
GET REFERENCE OF lv_carrid INTO lvr_carrid.
*  or
GET REFERENCE OF lt_sflight INTO lr_data.
GET REFERENCE OF ls_sflight INTO lr_data.
GET REFERENCE OF lv_carrid INTO lr_data.
** error !!! Syntax Error !!!
*GET REFERENCE OF ls_sflight INTO ltr_sflight.
*GET REFERENCE OF lv_carrid INTO ltr_sflight.
*GET REFERENCE OF lv_carrid INTO lsr_sflight.


 

* 2. ref  -->  <fs>
ASSIGN ltr_sflight->* TO <lt_sflight>.
ASSIGN lsr_sflight->* TO <ls_sflight>.
ASSIGN lvr_carrid->* TO <lv_carrid>.
*  or
ASSIGN ltr_sflight->* TO <l_data>.
ASSIGN lsr_sflight->* TO <l_data>.
ASSIGN lvr_carrid->* TO <l_data>.
*  or
ASSIGN lr_data->* TO <l_data>.
** error !!! Syntax Error !!!
*ASSIGN lsr_sflight->* TO <lt_sflight>.
*ASSIGN lvr_carrid->* TO <lt_sflight>.
** error !!! Short Dump !!!
*ASSIGN lr_data->* TO <lt_sflight>.


 

* 3. <fs>  -->  data
MOVE <lt_sflight> TO lt_sflight.   " lt_sflight = <lt_sflight>.
MOVE <ls_sflight> TO ls_sflight.   " ls_sflight = <ls_sflight>.
MOVE <lv_carrid> TO lv_carrid.    " lv_carrid = <lv_carrid>.
* or
MOVE <l_data> TO lv_carrid.     " lv_carrid = <l_data>.
** error !!! Syntax Error !!!
*MOVE <lt_sflight> TO ls_sflight.   " ls_sflight = <lt_sflight>.
** error !!! Short Dump !!!
*MOVE <l_data> TO lt_sflight.    " lt_sflight = <l_data>.
*MOVE <l_data> TO ls_sflight.    " ls_sflight = <l_data>.


 

* 4. data -->  <fs>
ASSIGN lt_sflight TO <lt_sflight>.
ASSIGN ls_sflight TO <ls_sflight>.
ASSIGN lv_carrid TO <lv_carrid>.
*  or
ASSIGN lt_sflight TO <l_data>.
ASSIGN ls_sflight TO <l_data>.
ASSIGN lv_carrid TO <l_data>.
** error !!! Syntax Error !!!
*ASSIGN ls_sflight TO <lt_sflight>.
*ASSIGN lv_carrid TO <lt_sflight>.


 

* 5. <fs>  -->  ref
GET REFERENCE OF <lt_sflight> INTO ltr_sflight.
GET REFERENCE OF <ls_sflight> INTO lsr_sflight.
GET REFERENCE OF <lv_carrid> INTO lvr_carrid.
*  or
GET REFERENCE OF <lt_sflight> INTO lr_data.
GET REFERENCE OF <ls_sflight> INTO lr_data.
GET REFERENCE OF <l_data> INTO lr_data.
** error !!! Syntax Error !!!
*GET REFERENCE OF <lt_sflight> INTO lsr_sflight.
*GET REFERENCE OF <lt_sflight> INTO lvr_carrid.
** error !!! Short Dump !!!
*GET REFERENCE OF <ls_sflight> INTO ltr_sflight.
*GET REFERENCE OF <lv_carrid> INTO ltr_sflight.
*GET REFERENCE OF <lv_carrid> INTO lsr_sflight.


 

* 6. ref  -->  data
MOVE ltr_sflight->* TO lt_sflight.   " lt_sflight = ltr_sflight->*.
MOVE lsr_sflight->* TO ls_sflight.   " ls_sflight = lsr_sflight->*.
MOVE lvr_carrid->* TO lv_carrid.     " lv_carrid = lvr_carrid->*.
** error !!! Syntax Error !!!
*MOVE lr_data->* TO lt_sflight.   " lt_sflight = lr_data->*.
*MOVE lr_data->* TO ls_sflight.   " ls_sflight = lr_data->*.
*MOVE lr_data->* TO lv_carrid.    " lv_carrid = lr_data->*.





* 7. How to read generic ref (table)
GET REFERENCE OF lt_sflight INTO lr_data.   " generic ref
* -->  lt_sflight
ASSIGN lr_data->* TO <l_data>.
MOVE <l_data> TO lt_sflight.   " lt_sflight = <l_data>.
*  or
ASSIGN lr_data->* TO <lt_data>.
MOVE <lt_data> TO lt_sflight.   " lt_sflight = <lt_data>.
*  or
ASSIGN lr_data->* TO <lt_sflight>.
MOVE <lt_sflight> TO lt_sflight.   " lt_sflight = <lt_sflight>.
* -->  ls_sflight
ASSIGN lr_data->* TO <lt_data>.
LOOP AT <lt_data> ASSIGNING <ls_data>.
  MOVE <ls_data> TO ls_sflight.   " ls_sflight = <l_data>.
ENDLOOP.
*  or
ASSIGN lr_data->* TO <lt_sflight>.
LOOP AT <lt_sflight> ASSIGNING <ls_sflight>.
  MOVE <ls_sflight> TO ls_sflight.    " ls_sflight = <ls_sflight>.
ENDLOOP.
* -->  lv_carrid
ASSIGN lr_data->* TO <lt_data>.
LOOP AT <lt_data> ASSIGNING <ls_data>.
  ASSIGN COMPONENT 'CARRID' OF STRUCTURE <ls_data> TO <l_data>.
  MOVE <l_data> TO lv_carrid.   " lv_carrid = <l_data>.
ENDLOOP.
*  or
ASSIGN lr_data->* TO <lt_sflight>.
LOOP AT <lt_sflight> ASSIGNING <ls_sflight>.
  ASSIGN COMPONENT 'CARRID' OF STRUCTURE <ls_sflight> TO <lv_carrid>.
  MOVE <lv_carrid> TO lv_carrid.    " lv_carrid = <lv_carrid>.
ENDLOOP.


 

* 8. How to read generic ref (structure)
GET REFERENCE OF ls_sflight INTO lr_data.   " generic ref
* -->  ls_sflight
ASSIGN lr_data->* TO <ls_data>.
MOVE <ls_data> TO ls_sflight.   " ls_sflight = <ls_data>.
*  or
ASSIGN lr_data->* TO <ls_sflight>.
MOVE <ls_sflight> TO ls_sflight.    " ls_sflight = <ls_sflight>
* -->  lv_carrid
ASSIGN lr_data->* TO <ls_data>.
ASSIGN COMPONENT 'CARRID' OF STRUCTURE <ls_data> TO <l_data>.
MOVE <l_data> TO lv_carrid.   " lv_carrid = <l_data>.
*  or
ASSIGN lr_data->* TO <ls_data>.
ASSIGN COMPONENT 'CARRID' OF STRUCTURE <ls_data> TO <lv_carrid>.
MOVE <lv_carrid> TO lv_carrid.    " lv_carrid = <lv_carrid>.


 

* 9. How to read generic ref (variable)
GET REFERENCE OF lv_carrid INTO lr_data.   " generic ref
* -->  lv_carrid
ASSIGN lr_data->* TO <l_data>.
MOVE <l_data> TO lv_carrid.   " lv_carrid = <l_data>.
*  or
ASSIGN lr_data->* TO <lv_carrid>.
MOVE <lv_carrid> TO lv_carrid.    " lv_carrid = <lv_carrid>.


 

** End.
SAP 프로그램 개발 공식 가이드 문서
http://wiki.sdn.sap.com/wiki/display/BBA/Home
들어가서  PDF 파일로 받을 수도 있습니다.

눈길이 가는 내용을 일부 살펴보자면, 
신규 프로그램은 SAP GUI (리포트,모듈풀 등)용으로 개발하지 않는다.
SAP에서 추천하는 UI 기술은 Web Dynpro ABAP (+FPM) , Web Dynpro Java, WebClient

Chapter 5. User Interface and User Experience Guidelines for Best-Built Applications 


SAP GUI

UI-TECH-9

SAP does not recommend developing new applications in SAP GUI.


Recommended UI Technologies

UI-TECH-1

SAP recommends that developers using SAP tools select one of the following user interface technologies:

  • Web Dynpro ABAP with the Floorplan Manager
  • Web Dynpro Java for development on the SAP NetWeaver Java stack
  • The WebClient UI Framework for development of applications that complement SAP CRM


UI Technologies That Are Not Encouraged

UI-TECH-6

SAP does not encourage use of the following user interface technologies:

  • Business Server Pages (BSP)
  • HTMLB
  • Portal Framework
  • XHTML or plain HTML
  • ITS flow logic
  • ABAP Dynpro


SAP UI Technologies and Tools for ABAP Developers

UI-TECH-2.1

For development of new applications via Web Dynpro ABAP, SAP recommends using the Floorplan Manager to increase consistency among user interfaces.


WebClient UI Framework

UI-TECH-2.2

For development of new applications that should be strongly integrated with SAP CRM, SAP recommends using the WebClient UI Framework to increase consistency among user interfaces.


SAP UI Technologies and Tools for Java Developers

UI-TECH-10

For Java UIs, SAP recommends either Web Dynpro Java or standards-based development using JavaServer Faces (JSF).


Java UI Technologies for Migrated Software

UI-TECH-3

SAP recommends that Java applications that are migrated to run on SAP NetWeaver use JavaServer Faces (JSF) technology.


UI Technologies for Rich Internet Applications

UI-TECH-5

SAP recommends using Adobe Flash or Microsoft Silverlight in Web Dynpro Islands or WebClient UIF Islands.


Output and Forms

UI-TECH-8

recommends using SAP Interactive Forms by Adobe for forms that are printed or used online or offline. SAP does not recommend that developers use SAPscript.


개념 이해:
NET312 pdf 파일의 22~27 (내부페이지 14~19)
Dynamically changing the UI 부분을 읽는다.

실습 예제:
Creating UI Elements Dynamically in Abap Webdynpro Application
http://wiki.sdn.sap.com/wiki/display/WDABAP/Creating+UI+Elements+Dynamically+in+Abap+Webdynpro+Application




 

아래 첨부파일은 SAPLINK 프로그램을 이용하여 Import Slinkee 하면 볼 수 있습니다.

WDYA_YDBLIM_TEST_POPUP.zip
다운로드

 

 

 


애플리케이션은 두개 입니다.

1. 본 창닫기 테스트


2. 내부 팝업 닫기 테스트



본 창 닫기를 위한 작업입니다. (내부 팝업엔 필요없음)
윈도우에 아웃바운드 플러그를 하나 만들고 타입은 Exit 으로하고 파라미터 CLOSE_WINDOW를 추가합니다.




닫는 로직은 이렇습니다.

METHOD close_popup .
* 하나의 메소드로 통합된 창닫기.
* 이 로직으로 내부 팝업, 본 창 무엇으로 사용되더라도 닫을 수 있다.

  DATA lo_api_view TYPE REF TO if_wd_view_controller.
   lo_api_view = wd_this->wd_get_api( ).

  DATA lo_api_window TYPE REF TO if_wd_window_controller.
   lo_api_window = lo_api_view->get_embedding_window_ctlr( ).

* lo_window 는 내부 팝업인 경우에 값이 있다.
  DATA: lo_window TYPE REF TO if_wd_window.
   lo_window = lo_api_window->get_window( ).

  IF lo_window IS BOUND.
* 내부 팝업 닫기
    lo_window->close( ).
  ELSE.
* 본 창은 lo_window가 없으므로 윈도우의 outbound plug를 호출하여 창을 닫는다.
* wd_this->fire_close_plg( close_window = abap_true ).

    DATA: lt_param TYPE wdr_event_parameter_list,
     ls_param LIKE LINE OF lt_param.

    ls_param-name = 'CLOSE_WINDOW'.
    GET REFERENCE OF abap_true INTO ls_param-value.
    INSERT ls_param INTO TABLE lt_param.

    lo_api_window->fire_plug(
      EXPORTING
        parameters = lt_param " Parameter of Outbound Plug
         plug_name = 'CLOSE' " Web Dynpro: Runtime Structure of In/Outbound Plugs
    ).
  ENDIF.

ENDMETHOD.

OVERRIDE_EVENT_XXX (있는경우)
BEFORE_PROCESS_EVENT (있는경우)
 PROCESS_EVENT (보이는 모든 UIBB 반복)
AFTER_PROCESS_EVENT (있는경우)


출처: http://www.softwaretop100.org/global-software-top-100-edition-2011

SAP는 어느 정도의 회사일까요?
소프트웨어 부분 매출 순으로 4위 입니다.
마이크로소프트의 경우는 1위를 굳건히 지키고 있습니다.


#

Company

Software
Revenues
mln US$

Software
Revenue
growth

Total
Revenues
mln US$

Software
Revenue
share

1
54,270 11% 67,383 81%
2
22,485 5% 99,870 23%
3
20,958 13% 30,180 69%
4
12,558 11% 16,654 75%
5
7,274 -4% 30,307 24%
6
6,669 8% 126,562 5%
7
5,636 1% 6,013 94%
8
5,456 -20% 13,766 40%
9
4,279 -7% 4,279 100%
10
4,356 10% 17,015 26%
11
4,229 -7% 16,918 25%
12
4,136 3% 4,454 93%
13
3,413 -8% 3,413 100%
14
3,177 14% 3,826 83%
15
2,561 -5% 21,374 12%
16
2,383 12% 41,045 6%
17
2,083 9% 83,039 3%
18
1,939 22% 113,500 2%
19
1,885 19% 2,090 90%
20
1,843 5% 1,981 93%
21
1,762 -12% 4,992 35%
22
1,701 9% 1,932 88%
23
1,643 3% 3,122 53%
24
1,523 28% 1,628 94%
25
1,485 -5% 2,228 67%


기업 시장만 보면 단연 SAP가 일등입니다.
( 출처: http://www.softwaretop100.org/enterprise-software-top-10 )
Top 10 Enterprise Software Companies
Rank Companies Software
revenues (mln)
1. SAP 10,500
2. Oracle 6,105
3. Sage 1,496
4. Infor 1,100
5. Microsoft 1,000
6. Salesforce.com 959
7. Lawson 463
8. Unit4 Agresso 326
9. Epicor 283
10. Visma 254

크롬이나 IE9 웹브라우저에서 닫았던 탭을 다시 열 수 있는 단축키 입니다.
웹브라우저시장에서 탭브라우징이 대세가 되면서 탭을 유용하게 쓰고 있는데요.

가끔 실수로 탭을 잘못 닫는 다거나
아쉬움이 남아서 다시 열고 싶을때가 있습니다.

이럴때는 Ctrl + Shift + T 를 눌러주세요. 마치 undo기능 처럼 닫았던 탭이 다시 살아납니다.
참고로 Ctrl + T 는 새 탭 열기 단축키이고, 여기에 Shift키만 더 눌러주면 닫았던 탭 열기 입니다.

+ Recent posts