SAP: CV02N BADI DOCUMENT_MAIN01

method IF_EX_DOCUMENT_MAIN01~BEFORE_READ_DATA.
  CALL FUNCTION 'ZWF_SPEC_ISEDIT'
    EXPORTING
      DRAW           DRAW
    EXCEPTIONS
      NOT_EDIT       1
      OTHERS         2
            .
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  EXPORT WA_DRAW FROM DRAW TO MEMORY ID 'ZDRAW_CHK'.

endmethod.

 

FUNCTION ZWF_SPEC_ISEDIT.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(DRAW) TYPE  DRAW 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 WITH HEADER LINE.
  DATA: L_AEPRO TYPE CC_PROFIL.
  DATA: L_MSTAE TYPE MSTAE.
  DATA: L_ISLAU TYPE ZISLAU.
  DATA: WA_SWWUSERWI TYPE SWWUSERWI,
        IT_SWWUSERWI TYPE SWWUSERWI OCCURS 0.
  DATA: G_WIID TYPE SWW_WIID.
  DATA: L_TYPEID TYPE SIBFTYPEID.
  DATA: L_DOKST TYPE DOKST.

  IF SY-TCODE <> 'CV02N' AND SY-TCODE <> 'CV02'.
    EXIT.
  ENDIF.

  CHECK DRAW-DOKAR 'CPS'.      "Only for SPEC trigger workflow

  "Get WFID
  L_OBJTYPE 'DRAW'.
  CONCATENATE DRAW-DOKAR DRAW-DOKNR DRAW-DOKVR DRAW-DOKTL INTO L_OBJKEY.
  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 OR SWO_RETURN-CODE NE 0.
    SY-MSGID 'OA'.
    SY-MSGTY 'E'.
    SY-MSGNO '679'.
    RAISE NOT_EDIT.
  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.

  "Check status
  SELECT SINGLE DOKST INTO L_DOKST FROM DRAW
    WHERE DOKAR DRAW-DOKAR AND DOKNR DRAW-DOKNR
    AND DOKVR DRAW-DOKVR AND DOKTL DRAW-DOKTL.
  IF L_DOKST 'RE'.
    SY-MSGID 'ZWF_1'.
    SY-MSGTY 'E'.
    SY-MSGNO '011'.
    SY-MSGV1 'Status is released'.
    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 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.
  DATA: L_ISLOCKD TYPE BAPISLOCKD.
  DATA: IT_RC TYPE TABLE OF BAPIRET2  WITH HEADER LINE.

  "Check locked user
*  CALL FUNCTION 'BAPI_USER_GET_DETAIL'
*    EXPORTING
*      USERNAME = SY-UNAME
*    IMPORTING
*      ISLOCKED = L_ISLOCKD
*    TABLES
*      RETURN   = IT_RC.
*  IF L_ISLOCKD <> 'UUUU'.
*    MESSAGE E021(ZWF_1) WITH SY-UNAME.
*    RAISE NOT_RUN.
*  ENDIF.

  "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(1TYPE 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.

 

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.

  "Get workitem details if existing
  CALL FUNCTION 'ZKZ_GETWICONTAINER'
    EXPORTING
      TYPEID       TYPEID
      INSTID       INSTID
      WFID         WFID
    TABLES
      IT_CONTAINER IT_CONTAINER.

  IF IT_CONTAINER[] IS NOT INITIAL.
    LOOP AT IT_CONTAINER INTO WA_CONTAINER WHERE ELEMENT 'NEXT_SPID'.
      IF WA_CONTAINER-VALUE SPACE.
        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.

  ELSE.

    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.
      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'.
      "Get work item user
      "CALL FUNCTION 'RH_USERS_OF_WI_READ'
      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.

 

method IF_EX_DOCUMENT_MAIN01~AFTER_READ_DATA.
  DATA: WA_DRAW TYPE DRAW,
        IT_DRAW TYPE TABLE OF DRAW.

  "Show lastest version for superior document
  IF DRAW-PRENR IS NOT INITIAL.
    SELECT INTO TABLE IT_DRAW FROM DRAW
      WHERE DOKAR DRAW-PREAR AND DOKNR DRAW-PRENR AND DOKTL DRAW-PRETL.
    SORT IT_DRAW BY DOKVR DESCENDING.
    READ TABLE IT_DRAW INDEX INTO WA_DRAW.
    DRAW-PREVR WA_DRAW-DOKVR.
  ENDIF.

endmethod.

 

 

method IF_EX_DOCUMENT_MAIN01~BEFORE_SAVE.

   CALL FUNCTION 'ZWF_INTERFACE_DRAW'
     EXPORTING
       DRAW          DRAW.

endmethod.

 

FUNCTION ZWF_INTERFACE_CS000010.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(I_STZUB) LIKE  STZUB STRUCTURE  STZUB
*"     REFERENCE(FL_UPD_TASK) TYPE  XFELD OPTIONAL
*"  TABLES
*"      T_CLRKB STRUCTURE  CSCLRK
*"      T_CLSTB STRUCTURE  CLSTB
*"      T_DOSTB STRUCTURE  DOSTB
*"      T_EQSTB STRUCTURE  EQSTB
*"      T_KDSTB STRUCTURE  KDSTB
*"      T_MASTB STRUCTURE  MASTB
*"      T_PRSTB STRUCTURE  PRSTB
*"      T_STASB STRUCTURE  STASB
*"      T_STKOB STRUCTURE  STKOB
*"      T_STPOB STRUCTURE  STPOB
*"      T_STPUB STRUCTURE  STPUB
*"      T_STSTB STRUCTURE  STSTB
*"      T_TPSTB STRUCTURE  TPSTB
*"----------------------------------------------------------------------

  DATA: L_TYPEID TYPE SIBFTYPEID.
  DATA: L_INSTID TYPE SIBFBORIID.
  DATA: CONTAINER TYPE TABLE OF SWCONT WITH HEADER LINE.
  DATA: BEGIN OF OBJKEY,
    MATERIAL LIKE MAST-MATNR,
    PLANT LIKE MAST-WERKS,
    BOMUSAGE LIKE MAST-STLAN,
    END OF OBJKEY.
  DATA: WA_OBJKEY LIKE OBJKEY OCCURS WITH HEADER LINE.
  DATA: L_MTART TYPE MTART.
  DATA: WA_KNMT TYPE KNMT,
        IT_KNMT TYPE KNMT OCCURS 0.

  IF SY-TCODE <> 'CS01' AND SY-TCODE <> 'CS02'
    AND SY-UNAME <> 'WF-BATCH' AND SY-BINPT <> 'X'.
    EXIT.
  ENDIF.

"   Only run approval flow for finish goods
*  SELECT SINGLE MTART INTO L_MTART FROM MARA
*     WHERE MATNR = T_MASTB-MATNR.
*  IF SY-SUBRC <> 0.
*    EXIT.
*  ENDIF.
*  IF L_MTART <> 'ZVFG' AND L_MTART <> 'ZUFG'.
*    EXIT.
*  ENDIF.

  IF T_STKOB-STLST 2.
    "Active BOM can not be approved again
    EXIT.
  ENDIF.

  WA_OBJKEY-MATERIAL  T_MASTB-MATNR.
  WA_OBJKEY-PLANT     T_MASTB-WERKS.
  WA_OBJKEY-BOMUSAGE  T_MASTB-STLAN.
  APPEND WA_OBJKEY.
  L_INSTID WA_OBJKEY.
  L_TYPEID 'BUS1080'.

  CALL FUNCTION 'ZWF_DIS_APPROVELOG_1'
    EXPORTING
      TYPEID    L_TYPEID
      INSTID    L_INSTID
      SUBMIT    'X'
    TABLES
      CONTAINER CONTAINER.


ENDFUNCTION.

 

<think>好的,我现在需要回答用户关于SAPBADI MB_MIGO_BADI是否会在BAPI BAPI_GOODSMVT_CREATE中被调用,以及它们的调用关系和实现机制的问题。首先,我需要回顾一下SAPBADI和BAPI的基本概念。 BADI(Business Add-In)是SAP的一种增强技术,允许用户在不修改标准代码的情况下扩展功能。MB_MIGO_BADI应该与MIGO事务相关,可能在货物移动时触发。而BAPI_GOODSMVT_CREATE是一个用于创建货物移动的BAPI,通常用于后台处理,比如通过外部系统调用。 用户的问题核心是:当使用BAPI_GOODSMVT_CREATE时,是否会触发MB_MIGO_BADI这个BADI。根据经验,BADI的触发通常依赖于特定的事务代码或应用模块。例如,在MIGO事务中执行操作时,相关的BADI会被调用。但BAPI可能不会触发同样的BADI,因为它们可能绕过了某些前端检查或增强点。 接下来需要验证这一点。查阅相关资料,特别是用户提供的引用,其中引用[3]提到使用BAPI_GOODSMVT_CREATE时,可以通过EXTENSIONIN参数传递扩展字段,这可能涉及到BADI增强。但具体到MB_MIGO_BADI是否被调用,可能需要更深入的分析。 考虑到SAP的机制,BADI的实现通常与特定应用程序关联。如果MB_MIGO_BADI是为MIGO事务设计的,可能在BAPI调用时不会自动触发,除非BAPI显式调用了相关增强。需要检查BAPI_GOODSMVT_CREATE的文档或源代码,看是否有调用MB_MIGO_BADI的逻辑。 另外,用户引用[3]提到通过EXTENSIONIN传递扩展字段,这可能涉及到不同的BADI,例如在BAPI层面定义的增强点,而不是MIGO事务中的BADI。因此,MB_MIGO_BADI可能不会被BAPI_GOODSMVT_CREATE直接调用。 总结:MB_MIGO_BADI主要用于MIGO事务的前端处理,而BAPI_GOODSMVT_CREATE作为后台接口,可能不会触发该BADI。但需要注意是否有隐式的调用或配置使两者关联。建议通过实际测试或查看SAP官方文档确认。</think>关于MB_MIGO_BADI增强在BAPI_GOODSMVT_CREATE中的调用关系,需从SAP增强机制和业务逻辑实现两个层面分析: ### 一、调用关系结论 **MB_MIGO_BADI不会在标准BAPI_GOODSMVT_CREATE调用过程中自动触发**。该BADI设计用于MIGO事务界面操作,与BAPI存在以下差异: 1. **执行路径差异** - MIGO事务通过$$TCODE$$驱动前端校验和界面交互,会触发$$MB_MIGO_BADI$$[^3] - BAPI_GOODSMVT_CREATE直接访问物料凭证创建函数模块$$MB_CREATE_GOODS_MOVEMENT$$,绕过了MIGO界面层 2. **增强机制差异** BAPI增强需通过: - 扩展结构$$EXTENSIONIN$$参数传递增强字段[^3] - 特定BAPI增强点(如$$BADI_GOODSMVT$$) - 隐式增强点插入 ### 二、实现机制验证方法 || MIGO事务 | BAPI调用 | |---------|----------|----------| | **BADI触发** | 自动触发MB_MIGO_BADI | 需显式配置增强 | | **表更新** | 通过MKPF/MSEG更新[^2] | 同MKPF/MSEG但跳过部分检查[^1] | | **增强方式** | 标准BADI实现 | 需使用BAPI专用增强点 | ### 三、解决方案建议 若需要在BAPI调用中实现类似MB_MIGO_BADI逻辑: 1. 创建新BADI实现$$MB_CREATE_GOODS_MOVEMENT$$的隐式增强 2. 使用$$USEREXIT_SAVE_DOCUMENT$$等标准出口 3. 通过$$CALL BADI$$语句在自定义增强中显式调用 ```abap METHOD if_ex_goodsmvt_create~save_document_prepare. " 在此处插入自定义逻辑 CALL BADI l_mb_migo_badi->item_check EXPORTING is_mseg = cs_mseg. ENDMETHOD. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值