zoukankan      html  css  js  c++  java
  • 在ABAP中用事务更新数据(转)

    ABAP的开发中,根据业务的需要,有时可能要对后台多个数据表进行更新,为了保证数据的完整性、一致性,需要把这些操作写在同一个事务中。对数据的操作,要么全部成功,要么全部失败回滚。结合在项目中的应用,下面阐述一下实现方法。

    本例是在用BAPI创建物料凭证的同时,要更新自定义状态表,实现物料凭证的创建和更新自定义状态表在同一事务中。 

    一、首先用SE37创建一个Update Module 类型的函数:

    函数里面的代码如下:

    FUNCTION ZMM_PULL_LIST_POST_AUFNR.

    *"----------------------------------------------------------------------

    *"*"Update function module:

    *"

    *"*"Local interface:

    *"  IMPORTING

    *"     VALUE(PLANT) TYPE  BAPI2017_GM_ITEM_CREATE-PLANT OPTIONAL

    *"     VALUE(STGE_LOC) TYPE  BAPI2017_GM_ITEM_CREATE-STGE_LOC OPTIONAL

    *"     VALUE(MOVE_TYPE) TYPE  BAPI2017_GM_ITEM_CREATE-MOVE_TYPE

    *"       OPTIONAL

    *"     VALUE(MOVE_PLANT) TYPE  BAPI2017_GM_ITEM_CREATE-MOVE_PLANT

    *"       OPTIONAL

    *"     VALUE(MOVE_STLOC) TYPE  BAPI2017_GM_ITEM_CREATE-MOVE_STLOC

    *"       OPTIONAL

    *"     VALUE(ENTRY_QNT) TYPE  BAPI2017_GM_ITEM_CREATE-ENTRY_QNT

    *"       OPTIONAL

    *"     VALUE(ISWBS) TYPE  CHAR1 OPTIONAL

    *"  TABLES

    *"      INPUT STRUCTURE  ZMM_PD_PULL_LIST OPTIONAL

    *"----------------------------------------------------------------------

    data:goodsmvt_header type bapi2017_gm_head_01.

    data:goodsmvt_code type bapi2017_gm_code.

    data:materialdocument type bapi2017_gm_head_ret-mat_doc.

    data:matdocumentyear type bapi2017_gm_head_ret-doc_year.

    data:goodsmvt_item type table of bapi2017_gm_item_create with header line.

    data:return type table of bapiret2 WITH HEADER LINE.

    DATA:ITRESULT TYPE TABLE OF zmm_311PD_result WITH HEADER LINE.

    DATA:ITRESULTLOG TYPE TABLE OF ZMM03_PD_LOG WITH HEADER LINE.

    DATA:IT_ERROR TYPE TABLE OF ZMM03_ERROR WITH HEADER LINE.

    DATA:m_POSTMSG(200).

    DATA:G_WBS_ELEM TYPE PRPS-POSKI,

         G_PSPNR TYPE PRPS-PSPNR.

     

    *使用之前先清空

    REFRESH IT_ERROR.

    CLEAR IT_ERROR.

    LOOP AT INPUT.

           CLEAR G_PSPNR.

           CLEAR G_WBS_ELEM.

     

           CLEAR GOODSMVT_HEADER.

           CLEAR GOODSMVT_CODE.

           CLEAR MATERIALDOCUMENT.

           CLEAR MATDOCUMENTYEAR.

           REFRESH GOODSMVT_ITEM.

           CLEAR GOODSMVT_ITEM.

     

           SELECT SINGLE

                   GRPNR

                   FROM GRPGA

                   INTO G_PSPNR

                   WHERE PSPNR = INPUT-PSPEL.

     

           IF G_PSPNR IS INITIAL.

              G_PSPNR = INPUT-PSPEL.

           ENDIF.

     

           SELECT SINGLE

                  POSKI

                  FROM PRPS

                  INTO G_WBS_ELEM

                  WHERE PSPNR = G_PSPNR.

     

           goodsmvt_header-pstng_date = sy-datum.

           goodsmvt_header-doc_date = sy-datum.

           goodsmvt_code-gm_code = '04'.

     

    *     抬头文本填批次/WBS,物料单填网络号

           concatenate INPUT-PICI '/' g_wbs_elem into goodsmvt_header-header_txt.

           condense goodsmvt_header-header_txt.

           goodsmvt_header-REF_DOC_NO_LONG = INPUT-aufnr.

     

           goodsmvt_item-material = INPUT-matnr.

           goodsmvt_item-plant = PLANT.

           goodsmvt_item-stge_loc = STGE_LOC.

           goodsmvt_item-move_type = MOVE_TYPE.

     

           IF ISWBS = '1'.

              goodsmvt_item-spec_stock = INPUT-SOBKZ.

           ENDIF.

           goodsmvt_item-entry_qnt = ENTRY_QNT.

           goodsmvt_item-entry_uom = INPUT-meins.

           goodsmvt_item-move_plant = MOVE_PLANT.

           goodsmvt_item-move_stloc = MOVE_STLOC.

     

           IF ISWBS = '1'.

               goodsmvt_item-wbs_elem = g_wbs_elem.

               goodsmvt_item-VAL_WBS_ELEM = G_WBS_ELEM.

           ENDIF.

     

           append goodsmvt_item.

           clear goodsmvt_item.

     

           call function 'BAPI_GOODSMVT_CREATE'

             exporting

                goodsmvt_header               = goodsmvt_header

                goodsmvt_code                 = goodsmvt_code

             importing

                materialdocument              = materialdocument

                matdocumentyear               = matdocumentyear

             tables

                goodsmvt_item                 = goodsmvt_item

                return                        = return.

     

           IF MATERIALDOCUMENT NE ''.

    *           从数据库中获取当前的出库数量

                SELECT SINGLE

                       MENGE_CK

                       INTO INPUT-MENGE_CK

                       FROM ZMM_PD_PULL_LIST

                       WHERE AUFNR = INPUT-AUFNR AND RSPOS = INPUT-RSPOS AND PICI = INPUT-PICI AND MATNR = INPUT-MATNR.

     

                INPUT-MENGE_CK = INPUT-MENGE_CK + ENTRY_QNT.

                INPUT-MENGE_QF = INPUT-MENGE_LL - INPUT-MENGE_CK.

                IF INPUT-MENGE_QF <= 0.

                   INPUT-FLAG = 'X'.

                ENDIF.

     

                ITRESULT-MBLNR = MATERIALDOCUMENT.

                ITRESULT-MJAHR = matdocumentyear.

                ITRESULT-WERKS = INPUT-WERKS.

                ITRESULT-MATNR = INPUT-MATNR.

                ITRESULT-AUFNR = INPUT-AUFNR.

                ITRESULT-RSPOS = INPUT-RSPOS.

                ITRESULT-MENGE = ENTRY_QNT.

                ITRESULT-MEINS = INPUT-MEINS.

                APPEND ITRESULT.

                CLEAR ITRESULT.

     

                ITRESULTLOG-MBLNR = MATERIALDOCUMENT.

                ITRESULTLOG-MJAHR = matdocumentyear.

                ITRESULTLOG-UNAME = SY-UNAME.

                ITRESULTLOG-WERKS = INPUT-WERKS.

                ITRESULTLOG-MATNR = INPUT-MATNR.

                ITRESULTLOG-AUFNR = INPUT-AUFNR.

                ITRESULTLOG-RSPOS = INPUT-RSPOS.

                ITRESULTLOG-MENGE = ENTRY_QNT.

                ITRESULTLOG-MEINS = INPUT-MEINS.

                APPEND ITRESULTLOG.

                CLEAR ITRESULTLOG.

           ELSE.

                CLEAR m_POSTMSG.

                m_POSTMSG = '创建凭证失败:'.

                LOOP AT RETURN WHERE TYPE = 'E'.

                     CONCATENATE m_POSTMSG '/' RETURN-MESSAGE INTO m_POSTMSG.

                ENDLOOP.

     

                MOVE-CORRESPONDING INPUT TO IT_ERROR.

                IT_ERROR-MESSAGE = m_POSTMSG.

                IT_ERROR-UNAME = SY-UNAME.

                APPEND IT_ERROR.

                CLEAR IT_ERROR.

           ENDIF.

           MODIFY INPUT.

           CLEAR INPUT.

    ENDLOOP.

    *以上代码过帐

     

    IF MATERIALDOCUMENT NE ''.

        MODIFY ZMM_PD_PULL_LIST FROM TABLE INPUT.

        MODIFY zmm_311PD_result FROM TABLE ITRESULT.

        MODIFY ZMM03_PD_LOG FROM TABLE ITRESULTLOG.

    ELSE.

        IF IT_ERROR[] IS NOT INITIAL.

            MODIFY ZMM03_ERROR FROM TABLE IT_ERROR.

        ENDIF.

    ENDIF.

    ENDFUNCTION.

     

    二、外部调用:

    SET UPDATE TASK LOCAL.

    CALL FUNCTION 'ZMM_PULL_LIST_POST_AUFNR' IN UPDATE TASK

           EXPORTING

              PLANT = IT-WERKS

              STGE_LOC = it_temp-lgort

              MOVE_TYPE = '311'

              MOVE_PLANT = IT-WERKS

              MOVE_STLOC = IT-lgort

              ENTRY_QNT = g_prlab

              ISWBS = ''

           TABLES

              INPUT = it_li.

    COMMIT WORK AND WAIT.

  • 相关阅读:
    MySql 插入(insert)性能测试 zt 武胜
    mysql日期 武胜
    Some Useful Extension Methods On IList<T> zt 武胜
    SQL语句 武胜
    MySql bulk load zt 武胜
    C# 结构体初始化 武胜
    备忘 武胜
    C# 批量插入Mysql zt 武胜
    Use C# to get JSON Data from the Web and Map it to .NET Class => Made Easy! 转 武胜
    开发例子 转http://www.google.com.hk/search?newwindow=1&safe=strict&client=firefoxa&hs=Gzw&rls=org.mozilla%3AzhCN%3Aofficial&q=%E5%8D%83%E5%8F%91&oq=%E5% 武胜
  • 原文地址:https://www.cnblogs.com/weichuo/p/3016831.html
Copyright © 2011-2022 走看看