co11n——生产订单确认的BAPI

来源:互联网 发布:2k17库里捏脸数据 编辑:程序博客网 时间:2024/05/22 15:05

通过C#访问SAP RFC没问题,但如果在RFC里使用BDC程序,就不能实际,返回错误信息。

现只能通过BAPI来解决。

 

REPORT TEST.
DATA: WA_ITEM      TYPE ZDT_PRD_ENSURE_ITEM,
        WA_HEADER    TYPE ZDT_PRD_ENSURE_RPHEADER,
        IT_TT        TYPE TABLE OF BAPI_PP_TIMETICKET,
        WA_TT        TYPE BAPI_PP_TIMETICKET,
        IT_DR        TYPE TABLE OF BAPI_CORU_RETURN,
        WA_DR        TYPE BAPI_CORU_RETURN,
        WA_RETURN    TYPE BAPIRET1,
*        wa_e_header TYPE zstr_xi_err_header,
*        wa_e_items   TYPE zstr_xi_err_items,
*        it_e_items   TYPE TABLE OF zstr_xi_err_items,

        I_ERRMSG     TYPE BAPIRET2-MESSAGE,"记录返回消息中的错误消息
        IMPORT_PARA TYPE ZMT_AS_MS_MES2SAP_OUT,
        RPHEADER     TYPE ZDT_AS_MS_MES2SAP_RPHEADER,
        ITEM         TYPE ZDT_AS_MS_MES2SAP_ITEM,
        I_TIME(14)   TYPE C, "传送时间
*        i_text(255) TYPE c,
        I_ERRFLG     TYPE C,
*        i_log        TYPE c,
        I_COUNT      TYPE I."用于对导入数据的行数记录
PARAMETERS : P_AUFNR LIKE AFRUD-AUFNR OBLIGATORY DEFAULT '50000319',
               P_VORNR LIKE AFRUD-VORNR OBLIGATORY DEFAULT '0010',
               P_LMNGA LIKE AFRUD-LMNGA OBLIGATORY DEFAULT '3' ,
*               p_unit like AFRUD-MEINH OBLIGATORY DEFAULT 'TON',
               P_BUDAT LIKE AFRUD-BUDAT OBLIGATORY DEFAULT '20071101'.

* LOOP AT input-mt_prd_ensure_in-item INTO wa_item.
    CLEAR: RPHEADER,ITEM,WA_TT,I_COUNT,I_ERRMSG,
           I_ERRFLG,WA_RETURN.
*    ADD 1 TO i_count.
** 订单号转换

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT = P_AUFNR
      IMPORTING
        OUTPUT = WA_TT-ORDERID.
    WA_TT-OPERATION = P_VORNR.
    WA_TT-YIELD      = P_LMNGA.
*    wa_tt-scrap      = wa_item-xmnga.
    WA_TT-POSTG_DATE = P_BUDAT.

***新增 2008-05-16*******
*********计算工时********

DATA:
       C_VORNR TYPE AFVC-VORNR,
       C_AUFNR TYPE AFKO-AUFNR,
       C_APLZL TYPE AFVC-APLZL,
       C_AUFPL TYPE AFVC-AUFPL,
       WA_AFVV TYPE AFVV.

    SELECT SINGLE AFVC~APLZL AFVC~AUFPL
                  INTO (C_APLZL, C_AUFPL)
                  FROM AFVC INNER JOIN AFKO
                  ON    AFVC~AUFPL = AFKO~AUFPL
                  WHERE AFKO~AUFNR = WA_TT-ORDERID
                  AND   AFVC~VORNR = P_VORNR.

    SELECT SINGLE * FROM AFVV INTO WA_AFVV
                    WHERE AUFPL = C_AUFPL
                    AND   APLZL = C_APLZL.
*    wa_tt-CONF_QUAN_UNIT = p_unit.
    WA_TT-CONF_ACTI_UNIT1 = WA_AFVV-VGE01.
    WA_TT-CONF_ACTI_UNIT2 = WA_AFVV-VGE02.
    WA_TT-CONF_ACTI_UNIT3 = WA_AFVV-VGE03.
    WA_TT-CONF_ACTI_UNIT4 = WA_AFVV-VGE04.
    WA_TT-CONF_ACTI_UNIT5 = WA_AFVV-VGE05.
    WA_TT-CONF_ACTI_UNIT6 = WA_AFVV-VGE06.
    WA_TT-CONF_ACTIVITY1 = WA_TT-YIELD * WA_AFVV-VGW01 / WA_AFVV-BMSCH.
    WA_TT-CONF_ACTIVITY2 = WA_TT-YIELD * WA_AFVV-VGW02 / WA_AFVV-BMSCH.
    WA_TT-CONF_ACTIVITY3 = WA_TT-YIELD * WA_AFVV-VGW03 / WA_AFVV-BMSCH.
    WA_TT-CONF_ACTIVITY4 = WA_TT-YIELD * WA_AFVV-VGW04 / WA_AFVV-BMSCH.
    WA_TT-CONF_ACTIVITY5 = WA_TT-YIELD * WA_AFVV-VGW05 / WA_AFVV-BMSCH.
    WA_TT-CONF_ACTIVITY6 = WA_TT-YIELD * WA_AFVV-VGW06 / WA_AFVV-BMSCH.
*************************

    APPEND WA_TT TO IT_TT.
    CALL FUNCTION 'BAPI_PRODORDCONF_CREATE_TT'   “主要是这个BAPI
      IMPORTING
        RETURN        = WA_RETURN
      TABLES
        TIMETICKETS   = IT_TT
        DETAIL_RETURN = IT_DR.

*   处理BAPI错误
    LOOP AT IT_DR INTO WA_DR.
      IF WA_DR-TYPE = 'E'.
        I_ERRFLG = 'X'.
        RPHEADER-FREEUSE1 = 'ERR'.
* 生成outbound数据item段error message
        ITEM-TYPE = WA_DR-TYPE.
* 合并错误message
        CALL FUNCTION 'Z_XI_GET_ERRMESSAGE'
          EXPORTING
            I_MESSAGE1 = WA_DR-MESSAGE
            I_MESSAGE2 = I_ERRMSG
          IMPORTING
            O_MESSAGE = ITEM-MESSAGE.
        I_ERRMSG = WA_DR-MESSAGE.
      ELSE.
        RPHEADER-FREEUSE1 = 'OK'.
        ITEM-MAT_DO     = WA_DR-CONF_NO. "生产订单确认号
        ITEM-HEADER_TXT = WA_TT-ORDERID. "生产订单号
        ITEM-BILL_OF_LADING = WA_DR-CONF_CNT. "确认计数器
        SHIFT ITEM-MAT_DO LEFT DELETING LEADING '0'.
        SHIFT ITEM-HEADER_TXT LEFT DELETING LEADING '0'.
        SHIFT ITEM-BILL_OF_LADING LEFT DELETING LEADING '0'.
      ENDIF.

      IF I_ERRFLG IS INITIAL.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      ENDIF.
    ENDLOOP.

* 处理返回信息
    APPEND ITEM TO IMPORT_PARA-MT_AS_MS_MES2SAP_OUT-ITEM.

* 对上传数据进行判断

    RPHEADER-FREEUSE1 = 'ERR'.
    ITEM-TYPE = 'E'.
    ITEM-MESSAGE = 'Item数据为空,无法确认生产订单'.
    APPEND ITEM TO IMPORT_PARA-MT_AS_MS_MES2SAP_OUT-ITEM.

* 生成outbound数据head段
RPHEADER-TLGNAME = WA_HEADER-TLGNAME.
RPHEADER-TLGID    = WA_HEADER-TLGID.
RPHEADER-RECEIVER = WA_HEADER-SENDER.

CALL FUNCTION 'Z_XI_ASYNCHRONISM_SEND'
    TABLES
      ITEM         = IMPORT_PARA-MT_AS_MS_MES2SAP_OUT-ITEM
    CHANGING
      RPHEADER     = RPHEADER
    EXCEPTIONS
      SYSTEM_ERROR = 1.
IF SY-SUBRC = 1.
ENDIF.