文章目录
- 需求
- 一、需求分析
- 二、需求实现
- 1.长文本
- 2.标准代码位置
- 3.增强实现
- 总结
需求
VA01创建特定类型销售订单时检查第一个行项目的长文本有没有输入内容,还必须是ZH中文的内容,没输入时不能保存销售订单.
一、需求分析
销售订单保存增强是很常见的需求,增强程序:MV45AFZZ都快被大家写烂了,但是这次的需求很少见,要求检查的是长文本.而在MV45AFZZ的USEREXIT_SAVE_DOCUMENT_PREPARE里是没有办法直接取到录入的长文本内容的.那么,如何在保存时检查长文本呢?
二、需求实现
1.长文本
做过长文本相关开发的顾问应该都知道,长文本的存储和普通数据不同,是通过文本名称,标识,对象,语言类型存到:
STXH表 - 长文本的抬头信息
STXL表 - 长文本是明细信息
读取时需要调用函数READ_TEXT进行读取.
我断点做了观察,在执行完USEREXIT_SAVE_DOCUMENT_PREPARE增强点时,STXH表还没有数据,所以只能另寻他法.
经过漫长的折磨,分析了SAP的标准代码,最后终于找到了!
2.标准代码位置
SE38: SAPLSTXD=>LSTXDUXX=>LSTXDU08的230行位置
这里是将长文本放到了内存中,而且这个位置是在MV45AFZZ的USEREXIT_SAVE_DOCUMENT_PREPARE之前运行的,也就是说,我们可以直接在USEREXIT_SAVE_DOCUMENT_PREPARE里获取这个内存参数的数据来判断有没有输入长文本!
这里的MEMORY_ID的格式,行项目的长文本ID是’SAPLSTXD000001’,就是SAPLSTX+行,1就是销售订单的第一行的意思,第二行就是’SAPLSTXD000002’
3.增强实现
代码如下(示例):
代码位置:MV45AFZZ的USEREXIT_SAVE_DOCUMENT_PREPARE中
*--------------------------------------------------------------------S↓*
DATA BEGIN OF catalog OCCURS 50.
INCLUDE STRUCTURE tcatalog.
DATA END OF catalog.DATA BEGIN OF theader.INCLUDE STRUCTURE thead.
DATA END OF theader.
DATA BEGIN OF gt_lines occurs 50.INCLUDE STRUCTURE tline.
DATA END OF gt_lines.IF ( sy-tcode = 'VA01' OR sy-tcode = 'VA02') AND ( xvbak-auart EQ 'ZOR1' OR xvbak-auart EQ 'ZOR8')."取得所有该销售订单的长文本内存IMPORT catalog FROM MEMORY ID 'SAPLSTXD'.LOOP AT catalog INTO DATA(ds_item10) WHERE tdname cs '000010' AND tdspras EQ '1'."有第一个行项目并且是中文的DATA(item_id) = 'SAPLSTXD' && catalog-id.EXIT.ENDLOOP.IF ds_item10 IS INITIAL.MESSAGE E145(ZV00).ENDIF."长文本详细内容IF item_id IS NOT INITIAL.IMPORT thead TO theader tline TO gt_lines FROM MEMORY ID item_id.LOOP AT tline."在此处理长文本的内容ENDLOOP.ENDIF.
ENDIF.*--------------------------------------------------------------------E↑*
总结
只要找对方法,位置,实现还是很简单的,但往往方法和位置才是最珍贵的.