### SE75 与 SmartForms 包含文本的集成应用详解
SAP SE75 与 SmartForms 的“包含文本”功能共同构成了业务单据长文本在打印表单中输出的完整解决方案。SE75 负责定义和查询文本存储的元数据规则,而 SmartForms 则提供可视化的文本排版与输出能力。两者的核心衔接点在于:**通过 SE75 获取正确的文本对象(`TDOBJECT`)和文本 ID(`TDID`),在 ABAP 程序中读取长文本,然后将文本内容传递给 SmartForms 的“包含文本”节点进行格式化显示**[ref_1][ref_5]。
#### 一、核心概念与流程总览
| 组件 | 角色 | 关键输出 | 与另一组件的关系 |
| :--- | :--- | :--- | :--- |
| **SE75** | **文本元数据管理器** | 文本对象 (`TDOBJECT`)、文本 ID (`TDID`)、文本名称描述。 | 为 ABAP 程序提供读取文本所需的“钥匙”(`TDOBJECT`, `TDID`)[ref_1]。 |
| **ABAP 程序** | **数据读取与传递者** | 包含长文本内容的内表(如 `TLINES`)或字符串。 | 调用 SE75 提供的“钥匙”,使用 `READ_TEXT` 读取文本,并封装成 SmartForms 接口要求的结构[ref_1][ref_5]。 |
| **SmartForms** | **文本排版与输出器** | 最终打印或预览的文档,其中长文本按指定样式嵌入。 | 通过“包含文本”节点接收并渲染 ABAP 程序传递来的文本数据流[ref_1][ref_3]。 |
**标准集成流程如下:**
1. **需求分析**:确定需要打印哪个业务单据(如销售订单 VA03)的哪类文本(如抬头备注、行项目说明)。
2. **SE75 查询**:使用 SE75 的“文本对象”功能,根据程序名(如 `SAPMV45A`)查询到对应的 `TDOBJECT` (如 `VBBK`) 和 `TDID` (如 `0001`)[ref_1]。
3. **ABAP 程序开发**:在调用 SmartForms 的函数模块(`SSF_FUNCTION_MODULE_NAME`)前后,编写代码读取文本并填入 SmartForms 的输入参数。
4. **SmartForms 设计**:在表单中插入“包含文本”节点,并配置其数据源绑定。
5. **测试与发布**:执行程序,测试文本是否正确读取并显示在表单上。
#### 二、SE75 查询:获取文本访问密钥
这是整个流程的起点。以在销售订单打印表单中显示“订单抬头文本”为例:
1. 执行事务码 **`SE75`**。
2. 点击 **`文本对象`** 按钮。
3. 在弹出窗口中,切换到 **`按程序`** 页签。
4. 在“程序”字段中输入销售订单相关的事务码(如 `VA03`)或主程序名(如 `SAPMV45A`),然后执行(F8)[ref_1]。
5. 系统会列出所有相关的文本对象。查找描述为“订单抬头文本”的行,通常对应:
* **文本对象**:`VBBK`
* **文本 ID**:`0001`
* **文本名**:通常为销售订单号(`VBAK-VBELN`)
*此步骤确定了读取文本所需的核心参数,这些参数将用于后续的 ABAP 代码中[ref_1]。*
#### 三、ABAP 程序:读取文本并封装数据
在调用 SmartForms 的打印程序(通常是 `ABAP Report` 或 `Module Pool`)中,需要完成文本的读取与传递。假设 SmartForms 名称为 `ZSD_SO_PRINT`,其函数模块接口中有一个用于接收文本的输入参数 `IT_LINES`(类型为 `TLINE` 的内表)。
**关键 ABAP 代码示例:**
```abap
REPORT zsd_read_text_for_smartform.
DATA: lv_formname TYPE tdsfname VALUE 'ZSD_SO_PRINT',
lv_fm_name TYPE rs38l_fnam,
ls_control TYPE ssfctrlop,
ls_output TYPE ssfcompop,
lt_lines TYPE TABLE OF tline. " 存储读取到的文本行
DATA: lv_vbeln TYPE vbeln. " 销售订单号,假设从选择屏幕或其它地方获取
PARAMETERS: p_vbeln TYPE vbeln.
START-OF-SELECTION.
lv_vbeln = p_vbeln.
" 1. 根据 SE75 查询结果,读取销售订单抬头文本
PERFORM read_order_header_text USING lv_vbeln
CHANGING lt_lines.
" 2. 获取 SmartForms 生成的函数模块名称
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = lv_formname
IMPORTING
fm_name = lv_fm_name
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
" 3. 准备打印控制参数(可选)
ls_output-tddest = 'LP01'. " 打印机或输出设备
ls_control-no_dialog = 'X'. " 不显示打印对话框
" 4. 调用 SmartForms 函数模块,并传入文本数据
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_control
output_options = ls_output
user_settings = ' '
is_vbak = ls_vbak " 假设还有其他订单抬头数据
IMPORTING
document_output_info = ls_doc_info
job_output_info = ls_job_info
TABLES
it_lines = lt_lines " 将读取的文本传递给SmartForms
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*&---------------------------------------------------------------------*
*& Form READ_ORDER_HEADER_TEXT
*&---------------------------------------------------------------------*
FORM read_order_header_text USING iv_vbeln TYPE vbeln
CHANGING ct_lines TYPE tline_tab.
DATA: ls_header TYPE thead.
CLEAR: ct_lines.
" 构建文本读取的关键字(来自SE75查询结果)
ls_header-tdobject = 'VBBK'. " 文本对象:销售凭证抬头
ls_header-tdid = '0001'. " 文本ID:订单抬头文本
ls_header-tdname = iv_vbeln. " 文本名称:销售订单号
ls_header-tdspras = sy-langu. " 语言
" 调用标准函数读取长文本
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = ls_header-tdid
language = ls_header-tdspras
name = ls_header-tdname
object = ls_header-tdobject
TABLES
lines = ct_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.
" 可以初始化一条“无文本”的记录,避免SmartForms接收空表出错
CLEAR ct_lines.
ct_lines = VALUE #( ( tdline = '(No Text)' ) ).
ENDIF.
ENDFORM.
```
*这段代码清晰地展示了如何将 SE75 查询到的元数据(`VBBK`, `0001`)应用于 `READ_TEXT` 函数,并将结果 `lt_lines` 传递给 SmartForms [ref_1][ref_5]。*
#### 四、SmartForms 设计:配置“包含文本”节点
在 SmartForms 设计器(事务码 `SMARTFORMS` 或 `SFP`)中,将文本内容嵌入表单的步骤如下:
1. **打开表单**:创建或打开目标表单(如 `ZSD_SO_PRINT`)。
2. **插入节点**:在需要显示长文本的窗口(Window)或表格行(Table Row)中,从右侧元素列表拖拽 **`包含文本`** 节点到画布上。
3. **绑定数据源**:
* 选中“包含文本”节点,在属性窗口的 **`文本`** 标签页下,找到 **`文本源`** 区域。
* 在 **`包含来自它处的文本`** 选项中,选择 **`来自程序`**。
* 在 **`行`** 输入框中,绑定从 ABAP 程序传入的内表。例如,如果 ABAP 程序传入的参数名为 `IT_LINES`,则此处应输入 `IT_LINES[]`。如果传入的是单个结构,则输入结构名[ref_1][ref_3]。
4. **配置文本格式**(可选):
* 在 **`段落格式`** 中,可以指定一个在 **`SE72`** 中定义的段落样式,以控制字体、缩进、行距等。
* 如果文本内表(`TLINE`)的 `TDFORMAT` 字段已包含样式信息,则此处可不填,系统会自动应用[ref_5]。
**“包含文本”节点的核心属性配置表:**
| 属性区域 | 配置项 | 说明与示例 |
| :--- | :--- | :--- |
| **文本源** | 包含来自它处的文本 | 选择“来自程序”。 |
| | 行 | 绑定程序传入的内表变量,如 `IT_LINES[]`。这是关键的数据绑定步骤[ref_1]。 |
| **段落格式** | 段落格式 | 输入预定义的段落样式名(在SE72中维护),如 `正文`。用于统一控制文本外观。 |
| **输出选项** | 立即输出文本 | 通常勾选,确保文本内容在节点位置立即输出,而非仅定义文本对象。 |
#### 五、高级应用与注意事项
1. **多语言文本处理**:
* `READ_TEXT` 函数可通过 `language` 参数读取特定语言版本的文本。在 SmartForms 中,如果传入的 `lt_lines` 包含多种语言,系统会根据输出设备的语言或默认语言自动选择[ref_1]。
2. **文本格式转换**:
* 有时从系统读取的文本是 ITF (Interchange Text Format) 格式。如果需要以纯文本或 HTML 格式输出,可以在 ABAP 端使用 `TEXT_CONVERT_ITF_TO_*` 系列函数进行转换,再将结果字符串传递给 SmartForms[ref_1]。
3. **处理无文本情况**:
* 如上述代码示例所示,当 `READ_TEXT` 未找到文本时(`sy-subrc <> 0`),建议向 SmartForms 传递一个包含默认内容(如 `'(No Text)'`)的行,以避免因传入空内表可能引起的显示问题或转 PDF 时的格式错乱[ref_3]。
4. **性能考量**:
* 如果单据文本量极大,需评估对打印性能的影响。SmartForms 的“包含文本”节点能很好地处理分页,长文本会自动延续到下一页[ref_1][ref_3]。
5. **与标准文本(SO10)的区别**:
* SE75/`READ_TEXT` 管理的是**业务对象相关的长文本**(如订单备注、物料描述)。
* 事务码 **`SO10`** 维护的是**标准文本**(如公司抬头、通用条款)。在 SmartForms 中调用标准文本,应使用 **`文本模块`** 节点,而不是“包含文本”节点[ref_2][ref_5]。
**总结**:将 SE75 与 SmartForms 的“包含文本”节点结合使用,是实现业务单据长文本动态、格式化打印的标准且强大的方法。开发的关键在于通过 SE75 准确获取文本标识(`TDOBJECT`/`TDID`),在 ABAP 程序中可靠地读取文本数据,并在 SmartForms 中正确绑定数据源。此方案广泛应用于销售订单、采购订单、发票、交货单等所有需要附带自定义长文本的 SAP 打印表单中[ref_1][ref_3][ref_5]。