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

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.
개념 이해:
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 (있는경우)


웹으로만 화면을 구성하고 있는데 SAP GUI 트랜젝션을 호출해야만 하는 경우
이방법을 사용하면 빠르게 대처할 수 있습니다. (그럭저럭 쓸만합니다)
SAP GUI 화면을 웹에서 볼 수 있는 Web GUI가 있습니다.

Web GUI의 URL 구성은 아래와 같습니다.

 http://<host>:<port>/sap/bc/gui/sap/its/webgui/?~transaction=<T-Code>

아래의 코드를 호출하면 위처럼 URL을 구성해줍니다.

DATA: lv_url TYPE string.
cl_its_runtime=>get_url(
  EXPORTING
    in_transaction    = 'SE80'
  IMPORTING
    out_abs_url       = lv_url
).

현재 접속된 서버(AP)를 기준으로 URL이 생성되기 때문에
여러 AP를 도메인 등록 없이 운영하고 Load Balancer만 도메인 등록한 경우 문제가 있습니다.
이럴때는 cl_its_runtime=>get_url 메소드의 파라미터 in_host, in_port 를 L4에 맞게 추가로 주면 됩니다.



1장의 그림으로 설명합니다.

웹딘프로의 UI Element 속성들 대부분은 바인딩이 가능한데,
바인딩을 통해 값을 조절하면 화면이 변경됩니다.
visible은 원칙적으로 WDUI_VISIBILITY 타입으로 해야 하지만 WDY_BOOLEAN으로도 할 수 있도록 봐줍니다 :)


 


UI Element를 자세히 살펴 볼수 있는 몇가지를 방법을 알려드리겠습니다.

1. 데모 프로그램
서버에 접속하여 SE80으로 이동후
웹딘프로 아이디 WDR_TEST_UI_ELEMENTS 를 찾습니다.

application을 실행합니다.

모든 UI Elemet를 한 화면에서 속성 변경해 가며 테스트 할 수 있는 데모 입니다.




2. NET312: UI Development with Web Dynpro for ABAP
정식 교육교재입니다. pdf 파일은 각자 알아서 구하시면 됩니다.


3. WDA UI Elements Reference (공식 도움말 페이지)
링크: http://help.sap.com/saphelp_nw2004s/helpdata/EN/cd/422b035f01914e80251a660e39ab14/frameset.htm




4. WDJ UI Elements Reference (웹딘프로 자바 도움말 페이지이지만 UI는 거의 같기 때문에 참고가 됩니다)
링크: http://help.sap.com/saphelp_nw04/helpdata/en/8f/aa63688343bd40aafc537971aee068/frameset.htm


아래의 예는 MARA-MTART 타입으로 웹딘프로아밥 드랍다운 구성하는 예입니다.

DATA: lo_nd_search_input TYPE REF TO if_wd_context_node,
      lo_node_info TYPE REF TO if_wd_context_node_info,
      ls_shlp_descr TYPE shlp_descr,
      lt_value_set TYPE TABLE OF wdr_context_attr_value,
      ls_value_set TYPE wdr_context_attr_value.

lo_nd_search_input = wd_context->get_child_node( name = wd_this->wdctx_search_input ).
lo_node_info = lo_nd_search_input->get_node_info( ).

CLEAR: ls_shlp_descr, lt_value_set.
CALL FUNCTION 'DPWTY_SEARCH_HELP'
  EXPORTING
    iv_db_tabname   = 'MARA'
    iv_db_fieldname = 'MTART'
    is_shlp         = ls_shlp_descr
    iv_drop_down    = 'X'
  IMPORTING
    et_values       = lt_value_set.

CLEAR: ls_value_set.
INSERT ls_value_set INTO lt_value_set INDEX 1.

lo_node_info->set_attribute_value_set(
   EXPORTING
     name      = 'MTART'
     value_set = lt_value_set
 ).


 

타입마다 다른 로직이 아니라서 좋은 방법입니다.


+ Recent posts