Spend Management Blogs by Members
Check out community member blog posts about spend management and SAP Ariba, SAP Fieldglass, and SAP Concur solutions. Post or comment about your experiences.
cancel
Showing results for 
Search instead for 
Did you mean: 
Srikanth_Jutur
Explorer
1,449
We can expose the inbox work items to mobile and take action against (approve or reject )

we can even connect different backend systems ( all in one inbox  from mobile )

Easy approvals  and prioritize the business activity

How to achieve  ?.

example PO approval process

Step1 : Create a Transformation:

TCODE : XSLT_TOOL

Name : ZMY_INBOX

Transformation:
<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">

<tt:root name="ROOT"/>

<tt:template>

<workitems>

<tt:loop name= "line" ref=".ROOT">

<order>

<tt:value ref="$line.order"/>

</order>

<req>

<tt:value ref="$line.req"/>

</req>

<netvalue>

<tt:value ref="$line.nvalue"/>

</netvalue>
<workitem>

<id>

<tt:value ref="$line.wi_id"/>

</id>

<title>

<tt:value ref="$line.wi_title"/>

</title>

<description>

<tt:loop name="html" ref="$line.wi_text">

<tt:value ref="$html.TEXTLINE"/>

</tt:loop>

</description>

<decisions>

<tt:loop name="dec_line" ref="$line.decisions">

<decision>

<key>

<tt:value ref="$dec_line.ALTKEY"/>

</key>

<text>

<tt:value ref="$dec_line.ALTTEXT"/>

</text>

</decision>

</tt:loop>

</decisions>

</workitem>

</tt:loop>

</workitems>

</tt:template>

</tt:transform>

save with this transformation.....

Step2 : TCODE : SICF

Create a SICF Service  Name : zmyinbox


attach the handler class ZCL_HANDLER_CLASS ( GET/PUT)

Call the above transformation in  hander class

use Following Code  to generate output xml format..
TYPES: BEGIN OF ty_wi_info,

order type string,

req type string,

supplier type string,

* quan type string,

nvalue type string,

wi_id TYPE swr_struct-workitemid,

wi_title TYPE swr_wihdr-wi_text,

wi_text TYPE STANDARD TABLE OF swr_txtlin WITH NON-UNIQUE DEFAULT KEY,

wi_htext TYPE STANDARD TABLE OF swr_txtlin WITH NON-UNIQUE DEFAULT KEY,

decisions TYPE STANDARD TABLE OF swr_decialts WITH NON-UNIQUE DEFAULT KEY,

END OF ty_wi_info.

TYPES: BEGIN OF local_wi2obj.

TYPES: wi_id TYPE sww_wiid.

TYPES: catid TYPE sibfcatid.

TYPES: instid TYPE sibfboriid.

TYPES: typeid TYPE sibftypeid.

TYPES: wi_reltype TYPE sww_reltyp.

TYPES: removed TYPE sww_relrmv.

TYPES: END OF local_wi2obj.

types : BEGIN OF ty_po,

ebeln type ekko-ebeln,

lifnr type ekko-lifnr,

RLWRT type ekko-RLWRT,

END OF ty_po .

types : BEGIN OF ty_po1,

ebeln type ekko-ebeln,

wi_id TYPE swr_struct-workitemid,

wi_text type WITEXT,

END OF ty_po1.

data : lt_po type TABLE OF ty_po,

lt_pod type TABLE OF ty_po1,

ls_po type ty_po,

ls_po1 type ty_Po1.




DATA: lt_wi2obj TYPE STANDARD TABLE OF local_wi2obj.

DATA: ls_wi2obj LIKE LINE OF lt_wi2obj.

DATA: lt_all_ids TYPE swfgpaciidtab,

l_subrc TYPE sysubrc,

l_aci_id TYPE swfgpaciid,

lt_uwlitems TYPE uwlitemlist,

lt_filter TYPE STANDARD TABLE OF swr_task,

ls_filter TYPE swr_task,

lt_sim_cont TYPE STANDARD TABLE OF swr_cont.

DATA: lv_param TYPE string,

lv_path TYPE string,

l_rc TYPE sy-subrc,

lv_split_tab TYPE TABLE OF string,

lv_param1 TYPE string,

lv_param2 TYPE string,

lv_res_xml TYPE xstring,

dec_key TYPE swr_decikey,

dec_wiid TYPE swr_struct-workitemid,

wi_text TYPE swr_wihdr-wi_text,

lv_nodes TYPE TABLE OF swr_decialts,

ls_nodes type swr_decialts,

items TYPE TABLE OF swr_wihdr,

t_wi_info TYPE TABLE OF ty_wi_info,

wi_info TYPE ty_wi_info,

lv_id type SWR_STRUCT-WORKITEMID,

lv_user type sy-uname,

lv_action type c.

DATA: lh_inbox TYPE REF TO cl_wapi_mobile_inbox.

DATA: lt_inbox TYPE cl_wapi_mobile_inbox=>table_inbox_header.

DATA: ls_inbox LIKE LINE OF lt_inbox.

DATA: ls_decision_alternatives TYPE cl_wapi_mobile_user_decision=>workitem_header_decision.

DATA: lt_wiis TYPE cl_wapi_mobile_user_decision=>table_workitem_header.

DATA: ls_wiis LIKE LINE OF lt_wiis.

DATA: l_fail TYPE xfeld.

DATA: lt_alternatives TYPE STANDARD TABLE OF swr_decialts.

DATA: m_user_decision TYPE REF TO cl_wapi_mobile_user_decision.




DATA text TYPE string .

DATA writer TYPE REF TO cl_sxml_string_writer.

DATA json TYPE xstring.







DATA: m_user TYPE syuname.

DATA: m_language TYPE sylangu,

lv_text type SWR_TXTLIN.

FIELD-SYMBOLS: <item> LIKE LINE OF lt_inbox,"items,

<uwlitems> TYPE UWLITEM,

<PO> type ty_po1.

data : lt_form_fields TYPE tihttpnvp.

FIELD-SYMBOLS:




<FS_form_field> TYPE ihttpnvp,

<fs_wi_info> type ty_wi_info.




CONSTANTS : lc_f(1) TYPE c VALUE 'F',

lc_completed(9) TYPE c VALUE 'COMPLETED',

lc_cancelled(9) TYPE c VALUE 'CANCELLED',

lc_error(5) TYPE c VALUE 'ERROR',

lc_bus2012 TYPE swotobjid-objtype VALUE 'BUS2012'.




CALL METHOD server->request->get_form_fields( CHANGING fields = lt_form_fields ).

READ TABLE lt_form_fields ASSIGNING <FS_form_field> WITH KEY name = 'user' ."co_ff_clear_cache.

IF sy-subrc = 0.

lv_user = <FS_form_field>-value.

ENDIF.

READ TABLE lt_form_fields ASSIGNING <fs_form_field> WITH KEY name = 'task' ."co_ff_clear_cache.

IF sy-subrc = 0.

* lv_rev = <fs_form_field>-value.

ENDIF.

READ TABLE lt_form_fields ASSIGNING <fs_form_field> WITH KEY name = 'action' ."co_ff_clear_cache.

IF sy-subrc = 0.

lv_param = <fs_form_field>-value.

ENDIF.

READ TABLE lt_form_fields ASSIGNING <fs_form_field> WITH KEY name = 'WI' ."co_ff_clear_cache.

IF sy-subrc = 0.

lv_id = <fs_form_field>-value.

ENDIF.

READ TABLE lt_form_fields ASSIGNING <fs_form_field> WITH KEY name = 'DEC' ."co_ff_clear_cache.

IF sy-subrc = 0.

lv_param2 = <fs_form_field>-value.

ENDIF.

TRANSLATE lv_param TO UPPER CASE.


IF lv_param <> 'GET' AND lv_param <> 'PUT'.

CALL METHOD server->response->set_header_field(

name = 'Allow' value = 'GET, PUT' ).

CALL METHOD server->response->set_status( code = '405' reason = 'Method not allowed' ).

EXIT.

ENDIF.

CASE lv_param. "Get user decisions to make…

WHEN 'GET'.

TRY.

lh_inbox = cl_wapi_mobile_inbox=>get_instance(

im_user = lv_user

im_language = m_language

).

lt_inbox = lh_inbox->get_current_inbox( ).


CATCH cx_wapi_exception.

CALL METHOD cl_aunit_assert=>fail

EXPORTING

msg = 'TEST_GET_ALTERNATIVES_VIA_WORKITEM: Programm Error ' "#EC NOTEXT

quit = cl_aunit_assert=>method.

ENDTRY.

if lt_inbox IS NOT INITIAL.

SELECT wi_id catid instid typeid wi_reltype removed FROM sww_wi2obj INTO TABLE lt_wi2obj

FOR ALL ENTRIES IN lt_inbox

WHERE wi_id EQ lt_inbox-wi_id.


loop at lt_inbox ASSIGNING <item> WHERE workflow_id = 'WSXXXXXX'. "INTO ls_wi2obj.

READ TABLE lt_wi2obj INTO ls_wi2obj with key wi_id = <item>-wi_id.

if sy-subrc is INITIAL.

ls_po1-ebeln = ls_wi2obj-instid.

ls_po1-wi_id = ls_wi2obj-wi_id.

ls_po1-wi_text = <item>-title.

APPEND ls_po1 to lt_pod.

endif.

ENDLOOP.

if lt_pod is not INITIAL .

SELECT ebeln lifnr rlwrt from ekko INTO TABLE lt_po

FOR ALL ENTRIES IN lt_pod

WHERE ebeln = lt_pod-ebeln.

endif.

endif .

CLEAR: l_rc, wi_info, wi_text, lv_nodes.

LOOP AT lt_pod ASSIGNING <po> . "WHERE wi_aagent = sy-uname.

lv_id = <po>-wi_id.

wi_text = <po>-wi_text.

lv_text = <po>-wi_text.

clear : lv_nodes, wi_info-decisions.

READ TABLE lt_po INTO ls_po with key ebeln = <po>-ebeln.

if sy-subrc is INITIAL.

wi_info-order = ls_po-ebeln.

wi_info-nvalue = ls_po-rlwrt.

wi_info-supplier = ls_po-lifnr.

wi_info-wi_id = <po>-wi_id.

ls_nodes-ALTKEY = '0001'.

ls_nodes-ALTTEXT = 'APPROVE'.

APPEND ls_nodes to lv_nodes.

ls_nodes-ALTKEY = '0002'.

ls_nodes-ALTTEXT = 'Reject'.

APPEND ls_nodes to lv_nodes.

wi_info-wi_title = wi_text.

wi_info-decisions = lv_nodes.

CLEAR l_rc.

CALL FUNCTION 'SAP_WAPI_WORKITEM_DESCRIPTION'

EXPORTING

workitem_id = lv_id

IMPORTING

return_code = l_rc

TABLES

text_lines = wi_info-wi_text

html_text_lines = wi_info-wi_htext.

APPEND wi_info TO t_wi_info.

endif.

ENDLOOP.

* if lv_format is INITIAL.

CALL TRANSFORMATION ZMY_INBOX

SOURCE root = t_wi_info

RESULT XML lv_res_xml.

CALL METHOD server->response->set_header_field(

name = 'Content-Type'

value = 'text/xml; charset=utf-8' ).

CALL METHOD server->response->set_data( data = lv_res_xml ).

CALL METHOD server->response->set_status( code = '200' reason = 'OK' ).


WHEN 'PUT'.
dec_key = lv_param2.

dec_wiid = lv_id .

CLEAR l_rc.

CALL FUNCTION 'SAP_WAPI_DECISION_COMPLETE'

EXPORTING

workitem_id = dec_wiid

decision_key = dec_key

IMPORTING

return_code = l_rc.

IF l_rc <> 0.

CALL METHOD server->response->set_status( code = '500' reason = 'Error (RC <> 0' ).

ELSE.

CALL METHOD server->response->set_status( code = '200' reason = 'OK' ).

ENDIF.




ENDCASE.

URL 1.https://system id .com:8000/sap/bc/workflow/zmyinbox?sap-client=800&user=usr&action= ( get - put)

Output :
<?xml version="1.0" encoding="utf-8" ?>
- <workitems>
<order>6510249899</order>
<req />
<netvalue>141599.90</netvalue>
- <workitem>
<id>000002787012</id>
<title>The Purchasing Document 6510249899 has been approved</title>
<description>The Purchasing Document 6510249899 created by MN
.</description>
- <decisions>
- <decision>
<key>0001</key>
<text>APPROVE</text>
</decision>
- <decision>
<key>0002</key>
<text>Reject</text>
</decision>
</decisions>
</workitem>
<order>4510249902</order>
<req />
<netvalue>200000000.00</netvalue>
- <workitem>
<id>000002787059</id>
<title>The Purchasing Document 6510249902 has been approved</title>
<description>The Purchasing Document 6510249899 created by nm
.</description>
- <decisions>
- <decision>
<key>0001</key>
<text>APPROVE</text>
</decision>
- <decision>
<key>0002</key>
<text>Reject</text>
</decision>
</decisions>
</workitem>
<order>4510249950</order>
<req />
<netvalue>1000000.00</netvalue>

 

third party Mobile Screen :


action


approval view


after business user action ( Approve or Reject) ,handler class ( PUT) parameter updated in backend ,refer the handler class.

Conclusion :     using ICF service , we can expose the workitems to third-party app using XML format

and take a action against .

easy approval process for business ,they can approve/Reject  anywhere from mobile  time to time

 
Top kudoed authors