*&---------------------------------------------------------------------*
*& Include ZXCCAU05
*&---------------------------------------------------------------------*
CALL FUNCTION 'ZWF_INTERFACE_ECM'
EXPORTING
AENRB = ECM_DATA
FUNCTION ZWF_INTERFACE_ECM.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(AENRB) TYPE AENRB
*"----------------------------------------------------------------------
DATA: L_TYPEID TYPE SIBFTYPEID.
DATA: L_INSTID TYPE SIBFBORIID.
DATA: CONTAINER TYPE TABLE OF SWCONT WITH HEADER LINE.
DATA: WA_AENV TYPE AENV,
IT_AENV TYPE TABLE OF AENV.
DATA: L_RUN TYPE FLAG.
IF SY-TCODE <> 'CC02'
AND SY-UNAME <> 'WF-BATCH' AND SY-BINPT <> 'X'.
EXIT.
ENDIF.
"Function with release key (EO) & without release key (MAEO)
IF AENRB-AEFUN <> '' AND AENRB-AEFUN <> '1'.
EXIT.
ENDIF.
"Check change material or material BOM
SELECT * INTO TABLE IT_AENV FROM AENV WHERE AENNR = AENRB-AENNR AND AEERL = 'X'.
LOOP AT IT_AENV INTO WA_AENV.
IF WA_AENV-AETYP = 2 OR WA_AENV-AETYP = 41.
L_RUN = 'X'.
EXIT.
ENDIF.
ENDLOOP.
CHECK L_RUN = 'X'.
L_TYPEID = 'ECM'.
L_INSTID = AENRB-AENNR.
CALL FUNCTION 'ZWF_DIS_APPROVELOG_1'
EXPORTING
TYPEID = L_TYPEID
INSTID = L_INSTID
SUBMIT = 'X'
TABLES
CONTAINER = CONTAINER.
ENDFUNCTION.
FUNCTION ZWF_DIS_APPROVELOG_1.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(TYPEID) TYPE SIBFTYPEID OPTIONAL
*" VALUE(INSTID) TYPE SIBFBORIID OPTIONAL
*" VALUE(WFID) TYPE ZWFID OPTIONAL
*" VALUE(SUBMIT) TYPE CHAR1 OPTIONAL
*" EXPORTING
*" VALUE(UCOMM) LIKE SY-UCOMM
*" TABLES
*" CONTAINER STRUCTURE SWCONT OPTIONAL
*"----------------------------------------------------------------------
DATA: WA_CONTAINER TYPE SWCONT.
DATA: WA_SWWUSERWI TYPE SWWUSERWI,
IT_SWWUSERWI TYPE SWWUSERWI OCCURS 0.
DATA: L_STSPID TYPE ZSPID.
DATA: WA_ZWF002 TYPE ZWF002_1.
DATA: L_OBJTYPE TYPE SWO_OBJTYP.
DATA: L_OBJKEY TYPE SWO_TYPEID.
DATA: SWO_RETURN TYPE SWOTRETURN.
DATA: IT_CONTAINER TYPE TABLE OF SWCONT WITH HEADER LINE.
DATA: IT_SWR_CONT TYPE TABLE OF SWR_CONT WITH HEADER LINE.
DATA: L_CREATOR TYPE SYUNAME.
DATA: L_ISLAU TYPE ZISLAU.
DATA: CHK_ADM TYPE RS_XFIELD.
"Clear all variants value
PERFORM INIT_VARIANT.
"Initalize TYPEID
IF TYPEID IS INITIAL.
SELECT SINGLE * FROM ZWF002_1 INTO WA_ZWF002 WHERE WFID = WFID.
TYPEID = WA_ZWF002-TYPEID.
ENDIF.
"Initalize WFID
IF WFID IS INITIAL.
L_OBJTYPE = TYPEID.
L_OBJKEY = INSTID.
CALL FUNCTION 'ZKZ_GET_OBJ_ATTR'
EXPORTING
OBJTYPE = L_OBJTYPE
OBJKEY = L_OBJKEY
VERB = 'WFID'
ACCESS = 'G'
IMPORTING
RETURN = SWO_RETURN
TABLES
CONTAINER = IT_CONTAINER
EXCEPTIONS
DISPLAY_ERROR = 1
OTHERS = 2.
IF SY-SUBRC NE 0 OR SWO_RETURN-CODE NE 0.
MESSAGE W015(ZWF_1).
EXIT.
ENDIF.
READ TABLE IT_CONTAINER WITH KEY ELEMENT = 'WFID'.
WFID = IT_CONTAINER-VALUE.
ENDIF.
"If launch workflow
CALL FUNCTION 'ZWF_CHECK_WF_RUN'
EXPORTING
WFID = WFID
CHK_ADM = ''
EXCEPTIONS
NOT_RUN = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
"Get creator
CALL FUNCTION 'ZKZ_GETCREATOR'
EXPORTING
INSTID = INSTID
WFID = WFID
IMPORTING
RESULT = L_CREATOR.
IF SUBMIT = 'X'.
"If not creator, then exit when submit
IF L_CREATOR <> SY-UNAME.
EXIT.
ENDIF.
ENDIF.
"Get current process
CALL FUNCTION 'ZKZ_GETCURRAPPR'
EXPORTING
INSTID = INSTID
WFID = WFID
SUBMIT_FLAG = SUBMIT
IMPORTING
WA_CURR_PROCESS = G_CURR_PROCESS.
"Get current O/S work item
CALL FUNCTION 'ZKZ_GET_CURR_WI'
EXPORTING
TYPEID = TYPEID
INSTID = INSTID
WFID = WFID
TABLES
IT_SWWUSERWI = IT_SWWUSERWI.
READ TABLE IT_SWWUSERWI INTO WA_SWWUSERWI INDEX 1.
G_WIID = WA_SWWUSERWI-WI_ID.
G_TYPEID = TYPEID.
G_WFID = WFID.
G_INSTID = INSTID.
G_SUBMIT = SUBMIT.
G_CREATOR = L_CREATOR.
CLEAR IT_SWR_CONT[].
CALL FUNCTION 'ZKZ_GETWICONTAINER'
EXPORTING
TYPEID = TYPEID
INSTID = INSTID
WFID = WFID
TABLES
IT_CONTAINER = IT_SWR_CONT.
LOOP AT IT_SWR_CONT.
CONTAINER-ELEMENT = IT_SWR_CONT-ELEMENT.
CONTAINER-VALUE = IT_SWR_CONT-VALUE.
APPEND CONTAINER.
ENDLOOP.
G_CONTAINER[] = CONTAINER[].
DYNAME = SY-REPID.
DYNUMB = SY-DYNNR.
"Get object number
LOOP AT CONTAINER INTO WA_CONTAINER WHERE ELEMENT = 'OBJNR'.
G_OBJNR = WA_CONTAINER-VALUE.
ENDLOOP.
"Get current status (for show user's function buttons)
SELECT SINGLE STSPID INTO L_STSPID FROM ZWF002_1 WHERE WFID = WFID.
IF L_STSPID = G_CURR_PROCESS-SPID.
G_STATUS = 'DRAFT'.
ENDIF.
IF G_CURR_PROCESS-SPID = 'APP'.
G_STATUS = 'APP'.
ENDIF.
"Get Containers (Exit for workflow)
CALL FUNCTION 'ZWF_EXIT_CONTAINER'
EXPORTING
TYPEID = G_TYPEID
WFID = G_WFID
INSTID = G_INSTID
CREATOR = G_CREATOR
TABLES
AC_CONTAINER = G_CONTAINER
EXCEPTIONS
NO_CONTAINER = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
CALL SCREEN 0100 STARTING AT 1 1
ENDING AT 115 21.
UCOMM = G_UCOMM.
ENDFUNCTION.
FUNCTION ZKZ_GET_OBJ_ATTR.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(OBJTYPE) TYPE SWO_OBJTYP OPTIONAL
*" VALUE(OBJKEY) TYPE SWO_TYPEID OPTIONAL
*" VALUE(VERB) TYPE SWO_VERB OPTIONAL
*" VALUE(ACCESS) TYPE SWO_CONTXT DEFAULT 'C'
*" EXPORTING
*" REFERENCE(OBJECT) TYPE SWO_OBJHND
*" REFERENCE(RETURN) TYPE SWOTRETURN
*" TABLES
*" CONTAINER STRUCTURE SWCONT
*" EXCEPTIONS
*" DISPLAY_ERROR
*"----------------------------------------------------------------------
DATA: SWO_RETURN TYPE SWOTRETURN.
CLEAR: SWO_RETURN, OBJECT.
CALL FUNCTION 'SWO_CREATE'
EXPORTING
OBJTYPE = OBJTYPE
OBJKEY = OBJKEY
* OBJNAME = ' '
* LOGICAL_SYSTEM = ' '
IMPORTING
OBJECT = OBJECT
RETURN = SWO_RETURN
EXCEPTIONS
NO_REMOTE_OBJECTS = 1
OTHERS = 2.
IF SY-SUBRC NE 0 OR SWO_RETURN-CODE NE 0.
"MESSAGE E679(OA) RAISING DISPLAY_ERROR.
RAISE DISPLAY_ERROR.
ENDIF.
CLEAR: SWO_RETURN, CONTAINER.
CALL FUNCTION 'SWO_INVOKE'
EXPORTING
ACCESS = ACCESS "G - Get attribute P - Put attribute
OBJECT = OBJECT
VERB = VERB
IMPORTING
RETURN = SWO_RETURN
TABLES
CONTAINER = CONTAINER.
IF SWO_RETURN-CODE NE 0
AND SWO_RETURN-CODE NE 8017."user cancel
"MESSAGE E679(OA) RAISING DISPLAY_ERROR.
RAISE DISPLAY_ERROR.
ENDIF.
ENDFUNCTION.
FUNCTION ZWF_CHECK_WF_RUN.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(WFID) TYPE ZWFID
*" VALUE(CHK_ADM) TYPE RS_XFIELD DEFAULT 'X'
*" EXCEPTIONS
*" NOT_RUN
*"----------------------------------------------------------------------
DATA: L_ISLAU TYPE ZISLAU.
DATA: WA_ZWF007 TYPE ZWF007_1.
"If launch workflow
SELECT SINGLE ISLAU INTO L_ISLAU FROM ZWF002_1 WHERE WFID = WFID.
IF SY-SUBRC <> 0.
RAISE NOT_RUN.
ENDIF.
IF L_ISLAU IS INITIAL.
RAISE NOT_RUN.
ELSE.
"If user is administrator, then do not control
IF CHK_ADM = 'X'.
SELECT SINGLE * INTO WA_ZWF007 FROM ZWF007_1 WHERE WFID = WFID AND USNAM = SY-UNAME.
IF SY-SUBRC = 0.
RAISE NOT_RUN.
ENDIF.
ENDIF.
ENDIF.
ENDFUNCTION.
FUNCTION ZKZ_GETCREATOR.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" REFERENCE(WFID) TYPE ZWFID
*" EXPORTING
*" VALUE(RESULT) TYPE SYUNAME
*" VALUE(SPNAME) TYPE ZSPNAME
*"----------------------------------------------------------------------
DATA: IT_ZWF004 TYPE ZWF004_1 OCCURS 0 WITH HEADER LINE.
DATA: WA_ZWF004 TYPE ZWF004_1.
DATA: L_AGENT(20) TYPE C.
SELECT * INTO TABLE IT_ZWF004 FROM ZWF004_1
WHERE SPLX = 'S' AND INSTID = INSTID AND WFID = WFID.
IF SY-SUBRC <> 0.
RESULT = SY-UNAME.
EXIT.
ENDIF.
SORT IT_ZWF004 BY SPRQ SPSJ DESCENDING.
READ TABLE IT_ZWF004 INTO WA_ZWF004 INDEX 1.
CONCATENATE 'US' WA_ZWF004-SPYH INTO L_AGENT.
CALL FUNCTION 'SWD_CHECK_AGENT'
EXPORTING
IN_EXPRESSION = L_AGENT
EXCEPTIONS
ERROR = 1
BINDING_ERROR = 2
OTHERS = 3.
IF SY-SUBRC = 0.
RESULT = WA_ZWF004-SPYH.
ELSE.
RESULT = SY-UNAME.
ENDIF.
SPNAME = WA_ZWF004-SPNAME.
ENDFUNCTION.
FUNCTION ZKZ_GETCURRAPPR.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" REFERENCE(WFID) TYPE ZWFID
*" VALUE(SUBMIT_FLAG) TYPE CHAR1 OPTIONAL
*" EXPORTING
*" REFERENCE(WA_CURR_PROCESS) TYPE ZKZ_CURR_PROCESS
*"----------------------------------------------------------------------
DATA: IT_CONTAINER TYPE SWR_CONT OCCURS 0.
DATA: WA_CONTAINER TYPE SWR_CONT.
DATA: WA_ZWF002 TYPE ZWF002_1.
DATA: WA_ZWF001 TYPE ZWF001_1.
DATA: L_USERID TYPE XUBNAME.
DATA: L_CREA_TMP TYPE SWFRCRETS.
DATA: WA_ZWF004 TYPE ZWF004_1,
IT_ZWF004 TYPE ZWF004_1 OCCURS 0.
DATA: WA_ZWF006 TYPE ZWF006_1.
DATA: TYPEID TYPE SIBFTYPEID.
"Get workflow template ID in setting table
SELECT SINGLE * FROM ZWF002_1 INTO WA_ZWF002 WHERE WFID = WFID.
TYPEID = WA_ZWF002-TYPEID.
WA_CURR_PROCESS-INSTID = INSTID.
WA_CURR_PROCESS-WFID = WFID.
SELECT SINGLE * FROM ZWF006_1 INTO WA_ZWF006
WHERE WFID = WFID AND INSTID = INSTID.
IF SY-SUBRC <> 0.
WA_CURR_PROCESS-SPID = WA_ZWF002-STSPID.
WA_CURR_PROCESS-SELID = SY-UNAME.
WA_CURR_PROCESS-SPRQ = SY-DATUM.
WA_CURR_PROCESS-SPSJ = SY-UZEIT.
ELSE.
IF SUBMIT_FLAG = 'X'.
WA_CURR_PROCESS-SPID = WA_ZWF002-STSPID.
WA_CURR_PROCESS-SELID = SY-UNAME.
WA_CURR_PROCESS-SPRQ = SY-DATUM.
WA_CURR_PROCESS-SPSJ = SY-UZEIT.
ELSEIF WA_ZWF006-SPID = '1'. "step is reject to creator
WA_CURR_PROCESS-SPID = WA_ZWF002-STSPID.
WA_CURR_PROCESS-SELID = WA_ZWF006-SELID.
WA_CURR_PROCESS-SPRQ = SY-DATUM.
WA_CURR_PROCESS-SPSJ = SY-UZEIT.
ELSEIF WA_ZWF006-SPID = 'APP'.
WA_CURR_PROCESS-SPID = WA_ZWF006-SPID.
WA_CURR_PROCESS-SPNAME = 'SYSTEM WORKFLOW'.
WA_CURR_PROCESS-SELID = ''.
WA_CURR_PROCESS-SPRQ = WA_ZWF006-SPRQ.
WA_CURR_PROCESS-SPSJ = WA_ZWF006-SPSJ.
ELSE.
CALL FUNCTION 'ZKZ_GETWICONTAINER'
EXPORTING
TYPEID = TYPEID
INSTID = INSTID
WFID = WFID
TABLES
IT_CONTAINER = IT_CONTAINER.
IF IT_CONTAINER IS INITIAL.
WA_CURR_PROCESS-SPID = 'APP'.
WA_CURR_PROCESS-SPNAME = 'SYSTEM WORKFLOW'.
WA_CURR_PROCESS-SELID = ''.
SELECT * FROM ZWF004_1 INTO TABLE IT_ZWF004
WHERE WFID = WFID AND INSTID = INSTID.
SORT IT_ZWF004 BY SPCNT DESCENDING.
READ TABLE IT_ZWF004 INTO WA_ZWF004 INDEX 1.
WA_CURR_PROCESS-SPRQ = WA_ZWF004-SPRQ.
WA_CURR_PROCESS-SPSJ = WA_ZWF004-SPSJ.
ELSE.
LOOP AT IT_CONTAINER INTO WA_CONTAINER WHERE ELEMENT = 'NEXT_SPID'.
IF WA_CONTAINER-VALUE = SPACE.
" SELECT SINGLE * FROM ZWF002_1 INTO WA_ZWF002 WHERE WFID = WFID.
WA_CURR_PROCESS-SPID = WA_ZWF002-STSPID.
ELSE.
WA_CURR_PROCESS-SPID = WA_CONTAINER-VALUE.
ENDIF.
ENDLOOP.
LOOP AT IT_CONTAINER INTO WA_CONTAINER WHERE ELEMENT = 'ACTUAL_NEXT_USER'.
WA_CURR_PROCESS-SELID = WA_CONTAINER-VALUE.
ENDLOOP.
LOOP AT IT_CONTAINER INTO WA_CONTAINER WHERE ELEMENT = 'WI_CD'.
WA_CURR_PROCESS-SPRQ = WA_CONTAINER-VALUE.
ENDLOOP.
LOOP AT IT_CONTAINER INTO WA_CONTAINER WHERE ELEMENT = 'WI_CT'.
WA_CURR_PROCESS-SPSJ = WA_CONTAINER-VALUE.
ENDLOOP.
ENDIF.
ENDIF.
ENDIF.
SELECT SINGLE * INTO WA_ZWF001 FROM ZWF001_1
WHERE WFID = WFID AND SPID = WA_CURR_PROCESS-SPID.
IF SY-SUBRC = 0.
WA_CURR_PROCESS-SPNAME = WA_ZWF001-SPNAME.
WA_CURR_PROCESS-NSTEP = WA_ZWF001-NSTEP.
WA_CURR_PROCESS-RSTEP = WA_ZWF001-RSTEP.
WA_CURR_PROCESS-ISCHGAPR = WA_ZWF001-ISCHGAPR.
WA_CURR_PROCESS-ISEDTDOC = WA_ZWF001-ISEDTDOC.
ENDIF.
ENDFUNCTION.
FUNCTION ZKZ_GETWICONTAINER.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(TYPEID) TYPE SIBFTYPEID
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" REFERENCE(WFID) TYPE ZWFID
*" TABLES
*" IT_CONTAINER STRUCTURE SWR_CONT
*"----------------------------------------------------------------------
DATA IT_SWR_WIHDR TYPE SWR_WIHDR OCCURS 0.
DATA WA_SWR_WIHDR TYPE SWR_WIHDR.
DATA L_OBJTYPE TYPE SWOTOBJID-OBJTYPE.
DATA L_OBJKEY TYPE SWOTOBJID-OBJKEY.
DATA IT_SWHACTOR TYPE SWHACTOR OCCURS 0.
DATA WA_ZWF002 TYPE ZWF002_1.
DATA IT_SWRTWIAGENT TYPE SWRTWIAGENT.
DATA IT_SWR_WIDTL TYPE SWR_WIDTL.
DATA IT_SWR_CONT TYPE SWR_CONT OCCURS 0.
DATA IT_SWP_LOGTAB TYPE SWP_LOGTAB OCCURS 0.
DATA WA_SWP_LOGTAB TYPE SWP_LOGTAB.
DATA L_USERID TYPE XUBNAME.
IF TYPEID IS INITIAL OR INSTID IS INITIAL OR WFID IS INITIAL.
EXIT.
ENDIF.
L_OBJTYPE = TYPEID.
L_OBJKEY = INSTID.
"Get all work items by object key on running time (Top WI ID)
CALL FUNCTION 'SAP_WAPI_WORKITEMS_TO_OBJECT'
EXPORTING
OBJTYPE = L_OBJTYPE
OBJKEY = L_OBJKEY
TABLES
WORKLIST = IT_SWR_WIHDR.
IF IT_SWR_WIHDR IS INITIAL.
EXIT.
ENDIF.
"Get workflow template ID in setting table
SELECT SINGLE * FROM ZWF002_1 INTO WA_ZWF002 WHERE WFID = WFID.
"Based on workflow template ID, get work item detail and container
LOOP AT IT_SWR_WIHDR INTO WA_SWR_WIHDR WHERE WI_RH_TASK = WA_ZWF002-WI_RH_TASK.
"Get Top WI ID Details
CALL FUNCTION 'SAP_WAPI_GET_WORKITEM_DETAIL'
EXPORTING
WORKITEM_ID = WA_SWR_WIHDR-WI_ID
IMPORTING
WORKITEM_DETAIL = IT_SWR_WIDTL.
"Get Goalble Container
CALL FUNCTION 'SAP_WAPI_READ_CONTAINER'
EXPORTING
WORKITEM_ID = WA_SWR_WIHDR-WI_ID
TABLES
SIMPLE_CONTAINER = IT_CONTAINER.
"Get Sub-WI List
CALL FUNCTION 'SWP_WORKFLOW_LOG_READ'
EXPORTING
TOP_LEVEL_WF = WA_SWR_WIHDR-WI_ID
TABLES
WF_LOG = IT_SWP_LOGTAB.
LOOP AT IT_SWP_LOGTAB INTO WA_SWP_LOGTAB WHERE WI_TYPE = 'W'.
SELECT SINGLE USER_ID
INTO L_USERID
FROM SWWUSERWI
WHERE WI_ID = WA_SWP_LOGTAB-WI_ID AND NO_SEL = ''.
IF SY-SUBRC = 0.
IT_CONTAINER-ELEMENT = 'ACTUAL_NEXT_USER'.
IT_CONTAINER-VALUE = L_USERID.
APPEND IT_CONTAINER.
IT_CONTAINER-ELEMENT = 'WI_CD'.
IT_CONTAINER-VALUE = WA_SWP_LOGTAB-WI_CD.
APPEND IT_CONTAINER.
IT_CONTAINER-ELEMENT = 'WI_CT'.
IT_CONTAINER-VALUE = WA_SWP_LOGTAB-WI_CT.
APPEND IT_CONTAINER.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFUNCTION.
FUNCTION ZKZ_GET_CURR_WI.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(TYPEID) TYPE SIBFTYPEID OPTIONAL
*" VALUE(INSTID) TYPE SIBFBORIID OPTIONAL
*" VALUE(WFID) TYPE ZWFID OPTIONAL
*" TABLES
*" IT_SWWUSERWI STRUCTURE SWWUSERWI OPTIONAL
*"----------------------------------------------------------------------
DATA: IT_SWR_WIHDR TYPE SWR_WIHDR OCCURS 0.
DATA: WA_SWR_WIHDR TYPE SWR_WIHDR.
DATA: IT_SWP_LOGTAB TYPE SWP_LOGTAB OCCURS 0.
DATA: WA_SWP_LOGTAB TYPE SWP_LOGTAB.
DATA: L_CURR_WORKITEMID TYPE SWOTOBJID-OBJKEY.
DATA: WA_SWWUSERWI TYPE SWWUSERWI.
DATA: L_OBJTYPE TYPE SWOTOBJID-OBJTYPE.
DATA: L_OBJKEY TYPE SWOTOBJID-OBJKEY.
DATA: WA_ZWF002 TYPE ZWF002_1.
* Get current work item ID If open from inbox
CALL FUNCTION 'SWE_WI_GET_FROM_REQUESTER'
IMPORTING
REQUESTER_WORKITEMID = L_CURR_WORKITEMID.
IF L_CURR_WORKITEMID IS NOT INITIAL.
SELECT SINGLE *
INTO WA_SWWUSERWI
FROM SWWUSERWI
WHERE WI_ID = L_CURR_WORKITEMID.
ELSE.
L_OBJTYPE = TYPEID.
L_OBJKEY = INSTID.
"Get all work items by object key on running time (Top WI ID)
CALL FUNCTION 'SAP_WAPI_WORKITEMS_TO_OBJECT'
EXPORTING
OBJTYPE = L_OBJTYPE
OBJKEY = L_OBJKEY
TABLES
WORKLIST = IT_SWR_WIHDR.
IF IT_SWR_WIHDR IS INITIAL.
EXIT.
ENDIF.
"Get workflow template ID in setting table
SELECT SINGLE * FROM ZWF002_1 INTO WA_ZWF002 WHERE WFID = WFID.
"Based on workflow template ID, get work item detail and container
LOOP AT IT_SWR_WIHDR INTO WA_SWR_WIHDR WHERE WI_RH_TASK = WA_ZWF002-WI_RH_TASK.
"Get Sub-WI List
CALL FUNCTION 'SWP_WORKFLOW_LOG_READ'
EXPORTING
TOP_LEVEL_WF = WA_SWR_WIHDR-WI_ID
TABLES
WF_LOG = IT_SWP_LOGTAB.
LOOP AT IT_SWP_LOGTAB INTO WA_SWP_LOGTAB WHERE WI_TYPE = 'W'.
SELECT SINGLE *
INTO WA_SWWUSERWI
FROM SWWUSERWI
WHERE WI_ID = WA_SWP_LOGTAB-WI_ID AND NO_SEL = ''.
ENDLOOP.
ENDLOOP.
ENDIF.
CLEAR IT_SWWUSERWI[].
APPEND WA_SWWUSERWI TO IT_SWWUSERWI.
ENDFUNCTION.
FUNCTION ZKZ_GETWICONTAINER.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(TYPEID) TYPE SIBFTYPEID
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" REFERENCE(WFID) TYPE ZWFID
*" TABLES
*" IT_CONTAINER STRUCTURE SWR_CONT
*"----------------------------------------------------------------------
DATA IT_SWR_WIHDR TYPE SWR_WIHDR OCCURS 0.
DATA WA_SWR_WIHDR TYPE SWR_WIHDR.
DATA L_OBJTYPE TYPE SWOTOBJID-OBJTYPE.
DATA L_OBJKEY TYPE SWOTOBJID-OBJKEY.
DATA IT_SWHACTOR TYPE SWHACTOR OCCURS 0.
DATA WA_ZWF002 TYPE ZWF002_1.
DATA IT_SWRTWIAGENT TYPE SWRTWIAGENT.
DATA IT_SWR_WIDTL TYPE SWR_WIDTL.
DATA IT_SWR_CONT TYPE SWR_CONT OCCURS 0.
DATA IT_SWP_LOGTAB TYPE SWP_LOGTAB OCCURS 0.
DATA WA_SWP_LOGTAB TYPE SWP_LOGTAB.
DATA L_USERID TYPE XUBNAME.
IF TYPEID IS INITIAL OR INSTID IS INITIAL OR WFID IS INITIAL.
EXIT.
ENDIF.
L_OBJTYPE = TYPEID.
L_OBJKEY = INSTID.
"Get all work items by object key on running time (Top WI ID)
CALL FUNCTION 'SAP_WAPI_WORKITEMS_TO_OBJECT'
EXPORTING
OBJTYPE = L_OBJTYPE
OBJKEY = L_OBJKEY
TABLES
WORKLIST = IT_SWR_WIHDR.
IF IT_SWR_WIHDR IS INITIAL.
EXIT.
ENDIF.
"Get workflow template ID in setting table
SELECT SINGLE * FROM ZWF002_1 INTO WA_ZWF002 WHERE WFID = WFID.
"Based on workflow template ID, get work item detail and container
LOOP AT IT_SWR_WIHDR INTO WA_SWR_WIHDR WHERE WI_RH_TASK = WA_ZWF002-WI_RH_TASK.
"Get Top WI ID Details
CALL FUNCTION 'SAP_WAPI_GET_WORKITEM_DETAIL'
EXPORTING
WORKITEM_ID = WA_SWR_WIHDR-WI_ID
IMPORTING
WORKITEM_DETAIL = IT_SWR_WIDTL.
"Get Goalble Container
CALL FUNCTION 'SAP_WAPI_READ_CONTAINER'
EXPORTING
WORKITEM_ID = WA_SWR_WIHDR-WI_ID
TABLES
SIMPLE_CONTAINER = IT_CONTAINER.
"Get Sub-WI List
CALL FUNCTION 'SWP_WORKFLOW_LOG_READ'
EXPORTING
TOP_LEVEL_WF = WA_SWR_WIHDR-WI_ID
TABLES
WF_LOG = IT_SWP_LOGTAB.
LOOP AT IT_SWP_LOGTAB INTO WA_SWP_LOGTAB WHERE WI_TYPE = 'W'.
SELECT SINGLE USER_ID
INTO L_USERID
FROM SWWUSERWI
WHERE WI_ID = WA_SWP_LOGTAB-WI_ID AND NO_SEL = ''.
IF SY-SUBRC = 0.
IT_CONTAINER-ELEMENT = 'ACTUAL_NEXT_USER'.
IT_CONTAINER-VALUE = L_USERID.
APPEND IT_CONTAINER.
IT_CONTAINER-ELEMENT = 'WI_CD'.
IT_CONTAINER-VALUE = WA_SWP_LOGTAB-WI_CD.
APPEND IT_CONTAINER.
IT_CONTAINER-ELEMENT = 'WI_CT'.
IT_CONTAINER-VALUE = WA_SWP_LOGTAB-WI_CT.
APPEND IT_CONTAINER.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFUNCTION.
FUNCTION ZWF_EXIT_CONTAINER.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(TYPEID) TYPE SIBFTYPEID
*" REFERENCE(WFID) TYPE ZWFID
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" REFERENCE(CREATOR) TYPE UNAME
*" TABLES
*" AC_CONTAINER STRUCTURE SWCONT
*" EXCEPTIONS
*" NO_CONTAINER
*"----------------------------------------------------------------------
DATA: L_INDEX TYPE I.
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'Initiator'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'Initiator'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 12.
AC_CONTAINER-VALUE = CREATOR.
APPEND AC_CONTAINER.
ENDIF.
CASE WFID.
WHEN 'WFBOMC01'.
CALL FUNCTION 'ZWF_EXIT_CONTAINER_BOM'
EXPORTING
INSTID = INSTID
TABLES
AC_CONTAINER = AC_CONTAINER
EXCEPTIONS
NO_CONTAINER = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
RAISE NO_CONTAINER.
ENDIF.
WHEN 'WFECNA01'.
CALL FUNCTION 'ZWF_EXIT_CONTAINER_EO'
EXPORTING
INSTID = INSTID
TABLES
AC_CONTAINER = AC_CONTAINER.
WHEN 'WFECNA02'.
CALL FUNCTION 'ZWF_EXIT_CONTAINER_MAEO'
EXPORTING
INSTID = INSTID
TABLES
AC_CONTAINER = AC_CONTAINER.
WHEN 'WFMMCA01'.
CALL FUNCTION 'ZWF_EXIT_CONTAINER_MM'
EXPORTING
INSTID = INSTID
TABLES
AC_CONTAINER = AC_CONTAINER
EXCEPTIONS
NO_CONTAINER = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
RAISE NO_CONTAINER.
ENDIF.
WHEN 'WFDRAW01'.
CALL FUNCTION 'ZWF_EXIT_CONTAINER_SPEC'
EXPORTING
INSTID = INSTID
TABLES
AC_CONTAINER = AC_CONTAINER
EXCEPTIONS
NO_CONTAINER = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
RAISE NO_CONTAINER.
ENDIF.
WHEN 'WFMRRN01' OR 'WFMRRN02'.
CALL FUNCTION 'ZWF_EXIT_CONTAINER_MRRN'
EXPORTING
INSTID = INSTID
TABLES
AC_CONTAINER = AC_CONTAINER
EXCEPTIONS
NO_CONTAINER = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
RAISE NO_CONTAINER.
ENDIF.
WHEN 'WFMRRN03'.
CALL FUNCTION 'ZWF_EXIT_CONTAINER_IMIR'
EXPORTING
INSTID = INSTID
TABLES
AC_CONTAINER = AC_CONTAINER
EXCEPTIONS
NO_CONTAINER = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
RAISE NO_CONTAINER.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDFUNCTION.
FUNCTION ZWF_EXIT_CONTAINER_BOM.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(TYPEID) TYPE SIBFTYPEID OPTIONAL
*" REFERENCE(WFID) TYPE ZWFID OPTIONAL
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" TABLES
*" AC_CONTAINER STRUCTURE SWCONT
*" EXCEPTIONS
*" NO_CONTAINER
*"----------------------------------------------------------------------
DATA: L_INDEX TYPE I.
DATA: WA_KNMT TYPE KNMT,
IT_KNMT TYPE KNMT OCCURS 0.
"Plant
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'PLANT'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'PLANT'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 4.
AC_CONTAINER-VALUE = INSTID+18(4).
APPEND AC_CONTAINER.
ENDIF.
"Customer
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'CUSTOMER'.
IF SY-SUBRC <> 0.
CALL FUNCTION 'ZWF_GET_CUSTOMER_BY_MATERIAL'
EXPORTING
MATNR = INSTID(18)
TABLES
KNMT = IT_KNMT
EXCEPTIONS
NO_CUSTOMER_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE W004(ZWF_BOM).
EXIT.
ENDIF.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
READ TABLE IT_KNMT INTO WA_KNMT INDEX 1.
AC_CONTAINER-ELEMENT = 'CUSTOMER'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 10.
AC_CONTAINER-VALUE = WA_KNMT-KUNNR.
APPEND AC_CONTAINER.
ENDIF.
ENDFUNCTION.
FUNCTION ZWF_GET_CUSTOMER_BY_MATERIAL.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(MATNR) TYPE MATNR
*" TABLES
*" KNMT STRUCTURE KNMT
*" EXCEPTIONS
*" NO_CUSTOMER_FOUND
*"----------------------------------------------------------------------
* DATA: BEGIN OF WA_KUNNR.
* DATA: KUNNR TYPE KUNNR_V.
* DATA: END OF WA_KUNNR.
SELECT * INTO TABLE KNMT FROM KNMT WHERE MATNR = MATNR.
IF SY-SUBRC <> 0.
RAISE NO_CUSTOMER_FOUND.
ENDIF.
ENDFUNCTION.
FUNCTION ZWF_EXIT_CONTAINER_EO .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(TYPEID) TYPE SIBFTYPEID OPTIONAL
*" REFERENCE(WFID) TYPE ZWFID OPTIONAL
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" TABLES
*" AC_CONTAINER STRUCTURE SWCONT
*"----------------------------------------------------------------------
DATA: L_AENNR TYPE AENNR.
DATA: L_PLANT TYPE WERKS_D.
DATA: L_CUSTOMER TYPE KUNNR.
DATA: L_INDEX TYPE I.
L_AENNR = INSTID.
"Get plant and customer
CALL FUNCTION 'ZWF_EO_GET_PLANT_AND_CUTM'
EXPORTING
AENNR = L_AENNR
IMPORTING
PLANT = L_PLANT
CUSTOMER = L_CUSTOMER
EXCEPTIONS
CLASS_NOT_FOUND = 1
PLANT_NOT_FOUND = 2
CUSTOMER_NOT_FOUND = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
"Plant
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'PLANT'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'PLANT'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 4.
AC_CONTAINER-VALUE = L_PLANT.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_PLANT.
AC_CONTAINER-VALUE = L_PLANT.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Customer
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'CUSTOMER'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'CUSTOMER'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 10.
AC_CONTAINER-VALUE = L_CUSTOMER.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_CUSTOMER.
AC_CONTAINER-VALUE = L_CUSTOMER.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
ENDFUNCTION.
FUNCTION ZWF_EO_GET_PLANT_AND_CUTM .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(AENNR) TYPE AENNR
*" EXPORTING
*" REFERENCE(PLANT) TYPE WERKS_D
*" REFERENCE(CUSTOMER) TYPE KUNNR
*" EXCEPTIONS
*" CLASS_NOT_FOUND
*" PLANT_NOT_FOUND
*" CUSTOMER_NOT_FOUND
*"----------------------------------------------------------------------
* DATA: WA_AEOI TYPE AEOI,
* IT_AEOI TYPE TABLE OF AEOI.
* DATA: L_MATNR TYPE MATNR.
* DATA: L_PLANT TYPE WERKS_D,
* L_PLANT_OLD TYPE WERKS_D.
* DATA: WA_KNMT TYPE KNMT,
* IT_KNMT TYPE TABLE OF KNMT.
* DATA: L_KUNNR TYPE KUNNR,
* L_KUNNR_OLD TYPE KUNNR.
*
* "Get all items by change number
* SELECT * INTO TABLE IT_AEOI FROM AEOI WHERE AENNR = AENNR.
*
* LOOP AT IT_AEOI INTO WA_AEOI.
* "Get item
* L_MATNR = WA_AEOI-USOBJ(18).
*
* "Get Plant
* IF WA_AEOI-AETYP = '02'. "Material BOM
* L_PLANT = WA_AEOI-USOBJ+18(4).
* ELSEIF WA_AEOI-AETYP = '41'. "Material
*
* ENDIF.
* "If difference plant, can not be submitted
* IF L_PLANT_OLD IS NOT INITIAL AND L_PLANT_OLD <> L_PLANT.
* RAISE DIFFERENCE_PLANT.
* ENDIF.
* L_PLANT_OLD = L_PLANT.
*
* "Get Customer
* IF WA_AEOI-AETYP = '02'. "Material BOM
* CALL FUNCTION 'ZWF_GET_CUSTOMER_BY_MATERIAL'
* EXPORTING
* MATNR = L_MATNR
* TABLES
* KNMT = IT_KNMT
* EXCEPTIONS
* NO_CUSTOMER_FOUND = 1
* OTHERS = 2.
* IF SY-SUBRC = 0.
* READ TABLE IT_KNMT INTO WA_KNMT INDEX 1.
* L_KUNNR = WA_KNMT-KUNNR.
* ENDIF.
*
* ELSEIF WA_AEOI-AETYP = '41'. "Material
*
* ENDIF.
*
* "If difference plant, can not be submitted
* IF L_KUNNR_OLD IS NOT INITIAL AND L_KUNNR_OLD <> L_KUNNR.
* RAISE DIFFERENCE_CUSTOMER.
* ENDIF.
* L_KUNNR_OLD = L_KUNNR.
*
* ENDLOOP.
*
* PLANT = L_PLANT.
* CUSTOMER = L_KUNNR.
DATA: L_PLANT TYPE WERKS_D.
DATA: L_CUSTOMER TYPE KUNNR.
DATA: L_OBJ TYPE AUSP-OBJEK.
DATA: WA_EXP_AUSP TYPE AUSP,
IT_EXP_AUSP TYPE TABLE OF AUSP.
DATA: L_ATINN TYPE ATINN.
DATA: L_VKORG TYPE VKORG.
CLEAR: SY-MSGID, SY-MSGTY, SY-MSGNO, SY-MSGV1, SY-MSGV2, SY-MSGV3, SY-MSGV4.
"Get Customer
L_OBJ = AENNR.
CALL FUNCTION 'CLFM_GET_AUSP_FROM_BUFFER'
EXPORTING
OBJECT = L_OBJ
CLASSYTPE = '025'
TABLES
EXP_AUSP = IT_EXP_AUSP.
IF IT_EXP_AUSP[] IS INITIAL.
SY-MSGID = 'ZWF_ECM'.
SY-MSGTY = 'E'.
SY-MSGNO = '010'.
SY-MSGV1 = 'ZWF_EO'.
RAISE CLASS_NOT_FOUND.
ENDIF.
SELECT SINGLE ATINN INTO L_ATINN
FROM CABN
WHERE ATNAM = 'ZWF_CUSTOMER'.
IF L_ATINN IS INITIAL.
SY-MSGID = 'ZWF_ECM'.
SY-MSGTY = 'E'.
SY-MSGNO = '010'.
SY-MSGV1 = 'ZWF_EO'.
RAISE CUSTOMER_NOT_FOUND.
ENDIF.
READ TABLE IT_EXP_AUSP INTO WA_EXP_AUSP WITH KEY ATINN = L_ATINN.
L_CUSTOMER = WA_EXP_AUSP-ATWRT.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = L_CUSTOMER
IMPORTING
OUTPUT = L_CUSTOMER.
"Get Plant
SELECT SINGLE B~VKORG INTO L_VKORG
FROM KNA1 AS A INNER JOIN KNVV AS B ON A~KUNNR = B~KUNNR
WHERE A~KTOKD = 'Z001' AND A~KUNNR = L_CUSTOMER.
IF SY-SUBRC <> 0.
SY-MSGID = 'ZWF_ECM'.
SY-MSGTY = 'E'.
SY-MSGNO = '011'.
SY-MSGV1 = L_CUSTOMER.
RAISE PLANT_NOT_FOUND.
ENDIF.
L_PLANT = L_VKORG.
PLANT = L_PLANT.
CUSTOMER = L_CUSTOMER.
ENDFUNCTION.
FUNCTION ZWF_EXIT_CONTAINER_MAEO .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(TYPEID) TYPE SIBFTYPEID OPTIONAL
*" REFERENCE(WFID) TYPE ZWFID OPTIONAL
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" TABLES
*" AC_CONTAINER STRUCTURE SWCONT
*"----------------------------------------------------------------------
DATA: L_AENNR TYPE AENNR.
DATA: L_PLANT TYPE WERKS_D.
DATA: L_CUSTOMER TYPE KUNNR.
DATA: L_MATNR TYPE MATNR.
DATA: L_INDEX TYPE I.
DATA: IT_AEOI TYPE AEOI.
DATA: L_EKGRP TYPE EKGRP.
L_AENNR = INSTID.
"Get plant and customer
CALL FUNCTION 'ZWF_MAEO_GET_PLANT_AND_CUTM'
EXPORTING
AENNR = L_AENNR
IMPORTING
PLANT = L_PLANT
CUSTOMER = L_CUSTOMER
EXCEPTIONS
CLASS_NOT_FOUND = 1
PLANT_NOT_FOUND = 2
CUSTOMER_NOT_FOUND = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
"Plant
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'PLANT'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'PLANT'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 4.
AC_CONTAINER-VALUE = L_PLANT.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_PLANT.
AC_CONTAINER-VALUE = L_PLANT.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Customer
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'CUSTOMER'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'CUSTOMER'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 10.
AC_CONTAINER-VALUE = L_CUSTOMER.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_CUSTOMER.
AC_CONTAINER-VALUE = L_CUSTOMER.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Purchasing Group
SELECT SINGLE * INTO IT_AEOI FROM AEOI WHERE AENNR = L_AENNR.
IF SY-SUBRC = 0.
L_MATNR = IT_AEOI-USOBJ.
SELECT SINGLE EKGRP FROM MARC INTO L_EKGRP
WHERE MATNR = L_MATNR AND WERKS = L_PLANT.
IF SY-SUBRC = 0.
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'PURGROUP'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'PURGROUP'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 3.
AC_CONTAINER-VALUE = L_EKGRP.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_EKGRP.
AC_CONTAINER-VALUE = L_EKGRP.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFUNCTION.
FUNCTION ZWF_MAEO_GET_PLANT_AND_CUTM .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(AENNR) TYPE AENNR
*" EXPORTING
*" REFERENCE(PLANT) TYPE WERKS_D
*" REFERENCE(CUSTOMER) TYPE KUNNR
*" EXCEPTIONS
*" CLASS_NOT_FOUND
*" PLANT_NOT_FOUND
*" CUSTOMER_NOT_FOUND
*"----------------------------------------------------------------------
DATA: L_PLANT TYPE WERKS_D.
DATA: L_CUSTOMER TYPE KUNNR.
DATA: L_OBJ TYPE AUSP-OBJEK.
DATA: WA_EXP_AUSP TYPE AUSP,
IT_EXP_AUSP TYPE TABLE OF AUSP.
DATA: L_ATINN TYPE ATINN.
DATA: L_VKORG TYPE VKORG.
"Get Customer
L_OBJ = AENNR.
CALL FUNCTION 'CLFM_GET_AUSP_FROM_BUFFER'
EXPORTING
OBJECT = L_OBJ
CLASSYTPE = '025'
MAFID = 'O'
TABLES
EXP_AUSP = IT_EXP_AUSP.
IF IT_EXP_AUSP[] IS INITIAL.
SY-MSGID = 'ZWF_ECM'.
SY-MSGTY = 'E'.
SY-MSGNO = '010'.
SY-MSGV1 = 'ZWF_MAEO'.
RAISE CLASS_NOT_FOUND.
ENDIF.
SELECT SINGLE ATINN INTO L_ATINN
FROM CABN
WHERE ATNAM = 'ZWF_CUSTOMER'.
IF L_ATINN IS INITIAL.
SY-MSGID = 'ZWF_ECM'.
SY-MSGTY = 'E'.
SY-MSGNO = '010'.
SY-MSGV1 = 'ZWF_MAEO'.
RAISE CUSTOMER_NOT_FOUND.
ENDIF.
READ TABLE IT_EXP_AUSP INTO WA_EXP_AUSP WITH KEY ATINN = L_ATINN.
L_CUSTOMER = WA_EXP_AUSP-ATWRT.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = L_CUSTOMER
IMPORTING
OUTPUT = L_CUSTOMER.
"Get Plant
SELECT SINGLE B~VKORG INTO L_VKORG
FROM KNA1 AS A INNER JOIN KNVV AS B ON A~KUNNR = B~KUNNR
WHERE A~KTOKD = 'Z001' AND A~KUNNR = L_CUSTOMER.
IF SY-SUBRC <> 0.
SY-MSGID = 'ZWF_ECM'.
SY-MSGTY = 'E'.
SY-MSGNO = '011'.
SY-MSGV1 = L_CUSTOMER.
RAISE PLANT_NOT_FOUND.
ENDIF.
L_PLANT = L_VKORG.
PLANT = L_PLANT.
CUSTOMER = L_CUSTOMER.
ENDFUNCTION.
FUNCTION ZWF_EXIT_CONTAINER_MM .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(TYPEID) TYPE SIBFTYPEID OPTIONAL
*" REFERENCE(WFID) TYPE ZWFID OPTIONAL
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" TABLES
*" AC_CONTAINER STRUCTURE SWCONT
*" EXCEPTIONS
*" NO_CONTAINER
*"----------------------------------------------------------------------
DATA: L_MATNR TYPE MATNR.
DATA: L_PLANT TYPE WERKS_D.
DATA: L_CUSTOMER TYPE KUNNR.
DATA: L_INDEX TYPE I.
L_MATNR = INSTID.
"Get plant and customer
CALL FUNCTION 'ZWF_MM_GET_PLANT_AND_CUTM'
EXPORTING
MATNR = L_MATNR
IMPORTING
PLANT = L_PLANT
CUSTOMER = L_CUSTOMER
EXCEPTIONS
CLASS_NOT_FOUND = 1
PLANT_NOT_FOUND = 2
CUSTOMER_NOT_FOUND = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
RAISE NO_CONTAINER.
ENDIF.
"Plant
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'PLANT'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'PLANT'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 4.
AC_CONTAINER-VALUE = L_PLANT.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_PLANT.
AC_CONTAINER-VALUE = L_PLANT.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Customer
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'CUSTOMER'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'CUSTOMER'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 10.
AC_CONTAINER-VALUE = L_CUSTOMER.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_CUSTOMER.
AC_CONTAINER-VALUE = L_CUSTOMER.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
ENDFUNCTION.
FUNCTION ZWF_MM_GET_PLANT_AND_CUTM .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(MATNR) TYPE MATNR
*" EXPORTING
*" REFERENCE(PLANT) TYPE WERKS_D
*" REFERENCE(CUSTOMER) TYPE KUNNR
*" EXCEPTIONS
*" CLASS_NOT_FOUND
*" PLANT_NOT_FOUND
*" CUSTOMER_NOT_FOUND
*"----------------------------------------------------------------------
DATA: L_PLANT TYPE WERKS_D.
DATA: L_CUSTOMER TYPE KUNNR.
DATA: L_OBJ TYPE AUSP-OBJEK.
DATA: WA_EXP_AUSP TYPE AUSP,
IT_EXP_AUSP TYPE TABLE OF AUSP.
DATA: L_ATINN TYPE ATINN.
DATA: L_VKORG TYPE VKORG.
CLEAR: SY-MSGID, SY-MSGTY, SY-MSGNO, SY-MSGV1, SY-MSGV2, SY-MSGV3, SY-MSGV4.
"Get Customer
L_OBJ = MATNR.
CALL FUNCTION 'CLFM_GET_AUSP_FROM_BUFFER'
EXPORTING
OBJECT = L_OBJ
CLASSYTPE = '001'
TABLES
EXP_AUSP = IT_EXP_AUSP.
IF IT_EXP_AUSP[] IS INITIAL.
SY-MSGID = 'ZWF_MM'.
SY-MSGTY = 'W'.
SY-MSGNO = '001'.
SY-MSGV1 = 'ZMATL_WF'.
RAISE CLASS_NOT_FOUND.
ENDIF.
SELECT SINGLE ATINN INTO L_ATINN
FROM CABN
WHERE ATNAM = 'ZEND_CUSTOMER'.
IF L_ATINN IS INITIAL.
SY-MSGID = 'ZWF_MM'.
SY-MSGTY = 'W'.
SY-MSGNO = '002'.
SY-MSGV1 = 'ZMATL_WF'.
RAISE CUSTOMER_NOT_FOUND.
ENDIF.
READ TABLE IT_EXP_AUSP INTO WA_EXP_AUSP WITH KEY ATINN = L_ATINN.
L_CUSTOMER = WA_EXP_AUSP-ATWRT.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = L_CUSTOMER
IMPORTING
OUTPUT = L_CUSTOMER.
"Get Plant
SELECT SINGLE B~VKORG INTO L_VKORG
FROM KNA1 AS A INNER JOIN KNVV AS B ON A~KUNNR = B~KUNNR
WHERE A~KTOKD = 'Z001' AND A~KUNNR = L_CUSTOMER.
IF SY-SUBRC <> 0.
SY-MSGID = 'ZWF_MM'.
SY-MSGTY = 'W'.
SY-MSGNO = '002'.
SY-MSGV1 = L_CUSTOMER.
RAISE PLANT_NOT_FOUND.
ENDIF.
L_PLANT = L_VKORG.
PLANT = L_PLANT.
CUSTOMER = L_CUSTOMER.
ENDFUNCTION.
FUNCTION ZWF_EXIT_CONTAINER_SPEC .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(TYPEID) TYPE SIBFTYPEID OPTIONAL
*" REFERENCE(WFID) TYPE ZWFID OPTIONAL
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" TABLES
*" AC_CONTAINER STRUCTURE SWCONT
*" EXCEPTIONS
*" NO_CONTAINER
*"----------------------------------------------------------------------
DATA: L_PLANT TYPE WERKS_D.
DATA: L_CUSTOMER TYPE KUNNR.
DATA: L_INDEX TYPE I.
"Get plant and customer
CALL FUNCTION 'ZWF_SPEC_GET_PLANT'
EXPORTING
INSTID = INSTID
IMPORTING
PLANT = L_PLANT
CUSTOMER = L_CUSTOMER
EXCEPTIONS
CLASS_NOT_FOUND = 1
PLANT_NOT_FOUND = 2
CUSTOMER_NOT_FOUND = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
"Plant
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'PLANT'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'PLANT'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 4.
AC_CONTAINER-VALUE = L_PLANT.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_PLANT.
AC_CONTAINER-VALUE = L_PLANT.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Customer
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'CUSTOMER'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'CUSTOMER'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 10.
AC_CONTAINER-VALUE = L_CUSTOMER.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_CUSTOMER.
AC_CONTAINER-VALUE = L_CUSTOMER.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
ENDFUNCTION.
FUNCTION ZWF_SPEC_GET_PLANT .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(INSTID) TYPE SIBFBORIID OPTIONAL
*" EXPORTING
*" REFERENCE(PLANT) TYPE WERKS_D
*" REFERENCE(CUSTOMER) TYPE KUNNR
*" EXCEPTIONS
*" CLASS_NOT_FOUND
*" PLANT_NOT_FOUND
*" CUSTOMER_NOT_FOUND
*"----------------------------------------------------------------------
DATA: L_CLASS TYPE TABELLE.
DATA: L_PLANT TYPE WERKS_D.
DATA: L_CUSTOMER TYPE KUNNR.
DATA: L_OBJ TYPE AUSP-OBJEK.
DATA: WA_EXP_AUSP TYPE AUSP,
IT_EXP_AUSP TYPE TABLE OF AUSP.
DATA: L_ATINN TYPE ATINN.
DATA: L_VKORG TYPE VKORG.
CLEAR: SY-MSGID, SY-MSGTY, SY-MSGNO, SY-MSGV1, SY-MSGV2, SY-MSGV3, SY-MSGV4.
"Get Customer
L_OBJ = INSTID.
L_CLASS = 'ZWF_SPEC'.
CALL FUNCTION 'CLFM_GET_AUSP_FROM_BUFFER'
EXPORTING
OBJECT = L_OBJ
CLASSYTPE = '017'
PTABLE = L_CLASS
MAFID = 'O'
TABLES
EXP_AUSP = IT_EXP_AUSP.
IF IT_EXP_AUSP[] IS INITIAL.
CALL FUNCTION 'CLFM_GET_AUSP_FROM_BUFFER'
EXPORTING
OBJECT = ''
CLASSYTPE = '017'
PTABLE = L_CLASS
OBJECT_IS_CUOBJ = 'X'
MAFID = 'O'
TABLES
EXP_AUSP = IT_EXP_AUSP.
IF IT_EXP_AUSP[] IS INITIAL.
SY-MSGID = 'ZWF_DRAW'.
SY-MSGTY = 'W'.
SY-MSGNO = '001'.
RAISE CLASS_NOT_FOUND.
ENDIF.
ENDIF.
SELECT SINGLE ATINN INTO L_ATINN
FROM CABN
WHERE ATNAM = 'ZWF_CUSTOMER'.
IF L_ATINN IS INITIAL.
SY-MSGID = 'ZWF_DRAW'.
SY-MSGTY = 'W'.
SY-MSGNO = '002'.
RAISE CUSTOMER_NOT_FOUND.
ENDIF.
READ TABLE IT_EXP_AUSP INTO WA_EXP_AUSP WITH KEY ATINN = L_ATINN.
L_CUSTOMER = WA_EXP_AUSP-ATWRT.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = L_CUSTOMER
IMPORTING
OUTPUT = L_CUSTOMER.
"Get Plant
SELECT SINGLE B~VKORG INTO L_VKORG
FROM KNA1 AS A INNER JOIN KNVV AS B ON A~KUNNR = B~KUNNR
WHERE A~KTOKD = 'Z001' AND A~KUNNR = L_CUSTOMER.
IF SY-SUBRC <> 0.
SY-MSGID = 'ZWF_DRAW'.
SY-MSGTY = 'W'.
SY-MSGNO = '001'.
RAISE PLANT_NOT_FOUND.
ENDIF.
L_PLANT = L_VKORG.
PLANT = L_PLANT.
CUSTOMER = L_CUSTOMER.
ENDFUNCTION.
FUNCTION ZWF_EXIT_CONTAINER_MRRN .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(TYPEID) TYPE SIBFTYPEID OPTIONAL
*" REFERENCE(WFID) TYPE ZWFID OPTIONAL
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" TABLES
*" AC_CONTAINER STRUCTURE SWCONT
*" EXCEPTIONS
*" NO_CONTAINER
*"----------------------------------------------------------------------
DATA: L_PLANT TYPE WERKS_D.
DATA: L_CUSTOMER TYPE KUNNR.
DATA: L_PRODLINE TYPE ZPRODLINE.
DATA: L_REASONCODE TYPE ZREASONID.
DATA: L_DEPARTMENT TYPE ZMNTDEP.
DATA: L_INDEX TYPE I.
DATA: L_RNTYPE TYPE ZRNTYPE.
DATA: L_MRRNFLG TYPE ZMRRNFLG.
DATA: WA_ZMM001 TYPE ZMM001.
SELECT SINGLE * INTO WA_ZMM001
FROM ZMM001 WHERE MRRNNO = INSTID.
* IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
* ENDIF.
L_MRRNFLG = WA_ZMM001-MRRNFLG.
L_PLANT = WA_ZMM001-WERKS.
L_PRODLINE = WA_ZMM001-PRODLINE.
L_REASONCODE = WA_ZMM001-REASON.
L_CUSTOMER = WA_ZMM001-KUNNR.
L_DEPARTMENT = WA_ZMM001-MNTDEP.
"MRRN Type
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'MRRNTYPE'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'MRRNTYPE'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 1.
AC_CONTAINER-VALUE = L_MRRNFLG.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_MRRNFLG.
AC_CONTAINER-VALUE = L_MRRNFLG.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Plant
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'PLANT'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'PLANT'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 4.
AC_CONTAINER-VALUE = L_PLANT.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_PLANT.
AC_CONTAINER-VALUE = L_PLANT.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Department
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'DEPARTMENT'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'DEPARTMENT'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 10.
AC_CONTAINER-VALUE = L_DEPARTMENT.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_DEPARTMENT.
AC_CONTAINER-VALUE = L_DEPARTMENT.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Customer
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'CUSTOMER'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'CUSTOMER'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 10.
AC_CONTAINER-VALUE = L_CUSTOMER.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_CUSTOMER.
AC_CONTAINER-VALUE = L_CUSTOMER.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Production Line
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'PRODLINE'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'PRODLINE'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 4.
AC_CONTAINER-VALUE = L_PRODLINE.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_PRODLINE.
AC_CONTAINER-VALUE = L_PRODLINE.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Reason Code
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'REASONCODE'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'REASONCODE'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 2.
AC_CONTAINER-VALUE = L_REASONCODE.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_REASONCODE.
AC_CONTAINER-VALUE = L_REASONCODE.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Return to vendor
SELECT SINGLE RNTYPE INTO L_RNTYPE FROM ZMM001 WHERE MRRNNO = INSTID AND RNTYPE = '1'.
IF SY-SUBRC <> 0.
L_RNTYPE = '0'.
ENDIF.
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'RNTYPE'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'RNTYPE'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 1.
AC_CONTAINER-VALUE = L_RNTYPE.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_RNTYPE.
AC_CONTAINER-VALUE = L_RNTYPE.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
ENDFUNCTION.
FUNCTION ZWF_EXIT_CONTAINER_IMIR .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(TYPEID) TYPE SIBFTYPEID OPTIONAL
*" REFERENCE(WFID) TYPE ZWFID OPTIONAL
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" TABLES
*" AC_CONTAINER STRUCTURE SWCONT
*" EXCEPTIONS
*" NO_CONTAINER
*"----------------------------------------------------------------------
DATA: L_PLANT TYPE WERKS_D.
DATA: L_CUSTOMER TYPE KUNNR.
DATA: L_PURGROUP TYPE BKGRP.
DATA: L_REASONCODE TYPE ZREASONID.
DATA: L_DEPARTMENT TYPE ZMNTDEP.
DATA: L_INDEX TYPE I.
DATA: L_PHGA TYPE ZPHGA.
DATA: L_FLOWPATH(3) TYPE C.
SELECT SINGLE A~WERKS A~EKGRP B~REASON B~KUNNR B~MNTDEP
INTO (L_PLANT, L_PURGROUP, L_REASONCODE, L_CUSTOMER, L_DEPARTMENT)
FROM ZMM002 AS A INNER JOIN ZMM001 AS B
ON A~MRRNNO = B~MRRNNO AND A~ITMNO = B~ITMNO
WHERE A~IMNO = INSTID.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
"Plant
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'PLANT'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'PLANT'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 4.
AC_CONTAINER-VALUE = L_PLANT.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_PLANT.
AC_CONTAINER-VALUE = L_PLANT.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Purchase Group
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'PURGROUP'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'PURGROUP'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 3.
AC_CONTAINER-VALUE = L_PURGROUP.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_PURGROUP.
AC_CONTAINER-VALUE = L_PURGROUP.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Department
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'DEPARTMENT'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'DEPARTMENT'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 10.
AC_CONTAINER-VALUE = L_DEPARTMENT.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_DEPARTMENT.
AC_CONTAINER-VALUE = L_DEPARTMENT.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Customer
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'CUSTOMER'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'CUSTOMER'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 10.
AC_CONTAINER-VALUE = L_CUSTOMER.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_CUSTOMER.
AC_CONTAINER-VALUE = L_CUSTOMER.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"Reason Code
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'REASONCODE'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'REASONCODE'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 2.
AC_CONTAINER-VALUE = L_REASONCODE.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_REASONCODE.
AC_CONTAINER-VALUE = L_REASONCODE.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
"FlowPath
SELECT B~PHGA INTO L_PHGA FROM ZMM002 AS A INNER JOIN ZMM001 AS B
ON A~MRRNNO = B~MRRNNO AND A~ITMNO = B~ITMNO
WHERE A~IMNO = INSTID.
IF L_PHGA = 'SCR'.
L_FLOWPATH = 'SCR'.
EXIT.
ELSE.
L_FLOWPATH = 'RTV'.
ENDIF.
ENDSELECT.
READ TABLE AC_CONTAINER WITH KEY ELEMENT = 'FLOWPATH'.
IF SY-SUBRC <> 0.
DESCRIBE TABLE AC_CONTAINER LINES L_INDEX.
AC_CONTAINER-ELEMENT = 'FLOWPATH'.
AC_CONTAINER-TAB_INDEX = L_INDEX.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-ELEMLENGTH = 3.
AC_CONTAINER-VALUE = L_FLOWPATH.
APPEND AC_CONTAINER.
ELSE.
IF AC_CONTAINER-VALUE <> L_FLOWPATH.
AC_CONTAINER-VALUE = L_FLOWPATH.
MODIFY AC_CONTAINER INDEX SY-TABIX.
ENDIF.
ENDIF.
ENDFUNCTION.
*&---------------------------------------------------------------------*
*& Include ZXCCAU06
*&---------------------------------------------------------------------*
CALL FUNCTION 'ZWF_ECM_ISEDIT'
EXPORTING
AENRB = ECM_DATA
EXCEPTIONS
NOT_EDIT = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
RAISE NOT_OK.
ENDIF.
FUNCTION ZWF_ECM_ISEDIT.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(AENRB) TYPE AENRB OPTIONAL
*" EXCEPTIONS
*" NOT_EDIT
*"----------------------------------------------------------------------
DATA: L_WFID TYPE ZWFID.
DATA: L_SPID TYPE ZSPID.
DATA: L_OBJKEY TYPE SWO_TYPEID.
DATA: L_OBJTYPE TYPE SWO_OBJTYP.
DATA: SWO_RETURN TYPE SWOTRETURN.
DATA: IT_CONTAINER TYPE SWCONT OCCURS 0 WITH HEADER LINE.
DATA: L_AEPRO TYPE CC_PROFIL.
DATA: L_ISLAU TYPE ZISLAU.
DATA: L_TYPEID TYPE SIBFTYPEID.
DATA: WA_SWWUSERWI TYPE SWWUSERWI,
IT_SWWUSERWI TYPE SWWUSERWI OCCURS 0.
DATA: G_WIID TYPE SWW_WIID.
IF SY-TCODE = 'CC01'. "Change master
IMPORT L_AEPRO FROM MEMORY ID 'ECM_PROFILE'.
IF NOT L_AEPRO IS INITIAL.
IF ( L_AEPRO = 'Z0000001' AND AENRB-AEFUN <> '' ) or
( L_AEPRO = 'Z0000002' AND AENRB-AEFUN <> '1' ) .
SY-MSGID = 'ZWF_ECM'.
SY-MSGTY = 'E'.
SY-MSGNO = '014'.
SY-MSGV1 = '(EO:Chg.Mas.->With Rel.Key->Profile Z0000002)'.
SY-MSGV2 = '(MAEO:Chg.Mas.->Without Rel.Key->Profile Z0000001)'.
RAISE NOT_EDIT.
ENDIF.
ENDIF.
ELSEIF SY-TCODE = 'CC31'. "ECR
SY-MSGID = 'ZWF_ECM'.
SY-MSGTY = 'E'.
SY-MSGNO = '014'.
SY-MSGV1 = '(EO:Chg.Mas.->With Rel.Key->Profile Z0000002)'.
SY-MSGV2 = '(MAEO:Chg.Mas.->Without Rel.Key->Profile Z0000001)'.
RAISE NOT_EDIT.
ENDIF.
IF SY-TCODE <> 'CC02'.
EXIT.
ENDIF.
"Function with release key (EO)or without release key (MAEO)
IF AENRB-AEFUN <> '' AND AENRB-AEFUN <> '1'.
EXIT.
ENDIF.
"Get WFID
L_OBJKEY = AENRB-AENNR.
L_OBJTYPE = 'ECM'.
CALL FUNCTION 'ZKZ_GET_OBJ_ATTR'
EXPORTING
OBJTYPE = L_OBJTYPE
OBJKEY = L_OBJKEY
VERB = 'WFID'
ACCESS = 'G'
IMPORTING
RETURN = SWO_RETURN
TABLES
CONTAINER = IT_CONTAINER
EXCEPTIONS
DISPLAY_ERROR = 1
OTHERS = 2.
IF SY-SUBRC NE 0 OR SWO_RETURN-CODE NE 0.
EXIT.
ENDIF.
READ TABLE IT_CONTAINER WITH KEY ELEMENT = 'WFID'.
L_WFID = IT_CONTAINER-VALUE.
"If launch workflow
CALL FUNCTION 'ZWF_CHECK_WF_RUN'
EXPORTING
WFID = L_WFID
EXCEPTIONS
NOT_RUN = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
"If ECM was released, then do not change again
IF AENRB-RLKEY = '01'.
SY-MSGID = 'ZWF_1'.
SY-MSGTY = 'E'.
SY-MSGNO = '011'.
SY-MSGV1 = 'Status is active'.
RAISE NOT_EDIT.
ENDIF.
"Get current O/S work item
"To fix exception no workflow trigger but create approval log
"Check work item created or not, if not, no check edit mode
L_TYPEID = L_OBJTYPE.
CALL FUNCTION 'ZKZ_GET_CURR_WI'
EXPORTING
TYPEID = L_TYPEID
INSTID = L_OBJKEY
WFID = L_WFID
TABLES
IT_SWWUSERWI = IT_SWWUSERWI.
IF IT_SWWUSERWI[] IS INITIAL.
EXIT.
ENDIF.
READ TABLE IT_SWWUSERWI INTO WA_SWWUSERWI INDEX 1.
G_WIID = WA_SWWUSERWI-WI_ID.
IF G_WIID IS INITIAL.
EXIT.
ENDIF.
"Get current approval step
CALL FUNCTION 'ZKZ_GET_NEXT_STEP'
EXPORTING
WFID = L_WFID
INSTID = L_OBJKEY
IMPORTING
SPID = L_SPID.
"Check user has authorization to edit or not
CALL FUNCTION 'ZKZ_CHECK_MOD_AUTH'
EXPORTING
WFID = L_WFID
INSTID = L_OBJKEY
SPID = L_SPID
EXCEPTIONS
NO_AUTH = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
SY-MSGID = 'ZWF_1'.
SY-MSGTY = 'E'.
SY-MSGNO = '011'.
SY-MSGV1 = 'Status is under approval'.
RAISE NOT_EDIT.
ENDIF.
ENDFUNCTION.
FUNCTION ZKZ_GET_OBJ_ATTR.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(OBJTYPE) TYPE SWO_OBJTYP OPTIONAL
*" VALUE(OBJKEY) TYPE SWO_TYPEID OPTIONAL
*" VALUE(VERB) TYPE SWO_VERB OPTIONAL
*" VALUE(ACCESS) TYPE SWO_CONTXT DEFAULT 'C'
*" EXPORTING
*" REFERENCE(OBJECT) TYPE SWO_OBJHND
*" REFERENCE(RETURN) TYPE SWOTRETURN
*" TABLES
*" CONTAINER STRUCTURE SWCONT
*" EXCEPTIONS
*" DISPLAY_ERROR
*"----------------------------------------------------------------------
DATA: SWO_RETURN TYPE SWOTRETURN.
CLEAR: SWO_RETURN, OBJECT.
CALL FUNCTION 'SWO_CREATE'
EXPORTING
OBJTYPE = OBJTYPE
OBJKEY = OBJKEY
* OBJNAME = ' '
* LOGICAL_SYSTEM = ' '
IMPORTING
OBJECT = OBJECT
RETURN = SWO_RETURN
EXCEPTIONS
NO_REMOTE_OBJECTS = 1
OTHERS = 2.
IF SY-SUBRC NE 0 OR SWO_RETURN-CODE NE 0.
"MESSAGE E679(OA) RAISING DISPLAY_ERROR.
RAISE DISPLAY_ERROR.
ENDIF.
CLEAR: SWO_RETURN, CONTAINER.
CALL FUNCTION 'SWO_INVOKE'
EXPORTING
ACCESS = ACCESS "G - Get attribute P - Put attribute
OBJECT = OBJECT
VERB = VERB
IMPORTING
RETURN = SWO_RETURN
TABLES
CONTAINER = CONTAINER.
IF SWO_RETURN-CODE NE 0
AND SWO_RETURN-CODE NE 8017."user cancel
"MESSAGE E679(OA) RAISING DISPLAY_ERROR.
RAISE DISPLAY_ERROR.
ENDIF.
ENDFUNCTION.
FUNCTION ZWF_CHECK_WF_RUN.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(WFID) TYPE ZWFID
*" VALUE(CHK_ADM) TYPE RS_XFIELD DEFAULT 'X'
*" EXCEPTIONS
*" NOT_RUN
*"----------------------------------------------------------------------
DATA: L_ISLAU TYPE ZISLAU.
DATA: WA_ZWF007 TYPE ZWF007_1.
"If launch workflow
SELECT SINGLE ISLAU INTO L_ISLAU FROM ZWF002_1 WHERE WFID = WFID.
IF SY-SUBRC <> 0.
RAISE NOT_RUN.
ENDIF.
IF L_ISLAU IS INITIAL.
RAISE NOT_RUN.
ELSE.
"If user is administrator, then do not control
IF CHK_ADM = 'X'.
SELECT SINGLE * INTO WA_ZWF007 FROM ZWF007_1 WHERE WFID = WFID AND USNAM = SY-UNAME.
IF SY-SUBRC = 0.
RAISE NOT_RUN.
ENDIF.
ENDIF.
ENDIF.
ENDFUNCTION.
FUNCTION ZKZ_GET_CURR_WI.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(TYPEID) TYPE SIBFTYPEID OPTIONAL
*" VALUE(INSTID) TYPE SIBFBORIID OPTIONAL
*" VALUE(WFID) TYPE ZWFID OPTIONAL
*" TABLES
*" IT_SWWUSERWI STRUCTURE SWWUSERWI OPTIONAL
*"----------------------------------------------------------------------
DATA: IT_SWR_WIHDR TYPE SWR_WIHDR OCCURS 0.
DATA: WA_SWR_WIHDR TYPE SWR_WIHDR.
DATA: IT_SWP_LOGTAB TYPE SWP_LOGTAB OCCURS 0.
DATA: WA_SWP_LOGTAB TYPE SWP_LOGTAB.
DATA: L_CURR_WORKITEMID TYPE SWOTOBJID-OBJKEY.
DATA: WA_SWWUSERWI TYPE SWWUSERWI.
DATA: L_OBJTYPE TYPE SWOTOBJID-OBJTYPE.
DATA: L_OBJKEY TYPE SWOTOBJID-OBJKEY.
DATA: WA_ZWF002 TYPE ZWF002_1.
* Get current work item ID If open from inbox
CALL FUNCTION 'SWE_WI_GET_FROM_REQUESTER'
IMPORTING
REQUESTER_WORKITEMID = L_CURR_WORKITEMID.
IF L_CURR_WORKITEMID IS NOT INITIAL.
SELECT SINGLE *
INTO WA_SWWUSERWI
FROM SWWUSERWI
WHERE WI_ID = L_CURR_WORKITEMID.
ELSE.
L_OBJTYPE = TYPEID.
L_OBJKEY = INSTID.
"Get all work items by object key on running time (Top WI ID)
CALL FUNCTION 'SAP_WAPI_WORKITEMS_TO_OBJECT'
EXPORTING
OBJTYPE = L_OBJTYPE
OBJKEY = L_OBJKEY
TABLES
WORKLIST = IT_SWR_WIHDR.
IF IT_SWR_WIHDR IS INITIAL.
EXIT.
ENDIF.
"Get workflow template ID in setting table
SELECT SINGLE * FROM ZWF002_1 INTO WA_ZWF002 WHERE WFID = WFID.
"Based on workflow template ID, get work item detail and container
LOOP AT IT_SWR_WIHDR INTO WA_SWR_WIHDR WHERE WI_RH_TASK = WA_ZWF002-WI_RH_TASK.
"Get Sub-WI List
CALL FUNCTION 'SWP_WORKFLOW_LOG_READ'
EXPORTING
TOP_LEVEL_WF = WA_SWR_WIHDR-WI_ID
TABLES
WF_LOG = IT_SWP_LOGTAB.
LOOP AT IT_SWP_LOGTAB INTO WA_SWP_LOGTAB WHERE WI_TYPE = 'W'.
SELECT SINGLE *
INTO WA_SWWUSERWI
FROM SWWUSERWI
WHERE WI_ID = WA_SWP_LOGTAB-WI_ID AND NO_SEL = ''.
ENDLOOP.
ENDLOOP.
ENDIF.
CLEAR IT_SWWUSERWI[].
APPEND WA_SWWUSERWI TO IT_SWWUSERWI.
ENDFUNCTION.
FUNCTION ZKZ_GET_NEXT_STEP.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(WFID) TYPE ZWFID
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" EXPORTING
*" REFERENCE(SPID) TYPE ZSPID
*"----------------------------------------------------------------------
DATA: WA_ZWF002 TYPE ZWF002_1,
WA_ZWF006 TYPE ZWF004_1,
WA_ZWF001 TYPE ZWF001_1.
" IT_ZWF004 TYPE ZWF004_1 OCCURS 0.
SELECT SINGLE * FROM ZWF006_1 INTO WA_ZWF006
WHERE WFID = WFID AND INSTID = INSTID.
IF SY-SUBRC <> 0.
"Get workflow template ID in setting table
SELECT SINGLE * FROM ZWF002_1 INTO WA_ZWF002 WHERE WFID = WFID.
SPID = WA_ZWF002-STSPID.
ELSE.
SELECT SINGLE * FROM ZWF001_1 INTO WA_ZWF001
WHERE WFID = WFID AND SPID = WA_ZWF006-SPID.
SPID = WA_ZWF001-NSTEP.
ENDIF.
ENDFUNCTION.
FUNCTION ZKZ_CHECK_MOD_AUTH.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(WFID) TYPE ZWFID
*" REFERENCE(INSTID) TYPE SIBFBORIID
*" REFERENCE(SPID) TYPE ZSPID
*" EXCEPTIONS
*" NO_AUTH
*"----------------------------------------------------------------------
DATA: WA_ZWF002 TYPE ZWF002_1,
IT_ZWF002 TYPE ZWF002_1 OCCURS 0.
DATA: WA_ZWF001 TYPE ZWF001_1,
IT_ZWF001 TYPE ZWF001_1 OCCURS 0.
DATA: L_RESULT(1) TYPE C.
DATA: WA_CURR_PROCESS TYPE ZKZ_CURR_PROCESS.
L_RESULT = ''.
SELECT SINGLE * FROM ZWF002_1 INTO WA_ZWF002
WHERE WFID = WFID.
IF SY-SUBRC = 0.
IF SPID = WA_ZWF002-APSPID OR SPID = WA_ZWF002-RJSPID.
"Apporved, anybody can not modify
L_RESULT = 'X'.
ELSEIF SPID <> WA_ZWF002-STSPID.
"In process, only current approver can modify if it's set EDIT mode
SELECT SINGLE * FROM ZWF001_1 INTO WA_ZWF001
WHERE WFID = WFID AND SPID = SPID.
IF SY-SUBRC = 0.
IF WA_ZWF001-ISEDTDOC = 'X'.
L_RESULT = 'X'.
ELSE.
"Check if current user is approver
CALL FUNCTION 'ZKZ_GETCURRAPPR'
EXPORTING
INSTID = INSTID
WFID = WFID
IMPORTING
WA_CURR_PROCESS = WA_CURR_PROCESS.
IF WA_CURR_PROCESS-SELID <> SY-UNAME.
L_RESULT = 'X'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
IF L_RESULT = 'X'.
RAISE NO_AUTH.
ENDIF.
ENDIF.
ENDFUNCTION.