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'.

    CLEAR: LT_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.

  CLEAR: LT_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(1) TYPE 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>-VBFUNC) IN PROGRAM (LV_PNAME) USING 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_VBKOK) TO <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.



2019年3月16日星期六

dynamic call function

*&---------------------------------------------------------------------*
*& Report  ZTOOLMAT
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZTOOLMAT_DU.

DATA: LT_PTAB  TYPE ABAP_FUNC_PARMBIND_TAB,
      LS_PTAB  TYPE ABAP_FUNC_PARMBIND.


TYPES: BEGIN OF TYP_DAT,
         LINE       TYPE STRING,     " UP/DOWNLOAD行データ
       END   OF TYP_DAT.

TYPES: BEGIN OF TYP_HASHTABLE,
         KEY        TYPE STRING,
         INX        TYPE I,
       END   OF TYP_HASHTABLE.

TYPES: BEGIN OF TYP_RESULT,
         INX            TYPE I,
         CODE           TYPE MARA-MATNR,
        RESULT          TYPE STRING,
        RESULT_TEXT     TYPE STRING,
       END   OF TYP_RESULT.

* 内部テーブル
DATA:LT_HASH          TYPE HASHED TABLE OF TYP_HASHTABLE WITH UNIQUE KEY  KEY ,
     L_HASH           TYPE TYP_HASHTABLE.
DATA:TBL_DAT          TYPE TABLE OF TYP_DAT.
DATA:LINE_DAT         TYPE TYP_DAT.
DATA:TBL_STRING       TYPE TABLE OF STRING.
DATA:L_VALUE          TYPE STRING.


DATA:RE               TYPE ABAP_FUNC_PARMBIND,
     RE_MSG           TYPE ABAP_FUNC_PARMBIND.

DATA L_RE             TYPE YERESULTSIGN.
DATA L_MSG            TYPE NATXT.
DATA:NORL_COUNT       TYPE I VALUE 0,
     ER_COUNT         TYPE I VALUE 0.
DATA L_H_TBL_RETURN   TYPE BAPIRET2.
DATA ER_FLG           TYPE C.
DATA:LT_RESULT        TYPE TABLE OF TYP_RESULT,
     LH_RESULT        TYPE TYP_RESULT.

FIELD-SYMBOLS : <FS_STRC>   TYPE ABAP_FUNC_PARMBIND,
                <FS_VALUE>  TYPE ANY,
                <FS2>       TYPE ANY,
                <FS_RET>    TYPE YERESULTSIGN,
                <FS_REMSG>  TYPE NATXT.
DATA OREF TYPE REF TO CX_ROOT.

*画面項目
SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-001.
PARAMETERS P_FILEU1 TYPE RLGRAP-FILENAME OBLIGATORY.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS P_CKBOX AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN  COMMENT 3(40) TEXT-002.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END   OF BLOCK BL1.

*ファイル項目
AT SELECTION-SCREEN  ON VALUE-REQUEST  FOR P_FILEU1.
  PERFORM GET_FILENAME  CHANGING P_FILEU1.

INITIALIZATION.


*実行処理
START-OF-SELECTION.
*
* ファイル入力
  PERFORM UPLOAD_FILE   USING P_FILEU1 TBL_DAT.

  PERFORM F_MAIN_PROC CHANGING LT_RESULT.


END-OF-SELECTION.
  IF  ER_FLG IS NOT INITIAL.
    RETURN.
  ENDIF.

  WRITE:         'No' ,
          5(20)  '品目コード' ,
          25(15) '結果サイン' ,
          40     'メッセージテキスト' ,
          /.

  LOOP AT  LT_RESULT INTO  LH_RESULT .

    WRITE:/(4)     LH_RESULT-INX,
          5(20)   LH_RESULT-CODE ,
          25(15)  LH_RESULT-RESULT ,
          40      LH_RESULT-RESULT_TEXT.


    IF LH_RESULT-RESULT = 'ER:エラー' .
      ADD 1 TO ER_COUNT .
    ELSEIF  LH_RESULT-RESULT = 'CR:登録' OR  LH_RESULT-RESULT = 'CH:変更' OR LH_RESULT-RESULT = 'EX:拡張登録' .
      ADD 1 TO  NORL_COUNT .
    ENDIF.

  ENDLOOP.

  WRITE: /'正常件数:', NORL_COUNT,'件' , 'エラー件数:',  ER_COUNT,'件' .

*&---------------------------------------------------------------------*
*&      Form  GET_FILENAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->EX_FILE    text
*----------------------------------------------------------------------*
FORM GET_FILENAME  CHANGING EX_FILE  TYPE RLGRAP-FILENAME.

* ローカル定義
  DATA :
    L_TITLE        TYPE STRING,                  " ダイアログの表題
    L_FILTER       TYPE STRING,                  " ファイル拡張フィルタストリング
    L_RC           TYPE SY-SUBRC,                " リターンコード
    L_I_FILE       TYPE FILETABLE.               " 選択されたファイル

* テキスト設定
  L_TITLE   = 'TAB区切りファイル指定'.
  L_FILTER  = 'TAB区切りファイル (*.txt)|*.txt'.
* ファイルを開くダイアログを表示
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE            = L_TITLE
      FILE_FILTER             = L_FILTER
    CHANGING
      FILE_TABLE              = L_I_FILE
      RC                      = L_RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5.
  IF SY-SUBRC  = 0.
    READ TABLE L_I_FILE  INDEX 1  INTO EX_FILE.
  ENDIF.

ENDFORM.                    " GET_FILENAME

*&---------------------------------------------------------------------*
*&      Form  UPLOAD_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IM_FILE    text
*      -->IM_TABLE   text
*----------------------------------------------------------------------*
FORM  UPLOAD_FILE USING IM_FILE   TYPE RLGRAP-FILENAME
                        IM_TABLE  TYPE STANDARD TABLE.
* ローカル定義
  DATA :
    L_FILENAME     TYPE STRING.             "ファイル名

* ファイルパス設定
  L_FILENAME  = IM_FILE.

* UPLOADファイル
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      FILENAME                = L_FILENAME
      FILETYPE                = 'ASC'
      HAS_FIELD_SEPARATOR     = ''
    TABLES
      DATA_TAB                = IM_TABLE
    EXCEPTIONS
      FILE_OPEN_ERROR         = 1
      FILE_READ_ERROR         = 2
      NO_BATCH                = 3
      GUI_REFUSE_FILETRANSFER = 4
      INVALID_TYPE            = 5
      NO_AUTHORITY            = 6
      UNKNOWN_ERROR           = 7
      BAD_DATA_FORMAT         = 8
      HEADER_NOT_ALLOWED      = 9
      SEPARATOR_NOT_ALLOWED   = 10
      HEADER_TOO_LONG         = 11
      UNKNOWN_DP_ERROR        = 12
      ACCESS_DENIED           = 13
      DP_OUT_OF_MEMORY        = 14
      DISK_FULL               = 15
      DP_TIMEOUT              = 16
      OTHERS                  = 17.

  IF SY-SUBRC <> 0.
    MESSAGE ID     SY-MSGID
            TYPE   SY-MSGTY
            NUMBER SY-MSGNO
            WITH   SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    "UPLOAD_FILE

*&---------------------------------------------------------------------*
*&      Form  F_MAIN_PROC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM F_MAIN_PROC CHANGING INPUT LIKE LT_RESULT.

  DATA: LT_INTERFACE TYPE RSFBINTFV,
        LS_IMPORT_PARA TYPE RSFBPARA,
        REF_WA TYPE REF TO DATA,
        REF_WB TYPE REF TO DATA,
        L_MATERIAL_CD TYPE STRING.

  CLEAR  LT_RESULT.
*->呼び出す先モジュールのIMPORT パラメータ情報取得
  CALL METHOD CL_FB_FUNCTION_UTILITY=>METH_GET_INTERFACE
    EXPORTING
      IM_NAME             = 'Y_MD_UPDATE_MAT_MASTER'         "FM name
    IMPORTING
      EX_INTERFACE        = LT_INTERFACE
    EXCEPTIONS
      ERROR_OCCURED       = 1
      OBJECT_NOT_EXISTING = 2
      OTHERS              = 3.

*->2行目の項目IDを取得する
  LOOP AT TBL_DAT INTO   LINE_DAT FROM 2 TO 2.

    SPLIT LINE_DAT-LINE  AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE TBL_STRING.

    LOOP AT TBL_STRING INTO L_VALUE .

*->IMPORT パラメータ情報に入力ファイル内項目の存在チェック
      READ TABLE LT_INTERFACE-IMPORT INTO LS_IMPORT_PARA WITH KEY PARAMETER = L_VALUE.
      IF SY-SUBRC <> 0.
        WRITE :  /'項目ID「',L_VALUE,'」がインポートパラメータにありません。'.
        ER_FLG = 'X'.

      ENDIF.

*->IMPORTパラーメタテーブルに項目属性を追加する
      CLEAR: LS_PTAB,L_HASH.
      MOVE L_VALUE TO  LS_PTAB-NAME.
      MOVE ABAP_FUNC_EXPORTING TO  LS_PTAB-KIND.

      INSERT LS_PTAB INTO TABLE LT_PTAB.
*->入力ファイル内項目に対応する値のINDEXをハッシュテーブルに格納する
      MOVE L_VALUE TO  L_HASH-KEY.
      MOVE SY-TABIX TO  L_HASH-INX.

      INSERT  L_HASH INTO TABLE LT_HASH.

    ENDLOOP.
*->項目エラーが場合、リターンする
    IF ER_FLG = 'X'.
      RETURN.
    ENDIF.

  ENDLOOP.

*->呼び出す先モジュールのEXPORTパラメータを追加する
  MOVE 'E_RESULT' TO LS_PTAB-NAME.
  MOVE ABAP_FUNC_IMPORTING TO  LS_PTAB-KIND.
  GET REFERENCE OF L_RE  INTO LS_PTAB-VALUE.
  INSERT LS_PTAB INTO TABLE LT_PTAB.
*
  MOVE 'E_ERMSG' TO LS_PTAB-NAME.
  MOVE ABAP_FUNC_IMPORTING TO  LS_PTAB-KIND.
  GET REFERENCE OF L_MSG  INTO LS_PTAB-VALUE.
  INSERT LS_PTAB INTO TABLE LT_PTAB.

  CLEAR: LS_PTAB,TBL_STRING.


*->汎用パラメータテーブルに値を格納する
  LOOP AT TBL_DAT INTO LINE_DAT FROM 3.

    SPLIT LINE_DAT-LINE  AT CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO TABLE TBL_STRING.

    LOOP AT LT_PTAB ASSIGNING <FS_STRC> .

      CLEAR L_HASH.

      READ TABLE LT_HASH INTO L_HASH WITH TABLE KEY  KEY = <FS_STRC>-NAME.
      IF SY-SUBRC <> 0 .
        CONTINUE.
      ENDIF.
      READ TABLE LT_INTERFACE-IMPORT INTO LS_IMPORT_PARA WITH KEY PARAMETER = <FS_STRC>-NAME.

      CREATE DATA REF_WA TYPE (LS_IMPORT_PARA-STRUCTURE).

      ASSIGN REF_WA->* TO <FS2>.

      READ TABLE TBL_STRING ASSIGNING <FS_VALUE> INDEX L_HASH-INX .

      <FS2> =  <FS_VALUE>.

      UNASSIGN  <FS2>.

      IF <FS_STRC>-NAME = 'I_MATERIAL'.
        L_MATERIAL_CD = <FS_VALUE>.
      ENDIF.

*品目コード
      IF SY-SUBRC = 0 AND REF_WA IS NOT INITIAL .
        <FS_STRC>-VALUE = REF_WA.
      ELSE.
        GET REFERENCE OF SPACE INTO <FS_STRC>-VALUE.
      ENDIF.

    ENDLOOP.

    TRY.

*FUNCTIONを呼び出し
        CALL FUNCTION 'Y_MD_UPDATE_MAT_MASTER'
          PARAMETER-TABLE LT_PTAB.

        LH_RESULT-CODE = L_MATERIAL_CD.

*リターン結果
        READ TABLE LT_PTAB INTO  RE  WITH  KEY NAME = 'E_RESULT'.
        ASSIGN RE-VALUE->* TO <FS_RET>.

        CASE <FS_RET>.

          WHEN 'CR'.
            LH_RESULT-RESULT = 'CR:登録'.
          WHEN 'CH'.
            LH_RESULT-RESULT = 'CH:変更'.
          WHEN 'EX'.
            LH_RESULT-RESULT = 'EX:拡張登録'.
          WHEN 'ER'.
            LH_RESULT-RESULT = 'ER:エラー'.
          WHEN 'NO'.
            LH_RESULT-RESULT = 'NO:変更なし'.
          WHEN ''.
            LH_RESULT-RESULT = '他(想定なし)'.
        ENDCASE.

*ERメッセージ
        READ TABLE LT_PTAB INTO  RE_MSG    WITH  KEY NAME = 'E_ERMSG'.
        ASSIGN RE_MSG-VALUE->* TO <FS_REMSG>.
        LH_RESULT-RESULT_TEXT = <FS_REMSG>.

*INDEX
        LH_RESULT-INX =  LH_RESULT-INX + 1.
        APPEND  LH_RESULT TO LT_RESULT.
      CATCH  CX_ROOT INTO OREF.
        CONTINUE.
    ENDTRY.
    IF P_CKBOX IS INITIAL.
**-> Commit work
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT   = 'X'
        IMPORTING
          RETURN = L_H_TBL_RETURN.
    ELSE.

**  -> Rollback work
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ENDIF.
  ENDLOOP.

ENDFORM.       

Customer Characteristic

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