我对ABAP更新声明有疑问。我在一个更新表语句中使用“提交工作”,但它在某些时候工作并且有时它不起作用时工作不正常。
检查陈述:
{{1}}
以上提交工作是否会导致任何问题,或者更新表的原因是什么? 请在这种情况下给出一些建议。
答案 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表示之间切换。