Roadmap készítése Sales Ticket-hez a IC Webclient-en
A fenti példa három lépést tartalamaz.

1. lépés, Items: Termékek megadása valamint a mennyiség megadása

2. lépés, Partners: Partnerek megváltoztatása és/ vagy a címeiknek a megváltoztatása

3. lépés, Payment Form: Fizetési információk megadása mint például Credit Card adatok
A lépések száma több is lehet, és tetszésünk szerint választhatjük a lépéseket, amihez épp készítjük a demo-t. Ennek a Roadmap controlnak 3 része van:

Ennek a megvalósítás kisebb programozási tudást is igényel, amit a következő részben szeretnék bővebben kifejteni.
Először A roadmap control elkészítésére lesz szükség, amit elsőként 3 nézet segítségével fog létrejönni. Az első nézet az a CRMV_OR_DT_WIZ ami tartalmazza a wizardunk nevét, amihez később majd a lépéseket rendelhetjük

Második nézet az a CRMV_OR_DT_STEP. Itt az egyes lépések neveit adhatjuk meg a leírással amit később a Roadmap controlon fogunk látni.

Harmadik nézet az a CRMV_OR_DT_WIZST, ahol az egyes lépéseket hozzárendeljük az első lépésben létrehozott wizardunkhoz. Itt határozhatjuk meg a lépések sorrendjét, valamint a link nevét amit később még használni fogunk a kódunkban.

A Sales ticket-hez tartozó komponens az a ICCMP_BT_SLT. Ezt enhance-olnunk kell, ezen belül a Slo2ViewSet-et kell elsőként enhance-olni.

A roadmap control integrálását most kell elvégeznünk az enhance-olt osztályban. Ehhez az alábbi attribútumokat kell hozzáadni az új Z-és osztályhoz:

Majd ezt követően újra kell definiálni két eljárást az osztályban, a DO_INIT_CONTEXT és a DO_PREPARE_OUTPUT-t. Ezekbe az eljárásokba az alábbi kódrészletet kell behelyeznünk:
method DO_INIT_CONTEXT.
CALL METHOD SUPER->DO_INIT_CONTEXT.
DATA: lv_first_step TYPE REF TO crms_or_wiz_step, lr_state_transitioner TYPE REF TO if_crm_or_state_transitioner.
clear m_state_manager.
cl_crm_or_state_manager=>create_instance( 'Z_SALES').
m_state_manager ?= cl_crm_or_state_manager=>get_instance( ).
gv_steps = m_state_manager->get_steps( ).
lv_first_step = m_state_manager->get_first_step( ).
m_state_manager->set_current_step( lv_first_step ).
IF lv_first_step IS NOT INITIAL.
gv_active_step = lv_first_step->onclick.
ENDIF.
endmethod.
method DO_PREPARE_OUTPUT.
*CALL METHOD SUPER->DO_PREPARE_OUTPUT
** EXPORTING ** IV_FIRST_TIME = ABAP_FALSE
* . gv_steps = M_STATE_MANAGER->get_steps( ).
DATA: lv_stepid TYPE crmt_or_wiz_st_id.
FIELD-SYMBOLS: <fs_step> TYPE crms_or_wiz_step.
READ table gv_steps WITH KEY onclick = gv_active_step ASSIGNING <fs_step>.
IF sy-subrc EQ 0.
gv_actions = M_STATE_MANAGER->get_step_actions(<fs_step>-id ).
endif.
endmethod.
Ha ezekkel a lépésekkel készen vagyunk akkor következő lépésként a DO_HANDLE_EVENT methódust kell újradefiniálnunk. Ebbe az alábbi részletet kell illeszteni:
METHOD do_handle_event.
* check if it is a roadmap navigation.
DATA:
lv_event_name TYPE string,
lr_validator TYPE REF TO if_crm_or_state_validator,
lr_step TYPE REF TO crms_or_wiz_step,
lr_step_instance TYPE REF TO if_crm_or_state.
lv_event_name = htmlb_event_ex->event_server_name.
* clear the previous user action
clear me->gv_user_action.
READ TABLE gv_steps WITH KEY onclick = lv_event_name TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
* check if the target step and the current step are the same. If so,
* we don't do any further processing.
IF htmlb_event_ex->event_server_name NE gv_target.
" current step validation
lr_step ?= m_state_manager->get_current_step( ).
lr_step_instance ?= lr_step->instance.
IF lr_step_instance IS NOT BOUND.
m_state_manager->create_step_instance( lr_step ).
lr_step_instance ?= lr_step->instance.
ENDIF.
lr_validator = lr_step_instance->get_validator( ).
IF ( lr_validator IS INITIAL ) OR lr_step_instance->validate_state( ) EQ abap_true.
gv_target = htmlb_event_ex->event_server_name.
" construct collection.
DATA: lv_rpt_col TYPE REF TO if_bol_bo_col.
DATA: lr_cuco TYPE REF TO cl_crmcmp_o_reportinstanc_impl.
lr_cuco ?= me->get_custom_controller( controller_id = 'CRMCMP_OR_DTWIZ/ReportInstance' )."#EC NOTEXT
IF lr_cuco->gr_rpt IS NOT INITIAL.
lv_rpt_col = cl_crm_or_util=>build_report_collection( iv_key = lr_cuco->gv_report_key
ir_report = lr_cuco->gr_rpt
iv_readonly = lr_cuco->gv_displaymode ).
ENDIF.
* render_messages( ).
op_totarget( lv_rpt_col ).
gv_active_step = gv_target.
m_state_manager->set_current_step( iv_key = 'onclick'"#EC NOTEXT
iv_value = gv_target ).
ENDIF.
ENDIF.
ELSE.
CASE lv_event_name.
WHEN OTHERS.
CALL METHOD super->do_handle_event
EXPORTING
event = event
htmlb_event = htmlb_event
htmlb_event_ex = htmlb_event_ex
global_messages = global_messages
RECEIVING
global_event = global_event.
ENDCASE.
ENDIF.
ENDMETHOD.
Ahhoz, hogy ténylegesen láthassuk a roadmap control-t a Slo2ViewSet nézet htm-jében az alábbi módosítások szükségesek:

<pre><%@page language="abap"%>
<%@extension name="thtmlb" prefix="thtmlb" %>
<%@extension name="tajax" prefix="tajax" %>
<%@extension name="chtmlb" prefix="chtmlb" %>
<%@ extension name="bsp" prefix="bsp"%>
<tajax:page id="WizardVS" deltaHandlingEnabled="false" availableElements="roadMapArea,buttonArea,mainArea" interceptEvents="e:(*):roadMapArea,$messageArea,buttonArea,mainArea,popupAreaDiv;">
<chtmlb:pageType type="HOME" >
<tajax:area id="roadMapArea">
<thtmlb:roadMap>
<% data ls_step type LINE OF CRMT_OR_WIZ_STEP_TAB.
data lv_status type string.
if controller->gv_steps is not initial.
loop at controller->gv_steps into ls_step.
if ls_step-onclick = controller->gv_active_step.
lv_status = 'ACTIVE'.
else.
lv_status = ls_step-status.
endif.
%>
<thtmlb:roadMapItem state = "<%= lv_status %>"
text = "<%= ls_step-text %>"
tooltip = "<%= ls_step-tooltip %>"
onClick = "<%= ls_step-onclick %>" />
<% endloop. endif. %>
</thtmlb:roadMap>
</tajax:area>
<div id="absoluteMainArea">
<tajax:area id="mainArea">
<chtmlb:pageType type="EDIT">
<thtmlb:grid cellSpacing="1" columnSize="1" height="100%" rowSize="2" width="100%">
<thtmlb:gridCell colSpan="1" columnIndex="1" rowIndex="2" rowSpan="1">
<bsp:call comp_id="<%=controller->GET_VIEWAREA_CONTENT_ID( 'Middle' )%>" url="<%=controller->GET_VIEWAREA_CONTENT_URL( 'Middle' )%>"/>
</thtmlb:gridCell>
</thtmlb:grid>
</chtmlb:pageType>
<chtmlb:pageType type="EDIT">
<thtmlb:grid cellSpacing="1" columnSize="1" height="100%" rowSize="1" width="100%">
<thtmlb:gridCell colSpan="1" columnIndex="1" rowIndex="1" rowSpan="1">
<bsp:call comp_id="<%=controller->GET_VIEWAREA_CONTENT_ID( 'Lower' )%>" url="<%=controller->GET_VIEWAREA_CONTENT_URL( 'Lower' )%>"/>
</thtmlb:gridCell>
</thtmlb:grid>
</chtmlb:pageType>
</tajax:area>
</div>
</chtmlb:pageType>
</tajax:page>
</pre>
Az egyes lépésekor lezajló eseményekhez létre kell hoznunk egy úgynevezet outbound plug-ot, ami meghívja a másik nézetet

Ebbe az eljárásba az alábbi kódrészlet kerül:
method OP_TOTARGET.
* Added by wizard: Outbound plug 'TOTARGET'
view_manager->navigate( source_rep_view = rep_view
outbound_plug = gv_target
data_collection = iv_data_collection ).
endmethod.
Ha ezzel készen vagyunk létre kell hozni az inbound plug-ot a Slo2Cart-ban, ami meghívódik:

Ezután el kell távolítani a cart nézetet a cart view area-ból. És hozzá kell adni a Middle view area-hoz:


Majd úgyanezt meg kell ismételni a Partner és a Payment nézettel is. Majd a button view-t is el kell távolítani és a lower area-hoz hozzá kell adni:

Utolsó lépésként létre kell hozni a navigációs link-eket ami meghívódik amikor az egyes lépésekre kattintunk. Itt az egyes navigációs linkeknek azt a nevet kell adni amit a CRMV_OR_DT_WIZST nézetben definiáltunk. Outbound plug minden esetben a TOTARGET lesz. Inbound plug meg mindig a meghívni kívánt nézet inbound plug-ja lesz.
Első ránézésre összetetnek tűnhet ez a megoldás, de a gyakorlatban nem jelentkezik annyi probléma mint ahogy az általában szokot. Egyedüli gond lehet ha a nézeteket olyan sorrendbe szeretnénk berakni a wizardba ami nem követi annak a logikáját. Ez esetben a gond az leszt, hogy nem lesz megfelelő az adatátvitel az egyes nézetek között. De ez könnyen feloldható a CRMV_OR_DT_WIZST nézetben a wizardunk módosításával.
Nincs hozzászólása.
A téma megvitatása a fórumon. (0 hozzászólás)


