2019年9月4日星期三

GOODS ISSUSE AND CANCEL

FUNCTION Y_GL_M_GOODS_ISSUE_AND_CANCEL.
*"----------------------------------------------------------------------
*"*"ローカルインタフェース:
*"  IMPORTING
*"     VALUE(IS_ISSUE_CONF) TYPE  YSGL2024
*"  EXPORTING
*"     VALUE(RETURN) TYPE  BAPIRET2
*"----------------------------------------------------------------------

*-----------------------------------------------------------------------
* DATA
*-----------------------------------------------------------------------
* 変数
  DATA:
    L_H_TBL_LIPS      TYPE TYP_LIPS,
    L_MSG(17)         TYPE C,
    L_NUM(03)         TYPE C,
*-> 出庫汎用モジュールWS_DELIVERY_UPDATE_2使用変数
    L_H_TBL_VBKOK     TYPE VBKOK,
    L_H_TBL_VBPOK     TYPE VBPOK,
    L_TBL_VBPOK       TYPE TYP_TBL_VBPOK,
    L_ERFLG           TYPE XFELD,
    L_TBL_PROT        TYPE TYP_TBL_PROT,
*-> 出庫取消汎用モジュールWS_REVERSE_GOODS_ISSUE使用変数
    L_ERFLG2          TYPE EMKPF,
    L_TBL_MESG        TYPE TYP_TBL_MESG,
*-> BAPI_TRANSACTION_COMMIT使用変数
    L_H_TBL_RETURN    TYPE BAPIRET2.


*----------------------------------------------------------------------*
* インポートパラメータチェック
*----------------------------------------------------------------------*
*->出庫日付の設定
  IF IS_ISSUE_CONF-WADAT IS INITIAL.
    MOVE SY-DATUM TO IS_ISSUE_CONF-WADAT.
  ENDIF.

*->処理区分のチェック
  IF IS_ISSUE_CONF-DBEKZ <> CNS_DBEKZ_1 AND
     IS_ISSUE_CONF-DBEKZ <> CNS_DBEKZ_2.
    PERFORM RETURN_MSG USING 'E' 'DMC_RT_MSG' '010' 'DBEKZ' IS_ISSUE_CONF-DBEKZ '' '' RETURN.
    RETURN.
  ENDIF.
*->出荷伝票番号の入力
  IF IS_ISSUE_CONF-VBELN IS INITIAL.
    PERFORM RETURN_MSG USING 'E' 'CLAIM' '205' '' '' '' '' RETURN.
    RETURN.
  ENDIF.
*->出荷明細番号の入力
  IF IS_ISSUE_CONF-POSNR IS INITIAL.
    PERFORM RETURN_MSG USING 'E' 'VK' '002' '' '' '' '' RETURN.
    RETURN.
  ENDIF.
*->品目コードの入力
  IF IS_ISSUE_CONF-MATNR IS INITIAL.
    PERFORM RETURN_MSG USING 'E' 'VZ' '007' '' '' '' '' RETURN.
    RETURN.
  ENDIF.
*->プラントの入力
  IF IS_ISSUE_CONF-WERKS IS INITIAL.
    PERFORM RETURN_MSG USING 'E' 'VELO' '453' '' '' '' '' RETURN.
    RETURN.
  ENDIF.
*->数量の入力
  IF IS_ISSUE_CONF-LFIMG IS INITIAL.
    PERFORM RETURN_MSG USING 'E' '06' '070' '' '' '' '' RETURN.
    RETURN.
  ENDIF.
*----------------------------------------------------------------------*
* 出庫確認・取消処理 開始
*----------------------------------------------------------------------*
  CLEAR:L_H_TBL_LIPS.
*->出荷伝票検索
  SELECT A~MATNR
         A~LFIMG
         A~WERKS
         A~VRKME
         A~VGBEL
         B~WBSTA
    INTO L_H_TBL_LIPS
    FROM       LIPS AS A
    INNER JOIN VBUP AS B
    ON A~VBELN B~VBELN AND
       A~POSNR B~POSNR
    UP TO ROWS
    WHERE A~VBELN IS_ISSUE_CONF-VBELN AND
          A~POSNR IS_ISSUE_CONF-POSNR.

  ENDSELECT.

  IF SY-SUBRC <> 0.
    CONCATENATE IS_ISSUE_CONF-VBELN '-' IS_ISSUE_CONF-POSNR INTO L_MSG.
    PERFORM RETURN_MSG USING 'E' 'L3' '123'
            L_MSG '' '' '' RETURN.
    RETURN.
  ENDIF.

  IF  IS_ISSUE_CONF-WERKS <> L_H_TBL_LIPS-WERKS.
    PERFORM RETURN_MSG USING 'E' 'YGL01' '017'
           IS_ISSUE_CONF-WERKS L_H_TBL_LIPS-WERKS '' '' RETURN.
    RETURN.
  ENDIF.

  IF  IS_ISSUE_CONF-MATNR <> L_H_TBL_LIPS-MATNR.
    CONCATENATE IS_ISSUE_CONF-VBELN '-' IS_ISSUE_CONF-POSNR INTO L_MSG.
    PERFORM RETURN_MSG USING 'E' 'IS' '147'
           IS_ISSUE_CONF-MATNR L_MSG '' '' RETURN.
    RETURN.
  ENDIF.


  IF IS_ISSUE_CONF-VRKME IS INITIAL.
    MOVE L_H_TBL_LIPS-VRKME TO IS_ISSUE_CONF-VRKME.
  ELSE.
    IF  IS_ISSUE_CONF-VRKME <> L_H_TBL_LIPS-VRKME.
      PERFORM RETURN_MSG USING 'E' 'IPPECIF' '180' '' '' '' '' RETURN.
      RETURN.
    ENDIF.
  ENDIF.

*-  VBAK ロック
  DO CNS_RETRY TIMES.
    CALL FUNCTION 'ENQUEUE_EVVBAKE'
      EXPORTING
        MODE_VBAK 'E'
        MANDT     SY-MANDT
        VBELN     L_H_TBL_LIPS-VGBEL
        _SCOPE    '1'
*       _WAIT     = 'X'
      EXCEPTIONS:
        FOREIGN_LOCK   1
        SYSTEM_FAILURE 2.

    IF SY-SUBRC <> 0.
      IF SY-INDEX CNS_RETRY.
        PERFORM RETURN_MSG USING 'E' '5B' '051' 'VBAK' '' '' '' RETURN.
        RETURN.
      ELSE.
        WAIT UP TO SECONDS.
      ENDIF.
    ELSE.
      EXIT.
    ENDIF.
  ENDDO.

*-  LIKP ロック
  DO CNS_RETRY TIMES.
    CALL FUNCTION 'ENQUEUE_EVVBLKE'
      EXPORTING
        MODE_LIKP 'E'
        MANDT     SY-MANDT
        VBELN     IS_ISSUE_CONF-VBELN
        _SCOPE    '1'
*       _WAIT     = 'X'
      EXCEPTIONS:
        FOREIGN_LOCK   1
        SYSTEM_FAILURE 2.

    IF SY-SUBRC <> 0.
      IF SY-INDEX CNS_RETRY.
        PERFORM RETURN_MSG USING 'E' '5B' '051' 'LIKP' '' '' '' RETURN.
        PERFORM F_DEQUEUE_VBAK  USING L_H_TBL_LIPS-VGBEL.
        RETURN.
      ELSE.
        WAIT UP TO SECONDS.
      ENDIF.
    ELSE.
      EXIT.
    ENDIF.
  ENDDO.


*-> 出庫確認・取消処理
  CASE IS_ISSUE_CONF-DBEKZ.

    WHEN CNS_DBEKZ_1.    "出庫確認
      IF L_H_TBL_LIPS-WBSTA 'C'.
        PERFORM RETURN_MSG USING 'E' 'VL' '602' '' '' '' '' RETURN.
        PERFORM F_DEQUEUE_VBAK  USING L_H_TBL_LIPS-VGBEL.
        PERFORM F_DEQUEUE_LIKP  USING IS_ISSUE_CONF-VBELN.
        RETURN.
      ENDIF.

      IF IS_ISSUE_CONF-LFIMG > L_H_TBL_LIPS-LFIMG.
        PERFORM RETURN_MSG USING 'E' 'VLA' '201' '' '' '' '' RETURN.
        PERFORM F_DEQUEUE_VBAK  USING L_H_TBL_LIPS-VGBEL.
        PERFORM F_DEQUEUE_LIKP  USING IS_ISSUE_CONF-VBELN.
        RETURN.
      ELSEIF IS_ISSUE_CONF-LFIMG < L_H_TBL_LIPS-LFIMG.
        PERFORM RETURN_MSG USING 'E' 'VL' '019' '' '' '' '' RETURN.
        PERFORM F_DEQUEUE_VBAK  USING L_H_TBL_LIPS-VGBEL.
        PERFORM F_DEQUEUE_LIKP  USING IS_ISSUE_CONF-VBELN.
        RETURN.
      ENDIF.

      CLEAR L_H_TBL_VBKOK.

      MOVE IS_ISSUE_CONF-VBELN TO L_H_TBL_VBKOK-VBELN_VL.
      MOVE 'X'                 TO L_H_TBL_VBKOK-WABUC.
      MOVE IS_ISSUE_CONF-WADAT TO L_H_TBL_VBKOK-WADAT_IST.

      CLEARL_H_TBL_VBPOK,
             L_TBL_VBPOK.

      MOVE IS_ISSUE_CONF-VBELN TO L_H_TBL_VBPOK-VBELN_VL.
      MOVE IS_ISSUE_CONF-POSNR TO L_H_TBL_VBPOK-POSNR_VL.
      MOVE 'X'                 TO L_H_TBL_VBPOK-LIANP.
      MOVE IS_ISSUE_CONF-LFIMG TO L_H_TBL_VBPOK-LFIMG.
      MOVE '1'                 TO L_H_TBL_VBPOK-UMVKZ.
      MOVE '1'                 TO L_H_TBL_VBPOK-UMVKN.
      MOVE IS_ISSUE_CONF-VRKME TO L_H_TBL_VBPOK-VRKME.
      APPEND L_H_TBL_VBPOK TO L_TBL_VBPOK.

      CALL FUNCTION 'WS_DELIVERY_UPDATE_2'
        EXPORTING
          VBKOK_WA               L_H_TBL_VBKOK
          SYNCHRON               'X'
          COMMIT                 ' '
          DELIVERY               IS_ISSUE_CONF-VBELN
          NICHT_SPERREN_1        'X'
          IF_DATABASE_UPDATE_1   '1'
          IF_ERROR_MESSAGES_SEND ' '
        IMPORTING
          EF_ERROR_ANY           L_ERFLG
        TABLES
          VBPOK_TAB              L_TBL_VBPOK
          PROT                   L_TBL_PROT.

      IF L_ERFLG 'X'.
        MOVE SY-MSGNO TO L_NUM.
        PERFORM RETURN_MSG
          USING 'E'
                SY-MSGID L_NUM
                SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
                RETURN.
        PERFORM FN_ROLLBACK.
        PERFORM F_DEQUEUE_VBAK  USING L_H_TBL_LIPS-VGBEL.
        PERFORM F_DEQUEUE_LIKP  USING IS_ISSUE_CONF-VBELN.
        RETURN.
      ENDIF.


    WHEN CNS_DBEKZ_2.    "出庫確認取消
      IF L_H_TBL_LIPS-WBSTA <> 'C'.
        CONCATENATE IS_ISSUE_CONF-VBELN '-' IS_ISSUE_CONF-POSNR INTO L_MSG.
        PERFORM RETURN_MSG USING 'E' 'VL' '623' L_MSG '' '' '' RETURN.
        PERFORM F_DEQUEUE_VBAK  USING L_H_TBL_LIPS-VGBEL.
        PERFORM F_DEQUEUE_LIKP  USING IS_ISSUE_CONF-VBELN.
        RETURN.
      ENDIF.

      IF IS_ISSUE_CONF-LFIMG <> L_H_TBL_LIPS-LFIMG.
        PERFORM RETURN_MSG USING 'E' 'YGL01' '015' '' '' '' '' RETURN.
        PERFORM F_DEQUEUE_VBAK  USING L_H_TBL_LIPS-VGBEL.
        PERFORM F_DEQUEUE_LIKP  USING IS_ISSUE_CONF-VBELN.
        RETURN.
      ENDIF.

      CALL FUNCTION 'WS_REVERSE_GOODS_ISSUE'
        EXPORTING
          I_VBELN                   IS_ISSUE_CONF-VBELN
          I_BUDAT                   IS_ISSUE_CONF-WADAT
          I_TCODE                   'VL09'
          I_VBTYP                   'J'
        IMPORTING
          ES_EMKPF                  L_ERFLG2
        TABLES
          T_MESG                    L_TBL_MESG
        EXCEPTIONS
          ERROR_REVERSE_GOODS_ISSUE 1
          ERROR_MESSAGE             2
          OTHERS                    9.

      IF SY-SUBRC <> 0.
        MOVE SY-MSGNO TO L_NUM.
        PERFORM RETURN_MSG USING
                SY-MSGTY SY-MSGID L_NUM
                SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 RETURN.
        PERFORM FN_ROLLBACK.
        PERFORM F_DEQUEUE_VBAK  USING L_H_TBL_LIPS-VGBEL.
        PERFORM F_DEQUEUE_LIKP  USING IS_ISSUE_CONF-VBELN.
        RETURN.
      ENDIF.
  ENDCASE.

*-> COMMIT.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      WAIT   'X'
    IMPORTING
      RETURN L_H_TBL_RETURN.

  IF L_H_TBL_RETURN-TYPE 'E'.
    MOVE L_H_TBL_RETURN-NUMBER TO L_NUM.
    PERFORM RETURN_MSG USING
          L_H_TBL_RETURN-TYPE L_H_TBL_RETURN-ID L_NUM
          L_H_TBL_RETURN-MESSAGE_V1 L_H_TBL_RETURN-MESSAGE_V2
          L_H_TBL_RETURN-MESSAGE_V3 L_H_TBL_RETURN-MESSAGE_V4
          RETURN.
    PERFORM FN_ROLLBACK.
    PERFORM F_DEQUEUE_VBAK  USING L_H_TBL_LIPS-VGBEL.
    PERFORM F_DEQUEUE_LIKP  USING IS_ISSUE_CONF-VBELN.
    RETURN.
  ENDIF.

*-> テーブルアンロック
  PERFORM F_DEQUEUE_VBAK  USING L_H_TBL_LIPS-VGBEL.
  PERFORM F_DEQUEUE_LIKP  USING IS_ISSUE_CONF-VBELN.

*-> 終了メッセージ
  PERFORM RETURN_MSG USING 'S' 'KD' '207' '' '' '' '' RETURN.

ENDFUNCTION.

*&---------------------------------------------------------------------*
*&      Form  FN_ROLLBACK
*&---------------------------------------------------------------------*
*       ロールバック
*----------------------------------------------------------------------*
FORM FN_ROLLBACK.
*----------------------------------------------------------------------*
  DATA FU_RETURN   TYPE BAPIRET2.     "処理結果テーブル
*----------------------------------------------------------------------*
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
    IMPORTING
      RETURN FU_RETURN.
ENDFORM.                    "FN_ROLLBACK
*&---------------------------------------------------------------------*
*&      Form  RETURN_MSG
*&---------------------------------------------------------------------*
*       メッセージ編集
*----------------------------------------------------------------------*
FORM RETURN_MSG USING
    FU_TYPE    TYPE BAPIRETURN-TYPE "メッセージタイプ
    FU_CL      TYPE SY-MSGID        "メッセージID
    FU_NUMBER  TYPE C               "メッセージ番号
    FU_PAR1    TYPE C               "TEXT
    FU_PAR2    TYPE C               "TEXT
    FU_PAR3    TYPE C               "TEXT
    FU_PAR4    TYPE C               "TEXT
    FU_RESULT  TYPE BAPIRET2.       "処理結果
*----------------------------------------------------------------------*
  DATA:L_MSGV1  TYPE SY-MSGV1,
       L_MSGV2  TYPE SY-MSGV2,
       L_MSGV3  TYPE SY-MSGV3,
       L_MSGV4  TYPE SY-MSGV4,
       L_NUMBER TYPE SY-MSGNO.
*----------------------------------------------------------------------*
  MOVE:FU_PAR1   TO L_MSGV1,
       FU_PAR2   TO L_MSGV2,
       FU_PAR3   TO L_MSGV3,
       FU_PAR4   TO L_MSGV4,
       FU_NUMBER TO L_NUMBER.

  CALL FUNCTION 'BALW_BAPIRETURN_GET2'
    EXPORTING
      TYPE   FU_TYPE
      CL     FU_CL
      NUMBER L_NUMBER
      PAR1   L_MSGV1
      PAR2   L_MSGV2
      PAR3   L_MSGV3
      PAR4   L_MSGV4
    IMPORTING
      RETURN FU_RESULT.
ENDFORM.                    "RETURN_MSG
*&---------------------------------------------------------------------*
*&      Form  F_DEQUEUE_VBAK
*&---------------------------------------------------------------------*
*       VBAK アンロック
*----------------------------------------------------------------------*
FORM F_DEQUEUE_VBAK  USING  FU_VBELN TYPE VBELN_VA.

  CALL FUNCTION 'DEQUEUE_EVVBAKE'
    EXPORTING
      MODE_VBAK 'E'
      MANDT     SY-MANDT
      VBELN     FU_VBELN
      _SCOPE    '1'.

ENDFORM.                    "F_DEQUEUE_VBAK

*&---------------------------------------------------------------------*
*&      Form  F_DEQUEUE_LIKP
*&---------------------------------------------------------------------*
*       LIKP アンロック
*----------------------------------------------------------------------*
FORM F_DEQUEUE_LIKP  USING   FU_VBELN TYPE VBELN_VL.

  CALL FUNCTION 'DEQUEUE_EVVBLKE'
    EXPORTING
      MODE_LIKP 'E'
      MANDT     SY-MANDT
      VBELN     FU_VBELN
      _SCOPE    '1'.

ENDFORM.                    "F_DEQUEUE_LIKP

2019年8月13日星期二

WBS NETWORK ACTIVITY


FORM F_INS_WBS USING" AI_W_SALESORDER    TYPE ZDWGG02
                     AI_V_PSPID          TYPE PROJ-PSPID
                     AI_W_WBSELEMENT_LV2 TYPE PRPS-POSID
                     AI_W_WBSELEMENT_LV3 TYPE PRPS-POSID
                     AI_W_WBSELEMENT2    TYPE BAPI_BUS2054_DETAIL
                     AI_W_WBSELEMENT3    TYPE BAPI_BUS2054_DETAIL
                     AI_W_NETWORK        TYPE BAPI_NETWORK_EXP
                     AI_W_ACTIVITY       TYPE BAPI_NETWORK_ACTIVITY_EXP
            CHANGING AO_V_NETWORK        TYPE BAPI_NETWORK_EXP-NETWORK
                     AO_V_ACTIVITY_NO    TYPE BAPI_NETWORK_ACTIVITY_EXP-ACTIVITY
                     AO_T_RETURN         TYPE BAPIRET2_T
                     AO_V_ERRFLG         TYPE CHAR01.
  DATA:
    LT_WBS            TYPE STANDARD TABLE OF BAPI_BUS2054_NEW,
    LS_WBS            TYPE BAPI_BUS2054_NEW,

    LT_EXT_IN         TYPE STANDARD TABLE OF BAPIPAREX,
    LS_EXT_IN         TYPE BAPIPAREX,
    LS_WBS_EXT        TYPE BAPI_TE_WBS_ELEMENT,
    LT_EXT_OUT        TYPE STANDARD TABLE OF BAPIPAREX,
    LT_RETURN         TYPE STANDARD TABLE OF BAPIRET2,
    LS_RETURN_STATUS  TYPE BAPIRETURN1,
    LS_STATUS         TYPE BAPI_WBS_MNT_SYSTEM_STATUS,
    LT_STATUS         TYPE STANDARD TABLE OF BAPI_WBS_MNT_SYSTEM_STATUS,
    LS_NETWORK_STATUS TYPE BAPI_SYSTEM_STATUS-SYSTEM_STATUS,

    LS_NETWORK        TYPE BAPI_BUS2002_NEW,
    LV_NETWORK        TYPE BAPI_NETWORK_LIST-NETWORK,

    LS_ACTIVITY       TYPE BAPI_BUS2002_ACT_NEW,
    LT_ACTIVITY       TYPE STANDARD TABLE OF BAPI_BUS2002_ACT_NEW,

    LS_NETWORK_INFO   TYPE BAPI_NETWORK_EXP,
    LS_ACTIVITY_INFO  TYPE BAPI_NETWORK_ACTIVITY_EXP,

    LV_MRP_ERR        TYPE CHAR01.
*    LW_WBSNETWORK_DATE TYPE TYP_WBS_NETWORK_DATE.

  CLEAR:
    LT_WBS,
    LS_WBS,
    LT_EXT_IN,
    LS_EXT_IN,
    LT_EXT_OUT,
    LS_NETWORK,
    LV_NETWORK,
    LS_ACTIVITY,
    LT_ACTIVITY,
    LS_WBS_EXT,
    LS_NETWORK_INFO,
    LS_ACTIVITY_INFO.

  IF AI_W_WBSELEMENT2 IS INITIAL.
    LS_WBS-WBS_ELEMENT  AI_W_WBSELEMENT_LV2.
    LS_WBS-DESCRIPTION  'XXXX'"AI_W_SALESWORDER-ZWORKTXT.

    CLEAR LS_WBS-WBS_PLANNING_ELEMENT.

    LS_WBS-WBS_ACCOUNT_ASSIGNMENT_ELEMENT 'X'.

    CLEAR LS_WBS-WBS_BILLING_ELEMENT.

    LS_WBS-COMPANY_CODE '1000'"AI_W_SALESWORDER-BUKRS.
    LS_WBS-PLANT   '1000'.  "AI_W_SALESWORDER-WERKS.
*   利益センタ
    LS_WBS-PROFIT_CTR '1000'."AI_W_SALESWORDER-PRCTR.
*   WBS要素:基本開始日付 (受注伝票日付)
    LS_WBS-WBS_BASIC_START_DATE '20190801'"AI_W_SALESWORDER-AUDAT.
*   WBS要素:基本終了日付 (納入日)
    LS_WBS-WBS_BASIC_FINISH_DATE '20190830'"AI_W_SALESWORDER-EDATU.
    LS_WBS-WBS_UP  AI_V_PSPID.
    APPEND LS_WBS TO LT_WBS.

    LS_EXT_IN-STRUCTURE 'BAPI_TE_WBS_ELEMENT'.
    LS_WBS_EXT-WBS_ELEMENT AI_W_WBSELEMENT2.
*   見積管理No
*   LS_WBS_EXT-ZZXXXX      = AI_W_SALESWORDER-ZESTNO.
    LS_EXT_IN-VALUEPART1 LS_WBS_EXT.
    APPEND LS_EXT_IN TO LT_EXT_IN.
  ENDIF.


  IF AI_W_WBSELEMENT3 IS INITIAL.
    LS_WBS-WBS_ELEMENT  AI_W_WBSELEMENT_LV3.
*   WBS名称 受注明細のテキスト
    LS_WBS-DESCRIPTION  'XXXX'"AI_W_SALESWORDER-ZWORKTXT.
*   区分:計画要素
    LS_WBS-WBS_PLANNING_ELEMENT 'X'.
*   区分:勘定設定要素
    LS_WBS-WBS_ACCOUNT_ASSIGNMENT_ELEMENT 'X'.
*   区分:請求要素
    LS_WBS-WBS_BILLING_ELEMENT 'X'.

    LS_WBS-COMPANY_CODE '1000'"AI_W_SALESWORDER-BUKRS.
    LS_WBS-PLANT   '1000'.  "AI_W_SALESWORDER-WERKS.
*   利益センタ
    LS_WBS-PROFIT_CTR '1000'."AI_W_SALESWORDER-PRCTR.
*   WBS要素:基本開始日付 (受注伝票日付)
    LS_WBS-WBS_BASIC_START_DATE '20190801'"AI_W_SALESWORDER-AUDAT.
*   WBS要素:基本終了日付 (納入日)
    LS_WBS-WBS_BASIC_FINISH_DATE '20190830'"AI_W_SALESWORDER-EDATU.
    APPEND LS_WBS TO LT_WBS.

  ENDIF.

  IF LT_WBS IS NOT INITIAL.
    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.

*   Level2 Level3のWBS登録
    CALL FUNCTION 'BAPI_BUS2054_CREATE_MULTI'
      EXPORTING
        I_PROJECT_DEFINITION AI_V_PSPID
      TABLES
        IT_WBS_ELEMENT       LT_WBS
        ET_RETURN            LT_RETURN
        EXTENSIONIN          LT_EXT_IN
        EXTENSIONOUT         LT_EXT_OUT.

    PERFORM F_ERROR_UNLOCK
      USING
        LT_RETURN
        'X'
      CHANGING
        AO_T_RETURN
        AO_V_ERRFLG.

    IF AO_V_ERRFLG IS NOT INITIAL.
      RETURN.
    ENDIF.

    CLEAR:
      LS_STATUS,
      LT_STATUS,
      LS_RETURN_STATUS.

    LS_STATUS-WBS_ELEMENT AI_W_WBSELEMENT_LV2.
    LS_STATUS-SET_SYSTEM_STATUS 'REL'.
    APPEND LS_STATUS TO LT_STATUS.

    CALL FUNCTION 'BAPI_BUS2054_SET_STATUS'
      IMPORTING
        RETURN              LS_RETURN_STATUS
      TABLES
        I_WBS_SYSTEM_STATUS LT_STATUS.

    PERFORM F_ERROR_UNLOCK
      USING
        LT_RETURN
        'X'
      CHANGING
        AO_T_RETURN
        AO_V_ERRFLG.

    IF AO_V_ERRFLG IS NOT INITIAL.
      RETURN.
    ENDIF.

    CALL FUNCTION 'BAPI_PS_PRECOMMIT'
      TABLES
        ET_RETURN LT_RETURN.

    PERFORM F_ERROR_UNLOCK
      USING
        LT_RETURN
        'X'
      CHANGING
        AO_T_RETURN
        AO_V_ERRFLG.

    IF AO_V_ERRFLG IS NOT INITIAL.
      RETURN.
    ENDIF.

    PERFORM F_UPDATE_GUID.

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT 'X'.
  ENDIF.

  IF AI_W_NETWORK IS INITIAL.
    LS_NETWORK-WBS_ELEMENT AI_W_WBSELEMENT_LV2.
    LS_NETWORK-PROJECT_DEFINITION AI_V_PSPID.
    LS_NETWORK-SHORT_TEXT 'AAAA'"AI_W_SALESORDER-ZWORKTXT.
*  MRP CONTROLLERは受注伝票のPSTYVよりADDONテーブルより取得
    LS_NETWORK-MRP_CONTROLLER 'ZZZ'.
*  開始日
    LS_NETWORK-START_DATE '20190801'"AI_W_SALESORDER-AUDAT.
*  終了日(工場出荷予定日)
    LS_NETWORK-FINISH_DATE '20190830'"AI_W_SALESORDER-MBDAT.
*  プラント
    LS_NETWORK-PLANT '1000'.  "AI_W_SALESORDER-WERKS

    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.

    CALL FUNCTION 'BAPI_BUS2002_CREATE'
      EXPORTING
        I_NETWORK LS_NETWORK
      TABLES
        ET_RETURN LT_RETURN.

    PERFORM F_ERROR_UNLOCK
       USING
         LT_RETURN
         'X'
       CHANGING
         AO_T_RETURN
         AO_V_ERRFLG.

    IF AO_V_ERRFLG IS NOT INITIAL.
      RETURN.
    ENDIF.

    CALL FUNCTION 'BAPI_PS_PRECOMMIT'
      TABLES
        ET_RETURN LT_RETURN.

    PERFORM F_ERROR_UNLOCK
      USING
        LT_RETURN
        'X'
      CHANGING
        AO_T_RETURN
        AO_V_ERRFLG.

    IF AO_V_ERRFLG IS NOT INITIAL.
      RETURN.
    ENDIF.

    PERFORM F_UPDATE_GUID.

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT 'X'.

  ENDIF.

  IF AI_W_NETWORK IS INITIAL.
*    Network新規作成した場合、作成したNetwork番号取得
    PERFORM F_GET_NETWORK
      USING
        AI_W_WBSELEMENT_LV2
        AI_W_WBSELEMENT_LV3
     CHANGING
        LS_NETWORK_INFO
        LS_ACTIVITY_INFO
        AO_V_ACTIVITY_NO.

    LV_NETWORK LS_NETWORK_INFO-NETWORK.

    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.

    CLEAR LS_RETURN_STATUS.

    LS_NETWORK_STATUS 'REL'.

    CALL FUNCTION 'BAPI_BUS2002_SET_STATUS'
      EXPORTING
        NUMBER            LV_NETWORK
        SET_SYSTEM_STATUS LS_NETWORK_STATUS
      IMPORTING
        RETURN            LS_RETURN_STATUS.

*   エラーが発生した場合、ステータスのエラーロック解除する
    PERFORM F_STATUS_ERROR_UNLOCK
     USING LS_RETURN_STATUS
     CHANGING
           AO_T_RETURN
           AO_V_ERRFLG.

    CALL FUNCTION 'BAPI_PS_PRECOMMIT'
      TABLES
        ET_RETURN LT_RETURN.

    PERFORM F_ERROR_UNLOCK
      USING
        LT_RETURN
        'X'
      CHANGING
        AO_T_RETURN
        AO_V_ERRFLG.

    IF AO_V_ERRFLG IS NOT INITIAL.
      RETURN.
    ENDIF.

    PERFORM F_UPDATE_GUID.

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT 'X'.
  ELSE.
    LV_NETWORK AI_W_NETWORK-NETWORK.
  ENDIF.

  AO_V_NETWORK LV_NETWORK.

  IF AI_W_ACTIVITY IS INITIAL.

    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.

    CLEARLT_ACTIVITY,
           LS_ACTIVITY.

    LS_ACTIVITY-PLANT '1000'.  "AI_W_SALESORDER-WERKS.
    LS_ACTIVITY-DESCRIPTION 'AAAAA'"AI_W_SALESORDER-ARKTX.
    LS_ACTIVITY-WBS_ELEMENT AI_W_WBSELEMENT_LV3.
    LS_ACTIVITY-ACTIVITY  AO_V_ACTIVITY_NO.
    APPEND LS_ACTIVITY TO LT_ACTIVITY.
    CALL FUNCTION 'BAPI_BUS2002_ACT_CREATE_MULTI'
      EXPORTING
        I_NUMBER    LV_NETWORK
      TABLES
        IT_ACTIVITY LT_ACTIVITY
        ET_RETURN   LT_RETURN.

    PERFORM F_ERROR_UNLOCK
       USING
         LT_RETURN
         'X'
       CHANGING
         AO_T_RETURN
         AO_V_ERRFLG.

    IF AO_V_ERRFLG IS NOT INITIAL.
      RETURN.
    ENDIF.

    CALL FUNCTION 'BAPI_PS_PRECOMMIT'
      TABLES
        ET_RETURN LT_RETURN.

    PERFORM F_ERROR_UNLOCK
      USING
        LT_RETURN
        'X'
      CHANGING
        AO_T_RETURN
        AO_V_ERRFLG.

    IF AO_V_ERRFLG IS NOT INITIAL.
      RETURN.
    ENDIF.

    PERFORM F_UPDATE_GUID.

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT 'X'.


  ENDIF.




ENDFORM.



FORM F_DEL_WBS  USING  AI_V_PSPID  TYPE PROJ-PSPID
                       AI_W_WBSELEMENT2    TYPE BAPI_BUS2054_DETAIL
                       AI_W_WBSELEMENT3    TYPE BAPI_BUS2054_DETAIL
                       AI_W_NETWORK        TYPE BAPI_NETWORK_EXP
                       AI_W_ACTIVITY       TYPE BAPI_NETWORK_ACTIVITY_EXP
            CHANGING   AO_T_RETURN         TYPE BAPIRET2_T
                       AO_V_ERRFLG         TYPE CHAR01.

  DATA:
    LT_ACTIVITY_STATUS TYPE STANDARD TABLE OF BAPI_ACT_MNT_SYSTEM_STATUS,
    LS_ACTIVITY_STATUS TYPE BAPI_ACT_MNT_SYSTEM_STATUS,

    LS_RETURN_STATUS   TYPE BAPIRETURN1,

    LT_WBS_STATUS      TYPE STANDARD TABLE OF BAPI_WBS_MNT_SYSTEM_STATUS,
    LS_WBS_STATUS      TYPE BAPI_WBS_MNT_SYSTEM_STATUS,
    LS_NETWORK_STATUS  TYPE BAPI_SYSTEM_STATUS-SYSTEM_STATUS,
    LT_RETURN          TYPE STANDARD TABLE OF BAPIRET2,
    LV_WHERE           TYPE STRING.

*    LT_WBS_3           TYPE STANDARD TABLE OF TYP_PRPS,
*    LS_WBS_3           TYPE TYP_PRPS,
*    LW_WBSNETWORK_DATE TYPE TYP_WBS_NETWORK_DATE.

  CLEARLT_RETURN.

  IF AI_W_ACTIVITY IS NOT INITIAL.
    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
    LS_ACTIVITY_STATUS-ACTIVITY  AI_W_ACTIVITY-ACTIVITY.
    LS_ACTIVITY_STATUS-SET_SYSTEM_STATUS 'DEL'.
    APPEND LS_ACTIVITY_STATUS TO LT_ACTIVITY_STATUS.

    CALL FUNCTION 'BAPI_BUS2002_SET_STATUS'
      EXPORTING
        NUMBER                   AI_W_NETWORK-NETWORK
      IMPORTING
        RETURN                   LS_RETURN_STATUS
      TABLES
        I_ACTIVITY_SYSTEM_STATUS LT_ACTIVITY_STATUS.

    PERFORM F_STATUS_ERROR_UNLOCK
    USING LS_RETURN_STATUS
    CHANGING
          AO_T_RETURN
          AO_V_ERRFLG.

    IF AO_V_ERRFLG IS NOT INITIAL.
      RETURN.
    ELSE.
      CALL FUNCTION 'BAPI_PS_PRECOMMIT'
        TABLES
          ET_RETURN LT_RETURN.

      PERFORM F_ERROR_UNLOCK
        USING
          LT_RETURN
          'X'
        CHANGING
          AO_T_RETURN
          AO_V_ERRFLG.

      IF AO_V_ERRFLG IS NOT INITIAL.
        RETURN.
      ENDIF.

      PERFORM F_UPDATE_GUID.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT 'X'.
    ENDIF.
  ENDIF.

  IF AI_W_WBSELEMENT3 IS NOT INITIAL.
    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.

    CLEAR:
      LT_WBS_STATUS,
      LS_WBS_STATUS,
      LS_RETURN_STATUS.

    LS_WBS_STATUS-WBS_ELEMENT  AI_W_WBSELEMENT3-WBS_ELEMENT.
    LS_WBS_STATUS-SET_SYSTEM_STATUS 'DEL'.
    APPEND LS_WBS_STATUS TO LT_WBS_STATUS.

    CALL FUNCTION 'BAPI_BUS2054_SET_STATUS'
      IMPORTING
        RETURN                   LS_RETURN_STATUS
      TABLES
        I_WBS_SYSTEM_STATUS LT_WBS_STATUS.

    PERFORM F_STATUS_ERROR_UNLOCK
    USING LS_RETURN_STATUS
    CHANGING
          AO_T_RETURN
          AO_V_ERRFLG.

    IF AO_V_ERRFLG IS NOT INITIAL.
      RETURN.
    ELSE.
      CALL FUNCTION 'BAPI_PS_PRECOMMIT'
        TABLES
          ET_RETURN LT_RETURN.

      PERFORM F_ERROR_UNLOCK
        USING
          LT_RETURN
          'X'
        CHANGING
          AO_T_RETURN
          AO_V_ERRFLG.

      IF AO_V_ERRFLG IS NOT INITIAL.
        RETURN.
      ENDIF.

      PERFORM F_UPDATE_GUID.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT 'X'.
    ENDIF.

  ENDIF.

  IF AI_W_WBSELEMENT2 IS NOT INITIAL.
    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.

    CLEAR:
      LT_WBS_STATUS,
      LS_WBS_STATUS,
      LS_RETURN_STATUS.

    LS_WBS_STATUS-WBS_ELEMENT  AI_W_WBSELEMENT2-WBS_ELEMENT.
    LS_WBS_STATUS-SET_SYSTEM_STATUS 'DEL'.
    APPEND LS_WBS_STATUS TO LT_WBS_STATUS.

    CALL FUNCTION 'BAPI_BUS2054_SET_STATUS'
      IMPORTING
        RETURN                   LS_RETURN_STATUS
      TABLES
        I_WBS_SYSTEM_STATUS LT_WBS_STATUS.

    PERFORM F_STATUS_ERROR_UNLOCK
    USING LS_RETURN_STATUS
    CHANGING
          AO_T_RETURN
          AO_V_ERRFLG.

    IF AO_V_ERRFLG IS NOT INITIAL.
      RETURN.
    ELSE.
      CALL FUNCTION 'BAPI_PS_PRECOMMIT'
        TABLES
          ET_RETURN LT_RETURN.

      PERFORM F_ERROR_UNLOCK
        USING
          LT_RETURN
          'X'
        CHANGING
          AO_T_RETURN
          AO_V_ERRFLG.

      IF AO_V_ERRFLG IS NOT INITIAL.
        RETURN.
      ENDIF.

      PERFORM F_UPDATE_GUID.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT 'X'.
    ENDIF.

  ENDIF.




ENDFORM.

FORM F_STATUS_ERROR_UNLOCK  USING AI_W_ERROR  TYPE BAPIRETURN1
                            CHANGING AO_T_ERROR TYPE BAPIRET2_T
                                     AO_V_ERRFLG TYPE CHAR01.

  DATA:LS_ERROR TYPE BAPIRET2.
  IF AI_W_ERROR-TYPE 'E' OR
    AI_W_ERROR-TYPE ='A'.

    AO_V_ERRFLG 'X'.
    MOVE-CORRESPONDING AI_W_ERROR TO LS_ERROR.
    APPEND LS_ERROR TO AO_T_ERROR.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .

  ENDIF.

ENDFORM.



FORM F_GET_NETWORK  USING  AI_W_WBS_LV2        TYPE PRPS-POSID
                           AI_W_WBS_LV3        TYPE PRPS-POSID
                    CHANGING
                           AO_W_NETWORK        TYPE BAPI_NETWORK_EXP
                           AO_W_ACTIVITY       TYPE BAPI_NETWORK_ACTIVITY_EXP
                           AO_V_ACTIVITY_NO    TYPE BAPI_NETWORK_ACTIVITY_EXP-ACTIVITY.

ENDFORM.




FORM F_ERROR_UNLOCK  USING     AI_T_ERROR  TYPE BAPIRET2_T
                               AI_V_UNLOCK TYPE CHAR01
                      CHANGING AO_T_ERROR  TYPE BAPIRET2_T
                               AO_V_ERRFLG TYPE CHAR01.

  FIELD-SYMBOLS:<FS_ERROR> TYPE BAPIRET2.

  CLEAR AO_V_ERRFLG.

  LOOP AT AI_T_ERROR ASSIGNING <FS_ERROR>
    WHERE TYPE 'E' AND
          TYPE 'A'.
    AO_V_ERRFLG 'X'.
    APPEND <FS_ERROR> TO AO_T_ERROR.
  ENDLOOP.

  IF AO_V_ERRFLG IS NOT INITIAL AND
     AI_V_UNLOCK IS NOT INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF.


ENDFORM.










*&-----------------------------------------------------------------------*
*& FORM F_UPDATE_GUID
*&-----------------------------------------------------------------------*
* GUIDの更新処理
*&-----------------------------------------------------------------------*
FORM F_UPDATE_GUID.
  DATA:
    LI_VBMOD_ALL TYPE STANDARD TABLE OF VBMOD,
    LV_ENQDONE   TYPE CHAR01,
    LV_ENQKEY    TYPE EQEUSEVB,
    TH_OPCODE(1TYPE X,
    LV_VBKEY     TYPE VBMOD-VBKEY,
    LV_FUNCNM    TYPE TFDIR-FUNCNAME,
    LV_PNAME     TYPE CHAR40,
    BEGIN OF VBID,
      TIMESTAMP LIKE VBMOD-VBKEY,
      ID        LIKE VBMOD-VBMODCNT,
    END OF VBID.

  FIELD-SYMBOLS:<FS_VBMOD> TYPE VBMOD.
  CONSTANTS:C_GET_VB_KEY LIKE TH_OPCODE VALUE 2.

  CALL 'ThVBCall' ID 'OPCODE' FIELD C_GET_VB_KEY
                  ID 'VBKEY'   FIELD LV_VBKEY
                  ID 'ENQKEY'  FIELD LV_ENQKEY
                  ID 'ENQDONE' FIELD LV_ENQDONE.

  SELECT FROM VBMOD INTO TABLE LI_VBMOD_ALL
    WHERE VBKEY LV_VBKEY.

  SORT LI_VBMOD_ALL BY VBMODCNT  ASCENDING.

  LOOP AT LI_VBMOD_ALL ASSIGNING <FS_VBMOD>.

    SELECT SINGLE PNAME INTO LV_PNAME FROM TFDIR WHERE FUNCNAME <FS_VBMOD>-VBFUNC.
    VBID-TIMESTAMP <FS_VBMOD>-VBKEY.
    VBID-ID        <FS_VBMOD>-VBMODCNT.

    PERFORM (<FS_VBMOD>-VBFUNCIN PROGRAM (LV_PNAMEUSING VBID.


    DELETE FROM VBMOD WHERE  VBKEY    <FS_VBMOD>-VBKEY AND
                             VBMODCNT <FS_VBMOD>-VBMODCNT.
    DELETE FROM VBDATA WHERE VBKEY    <FS_VBMOD>-VBKEY AND
                             VBMODCNT <FS_VBMOD>-VBMODCNT.


  ENDLOOP.

ENDFORM.

2019年5月6日星期一

Logistics Execution


Add append fields to bapi BAPI_OUTB_DELIVERY_CHANGE

1.add apend fields to structure vbkok and vbpok

2.implement badi:SMOD_V50B0001 method EXIT_SAPLV50I_010

 METHOD IF_EX_SMOD_V50B0001~EXIT_SAPLV50I_010.
    CONSTANTS:
      LC_VBKOK    TYPE CHAR5  VALUE 'VBKOK',  "出荷ヘッダ(拡張項目ZXX含まれる)
      LC_VBPOK    TYPE CHAR5  VALUE 'VBPOK',  "出荷明細(拡張項目ZXX含まれる)
      LC_CS_VBKOK TYPE CHAR8  VALUE 'CS_VBKOK'.

    DATA:
      LV_ITEM       TYPE POSNR_VL,
      LW_EXTENSION2 TYPE BAPIEXT.

    FIELD-SYMBOLS:
      <LFS_FIELDNAME> TYPE ANY,
      <LFS_VBKOK>     TYPE ANY,
      <LFS_VBPOK>     TYPE ANY.


    LOOP AT EXTENSION2 INTO LW_EXTENSION2.

      CASE LW_EXTENSION2-PARAM.
        WHEN LC_VBKOK"LIKPの拡張項目
          ASSIGN (LC_CS_VBKOKTO <LFS_VBKOK>.
          IF <LFS_VBKOK> IS ASSIGNED.
            ASSIGN COMPONENT LW_EXTENSION2-FIELD OF STRUCTURE <LFS_VBKOK> TO <LFS_FIELDNAME>.
            IF <LFS_FIELDNAME> IS ASSIGNED.
              <LFS_FIELDNAME> LW_EXTENSION2-VALUE.
            ENDIF.
          ENDIF.

        WHEN LC_VBPOK"LIPSの拡張項目
          MOVE LW_EXTENSION2-ROW TO LV_ITEM.
          READ TABLE CT_VBPOK ASSIGNING <LFS_VBPOK> WITH KEY POSNR_VL LV_ITEM.
          IF SY-SUBRC 0.
            ASSIGN COMPONENT LW_EXTENSION2-FIELD OF STRUCTURE <LFS_VBPOK> TO <LFS_FIELDNAME>.
            IF <LFS_FIELDNAME> IS ASSIGNED.
              <LFS_FIELDNAME> LW_EXTENSION2-VALUE.
            ENDIF.
          ENDIF.

      ENDCASE.

    ENDLOOP.


3. implement badi (enhancement spot) LE_SHP_DELIVERY_UPDATE 

  method IF_EX_LE_SHP_DELIVERY_UPDATE~UPDATE_HEADER.
   CS_LIKP-ZZ1_TEST_TOSS_NO_DLH IS_VBKOK-ZZ2_TEST_TOSS_NO_DLH.
  endmethod. 

    method IF_EX_LE_SHP_DELIVERY_UPDATE~UPDATE_ITEM.
   endmethod.



Customer Characteristic

  Characteristic Descriptions are stored in the table - CABNT - Language - SPRAS - Characteristic description - ATBEZ Characteristic Values ...