0% found this document useful (0 votes)
84 views

SAP ABAP Workflow

Uploaded by

aartikvsd1079
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
84 views

SAP ABAP Workflow

Uploaded by

aartikvsd1079
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 31

SAP Technical Consultant m.uzairkoreja@gmail.

com

This is a Practice Based Working Document. Everyone can change by their


own requirements.

Scenario:
The scenario is when a Purchase Order Document creates a workflow will send an approval
request email to the approver. That email will be received in Gmail Inbox or any other email
server.

The approver will open that email in any device by using Gmail or mail server app or website.
He will have two options Approve or Reject the purchase order.

He will just click on approve/reject button in email and the effect will happen in SAP Inbox.

The Purchase Order will be approved or rejected directly in SAP.

Transaction Codes Used:


1. SWO1 – To create business object.
2. SE37 – To create Function Module for Email Body
3. PFTC – To Create Workflow Task and Template
4. SEGW – Create ODATA
5. SOST – To Check Emails in Inbox

Page | 1
SAP Technical Consultant [email protected]

Go to SW01:
Create a business object by follow these the steps.

Step 1:

Must Assign Package and TR. Otherwise It May create issues.

Page | 2
SAP Technical Consultant [email protected]

The Business Object is created. Now we have to arrange it according to the need.

Step 2:
Must Implement and Release the Business object to make it available for use.

Page | 3
SAP Technical Consultant [email protected]

Now, it is available to use for Workflow.

Page | 4
SAP Technical Consultant [email protected]

Step 3:
We must create Key Field that is Purchase Order Number in Our case.

Page | 5
SAP Technical Consultant [email protected]

The Key Field is created successfully.

Page | 6
SAP Technical Consultant [email protected]

Step 4:
We have to create a method in this Business Object to send Email to the recipient.

Page | 7
SAP Technical Consultant [email protected]

Page | 8
SAP Technical Consultant [email protected]

Note: Must step after creating any object in BO.

We must need to Implement and Release the Method to make it available for use in Workflow
Tasks.

Page | 9
SAP Technical Consultant [email protected]

Method is now available to use.

Page | 10
SAP Technical Consultant [email protected]

Step 5:
Create the parameters for the method that should be passed to that method during workflow
running.

Page | 11
SAP Technical Consultant [email protected]

Page | 12
SAP Technical Consultant [email protected]

Step 6:
Now we have to write code in the created method to send Email.

Note: The code is written for practice only. You can write by your own way with the new
ABAP syntax as well.

Code for the Email Send:

BEGIN_METHOD SENDEMAIL CHANGING CONTAINER.

DATA: PURCHASINGDOCUMENT TYPE EKKO-EBELN.

SWC_GET_ELEMENT CONTAINER 'PurchasingDocument' PURCHASINGDOCUMENT.

CONSTANTS:

*-- Constants used in the body of the Email (HTML)

C_HTM TYPE CHAR3 VALUE 'HTM',

C_STYLE_START TYPE CHAR255 VALUE '<FONT face=Arial size=2>',

C_NEW_LINE TYPE CHAR255 VALUE '<br>',

C_LINK_START TYPE CHAR128 VALUE '<A href="www.w3schools.com">',

C_LINK_TEXT TYPE CHAR32 VALUE 'Link for learning HTML',

C_LINK_END TYPE CHAR4 VALUE '</A>',

C_SPACE(6) TYPE C VALUE '&nbsp;'.

DATA: GT_CONT TYPE STANDARD TABLE OF BAPIASCONT255,

Page | 13
SAP Technical Consultant [email protected]

GW_CONT LIKE LINE OF GT_CONT.

DATA: SEND_REQUEST TYPE REF TO CL_BCS,

MAILSUBJECT TYPE SO_OBJ_DES,

MAILTEXT TYPE BCSY_TEXT,

DOCUMENT TYPE REF TO CL_DOCUMENT_BCS,

SENDER TYPE REF TO CL_CAM_ADDRESS_BCS,

RECIPIENT_TO TYPE REF TO CL_CAM_ADDRESS_BCS,

RECIPIENT_CC TYPE REF TO CL_CAM_ADDRESS_BCS,

RECIPIENT_BCC TYPE REF TO CL_CAM_ADDRESS_BCS,

BCS_EXCEPTION TYPE REF TO CX_BCS.

TRY.

SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).

MAILSUBJECT = 'Release PO Notification'.

CALL FUNCTION 'ZSENDEMAIL_THROUGH_WORKFLOW'

EXPORTING

EBELN = PURCHASINGDOCUMENT

TABLES

GT_CONT = GT_CONT.

DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(

I_TYPE = C_HTM

I_TEXT = GT_CONT

I_LANGUAGE = SY-LANGU

I_SUBJECT = MAILSUBJECT ).

SEND_REQUEST->SET_DOCUMENT( DOCUMENT ).

SENDER = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( '[email protected]' ).

SEND_REQUEST->SET_SENDER( SENDER ).

RECIPIENT_TO = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( '[email protected]' ).

SEND_REQUEST->ADD_RECIPIENT( I_RECIPIENT = RECIPIENT_TO ).

RECIPIENT_CC = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( '[email protected]' ).

Page | 14
SAP Technical Consultant [email protected]

SEND_REQUEST->ADD_RECIPIENT( I_RECIPIENT = RECIPIENT_CC

I_COPY = 'X' ).

RECIPIENT_BCC = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( '[email protected]' ).

SEND_REQUEST->ADD_RECIPIENT( I_RECIPIENT = RECIPIENT_BCC

I_BLIND_COPY = 'X' ).

DATA(LV_SENT_TO_ALL) = SEND_REQUEST->SEND( ).

IF LV_SENT_TO_ALL = 'X'.

* WRITE 'Email sent to all recipients'.

ELSE.

* WRITE 'Email could not be sent to all recipients!'.

ENDIF.

COMMIT WORK.

CATCH CX_BCS INTO BCS_EXCEPTION.

* WRITE: 'Error occurred while sending email: Error Type', BCS_EXCEPTION->ERROR_TYPE.

ENDTRY.

SWC_SET_ELEMENT CONTAINER 'PurchasingDocument' PURCHASINGDOCUMENT.

END_METHOD.

Function Module Code: ZSENDEMAIL_THROUGH_WORKFLOW


DATA: G_URL_FIOR1 TYPE TEXT200,
G_URL_FIOR2 TYPE TEXT200,
LV_WIID TYPE C LENGTH 12,
LV_PO TYPE C LENGTH 25.

" READ SELECTED WORK ITEM ID


SELECT WI_ID FROM SWWWIHEAD INTO TABLE @DATA(IT_WI_ID) WHERE TOP_TASK EQ 'WS90000135' AN
D WI_STAT EQ 'STARTED' AND WI_RH_TASK EQ 'TS90000200'.
SORT IT_WI_ID DESCENDING BY WI_ID.
READ TABLE IT_WI_ID INTO DATA(WA_WI_ID) INDEX 1.
WA_WI_ID-WI_ID = WA_WI_ID-WI_ID + 1.
WA_WI_ID-WI_ID = |{ WA_WI_ID-WI_ID ALPHA = IN }|.
MOVE WA_WI_ID-WI_ID TO LV_WIID.
CLEAR: LV_PO,WA_WI_ID,IT_WI_ID.

" CREATE LINK TO APPROVE WORK ITEM


MOVE EBELN TO LV_PO.
CONCATENATE LV_PO 'A' LV_WIID INTO LV_PO SEPARATED BY SPACE.
CONCATENATE 'https://-------/sap/opu/odata/SAP/ZAPPROVEPO_SRV/poSet(' '''' LV_PO '''' ')' INTO G_URL_FIOR1.

" CREATE LINK TO REJECT WORK ITEM


CLEAR: LV_PO.
MOVE EBELN TO LV_PO.

Page | 15
SAP Technical Consultant [email protected]

CONCATENATE LV_PO 'R' LV_WIID INTO LV_PO SEPARATED BY SPACE.


CONCATENATE 'https://--------/sap/opu/odata/SAP/ZAPPROVEPO_SRV/poSet(' '''' LV_PO '''' ')' INTO G_URL_FIOR2.

CONSTANTS:
*-- Constants used in the body of the Email (HTML)
C_HTM TYPE CHAR3 VALUE 'HTM',
C_STYLE_START TYPE CHAR255 VALUE '<FONT face=Arial size=2>',
C_NEW_LINE TYPE CHAR255 VALUE '<br>',
C_LINK_START TYPE CHAR128 VALUE '<A href="www.w3schools.com">',
C_LINK_TEXT TYPE CHAR32 VALUE 'Link for learning HTML',
C_LINK_END TYPE CHAR4 VALUE '</A>',
C_SPACE(6) TYPE C VALUE '&nbsp;'.

DATA: GW_CONT LIKE LINE OF GT_CONT.

*start-> === Filling Email header =======


GW_CONT-LINE = '<html>'.
APPEND GW_CONT TO GT_CONT.

CLEAR GW_CONT.
MOVE '<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">' TO GW_CONT-LINE.
APPEND GW_CONT TO GT_CONT.

CLEAR GW_CONT.
MOVE '<head>' TO GW_CONT-LINE.
APPEND GW_CONT TO GT_CONT.

CLEAR GW_CONT.
GW_CONT-LINE = '<em><font ' .
APPEND GW_CONT TO GT_CONT.

CLEAR GW_CONT.
GW_CONT-LINE = 'color="#0000FF" size="+7" face="Arial,'.
APPEND GW_CONT TO GT_CONT.

CLEAR GW_CONT.
GW_CONT-LINE = 'Helvetica, sans-serif"> </font></em>'.
APPEND GW_CONT TO GT_CONT.

CLEAR GW_CONT.
MOVE '</head>' TO GW_CONT-LINE.
APPEND GW_CONT TO GT_CONT.

CLEAR GW_CONT.
GW_CONT-LINE = '<br>'.
APPEND GW_CONT TO GT_CONT.

CLEAR GW_CONT.

CONCATENATE 'Dear' 'Sir, ' INTO GW_CONT-LINE SEPARATED BY SPACE.

APPEND GW_CONT TO GT_CONT.

CLEAR GW_CONT.
GW_CONT-LINE = '<br>'.
APPEND GW_CONT TO GT_CONT.

CONCATENATE 'Please Release PO' '' INTO GW_CONT-LINE SEPARATED BY SPACE.

Page | 16
SAP Technical Consultant [email protected]

GW_CONT-LINE = '<body>'.

APPEND GW_CONT TO GT_CONT.

CONCATENATE '<p>Purchase number' EBELN 'is waiting for your decision,'


'kindly login the following applications to approve the document:</p>' INTO GW_CONT-
LINE SEPARATED BY SPACE.

APPEND GW_CONT TO GT_CONT.

"Insert URLs in bullets


GW_CONT-LINE = '<ul>'.
APPEND GW_CONT TO GT_CONT.

"Option 1
CONCATENATE '<li>'
'<a href="'
G_URL_FIOR1
'">'
'Approve</a>'
'</li>'
INTO GW_CONT-LINE.
APPEND GW_CONT TO GT_CONT.

"Option 2
CONCATENATE '<li>'
'<a href="'
G_URL_FIOR2
'">'
'Reject</a>'
'</li>'
INTO GW_CONT-LINE.
APPEND GW_CONT TO GT_CONT.

GW_CONT-LINE = '</ul>'.
APPEND GW_CONT TO GT_CONT.

GW_CONT-LINE = '</body>'.
APPEND GW_CONT TO GT_CONT.

GW_CONT-LINE = '<br><p>Regards</P>'.
APPEND GW_CONT TO GT_CONT.

GW_CONT-LINE = '<p><i>This e-mail was generated automatically from'.


APPEND GW_CONT TO GT_CONT.

GW_CONT-LINE = 'SAP; please do not reply.</i></P>'.


APPEND GW_CONT TO GT_CONT.

GW_CONT-LINE = '</body></html>'.
APPEND GW_CONT TO GT_CONT.

CLEAR GW_CONT.
GW_CONT-LINE = '<br>'.
APPEND GW_CONT TO GT_CONT.

Page | 17
SAP Technical Consultant [email protected]

Note: After writing code in the BO Method must need to click on generate button to
make it available.

Step 7:
Now we have to create event to use in Workflow.

Page | 18
SAP Technical Consultant [email protected]

Same as before, must need to implement and release it to make it available for use.

Page | 19
SAP Technical Consultant [email protected]

Step 8:
We need an API that will send a request of approve or reject case selected by approver from
email.

In Our case, We Create ODATA and Implement Get Entity Method:

Go To Transaction Code SEGW and create a project with the following objects:

Note: I am not telling ODATA Creation in Detail here. Also change length of Ebeln to 25.

After Creating and Generating the ODATA Project we have to redefine the Get Entity Method.

Why we use get entity method?


As we have to send 2 parameters from Email to Back SAP.

1. Purchase Order Number


2. Approve or Reject Selection

Page | 20
SAP Technical Consultant [email protected]

Code for Get Entity Method:

DATA: WA_KEY_TAB LIKE LINE OF IT_KEY_TAB,


LV_EBELN TYPE EBELN,
LV_VAR1 TYPE C LENGTH 10,
LV_VAR2 TYPE C LENGTH 1,
LV_VAR3 TYPE C LENGTH 12.

DATA: WORKITEM_ID TYPE SWR_STRUCT-WORKITEMID.

READ TABLE IT_KEY_TAB INTO WA_KEY_TAB WITH KEY NAME = 'Ebeln'.

SPLIT WA_KEY_TAB-VALUE AT SPACE INTO LV_VAR1 LV_VAR2 LV_VAR3.

IF SY-SUBRC EQ 0.

IF LV_VAR2 EQ 'A'.

MOVE LV_VAR3 TO WORKITEM_ID.


CALL FUNCTION 'SAP_WAPI_FORWARD_WORKITEM'
EXPORTING
WORKITEM_ID = WORKITEM_ID.

COMMIT WORK AND WAIT.

ELSEIF LV_VAR2 EQ 'R'.

MOVE LV_VAR3 TO WORKITEM_ID.


CALL FUNCTION 'SAP_WAPI_WORKITEM_DELETE'
EXPORTING
WORKITEM_ID = WORKITEM_ID.

COMMIT WORK AND WAIT.

ENDIF.

ENDIF.
MOVE LV_VAR1 TO LV_EBELN.
SELECT SINGLE * FROM EKKO INTO ER_ENTITY WHERE EBELN EQ LV_EBELN.

Page | 21
SAP Technical Consultant [email protected]

Step 9:
Create Workflow and Workflow Task:

Go to PFTC:

Page | 22
SAP Technical Consultant [email protected]

Link the event here that was created in Business Object.

Page | 23
SAP Technical Consultant [email protected]

Step 10:
Create workflow.

We have to create 2 activities only for simplicity and proper understanding.

Page | 24
SAP Technical Consultant [email protected]

Activity 1:
We have to create this Task in PFTC T-Code.

Page | 25
SAP Technical Consultant [email protected]

Activity 2:
We have to use standard task here for sending notification in Inbox.

Page | 26
SAP Technical Consultant [email protected]

Step 11:
Let’s Run the Workflow and Test it.

Page | 27
SAP Technical Consultant [email protected]

Page | 28
SAP Technical Consultant [email protected]

We can see our inbox the notification arrived to approve Purchase Order.

Also, see in Transaction SOST the Email arrived to send.

Select Email line and Click on Display to see Email Body.


We can see Approve and Reject buttons.

Page | 29
SAP Technical Consultant [email protected]

When we click on Approve or Reject Button.


The notification will be removed from inbox.

Page | 30
SAP Technical Consultant [email protected]

Page | 31

You might also like