近日写了一个程序,调用系统功能修改内向交货单数量。
出现了一个诡异的问题。
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.