现在的位置: 首页 > 综合 > 正文

sap 如何正确的取物料主数据的销售长文本

2013年05月09日 ⁄ 综合 ⁄ 共 2237字 ⁄ 字号 评论关闭
如何正确的取物料主数据的销售长文本呢?今天在取它的时候发生了一个典型的错误了,在这之前一直认为没有必要发blog讲这个东西,因为认为比较简单,就跟取普通的长文本一个性质,但我错了,真的错了!下面来看看物料主数据的销售长文本:

在上图中,在取物料主数据的销售长文本,必须要知道这个物料对应的销售组织、分销渠道,这样才能决定值是唯一的!

上图就是能过函数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.

抱歉!评论已关闭.