在上图中,在取物料主数据的销售长文本,必须要知道这个物料对应的销售组织、分销渠道,这样才能决定值是唯一的!
上图就是能过函数read_text访问长文本的相关参数,其中红色部分就是物料编码,绿色部分就是销售组织,蓝色部分就是分销渠道;红色部分是我们的难点部分,因为这一部分的空格部分是不确定的,这就要求我们只能通过模糊查询匹配,如下的方法是大家通用的方法:
DATA: TDSPRAS TYPE STXH-TDSPRAS.
DATA: L_NAME LIKE THEAD-TDNAME,
L_NAME2 LIKE STXH-TDNAME.
DATA: T_LINES LIKE TLINE OCCURS 0 WITH HEADER LINE.
CLEAR L_NAME.
CLEAR L_NAME2.
CONCATENATE T_VBAP-MATNR '%' '1200' '%' INTO L_NAME. ”模糊查询条件
CLEAR TDSPRAS.
SELECT SINGLE TDSPRAS TDNAME
INTO (TDSPRAS,L_NAME2)
FROM STXH
WHERE TDID = '0001'
AND TDOBJECT = 'MVKE'
AND TDNAME like L_NAME
AND TDSPRAS = '1'.
CLEAR T_VBAP-L_TEXT.
IF TDSPRAS <> ''.
CALL FUNCTION 'READ_TEXT'
EXPORTING
CLIENT = SY-MANDT
ID = '0001'
LANGUAGE = '1'
NAME = L_NAME2
OBJECT = 'MVKE'
TABLES
LINES = T_LINES.
LOOP AT T_LINES.
CONCATENATE T_VBAP-L_TEXT T_LINES-TDLINE INTO T_VBAP-L_TEXT SEPARATED BY ' '.
ENDLOOP.
CLEAR T_LINES.
SPLIT T_VBAP-L_TEXT AT '*' INTO T_VBAP-CWB_MS T_VBAP-CWB_BM.
MODIFY T_VBAP.
ENDIF.
上面的这种方法存在一种缺陷,没有考虑周到,存在这样一种情况:
比如物料A:matnr(test_001)没有维护相关的销售长文本,物料B:matnr(test_001_1)维护了相关的物料长文本,如果要查物
料A的销售长文本也是可以查到的,为什么呢?因为物料A的模糊查询条件为'test_001%1200%',这种情况就把物料B的销售长文本取给物料A
了,那还有没有方法可以改进了呢?下面介绍本人的方法,如果大家有好的不妨一块讨论:
DATA: TDSPRAS TYPE STXH-TDSPRAS.
DATA: L_NAME LIKE THEAD-TDNAME,
L_NAME2 LIKE STXH-TDNAME.
DATA: T_LINES LIKE TLINE OCCURS 0 WITH HEADER LINE.
*** 定义临时物料编码
data: l_matnr like mara-matnr.
*** 定义一个内表用于存储长文本相关信息
data: begin of t_text occurs 0,
tdspras like stxh-tdspras,
tdname like stxh-tdname,
end of t_text.
CLEAR L_NAME.
CLEAR L_NAME2.
CONCATENATE T_VBAP-MATNR '%' '1200' '%' INTO L_NAME. ”模糊查询条件
CLEAR TDSPRAS.
SELECT TDSPRAS TDNAME
into corresponding fields of table t_text
FROM STXH
WHERE TDID = '0001'
AND TDOBJECT = 'MVKE'
AND TDNAME like L_NAME
AND TDSPRAS = '1'.
**** 根据物料编码进行比较
loop at t_text.
l_matnr = t_text-tdname(18) "取前18位作为物料编码
if l_matnr = matnr. "与当前的物料编码进行比较,只有相等
tdspras = t_text-tdspras.
l_name2 = t_text-tdname.
exit.
endif.
endloop.
CLEAR T_VBAP-L_TEXT.
IF TDSPRAS <> ''.
CALL FUNCTION 'READ_TEXT'
EXPORTING
CLIENT = SY-MANDT
ID = '0001'
LANGUAGE = '1'
NAME = L_NAME2
OBJECT = 'MVKE'
TABLES
LINES = T_LINES.
LOOP AT T_LINES.
CONCATENATE T_VBAP-L_TEXT T_LINES-TDLINE INTO T_VBAP-L_TEXT SEPARATED BY ' '.
ENDLOOP.
CLEAR T_LINES.
SPLIT T_VBAP-L_TEXT AT '*' INTO T_VBAP-CWB_MS T_VBAP-CWB_BM.
MODIFY T_VBAP.
ENDIF.