2

ビューの N インスタンスをビューTransparentContainer上に配置し、それぞれが異なるパラメーターを受け取るシナリオがあります。これを実現するために、 を動的に作成し、それを(メイン ビューの)cl_wd_view_container_uielementに追加してから、動的ナビゲーションを使用してプラグを起動し、パラメーターを送信するロジックを作成しました。コードは以下にあります。cl_wd_uielement_containerTransparentContainer

これはすべて 1 つの問題で機能します。作成されたインスタンスは一意ではないため、基本的に同じビューの N 個のコピーを追加します。N 個のプラグが起動されて処理されますが、インスタンスが 1 つしかないため、最後のプラグはすべてのビューのパラメーターを設定します。ビューWDDOMODIFYVIEWも一度だけ起動されます。

以下のコードは、動作中のバージョンから転用してクリーンアップしたものなので、可能であることがわかります。大きな違いは、シナリオで同じ WDC からビューを追加していることです。元のアプリケーションでは、動的に追加されたビューに独自の Web Dynpro コンポーネントがあり、呼び出し側も動的に作成されたコンポーネントの使用法を提供します。

不足している複数のインスタンスを作成する方法はありますか? この場合、結局、コンポーネントの使用法を提供する必要がありますか? 私はこれを数時間いじっていますが、進歩していないので、正しい軌道に乗るための意見を歓迎します.

メイン ビューからのコード:

DATA:
    lo_container          TYPE REF TO cl_wd_uielement_container,
    lo_subview            TYPE REF TO cl_wd_view_container_uielement,
    lo_flow_data          TYPE REF TO cl_wd_flow_data,
    lo_view_controller    TYPE REF TO if_wd_view_controller,
    lo_component_usage    TYPE REF TO if_wd_component_usage,
    lo_wdr_view           TYPE REF TO cl_wdr_view,
    lo_component_api      TYPE REF TO if_wd_component,

    lt_posts              TYPE ztt_fi_vernot_posts,
    ls_post               LIKE LINE OF lt_posts,
    lt_parameters         TYPE wdr_event_parameter_list,
    ls_parameter          TYPE wdr_event_parameter,

    lv_view_id            TYPE string,
    lv_source_plug_name   TYPE string,
    lv_target_embed_pos   TYPE string,
    lv_param_value        TYPE REF TO DATA.
FIELD-SYMBOLS:
    <lv_param_value>      TYPE bu_partner
.

lt_posts = wd_this->mo_model->get_posts( iv_open = abap_true ).
" Retrieve and refresh the view container.
lo_wdr_view  ?= wd_this->wd_get_api( ).
lo_container ?= lo_wdr_view->root_element.
lo_container ?= lo_wdr_view->get_element( 'TC_POSTS' ).
lo_container->remove_all_children( ).
LOOP AT lt_posts INTO ls_post.
" View and plug IDs should be unique.
CONCATENATE 'POSTS_' ls_post-index  INTO lv_view_id.
CONCATENATE 'OUTPLUG_' ls_post-index INTO lv_source_plug_name.
" Create a new view.
lo_subview  = cl_wd_view_container_uielement=>new_view_container_uielement( id = lv_view_id ).
lo_flow_data = cl_wd_flow_data=>new_flow_data( element = lo_subview ).
lo_subview->set_layout_data( lo_flow_data ).
lo_subview->set_layout_data( cl_wd_flow_data=>new_flow_data( element = lo_subview ) ).
lo_container->add_child( lo_subview ).
lo_view_controller = wd_this->wd_get_api( ).
CONCATENATE 'V_MAIN/' lv_view_id INTO lv_target_embed_pos.
*   This was present in the source, returning a component usage via create_comp_usage_of_same_type()
*   lo_component_usage = wd_comp_controller->get_component( iv_compcnt = ls_post-index  ).

lo_view_controller->prepare_dynamic_navigation(
  source_window_name          = 'W_MAIN'
  " Found in the window structure for this View
  source_vusage_name          = 'V_MAIN_USAGE_0'
  source_plug_name            = lv_source_plug_name
" target_component_name       = '[WDC name]'   " Optional?
" target_component_usage      = lo_component_usage->name " Optional?
  target_view_name            = 'V_POSTS'
  target_plug_name            = 'SET_PARAMS'
  target_embedding_position   = lv_target_embed_pos ).

" Fill the paramaters. Note that the values should be passed as pointers.
REFRESH lt_parameters.
CLEAR ls_parameter.
ls_parameter-name = zcl_fi_vernot=>gcs_plugs-params-bp.
CREATE DATA lv_param_value LIKE ls_post-bp.
ASSIGN lv_param_value->* TO <lv_param_value>.
<lv_param_value> = ls_post-bp.
ls_parameter-value = lv_param_value.
INSERT ls_parameter INTO TABLE lt_parameters.

" Do the same for the contract.
CLEAR ls_parameter.
ls_parameter-name = zcl_fi_vernot=>gcs_plugs-params-contract.
CREATE DATA lv_param_value LIKE ls_post-contract.
ASSIGN lv_param_value->* TO <lv_param_value>.
<lv_param_value> = ls_post-contract.
ls_parameter-value = lv_param_value.
INSERT ls_parameter INTO TABLE lt_parameters.

" Finally, fire the plug.
wd_this->wd_get_api( )->fire_plug( plug_name = lv_source_plug_name parameters = lt_parameters ).

ENDLOOP.
4

1 に答える 1

2

この問題は、ビューの動的生成に限らず、同じコンポーネントのウィンドウで特定のビューを複数回使用する場合にも発生します。作成されるインスタンスは 1 つだけなので、再利用は非常に限られています。

これに対する唯一の解決策は、ビューを独自の Web Dynpro コンポーネントに分離するか、有効な WDC の複数のコンポーネント用途を作成し、それらをダイナミック ナビゲーションで使用することです。

于 2014-05-27T13:27:14.793 に答える