保存销售订单时如何更新标准字段VBKD-VSART?
解决SAP销售订单保存时修改VBKD-VSART字段的问题
问题原因分析
- 在
USEREXIT_SAVE_DOCUMENT、USEREXIT_SAVE_DOCUMENT_PREPARE(未正确处理)或USEREXIT_MOVE_FIELD_TO_VBKD中直接修改XVBKD触发短转储,是因为不同出口的执行时机下,XVBKD的内存状态受SAP系统保护,直接修改违反了语句执行规则。 USEREXIT_MOVE_FIELD_TO_VBKD会在订单创建、修改的多个阶段触发,无法满足“仅保存时修改”的需求。- 仅在
USEREXIT_SAVE_DOCUMENT_PREPARE中修改XVBKD但未生效,是因为未标记该内表条目为“待更新”状态,SAP后续保存流程无法识别到变更。
正确解决方案
在USEREXIT_SAVE_DOCUMENT_PREPARE中修改XVBKD字段时,需同时设置更新标识UPDKZ为'U'(表示修改),确保SAP保存流程能捕获到内表变更并同步到数据库。
示例代码
FORM userexit_save_document_prepare. DATA(lo_vbkd) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( 'XVBKD' ) ). " 检查XVBKD是否包含UPDKZ字段,确保代码兼容性 IF lo_vbkd->get_component( 'UPDKZ' ) IS NOT INITIAL. LOOP AT xvbkd ASSIGNING FIELD-SYMBOL(<ls_vbkd>). <ls_vbkd>-vsart = '01'. <ls_vbkd>-updkz = 'U'. " 设置修改标识,告知SAP需要更新该条目 ENDLOOP. ENDIF. ENDFORM.
补充说明
USEREXIT_SAVE_DOCUMENT_PREPARE是唯一适配的出口:该出口处于保存前的准备阶段,此时修改XVBKD并设置更新标识不会触发内存保护错误,且能被后续保存流程处理。- 若仍存在问题,需检查是否有其他增强或标准逻辑覆盖了
VSART字段的值,可通过调试跟踪VBKD-VSART的赋值流程确认。
内容的提问来源于stack exchange,提问作者Ovidiu Pocnet
相关产品推荐
相关产品推荐

