使用UPDATE语句在表上提交工作

时间:2015-11-24 11:34:02

标签: sap abap

我对ABAP更新声明有疑问。我在一个更新表语句中使用“提交工作”,但它在某些时候工作并且有时它不起作用时工作不正常。

检查陈述:

{{1}}

以上提交工作是否会导致任何问题,或者更新表的原因是什么? 请在这种情况下给出一些建议。

3 个答案:

答案 0 :(得分:2)

将您的提交更改为

COMMIT WORK AND WAIT. 
IF SY-SUBRC NE 0.
  WRITE: / 'Update error! Check SM13'.
ENDIF.

如果你检查BAPI_TRANSACTION_COMMIT,它确切地说是用WAIT参数调用的。如果您愿意,可以使用该功能模块并显示标准错误消息。

如果更新失败,请检查SM13的原因。最有可能的是,这是一个锁定问题,但也可能有其他原因。

在任何情况下,您都应该扩展逻辑以在UPDATE之前包含对象锁定。

答案 1 :(得分:2)

如果SY-SUBRC等于'4',则表MARA中的材料不存在或wa-basic_data1-matnr的值未准备好输入,您必须将其转换。

有时,表中“MARA”中“MATNR”的值在SAP中配置为使用范围自动将数字分配给标准事务“MM01”和“MM41”中的材料。此行为不适用于自定义程序,请确保在这种情况下使用功能模块“CONVERSION_EXIT_MATN1_INPUT”和“CONVERSION_EXIT_MATN1_OUTPUT”。

数据类型'MATNR'是CHAR(18),值(在这种情况下)在左侧存储为零,尽管您看到的数字没有那些零。这是因为SAP在内部转换输出值,因此用户看不到那些零。

例如,如果交易“SE16N”或“MM03”中的MARA-MATNR值为“9999999”,则存储的实际值为“000000000009999999”。使用事务'SE11'检查同一个表,这次您将看到原始数据。 以下代码可以更好地解释上述内容:

DATA: lv_matnr TYPE matnr,
      wa_mara TYPE mara.

lv_matnr = '1234567'. " -> Not ready for input
SELECT SINGLE * FROM mara INTO wa_mara WHERE matnr eq lv_matnr.
WRITE sy-subrc. " -> sy-subrc = 4. Not found

CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' " Format for input
  EXPORTING
    INPUT              = lv_matnr " The value is '1234567'
  IMPORTING
    OUTPUT             = lv_matnr " The value will be formatted to '000000000001234567'
  EXCEPTIONS
    LENGTH_ERROR       = 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.

SELECT SINGLE * FROM mara INTO wa_mara WHERE matnr eq lv_matnr.
WRITE / sy-subrc. " -> sy-subrc = 0. Found

在你的情况下试试这个;

CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
  EXPORTING
    INPUT              = wa-basic_data1-matnr 
  IMPORTING
    OUTPUT             = wa-basic_data1-matnr " Add zeroes at the left
  EXCEPTIONS
    LENGTH_ERROR       = 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.

UPDATE mara
SET
      zzmanu     =  wa-sales_data2-zzmanu
      zzmatnr_sf =  wa-sales_data2-zzmatnr_sf
WHERE  matnr = wa-basic_data1-matnr.

if sy-subrc eq 0.
commit work.
wait up to 2 seconds.
ENDIF.

希望有所帮助

答案 2 :(得分:1)

关于材料编号,您必须知道SAP使用所谓的“Alpha转换”。

字母数字材料编号是左边界,数字材料编号与前导零绑定。

如果您没有更新所需的表单中的材料编号,那可能会出现问题。

因此Ax1123将成为数据库上的AX1123     在数据库上123将是000000000000000123。

SAP使用convert_exit_alpha_input和conversion_exit_alpha_output等功能模块在DB值和UI表示之间切换。