获取文本描述(READ_TEXT)

该博客介绍了如何在ABAP中使用READ_TEXT函数从数据库获取指定对象的长文本信息,并将其存储到内表中。通过遍历内表并读取不同ID的长文本,将结果分别存入目标内表的不同字段。
DATA: BEGIN OF  i_stxh  OCCURS  0,         "定义传参所需的参数的内表
     tdobject 
LIKE  stxh - tdobject,
     tdname 
LIKE  stxh - tdname,
     tdid     
LIKE  stxh - tdid,
     tdspras  
LIKE  stxh - tdspras,
     
END OF  i_stxh.

DATA:BEGIN OF  it_longtext  OCCURS  0,          "存储长文本信息的内表
       tdobject 
LIKE  stxh - tdobject,
       tdname 
LIKE  stxh - tdname,
       tdid     
LIKE  stxh - tdid,
       tdspras  
LIKE  stxh - tdspras,
       tdformat 
TYPE  tline - tdformat,
       tdline 
TYPE  tline - tdline,
  
END OF  it_longtext.

DATA: BEGIN OF  it_read  OCCURS  0,       "函数传参时的内表
tdformat 
TYPE  tline - tdformat,
 tdline 
TYPE  tline - tdline,
END OF  it_read.

SELECT tdobject tdname tdid tdspras
      
INTO CORRESPONDING FIELDS OF TABLE i_stxh
      
FROM  stxh
    
<think>嗯,用户这次的问题很具体:需要在SAPR/3环境下用ABAP编写后台作业程序来获取所有语言的物料长文本。从对话历史看,用户对ABAP有一定基础,之前讨论过类方法调用和语法细节,还提到过READ_TEXT_TABLE方法,这应该是个关键切入点。用户引用资料里其实藏着重要线索。引用[1]提到"理解ABAP方法调用传引用和传值差异",暗示待会处理参数要注意;引用[3]的内表操作技巧对存储多语言文本很重要;引用[4]的FORALLENTRIES优化建议则提醒要考虑性能问题。不过用户明确说要基于SAPR/3版本,得注意不能用新语法特性。深入分析需求:1)要抓所有语言物料长文本2)用后台作业跑3)用标准方法READ_TEXT_TABLE。难点在于:长文本SAP是分文本行存储的,且语言版本分散在多个文本对象里。突然想到MAKT表存物料描述,但长文本实际在STXH/STXL表,这个得说明清楚。技术方案框架逐渐清晰:先选语言列表(查T002表),再获取有效物料号(避免空跑),然后轮询每种语言调用READ_TEXT_TABLE。特别注意文本表的多层结构:文本ID(TDOBJECT)固定为"MATERIAL",文本名(TDNAME)对应物料号,文本类型(TDID)可能是"GRUN"基础文本或自定义类型。后台作业配置部分要提醒关键参数:作业名建议包含Z标识,变式保存选择条件,输出方式选假打印避免真打印。突然意识到用户可能需要输出到ALV或文件,所以补充了内表转Excel的通用方案。最后检查是否覆盖所有点:多语言支持(通过SY-LANGU动态切换)、大物料量处理(分批次提交)、错误处理(SY-SUBRC监控)。还特意警告了TEXT_CONTENT可能包含换行符导致导出异常,这个坑实际开发经常遇到。</think> 在 SAP R/3 中通过后台作业批量获取所有语言的物料长文本,需结合 `READ_TEXT_TABLE` 方法、语言主数据处理和内表操作技术。以下是完整实现方案: --- ### 完整 ABAP 程序示例 (ZMM_READ_MATERIAL_TEXT_JOB) ```abap REPORT zmm_read_material_text_job. TABLES: mara. " 物料主数据表 DATA: gt_matnr TYPE RANGE OF matnr, " 物料号选择范围 gt_languages TYPE TABLE OF t002, " 系统支持的语言表 gt_text TYPE TABLE OF tline, " 长文本存储内表 gv_object TYPE thead-tdobject VALUE 'MATERIAL', " 文本对象 gv_id TYPE thead-tdid VALUE 'GRUN'. " 文本类型(基础文本) SELECT-OPTIONS: s_matnr FOR mara-matnr. " 物料选择条件 START-OF-SELECTION. * 1. 获取系统所有语言 SELECT * INTO TABLE gt_languages FROM t002 WHERE spras IS NOT NULL. " 排除空语言[^1] * 2. 批处理核心逻辑 LOOP AT gt_languages ASSIGNING FIELD-SYMBOL(<lang>). LOOP AT s_matnr ASSIGNING FIELD-SYMBOL(<matnr>). REFRESH gt_text. * 3. 调用长文本读取方法 CALL FUNCTION 'READ_TEXT_TABLE' " 关键文本读取函数 EXPORTING client = sy-mandt object = gv_object name = <matnr>-low " 物料号作为文本名 id = gv_id language = <lang>-spras " 动态语言 TABLES text_table = gt_text EXCEPTIONS wrong_access_to_archive = 1 OTHERS = 2. * 4. 存储结果(添加语言标识) IF sy-subrc = 0. DATA(ls_result) = VALUE zbcd_material_texts( " 自定义结构 matnr = <matnr>-low, spras = <lang>-spras, text_lines = gt_text[] ). " 内表深拷贝[^3] APPEND ls_result TO gt_output. ENDIF. ENDLOOP. ENDLOOP. * 5. 结果输出(示例:生成Excel文件) CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING filename = 'C:\TEMP\MATERIAL_TEXTS.XLSX' filetype = 'BIN' TABLES data_tab = gt_output. ``` --- ### 配置为后台作业的步骤 1. **事务码 `SM36` 创建作业** - 作业名:`Z_MAT_TEXT_JOB` - 作业类:`A`(高优先级) 2. **配置执行变式** ```abap PROGRAM = zmm_read_material_text_job VARIANT = * " 保存选择条件的变式 ``` 3. **计划执行时间** - 选择"周期性作业" - 设置每日/每周执行周期 4. **输出管理** - 选择"假打印" → 保存日志不实际打印[^2] --- ### 关键实现说明 1. **多语言支持逻辑** - 通过 `T002` 表获取语言列表实现动态切换 - 每个语言循环调用文本读取函数: ```abap language = <lang>-spras ``` 2. **性能优化** - 使用内表缓存结果而非逐条数据库提交 - 对于海量物料建议分批处理: ```abap SELECT matnr FROM mara INTO TABLE gt_matnr WHERE ... PACKAGE SIZE 1000. " 分批次读取 ``` 3. **数据结构建议** ```abap TYPES: BEGIN OF zbcd_material_texts, matnr TYPE matnr, spras TYPE spras, text_table TYPE TABLE OF tline, END OF zbcd_material_texts. ``` > **文本行数据结构**:`TLINE` 包含字段 `TDLINE`(文本内容), `TDFORMAT`(格式)[^3] --- ### 常见问题处理 1. **缺失文本处理** ```abap IF gt_text IS INITIAL. APPEND VALUE #( matnr = <matnr> spras = <lang> text = 'NO TEXT' ) TO gt_output. ENDIF. ``` 2. **长文本截断问题** ```abap CALL FUNCTION 'READ_TEXT_TABLE' EXPORTING ... ARCHIVEHANDLE = lo_archive " 启用归档支持 ``` 3. **授权检查** - 事务码 `SU53` 检查缺失权限 - `AUTHORITY-CHECK OBJECT 'M_MATE_WRK'` --- **运行结果示例**: | 物料号 | 语言 | 文本内容 | |------------|------|---------------------------| | MAT-1001 | EN | Steel cylinder DN50 | | MAT-1001 | ZH | 钢制缸体 DN50 | | MAT-2002 | DE | Elektromotor 5kW | --- ### 注意事项 1. **文本对象与类型** - 标准文本对象:`MATERIAL` - 常用文本类型: - `GRUN` (基础文本) - `BEST` (采购文本) - `KTEXT` (描述) 2. **大文本处理警告** > 单条文本超过 255 行时需处理 `TEXT_CONTENT` 和 `TEXT_STREAM` 字段[^4] 3. **系统兼容性** - `READ_TEXT_TABLE` 支持 SAP R/3 4.6C 以上版本 - 旧版系统使用 `READ_TEXT` 函数 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值