如何在ABAP中拼接READ_TEXT输出以替换物料长文本列
技术解决方案:物料长文本读取与展示
一、内部表GT_NAZIV_MAT的正确定义
READ_TEXT函数返回的文本行结构是TDLINE,你需要定义一个关联物料号与拼接后长文本的自定义结构,再基于该结构创建内部表,这样能精准对应每个物料的长文本数据:
TYPES: BEGIN OF ty_naziv_mat, matnr TYPE mseg-matnr, " 物料号,用于关联原数据 long_text TYPE string, " 存储拼接后的完整长文本 END OF ty_naziv_mat. DATA: gt_naziv_mat TYPE STANDARD TABLE OF ty_naziv_mat WITH KEY matnr. DATA: gs_naziv_mat TYPE ty_naziv_mat. DATA: gt_lines TYPE STANDARD TABLE OF tdline. " 临时存储READ_TEXT返回的单行文本 DATA: gs_line TYPE tdline.
二、INITIALIZATION代码段的适用性判断
INITIALIZATION是程序/屏幕初始化阶段执行的代码块,仅当你需要在程序启动时预加载所有物料长文本时才适合用它。如果是在筛选特定物料范围后才需要读取文本,建议把读取逻辑放在START-OF-SELECTION或数据处理主逻辑块中,避免提前加载冗余数据拖慢性能。
三、完整的长文本读取与拼接逻辑示例
以下是核心代码片段,包含去重读取、文本拼接及异常处理:
START-OF-SELECTION. " 假设已获取待处理的物料清单(比如从MSEG中筛选) DATA: gt_mseg TYPE STANDARD TABLE OF mseg. SELECT matnr FROM mseg INTO TABLE gt_mseg WHERE ... " 你的业务筛选条件 " 物料号去重,避免重复调用READ_TEXT浪费资源 SORT gt_mseg BY matnr. DELETE ADJACENT DUPLICATES FROM gt_mseg COMPARING matnr. " 循环读取每个物料的长文本 LOOP AT gt_mseg INTO DATA(gs_mseg). CALL FUNCTION 'READ_TEXT' EXPORTING client = sy-mandt id = 'GRUN' language = 'HR' name = gs_mseg-matnr object = 'MATERIAL' TABLES lines = gt_lines EXCEPTIONS id = 1 language = 2 name = 3 not_found = 4 object = 5 reference_check = 6 wrong_access_to_archive = 7 OTHERS = 8. IF sy-subrc = 0. " 拼接所有文本行为单行,用空格分隔(可按需替换成换行符等) CLEAR gs_naziv_mat-long_text. LOOP AT gt_lines INTO gs_line. CONCATENATE gs_naziv_mat-long_text gs_line-tdline INTO gs_naziv_mat-long_text SEPARATED BY space. ENDLOOP. gs_naziv_mat-matnr = gs_mseg-matnr. APPEND gs_naziv_mat TO gt_naziv_mat. ELSE. " 处理无长文本的情况,可自定义默认值 gs_naziv_mat-matnr = gs_mseg-matnr. gs_naziv_mat-long_text = '无长文本描述'. APPEND gs_naziv_mat TO gt_naziv_mat. ENDIF. CLEAR gt_lines. ENDLOOP. " 后续可将gt_naziv_mat与STXH/STHL原数据关联,替换原40字符列
四、关键注意事项
- 性能优化:必须对物料号去重,大批量物料场景下,可考虑批量调用
READ_TEXT或并行处理提升效率。 - 语言适配:如果是多语言系统,建议用
sy-langu动态获取当前登录语言,替代固定的'HR'。 - 异常处理:不要忽略
READ_TEXT的异常分支,尤其是NOT_FOUND(物料无长文本)的情况,需做友好处理。
内容的提问来源于stack exchange,提问作者krumpirko8888
相关产品推荐
相关产品推荐

