0

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

检查语句:

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.

上面的 Commit 是否会导致任何问题,或者它没有更新表的原因是什么。请在这种情况下提出一些建议。

4

3 回答 3

2

将您的提交更改为

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

如果您检查 BAPI_TRANSACTION_COMMIT,这正是使用 WAIT 参数调用时所做的事情。如果您愿意并显示标准错误消息,您可以使用该功能模块。

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

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

于 2015-11-25T11:06:50.930 回答
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.

希望能帮助到你

于 2015-11-26T13:25:02.050 回答
1

关于物料编号,您必须知道 SAP 使用所谓的“Alpha-Conversion”。

字母数字材料编号为左边界,数字材料编号右边界为前导零。

如果您没有更新所需的表格中的材料编号,这可能是个问题。

所以 Ax1123 将是数据库 123 上的 AX1123 将是数据库上的 000000000000000123。

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

于 2015-12-11T05:01:10.143 回答