此博客为原创博客,都是个人工作经历所得,转载请注明出处

ABAP-商品进价批导程序(零售)

*1.根据模板把数据批导进入程序                                       *
*2.根据导入数据更新物料进价   

*&---------------------------------------------------------------------*
* TITLE   ZMDT003
* APPLICATION     : MD                                             *
* SUBJECT         : 商品进价批导程序                                *
* REQUESTED BY    :                                             *
* EXECUTION       : USER REQUIRED                                   *
* REF NO:         :                                                 *
* AUTHOR          : zcwei                                           *
* REQ DATE        : 20141117                                        *
*********************************************************************
*              设计主要逻辑与原理说明                             *
*********************************************************************
*1.根据模板把数据批导进入程序                                       *
*2.根据导入数据更新物料进价                                         *
*********************************************************************

REPORT ZMDT003 MESSAGE-ID ZBH1.

TABLES: SSCRFIELDS.

TYPES: BEGIN OF TY_UPLOAD,
         MATNR      TYPE EINA-MATNR, "物料
         LIFNR      TYPE EINA-LIFNR, "供应商
         ESOKZ      TYPE EINE-ESOKZ, "经营方式
         KBETR      TYPE KONP-KBETR, "价格
         PEINH      TYPE EINE-PEINH, "价格单位
         MEINS      TYPE EINA-MEINS, "定价单位
         KONWA      TYPE KONP-KONWA, "货币
         INDAT(10),

         DATAB      TYPE KONH-DATAB, "开始生效日期

         ZZMSG(200),
         STATUS(1),
         SELDA(1),
         ICON       TYPE ICON-ID,
       END OF TY_UPLOAD.

DATA: GT_UPLOAD TYPE TABLE OF TY_UPLOAD,
      GS_UPLOAD TYPE TY_UPLOAD.

*----------------------------------------------------------------------*
*ALV DEFINE
*----------------------------------------------------------------------*
DATA: GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      GS_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
      GS_LAYOUT   TYPE SLIS_LAYOUT_ALV.


SELECTION-SCREEN BEGIN OF BLOCK SC1 WITH FRAME TITLE TEXT-001.
PARAMETER: P_FILE TYPE RLGRAP-FILENAME."
SELECTION-SCREEN END OF BLOCK SC1.

SELECTION-SCREEN FUNCTION KEY 1.

INITIALIZATION.
  SSCRFIELDS-FUNCTXT_01 = '下载模板'.

AT SELECTION-SCREEN.

  PERFORM FRM_DOWNLOAD_TEMPLATE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.

  PERFORM FRM_GETPATH.

START-OF-SELECTION.

  PERFORM FRM_UPLOAD_DATA.

  PERFORM FRM_DATA_CHECK.

  PERFORM FRM_SHOW_MSG.

*  PERFORM FRM_CALL_BAPI.

*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_TEMPLATE .
  DATA: LS_KEY      TYPE WWWDATATAB,
        LV_TEMP     TYPE C,
        LV_FILE     TYPE STRING VALUE '\ZMDT003.XLSX',
        LV_FILEPATH TYPE RLGRAP-FILENAME,
        LV_RESULT   TYPE ABAP_BOOL,
        LV_PATH     TYPE STRING,
        LV_MSG      TYPE STRING.

  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'.

      CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE
        EXPORTING
          WINDOW_TITLE         = '选择文件目录'
*         initial_folder       = 'C:\TEMP'
        CHANGING
          SELECTED_FOLDER      = LV_PATH
        EXCEPTIONS
          CNTL_ERROR           = 1
          ERROR_NO_GUI         = 2
          NOT_SUPPORTED_BY_GUI = 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.
      ELSE.
        CONCATENATE LV_PATH LV_FILE INTO LV_FILE.

        CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
          EXPORTING
            FILE                 = LV_FILE
          RECEIVING
            RESULT               = LV_RESULT
          EXCEPTIONS
            CNTL_ERROR           = 1
            ERROR_NO_GUI         = 2
            WRONG_PARAMETER      = 3
            NOT_SUPPORTED_BY_GUI = 4
            OTHERS               = 5.
        IF LV_RESULT = 'X'.
          CONCATENATE '模板' LV_FILE  '已存在!' INTO LV_MSG.
          MESSAGE LV_MSG TYPE 'S'.
          STOP.
        ELSE.
          LS_KEY-RELID = 'MI'.
          LS_KEY-OBJID = 'ZMDT003'.              "SMW0定义的对象名称
          LV_FILEPATH = LV_FILE.
          CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
            EXPORTING
              KEY         = LS_KEY
              DESTINATION = LV_FILEPATH.
          IF SY-SUBRC <> 0.
            MESSAGE '下载模板失败!' TYPE 'E'.
          ELSE.
            MESSAGE S000 WITH '成功下载模板,请重新调整以适应本机!下载目录:' LV_FILEPATH ''.
          ENDIF.
        ENDIF.
      ENDIF.


  ENDCASE.
ENDFORM.                    " FRM_DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*&      Form  FRM_GETPATH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_FNAME  text
*----------------------------------------------------------------------*
FORM FRM_GETPATH.

  CALL FUNCTION 'TB_LIMIT_WS_FILENAME_GET'
    EXPORTING
      DEF_FILENAME     = '*.xls'
      DEF_PATH         = 'C:\'
      MASK             = ',All Files,*.*,Excel Files,*.xls.'
      MODE             = 'O'
      TITLE            = 'Please choose file to use '
    IMPORTING
      FILENAME         = P_FILE
    EXCEPTIONS
      INV_WINSYS       = 1
      NO_BATCH         = 2
      SELECTION_CANCEL = 3
      SELECTION_ERROR  = 4
      OTHERS           = 5.


ENDFORM.                    " FRM_GETPATH
*---------------------------------------------------------------------*
*       FORM FRM_UPLOAD_DATA                                             *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM FRM_UPLOAD_DATA.
*  DATA: LV_TABIX TYPE SY-TABIX.
*
*  DATA: LT_EXCEL TYPE TABLE OF ZSALSMEX.
*  FIELD-SYMBOLS:
*    <FS_EXCEL> LIKE LINE OF LT_EXCEL,
*    <FS_FIELD> TYPE ANY.
*
*  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
*    EXPORTING
*      FILENAME                = P_FILE
*      I_BEGIN_COL             = 1
*      I_BEGIN_ROW             = 2
*      I_END_COL               = 130
*      I_END_ROW               = 10000
*    TABLES
*      INTERN                  = LT_EXCEL
*    EXCEPTIONS
*      INCONSISTENT_PARAMETERS = 1
*      UPLOAD_OLE              = 2
*      OTHERS                  = 3.
*  IF SY-SUBRC <> 0.
*    IF SY-MSGTY IS NOT INITIAL.
*      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*    ELSE.
*      MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO
*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*    ENDIF.
*  ENDIF.
*  LOOP AT LT_EXCEL ASSIGNING <FS_EXCEL>.
*
*    ASSIGN COMPONENT <FS_EXCEL>-COL OF STRUCTURE GS_UPLOAD TO <FS_FIELD>.
*    <FS_FIELD> = <FS_EXCEL>-VALUE.
*
*    AT END OF ROW.
*      APPEND GS_UPLOAD TO GT_UPLOAD.
*      CLEAR GS_UPLOAD.
*    ENDAT.
*  ENDLOOP.

  DATA: LT_RAW TYPE TRUXS_T_TEXT_DATA.

  CLEAR: LT_RAW[], GT_UPLOAD.
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
*     I_FIELD_SEPERATOR    =
      I_LINE_HEADER        = 'X'
      I_TAB_RAW_DATA       = LT_RAW
      I_FILENAME           = P_FILE
    TABLES
      I_TAB_CONVERTED_DATA = GT_UPLOAD
    EXCEPTIONS
      CONVERSION_FAILED    = 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.
ENDFORM.                    "FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_CALL_BAPI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CALL_BAPI .
  DATA: LS_EINA_I    TYPE EINA,
        LS_EINE_I    TYPE EINE,
        LS_EINA_O    TYPE EINA,
        LS_EINE_O    TYPE EINE,
        LT_EINA      TYPE TABLE OF EINA,
        LT_EINE      TYPE TABLE OF EINE,
        LT_A018      TYPE TABLE OF A018,
        LS_A018      TYPE A018,
        LT_A018_DEL  TYPE TABLE OF A018,
        LV_KBETR     TYPE KONP-KBETR,
        LV_KEY       TYPE BAPICONDCT-VARKEY,
        LV_LEN       TYPE I,
        LV_KNUMH     TYPE KONH-KNUMH,
        LT_DATA      TYPE TABLE OF ZTBHSPPRICE,
        LS_DATA      TYPE ZTBHSPPRICE,
        LT_ZEORD     TYPE TABLE OF ZTIFEORD,
        LS_ZEORD     TYPE ZTIFEORD,
        LV_INDEX     TYPE I,
        LV_CINDEX(9),
        LV_COND_NO   TYPE KNUMH,
        LV_MSGFN     TYPE MSGFN.

  DATA:LT_CONDCT      TYPE TABLE OF BAPICONDCT,
       LS_CONDCT      TYPE BAPICONDCT,
       LT_CONDHD      TYPE TABLE OF BAPICONDHD,
       LS_CONDHD      TYPE BAPICONDHD,
       LT_CONDIT      TYPE TABLE OF BAPICONDIT,
       LS_CONDIT      TYPE BAPICONDIT,
       LT_CONDQS      TYPE TABLE OF BAPICONDQS,
       LS_CONDQS      TYPE BAPICONDQS,
       LT_CONDVS      TYPE TABLE OF BAPICONDVS,
       LS_CONDVS      TYPE BAPICONDVS,
       LT_RET_MES     TYPE TABLE OF BAPIRET2,
       LS_RET_MES     TYPE BAPIRET2,
       LT_KNUMHS      TYPE TABLE OF BAPIKNUMHS,
       LS_KNUMHS      TYPE BAPIKNUMHS,
       LT_MEM_INITIAL TYPE TABLE OF CND_MEM_INITIAL,
       LS_MEM_INITIAL TYPE CND_MEM_INITIAL.

  CLEAR: LT_CONDCT,LS_CONDCT,LT_CONDHD,LS_CONDHD,LT_CONDIT,LS_CONDIT,
         LT_CONDQS,LS_CONDQS,LT_CONDVS,LS_CONDVS,LT_RET_MES,LS_RET_MES,
         LT_KNUMHS,LS_KNUMHS,LT_MEM_INITIAL,LS_MEM_INITIAL.

  LOOP AT GT_UPLOAD INTO GS_UPLOAD WHERE STATUS NE 'E' AND SELDA EQ 'X'.
    CLEAR: LS_EINA_I,LS_EINE_I,LS_EINA_O,LS_EINE_O,LT_EINA,LT_EINE,LS_A018,LV_KBETR,LV_KEY.

    CLEAR: LV_COND_NO.
    LV_INDEX = LV_INDEX + 1.
    LV_CINDEX = LV_INDEX.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = LV_CINDEX
      IMPORTING
        OUTPUT = LV_CINDEX.
    CONCATENATE '$' LV_CINDEX INTO LV_COND_NO.


    LV_KBETR = GS_UPLOAD-KBETR.

    SELECT * FROM A018 INTO TABLE LT_A018
      WHERE MATNR = GS_UPLOAD-MATNR
        AND LIFNR = GS_UPLOAD-LIFNR
        AND EKORG = 'P001'
        AND ESOKZ = GS_UPLOAD-ESOKZ.

    SELECT SINGLE * FROM EINA INTO LS_EINA_I
      WHERE MATNR = GS_UPLOAD-MATNR
        AND LIFNR = GS_UPLOAD-LIFNR.
    IF SY-SUBRC = 0 .
      SELECT SINGLE * FROM EINE INTO LS_EINE_I
        WHERE INFNR = LS_EINA_I-INFNR
          AND EKORG = 'P001'
          AND ESOKZ = GS_UPLOAD-ESOKZ.
    ENDIF .

    LS_EINA_O = LS_EINA_I .

    LS_EINE_O = LS_EINE_I .

    LS_EINE_I-NETPR = LV_KBETR.

    LS_EINE_I-EFFPR = LV_KBETR.

*  CALL FUNCTION 'ME_UPDATE_INFORECORD'
*    EXPORTING
*      XEINA    = LS_EINA_I
*      XEINE    = LS_EINE_I
*      YEINA    = LS_EINA_O
*      YEINE    = LS_EINE_O
*      REG_EINA = LS_EINA_I.

    APPEND LS_EINE_I TO LT_EINE.
    CALL FUNCTION 'ME_UPDATE_INFORECORD_COND'
      TABLES
        REINE = LT_EINE.


*& 条件价格赋值

    LOOP AT LT_A018 INTO LS_A018.
      LV_MSGFN = '004'.
      IF LS_A018-DATAB >= GS_UPLOAD-DATAB AND LS_A018-DATBI >= GS_UPLOAD-DATAB.
        LV_MSGFN = '003'.
      ENDIF.

      CLEAR LS_CONDCT.
      LS_CONDCT-COND_USAGE = 'A'.
      LS_CONDCT-TABLE_NO = '018'.
      LS_CONDCT-COND_TYPE  = 'PB00'.
      LS_CONDCT-APPLICATIO = 'M'.
      LS_CONDCT-OPERATION  = LV_MSGFN. "003 -- 删除 004 -- 修改 009 -- 新建
      LS_CONDCT-COND_NO    = LS_A018-KNUMH.
      LS_CONDCT-VALID_FROM = LS_A018-DATAB.
      IF LS_A018-DATBI >= GS_UPLOAD-DATAB AND LS_A018-DATAB <= GS_UPLOAD-DATAB.
        LS_CONDCT-VALID_TO = GS_UPLOAD-DATAB - 1.

        IF LS_A018-DATBI NE '99991231'.
          APPEND LS_A018 TO LT_A018_DEL.
        ENDIF.
      ELSE.
        LS_CONDCT-VALID_TO =  LS_A018-DATBI.
      ENDIF.

      CLEAR LV_KEY.
      LV_KEY(10) = GS_UPLOAD-LIFNR.
      LV_KEY+10(18) = GS_UPLOAD-MATNR.
      CONCATENATE LV_KEY 'P001' GS_UPLOAD-ESOKZ INTO LV_KEY.
      LS_CONDCT-VARKEY = LV_KEY.
*      IF LS_A018-DATAB <> GS_UPLOAD-DATAB AND LS_CONDCT-VALID_TO >= LS_CONDCT-VALID_FROM.
      APPEND LS_CONDCT TO LT_CONDCT.
*      ENDIF.

      CLEAR LS_CONDHD.
      LS_CONDHD-COND_NO = LS_A018-KNUMH.
      LS_CONDHD-OPERATION = LV_MSGFN. "003 -- 删除 004 -- 修改 009 -- 新建
      LS_CONDHD-COND_USAGE = 'A'.
      LS_CONDHD-TABLE_NO   = '018'.
      LS_CONDHD-APPLICATIO = 'M'.
      LS_CONDHD-COND_TYPE  = 'PB00'.
      LS_CONDHD-VARKEY     = LV_KEY.
      LS_CONDHD-VALID_FROM = LS_A018-DATAB.
      IF LS_A018-DATBI >= GS_UPLOAD-DATAB AND LS_A018-DATAB <= GS_UPLOAD-DATAB.
        LS_CONDHD-VALID_TO = GS_UPLOAD-DATAB - 1.
      ELSE.
        LS_CONDHD-VALID_TO =  LS_A018-DATBI.
      ENDIF.
*      IF LS_A018-DATAB <> GS_UPLOAD-DATAB AND LS_CONDHD-VALID_TO >= LS_CONDHD-VALID_FROM.
      APPEND LS_CONDHD TO LT_CONDHD.
*      ENDIF.

      CLEAR LS_CONDIT.
      LS_CONDIT-COND_NO = LS_A018-KNUMH.
      LS_CONDIT-OPERATION = LV_MSGFN. "003 -- 删除 004 -- 修改 009 -- 新建
      LS_CONDIT-COND_COUNT = '01'.
      LS_CONDIT-APPLICATIO = 'M'.
      LS_CONDIT-COND_TYPE  = 'PB00'.
      LS_CONDIT-SCALETYPE  = 'A'.
      LS_CONDIT-SCALEBASIN = 'C'.
*    LS_CONDIT-CONDITIDX  = '01'.
      LS_CONDIT-COND_P_UNT = LS_EINE_I-PEINH.
      LS_CONDIT-COND_UNIT  = LS_EINE_I-BPRME.
      LS_CONDIT-CALCTYPCON = 'C'.
      LS_CONDIT-EXCLUSION  = 'X'.
      LS_CONDIT-PMNTTRMS   = ''.
      LS_CONDIT-CONDCURR   = LS_EINE_I-WAERS.
      SELECT SINGLE KBETR INTO LS_CONDIT-COND_VALUE
        FROM KONP
        WHERE KNUMH = LS_A018-KNUMH
          AND KOPOS = '01'.
*      LS_CONDIT-COND_VALUE = LS_EINE_O-NETPR.
*      IF LS_A018-DATAB <> GS_UPLOAD-DATAB AND LS_CONDCT-VALID_TO >= LS_CONDCT-VALID_FROM.

      APPEND LS_CONDIT TO LT_CONDIT.
*      ENDIF.
    ENDLOOP.

    CLEAR LS_CONDCT.
    LS_CONDCT-COND_USAGE = 'A'.
    LS_CONDCT-TABLE_NO = '018'.
    LS_CONDCT-COND_TYPE  = 'PB00'.
    LS_CONDCT-APPLICATIO = 'M'.
    LS_CONDCT-OPERATION  = '009'. "004 -- 修改 009 -- 新建
    LS_CONDCT-COND_NO    = LV_COND_NO. "'$000000001'. "LS_A018-KNUMH.
    LS_CONDCT-VALID_FROM = GS_UPLOAD-DATAB.
    LS_CONDCT-VALID_TO   = '99991231'.
    CLEAR LV_KEY.
    LV_KEY(10) = GS_UPLOAD-LIFNR.
    LV_KEY+10(18) = GS_UPLOAD-MATNR.
    CONCATENATE LV_KEY 'P001' GS_UPLOAD-ESOKZ INTO LV_KEY.
    LS_CONDCT-VARKEY = LV_KEY.
    APPEND LS_CONDCT TO LT_CONDCT.

    CLEAR LS_CONDHD.
    LS_CONDHD-COND_NO = LV_COND_NO. "'$000000001'. "LS_A018-KNUMH.
    LS_CONDHD-OPERATION = '009'. "004 -- 修改 009 -- 新建
    LS_CONDHD-CREATED_BY = SY-UNAME.
    LS_CONDHD-CREAT_DATE = SY-DATUM.
    LS_CONDHD-COND_USAGE = 'A'.
    LS_CONDHD-TABLE_NO   = '018'.
    LS_CONDHD-APPLICATIO = 'M'.
    LS_CONDHD-COND_TYPE  = 'PB00'.
    LS_CONDHD-VARKEY     = LV_KEY.
    LS_CONDHD-VALID_FROM = GS_UPLOAD-DATAB.
    LS_CONDHD-VALID_TO   = '99991231'.
    APPEND LS_CONDHD TO LT_CONDHD.

    CLEAR LS_CONDIT.
    LS_CONDIT-COND_NO = LV_COND_NO. "'$000000001'. "LS_A018-KNUMH.
    LS_CONDIT-OPERATION = '009'. "004 -- 修改 009 -- 新建
    LS_CONDIT-COND_COUNT = '01'.
    LS_CONDIT-APPLICATIO = 'M'.
    LS_CONDIT-COND_TYPE  = 'PB00'.
    LS_CONDIT-SCALETYPE  = 'A'.
    LS_CONDIT-SCALEBASIN = 'C'.
*    LS_CONDIT-CONDITIDX  = '01'.
    LS_CONDIT-COND_P_UNT = GS_UPLOAD-PEINH.
    LS_CONDIT-COND_UNIT  = GS_UPLOAD-MEINS.
    PERFORM CONVERT_INTO_INPUT CHANGING LS_CONDIT-COND_UNIT.
    LS_CONDIT-CALCTYPCON = 'C'.
    LS_CONDIT-EXCLUSION  = 'X'.
    LS_CONDIT-PMNTTRMS   = ''.
    LS_CONDIT-CONDCURR   = GS_UPLOAD-KONWA.
    LS_CONDIT-COND_VALUE = LV_KBETR.
    APPEND LS_CONDIT TO LT_CONDIT.

    MODIFY GT_UPLOAD FROM GS_UPLOAD.
  ENDLOOP.

  BREAK ZCWEI.
  CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
    EXPORTING
      PI_PHYSICAL_DELETION = 'X'
    TABLES
      TI_BAPICONDCT        = LT_CONDCT
      TI_BAPICONDHD        = LT_CONDHD
      TI_BAPICONDIT        = LT_CONDIT
      TI_BAPICONDQS        = LT_CONDQS
      TI_BAPICONDVS        = LT_CONDVS
      TO_BAPIRET2          = LT_RET_MES
      TO_BAPIKNUMHS        = LT_KNUMHS
      TO_MEM_INITIAL       = LT_MEM_INITIAL
    EXCEPTIONS
      UPDATE_ERROR         = 1
      OTHERS               = 2.
  IF SY-SUBRC = 0.

    LOOP AT LT_KNUMHS INTO LS_KNUMHS.

      READ TABLE LT_CONDIT INTO LS_CONDIT WITH KEY COND_NO = LS_KNUMHS-COND_NO_OLD.
      IF SY-SUBRC EQ 0.
        CLEAR LS_DATA.

        SELECT SINGLE * INTO LS_DATA FROM ZTBHSPPRICE
          WHERE KNUMH =  LS_KNUMHS-COND_NO_NEW.
        LS_DATA-KNUMH =  LS_KNUMHS-COND_NO_NEW.
        LS_DATA-KSCHL =  LS_CONDIT-COND_TYPE.
        LS_DATA-KBETR =  LS_CONDIT-COND_VALUE.
        LS_DATA-KONWA =  LS_CONDIT-CONDCURR.
        LS_DATA-KPEIN =  LS_CONDIT-COND_P_UNT.
        LS_DATA-KMEIN =  LS_CONDIT-COND_UNIT.

        LS_DATA-TCODE = SY-TCODE.
        LS_DATA-ZTRANS = ' '.

        IF LS_KNUMHS-COND_NO_OLD CP '$*'.
          LS_DATA-ERNAM = SY-UNAME.
          LS_DATA-ERDAT = SY-DATUM.
        ELSE.
          LS_DATA-AENAM = SY-UNAME.
          LS_DATA-AEDAT = SY-DATUM.
        ENDIF.
        CONCATENATE SY-DATUM SY-UZEIT INTO LS_DATA-TIMET.

        READ TABLE LT_CONDHD INTO LS_CONDHD WITH KEY COND_NO = LS_KNUMHS-COND_NO_OLD.
        IF SY-SUBRC EQ 0.
          LS_DATA-LIFNR = LS_CONDHD-VARKEY(10).
          LS_DATA-MATNR = LS_CONDHD-VARKEY+10(18).
          LS_DATA-EKORG = 'P001'.
        ENDIF.

        APPEND LS_DATA TO LT_DATA.

        MOVE: SY-MANDT TO LS_ZEORD-MANDT,
            LS_DATA-MATNR TO LS_ZEORD-MATNR,
*            N_EINE-WERKS TO LS_ZEORD-WERKS,
            LS_DATA-LIFNR TO LS_ZEORD-LIFNR,
            SY-UNAME TO LS_ZEORD-WUSER,
            SY-REPID TO LS_ZEORD-WREPID,
            SY-TCODE TO LS_ZEORD-WTCODE,
            'SAP2SCM012' TO LS_ZEORD-JIEKNO,
            ' ' TO LS_ZEORD-DFLAG.
        CONCATENATE SY-DATUM SY-UZEIT INTO LS_ZEORD-WTIME.

        APPEND LS_ZEORD TO LT_ZEORD.
      ENDIF.
    ENDLOOP.

*_插入数据到接口传输表
    MODIFY ZTBHSPPRICE FROM TABLE LT_DATA.
    MODIFY ZTIFEORD FROM TABLE LT_ZEORD.
    DELETE A018 FROM TABLE LT_A018_DEL.

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

    LOOP AT GT_UPLOAD INTO GS_UPLOAD WHERE STATUS NE 'E' AND SELDA EQ 'X'.
      GS_UPLOAD-STATUS = 'S'.
      GS_UPLOAD-ICON = '@08@'. "成功
      GS_UPLOAD-ZZMSG = '修改成功'.
      MODIFY GT_UPLOAD FROM GS_UPLOAD.
    ENDLOOP.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    LOOP AT GT_UPLOAD INTO GS_UPLOAD WHERE STATUS NE 'E' AND SELDA EQ 'X'.
      GS_UPLOAD-STATUS = 'E'.
      GS_UPLOAD-ICON = '@0A@'. "失败
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 INTO GS_UPLOAD-ZZMSG.
      MODIFY GT_UPLOAD FROM GS_UPLOAD.
    ENDLOOP.
  ENDIF.

ENDFORM.                    " FRM_CALL_BAPI
*&---------------------------------------------------------------------*
*&      Form  CONVERT_INTO_INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_IT_CONDIT_COND_UNIT  text
*----------------------------------------------------------------------*
FORM CONVERT_INTO_INPUT  CHANGING P_COND_UNIT.

  CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
    EXPORTING
      INPUT          = P_COND_UNIT
      LANGUAGE       = SY-LANGU
    IMPORTING
      OUTPUT         = P_COND_UNIT
    EXCEPTIONS
      UNIT_NOT_FOUND = 1
      OTHERS         = 2.


ENDFORM.                    " CONVERT_INTO_INPUT
*&---------------------------------------------------------------------*
*&      Form  FRM_SHOW_MSG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SHOW_MSG .
  PERFORM FRM_FILL_FIELDCAT.
  PERFORM FRM_FILL_LAYOUT.
  PERFORM FRM_OUTPUT_LIST .
ENDFORM.                    " FRM_SHOW_MSG
*&---------------------------------------------------------------------*
*&      FORM  FRM_FILL_FIELDCAT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM FRM_FILL_FIELDCAT .
  DATA: LV_POS            TYPE I.

  CLEAR LV_POS.
  CLEAR GT_FIELDCAT[].

  DEFINE D_GET_FIELD.
    LV_POS = LV_POS + 1.
    CLEAR GS_FIELDCAT.
    GS_FIELDCAT-COL_POS  = LV_POS.
    GS_FIELDCAT-FIELDNAME  = &1.
    GS_FIELDCAT-SELTEXT_L  = &2.
    GS_FIELDCAT-OUTPUTLEN  = &3.


    IF ( &1 EQ 'LIFNR' OR &1 EQ 'KBETR' OR
         &1 EQ 'PEINH' OR &1 EQ 'MATNR' ).
      GS_FIELDCAT-NO_ZERO = 'X'.
    ENDIF.
    IF &1 EQ 'SELDA'.
      GS_FIELDCAT-EDIT = 'X'.
      GS_FIELDCAT-CHECKBOX = 'X'.
    ENDIF.

    APPEND GS_FIELDCAT TO GT_FIELDCAT.
  END-OF-DEFINITION.

  D_GET_FIELD:
          'SELDA'       '选择'            '4',
          'ICON'        '信号灯'          '4',
          'MATNR'       '物料'          '18',
          'LIFNR'       '供应商'          '10',
          'ESOKZ'       '经营方式'         '10',
          'KBETR'       '价格'         '10',
          'PEINH'       '价格单位'       '10',
          'MEINS'       '定价单位'       '10',
          'KONWA'       '货币'       '10',
          'DATAB'       '开始生效日期'        '20',
          'ZZMSG'       '信息文本'          '50'.

ENDFORM.                    " FRM_FILL_FIELDCAT
*&---------------------------------------------------------------------*
*&      FORM  FRM_FILL_LAYOUT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM FRM_FILL_LAYOUT .
*  W_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
*   定义条纹显示
  GS_LAYOUT-ZEBRA             = 'X'.
ENDFORM.                    " FRM_FILL_LAYOUT
*&---------------------------------------------------------------------*
*&      FORM  FRM_OUTPUT_LIST
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM FRM_OUTPUT_LIST .
  DATA: LV_REPID LIKE SY-REPID.
  DATA: LS_VARIANT LIKE DISVARIANT.
  DATA: LV_SETTING TYPE LVC_S_GLAY.


  LV_REPID = SY-REPID.
  LS_VARIANT-REPORT = SY-REPID.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*     I_BYPASSING_BUFFER       = 'X'
*     I_GRID_SETTINGS          = LV_SETTING
      I_CALLBACK_PROGRAM       = LV_REPID
      IS_LAYOUT                = GS_LAYOUT
      I_CALLBACK_PF_STATUS_SET = 'PF_STATUS'
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
      IT_FIELDCAT              = GT_FIELDCAT[]
*     IT_SORT                  = I_SORT[]
*     IT_EVENTS                = GT_EVENTS[]
*     IS_PRINT                 = W_PRINT
      I_SAVE                   = 'A'
*     IS_VARIANT               = LS_VARIANT
    TABLES
      T_OUTTAB                 = GT_UPLOAD
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  IF SY-SUBRC = 0.
  ENDIF.
ENDFORM.                    " FRM_OUTPUT_LIST
*&---------------------------------------------------------------------*
*&      FORM  STANDARD_ER01
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->EXTAB      TEXT
*----------------------------------------------------------------------*
FORM PF_STATUS USING  EXTAB TYPE SLIS_T_EXTAB.

  DATA: LS_EXTAB TYPE SLIS_EXTAB.

  SET PF-STATUS 'MENU'." EXCLUDING RT_EXTAB.

ENDFORM.                    "STANDARD_ER01
*&---------------------------------------------------------------------*
*&      Form  FRM_DATA_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DATA_CHECK .
  DATA: LS_EINA_I TYPE EINA,
        LS_EINE_I TYPE EINE.
  DATA: LV_LEN       TYPE I.

  LOOP AT GT_UPLOAD INTO GS_UPLOAD.
*****  转换日期
    LV_LEN = STRLEN( GS_UPLOAD-INDAT ).
    IF LV_LEN EQ 10.
      CONCATENATE GS_UPLOAD-INDAT(4) GS_UPLOAD-INDAT+5(2) GS_UPLOAD-INDAT+8(2) INTO GS_UPLOAD-DATAB.
    ELSEIF LV_LEN EQ 8.
      GS_UPLOAD-DATAB = GS_UPLOAD-INDAT.
    ELSE.
      GS_UPLOAD-DATAB = SY-DATUM.
    ENDIF.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = GS_UPLOAD-MATNR
      IMPORTING
        OUTPUT = GS_UPLOAD-MATNR.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = GS_UPLOAD-LIFNR
      IMPORTING
        OUTPUT = GS_UPLOAD-LIFNR.

    GS_UPLOAD-STATUS = 'S'.
    GS_UPLOAD-ICON = '@08@'. "成功

    SELECT SINGLE * FROM EINA INTO LS_EINA_I
      WHERE MATNR = GS_UPLOAD-MATNR
        AND LIFNR = GS_UPLOAD-LIFNR.
    IF SY-SUBRC = 0 .
      SELECT SINGLE * FROM EINE INTO LS_EINE_I
        WHERE INFNR = LS_EINA_I-INFNR
          AND EKORG = 'P001'
          AND ESOKZ = GS_UPLOAD-ESOKZ.
      IF SY-SUBRC NE 0.
        GS_UPLOAD-STATUS = 'E'.
        GS_UPLOAD-ICON = '@0A@'. "失败
        CONCATENATE '请先维护商品' GS_UPLOAD-MATNR '供应商' GS_UPLOAD-LIFNR '的采购信息记录' INTO GS_UPLOAD-ZZMSG.
      ENDIF.
    ELSE.
      GS_UPLOAD-STATUS = 'E'.
      GS_UPLOAD-ICON = '@0A@'. "失败
      CONCATENATE '请先维护商品' GS_UPLOAD-MATNR '供应商' GS_UPLOAD-LIFNR '的采购信息记录' INTO GS_UPLOAD-ZZMSG.
    ENDIF .

    MODIFY GT_UPLOAD FROM GS_UPLOAD.
  ENDLOOP.
ENDFORM.                    " FRM_DATA_CHECK
*&--------------------------------------------------------------------*
*&      Form  user_command
*&--------------------------------------------------------------------*
*       响应用户事件,例如双击事件等
*---------------------------------------------------------------------*
*      -->U_UCOMM      系统按钮变量
*      -->SELFIELD     选择的栏位名
*---------------------------------------------------------------------*
FORM USER_COMMAND USING U_UCOMM LIKE SY-UCOMM
                       SELFIELD TYPE SLIS_SELFIELD.

  DATA:LV_GRID TYPE REF TO CL_GUI_ALV_GRID.
  DATA:LO_GUID TYPE REF TO CL_GUI_ALV_GRID.
  DATA: LV_INDEX TYPE SY-TABIX.

  " ALV GridControl full screen.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LO_GUID.

  " Verification of Changes.
  CALL METHOD LO_GUID->CHECK_CHANGED_DATA.

  SELFIELD-REFRESH = 'X'.  "自动刷新
  SELFIELD-COL_STABLE = 'X'.  "防止列跑位
  SELFIELD-ROW_STABLE = 'X'.  "防止行跑位

  CASE  U_UCOMM.
    WHEN 'EXEC'.
      READ TABLE GT_UPLOAD INTO GS_UPLOAD WITH KEY SELDA = 'X'
                                                   STATUS = 'S'.
      IF SY-SUBRC EQ 0.
        PERFORM FRM_CALL_BAPI.
      ELSE.
        MESSAGE '请先选择可以导入的数据!' TYPE 'E'.
      ENDIF.
    WHEN 'ALSEL'.
      LOOP AT GT_UPLOAD INTO GS_UPLOAD.
        GS_UPLOAD-SELDA = 'X'.

        MODIFY GT_UPLOAD FROM GS_UPLOAD.
      ENDLOOP.
    WHEN 'UNSEL'.
      LOOP AT GT_UPLOAD INTO GS_UPLOAD.
        GS_UPLOAD-SELDA = ''.

        MODIFY GT_UPLOAD FROM GS_UPLOAD.
      ENDLOOP.
  ENDCASE.
ENDFORM.

 

posted @ 2017-03-25 12:54  Rainystuday  阅读(452)  评论(0)    收藏  举报