ABAP INSERT数据无效


近日写了一个程序,调用系统功能修改内向交货单数量。


出现了一个诡异的问题。


INSERT ZMMT_LOG026 FROM GS_ZMMT_LOG026  插入语句,无论如何也插不进数据,找了N多方法,最后终于有了结果。



程序功能本身很简单,

1、准备数据

2、保存日志透明表  (INSERT)

3、调用系统功能FUNCTION

4、保存日志透明表 (MODIFY)


问题出现在第二步,始终无法插入数据到自己的透明表。


原来是,后面的FUNCTION影响到2步的插入语句。。。。。需要显示地申明数据库提交,就好了。


SAP的解释:


行内更新

可以将更新语句(INSERT、 UPDATE、 MODIFY、 DELETE)直接放置在 代码中。

这些是“行内 ”更新(也就是非绑定的),无需使用任何 ABAP/4 绑定技术就可以执行。

即使没有COMMIT WORK 语句,下一屏幕更改的 数据库提交 也将更新提 交给数据库 。


此行内更新方法只适用于单个屏幕事务。

通过多屏幕事务 ,如果错误发生在以后的屏幕中, 则不能反转早期屏幕提交的数据。
如果使用该方法,则不依靠屏幕更改时执行的自动提交。

SAP建议在屏幕处理之前显式地使用COMMIT WORK。



程序全文:


*&---------------------------------------------------------------------*
*& Report  ZTEST8
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZTEST8.

TABLES ZMMT_LOG026.



DATA GT_MSEG LIKE TABLE OF MSEG WITH HEADER LINE.

DATA GV_MENGE103 LIKE MSEG-MENGE VALUE 0.
DATA GV_MENGE104 LIKE MSEG-MENGE VALUE 0.
DATA GV_MENGE_BAPI LIKE MSEG-MENGE VALUE 0.

DATA GS_ZMMT_LOG026 LIKE ZMMT_LOG026.



DATA GS_HEADER_DATA    LIKE BAPIIBDLVHDRCHG .
DATA GS_HEADER_CONTROL LIKE BAPIIBDLVHDRCTRLCHG .
DATA GT_ITEM_DATA    LIKE TABLE OF BAPIIBDLVITEMCHG WITH HEADER LINE.
DATA GT_ITEM_CONTROL LIKE TABLE OF BAPIIBDLVITEMCTRLCHG WITH HEADER LINE.
DATA RETURNSS TYPE STANDARD TABLE OF BAPIRET2 WITH HEADER LINE.







"从凭证中得到当天的内向交货单

SELECT DISTINCT MATNR VBELN_IM VBELP_IM INTO CORRESPONDING FIELDS OF TABLE GT_MSEG "带物料抓取快
  FROM MSEG
  WHERE CPUDT_MKPF = SY-DATUM
  AND BWART IN (103,104)
  AND VBELN_IM <> ''.




LOOP AT GT_MSEG.


        SELECT MENGE INTO GV_MENGE103 FROM MSEG WHERE BWART = '103' AND MATNR = GT_MSEG-MATNR AND VBELN_IM = GT_MSEG-VBELN_IM AND VBELP_IM = GT_MSEG-VBELP_IM.  "移动类型103,物料,内单号,项目
        ENDSELECT.

        SELECT MENGE INTO GV_MENGE104 FROM MSEG WHERE BWART = '104' AND MATNR = GT_MSEG-MATNR AND VBELN_IM = GT_MSEG-VBELN_IM AND VBELP_IM = GT_MSEG-VBELP_IM.  "移动类型104,物料,内单号,项目
        ENDSELECT.

        GV_MENGE_BAPI = GV_MENGE103 - GV_MENGE104.


        "装填日志前部分数据

        GS_ZMMT_LOG026-USRID = SY-UNAME. "用户名
        GS_ZMMT_LOG026-ERDAT = SY-DATUM. "日期
        GS_ZMMT_LOG026-ANUZT = SY-UZEIT. "时间

        CALL FUNCTION 'NUMBER_GET_NEXT'
            EXPORTING
              NR_RANGE_NR                   = 'A1'
              OBJECT                        = 'ZSDFM020'
           IMPORTING
              NUMBER                         = GS_ZMMT_LOG026-AUTONUMBER. "自动编号


         CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'  "去掉前导零
           EXPORTING
             INPUT         = GS_ZMMT_LOG026-AUTONUMBER
          IMPORTING
            OUTPUT        =  GS_ZMMT_LOG026-AUTONUMBER.


     " PICK UP  ASN号码,项目,内单号码,行项目,物料,初始数量
        SELECT  VBELV POSNV VBELN POSNR   MATNR LFIMG
                                  INTO CORRESPONDING FIELDS OF GS_ZMMT_LOG026
                                  FROM LIPS
                                  WHERE VBELN = GT_MSEG-VBELN_IM
                                  AND   POSNR = GT_MSEG-VBELP_IM.
        ENDSELECT   .





            INSERT ZMMT_LOG026 FROM GS_ZMMT_LOG026. "处理前保存到日志表前部分

            COMMIT WORK. "后面BAPI影响,这里必须提交



            "使用BAPI调整内向交货单数量

            "BAPI 入口参数
            GS_HEADER_DATA-DELIV_NUMB    = GS_ZMMT_LOG026-VBELN. "内单号
            GS_HEADER_CONTROL-DELIV_NUMB = GS_ZMMT_LOG026-VBELN. "内单号


            "BAPI 入口表
            GT_ITEM_DATA-DLV_QTY        = GS_ZMMT_LOG026-MENGE_BAPI. "交货数量 ,被修改
            GT_ITEM_DATA-DLV_QTY_IMUNIT = GS_ZMMT_LOG026-MENGE_BAPI.
            GT_ITEM_DATA-DEL_QTY_FLO    = GS_ZMMT_LOG026-MENGE_BAPI.
            GT_ITEM_DATA-DLV_QTY_ST_FLO = GS_ZMMT_LOG026-MENGE_BAPI.
            GT_ITEM_DATA-FACT_UNIT_NOM = 1.   "固定1
            GT_ITEM_DATA-FACT_UNIT_DENOM = 1. "固定1
            GT_ITEM_DATA-CONV_FACT = 1.       "固定1
            GT_ITEM_DATA-DELIV_NUMB = GS_ZMMT_LOG026-VBELN. "内单号
            GT_ITEM_DATA-DELIV_ITEM = GS_ZMMT_LOG026-POSNR. "行项目
            APPEND GT_ITEM_DATA .

            GT_ITEM_CONTROL-DELIV_NUMB = GS_ZMMT_LOG026-VBELN. "内单号
            GT_ITEM_CONTROL-DELIV_ITEM = GS_ZMMT_LOG026-POSNR. "行项目
            GT_ITEM_CONTROL-CHG_DELQTY = 'X'.
            APPEND GT_ITEM_CONTROL .

            CALL FUNCTION 'BAPI_INB_DELIVERY_CHANGE'
              EXPORTING
                HEADER_DATA                = GS_HEADER_DATA
                HEADER_CONTROL             = GS_HEADER_CONTROL
                DELIVERY                   = GS_ZMMT_LOG026-VBELN "内单号
              TABLES
                ITEM_DATA                  = GT_ITEM_DATA
                ITEM_CONTROL               = GT_ITEM_CONTROL
                RETURN                     = RETURNSS .

            IF RETURNSS[] IS INITIAL.

               CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' " BAPI成功提交
               EXPORTING
               WAIT = 'X'.

               GS_ZMMT_LOG026-ERPDO = 'X'.      "ERP处理标志
               GS_ZMMT_LOG026-EDATS = SY-DATUM. "ERP处理日期
               GS_ZMMT_LOG026-ETIMS = SY-UZEIT. "ERP处理时间

               MODIFY ZMMT_LOG026 FROM GS_ZMMT_LOG026. "保存日志透明表

            ELSE.

               GS_ZMMT_LOG026-ERPDO = 'X'.      "ERP处理标志
               GS_ZMMT_LOG026-EDATS = SY-DATUM. "ERP处理日期
               GS_ZMMT_LOG026-ETIMS = SY-UZEIT. "ERP处理时间



                DATA SS LIKE BAPIRET2-MESSAGE.
                DATA GV_LONG(200) TYPE C.

                  LOOP AT RETURNSS.
                      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
                       EXPORTING
                         MSGID               = RETURNSS-ID
                         MSGNR               = RETURNSS-NUMBER
                         MSGV1               = RETURNSS-MESSAGE_V1
                         MSGV2               = RETURNSS-MESSAGE_V2
                         MSGV3               = RETURNSS-MESSAGE_V3
                         MSGV4               = RETURNSS-MESSAGE_V4
                       IMPORTING
                         MESSAGE_TEXT_OUTPUT = SS.
                        GV_LONG = GV_LONG && '(' && SY-TABIX && ')' &&  '[' && RETURNSS-TYPE && ']' && SS .
                  ENDLOOP.



               GS_ZMMT_LOG026-MESSAGE = GV_LONG.



               MODIFY ZMMT_LOG026 FROM GS_ZMMT_LOG026. "保存日志透明表
               COMMIT WORK.




            ENDIF.




            "对透明表LIPS,加完成标记
               UPDATE LIPS
               SET GRUND = '0006'
               WHERE VBELN = GS_ZMMT_LOG026-VBELN "内单号
               AND   POSNR = GS_ZMMT_LOG026-POSNR."行项目




              CLEAR: GS_ZMMT_LOG026,GV_MENGE_BAPI,GV_MENGE103,GV_MENGE104.
              CLEAR: GS_HEADER_DATA,GS_HEADER_CONTROL,GT_ITEM_DATA,GT_ITEM_DATA[],GT_ITEM_CONTROL,GT_ITEM_CONTROL[],RETURNSS,RETURNSS[].
              CLEAR: SS,GV_LONG.




ENDLOOP.



ABAP中的INSERT语句用于将数据插入到数据库表中。根据引用\[1\]中的解释,INSERT INTO语句可以用来插入单条记录,语法如下: INSERT INTO dbtab VALUES wa. 其中,dbtab是数据库表的名称,wa是一个结构体或内表,包含要插入的数据。wa中的字段排列必须与数据库表中的字段排列一致。 另外,INSERT INTO语句还可以用来插入多条记录,可以通过FROM TABLE子句指定一个内表来插入多条数据,语法如下: INSERT dbtab FROM TABLE itab. 其中,itab是一个内表,包含要插入的多条数据。 除了INSERT INTO语句,ABAP还提供了其他的插入数据的方式。例如,可以使用INSERT dbtab语句将一个结构体或内表作为一个记录插入数据库表中,语法如下: INSERT dbtab FROM wa. 或者 INSERT (dbtabname) FROM wa. 其中,wa是一个结构体或内表,dbtab是一个与wa结构相同的数据库表。 总结起来,ABAP中的INSERT语句可以用于插入单条记录或多条记录到数据库表中,可以使用不同的语法形式来实现。 #### 引用[.reference_title] - *1* *2* [ABAP数据库操作之操作语句Insert](https://blog.csdn.net/zhongguomao/article/details/53349520)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ABAP数据库操作03-数据添加](https://blog.csdn.net/f346348157/article/details/124065795)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值