Hirdetés
 

Roadmap készítése Sales Ticket-hez a IC Webclient-en

PDF
Nyomtatás
Sokan gondolkodhattak már azon, hogy egy demo bemutatását hogyan lehetne leginkább hatékonnyá tenni, és egyben az ügyfelek érdeklődését felkelteni. Ehhez igen hasznos eszköz lehet egy roadmap control készítése. Ami nem más mint a demo-n bemutatni kívánt nézetek egymást követő bemutatása egy wizard segítségével. Hogy ez érthetőbbé válhasson egy példán keresztül szeretnék illusztrálni egy megoldást ami a Sales ticket-hez kapcsolódik. 

A fenti példa három lépést tartalamaz.

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

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

salestick01.jpg
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:

salestick01.jpg

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

salestick01.jpg

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.

salestick01.jpg

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.

salestick01.jpg

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.

salestick01.jpg

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:

salestick01.jpg

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:

salestick01.jpg

<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

salestick01.jpg

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:

salestick01.jpg

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:

salestick01.jpgsalestick01.jpg

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:

salestick01.jpg salestick01.jpg

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)