SAP ABAP 长文本的显示、保存、删除处理

文章详细介绍了在SAP系统中如何管理和操作长文本,包括存储在STXH和STXL表中的信息,以及通过ABAP代码进行的初始化、保存、显示和删除操作。配置在V_TTXIDI和V_TTXOBI视图中进行,且长文本不能直接查看,需通过程序读取在界面上显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SAP中所有的长文本都存在如下两张表中:

  • STXH 长文本的抬头信息
  • STXL 长文本的明细信息

长文本在使用前,需要先进行配置,如果不配置是不可能往表STXH和STXL中写入文本值的。

配置在视图V_TTXIDI和视图V_TTXOBI中进行。

前台事务代码:SE75

 

保存之后,双击“ZSD001”进入维护ID。 

相应的对长文本进行增加、保存、删除的ABAP代码示例如下:把

变量的声明

DATA: lines TYPE STANDARD TABLE OF tline ,
      it_line TYPE TABLE OF line,
      header LIKE thead .
DATA: container1 TYPE REF TO cl_gui_custom_container,
      editor1    TYPE REF TO cl_gui_textedit.
DATA: ok_code LIKE sy-ucomm,
      save_ok LIKE sy-ucomm.

 

长文本的初始化

  IF container1 IS INITIAL.
    CREATE OBJECT:container1 EXPORTING container_name = 'COMMENT1',
                  editor1    EXPORTING parent = container1.
  CALL METHOD editor1->set_statusbar_mode
    EXPORTING
      statusbar_mode = 0.
 
  CALL METHOD editor1->set_toolbar_mode
    EXPORTING
      toolbar_mode = 0.
ENDIF.
  CALL METHOD editor1->set_text_as_stream
    EXPORTING
      text = it_line.

长文本的保存

 REFRESH it_line.
  CALL METHOD editor1->get_text_as_stream
    IMPORTING
      text = it_line.
*--长文本保存
    header-tdobject  = 'Z_TEST01'.     "object
    header-tdname    = '001'.
    header-tdid      = 'LTXT'.
    header-tdspras   = sy-langu.
    CALL FUNCTION 'CONVERT_STREAM_TO_ITF_TEXT'
      EXPORTING
        language    = sy-langu
      TABLES
        text_stream = it_line
        itf_text    = lines.
    CALL FUNCTION 'SAVE_TEXT'
      EXPORTING
        header          = header
        savemode_direct = 'X'
      TABLES
        lines           = lines
      EXCEPTIONS
        id              = 1
        language        = 2
        name            = 3
        object          = 4
        OTHERS          = 5.
    CLEAR header.
    REFRESH lines.

长文本的显示

   header-tdobject  = 'Z_TEST01'.     "object
   header-tdname    = '001'.
   header-tdid      = 'LTXT'.
   header-tdspras   = sy-langu.
   CALL FUNCTION 'READ_TEXT'
     EXPORTING
       id                      = header-tdid
       language                = sy-langu
       name                    = header-tdname
       object                  = header-tdobject
     TABLES
       lines                   = lines
     EXCEPTIONS
       id                      = 1
       language                = 2
       name                    = 3
       not_found               = 4
       object                  = 5
       reference_check         = 6
       wrong_access_to_archive = 7
       OTHERS                  = 8.
   CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT'
     EXPORTING
       language    = sy-langu
     TABLES
       itf_text    = lines
       text_stream = it_line.
   CALL METHOD editor1->set_statusbar_mode
     EXPORTING
       statusbar_mode = 0.
   CALL METHOD editor1->set_toolbar_mode
     EXPORTING
       toolbar_mode = 0.
   CALL METHOD editor1->set_text_as_stream
     EXPORTING
       text = it_line.
   CALL METHOD editor1->set_readonly_mode
     EXPORTING
       readonly_mode = '1'.

长文本的删除

header-tdobject  = 'Z_TEST01'.     "object
   header-tdname    = '001'.
   header-tdid      = 'LTXT'.
   header-tdspras   = sy-langu.
  CALL FUNCTION 'DELETE_TEXT'
   EXPORTING
       id                      = header-tdid
       language                = sy-langu
       name                    = header-tdname
       object                  = header-tdobject
*     SAVEMODE_DIRECT       = ' '
*     TEXTMEMORY_ONLY       = ' '
*     LOCAL_CAT             = ' '
*   EXCEPTIONS
*     NOT_FOUND             = 1
*     OTHERS                = 2
          .
  IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

在ABAP的长文本操作中,我们是无法直接看到存储的长文本的,只能通过程序读取长文本在界面中显示,这点是和其他类型的变量区别开来的。

<think>我们正在处理的是采购订单(Purchase Order)中的运费短文本问题。注意用户之前的问题是关于销售订单的运费,但这次明确提到了“运费采购订单短文本”,因此我们需要关注采购模块(MM)的相关信息。 在SAP中,采购订单的文本信息通常存储在文本表(如STXH和STXL)中,并通过对象键关联到采购订单行项目。具体到运费相关的短文本,我们需要考虑以下方面: 1. **采购订单文本类型**: - 采购订单行项目文本通常使用文本类型`F`(行项目文本)。 - 另外,运费信息可能通过条件类型(如`FRA1`,`FRA2`等)在定价中体现,但文本描述可能单独存储。 2. **关键表和字段**: - **EKPO**:采购订单行项目表,其中`TXTYP`字段指示文本类型,`TXZ01`字段存储行项目的短文本(通常用于物料描述,但运费可能不在此处)。 - **STXH**:文本抬头表,存储文本的抬头信息(如文本名称、对象等)。 - **STXL**:文本行表,存储具体的文本内容(长文本,但短文本也可能存储在这里的一行中)。 - 关联关系:采购订单行项目(EKPO)通过采购订单号(EBELN)和行项目号(EBELP)与文本表关联。文本表的对象键(TDOBJECT)为`EKKO`(采购订单抬头)或`EKPO`(采购订单行项目),文本对象(TDID)根据文本类型而定。 3. **运费相关文本的存储**: - 运费条件类型在采购订单定价中配置,但短文本可能存储在条件记录中(表KONP)的`KTEXT`字段,或者通过文本标识存储在文本表中。 - 在采购订单行项目中,运费可能作为一个条件行(类似销售订单的KONV),但采购订单的条件表是`KONV`(与销售订单共用)或采购特定的条件表(如AXXX条件表,但通常KONV是通用的)。 4. **如何查看或修改**: - **查看**:通过事务代码ME23N查看采购订单,在行项目中选择“项目明细”->“条件”页签,可以看到运费条件类型,然后点击该条件类型旁边的文本图标(或按F2)可以查看文本。或者,在行项目的“文本”页签查看行项目文本。 - **修改**:在修改采购订单(ME22N)时,同样可以进入条件页签或文本页签修改。 5. **ABAP中如何访问**: - 首先,我们需要获取采购订单行项目对应的条件记录(条件类型为运费条件类型,如`FRA1`),然后从条件记录中获取文本标识,再读取文本表。 - 或者,直接读取行项目的文本(通过文本对象和文本标识)。 具体步骤: ### 1. **定位运费条件行** 在采购订单中,运费通常作为条件类型出现在定价行中。表`KONV`存储条件值,但采购订单的条件编号存储在表`EKKO`(抬头)和`EKPO`(行项目)中。采购订单抬头的条件编号存储在`EKKO-KNUMV`,行项目没有单独的条件编号,通常使用抬头的条件编号。 因此,我们可以通过以下方式获取条件行: ```abap DATA: lv_ebeln TYPE ebeln, " 采购订单号 lv_ebelp TYPE ebelp. " 行项目号(如果是特定行) SELECT SINGLE knumv FROM ekko INTO @DATA(lv_knumv) WHERE ebeln = @lv_ebeln. IF sy-subrc = 0. SELECT * FROM konv WHERE knumv = @lv_knumv AND kschl LIKE 'FRA%' " 运费条件类型通常以FRA开头 AND ( kposn = @lv_ebelp OR kposn = '00000' ) " 行项目号(00000表示抬头条件) INTO TABLE @DATA(lt_konv). ENDIF. ``` 在采购订单中,条件可以出现在抬头(行项目号00000)或行项目(具体行项目号)。所以上述查询条件中包含了行项目号。 ### 2. **读取条件文本** 条件记录中的文本标识存储在`KONV-TXTPF`(文本标识)字段。然后我们可以使用函数`READ_TEXT`读取文本内容。 例如: ```abap LOOP AT lt_konv ASSIGNING FIELD-SYMBOL(<fs_konv>). DATA: lv_text_object TYPE thead-tdobject VALUE 'KONV', " 对象为条件 lv_text_id TYPE thead-tdid VALUE '0001', " 文本ID,条件文本通常是0001 lv_text_name TYPE thead-tdname. " 文本名称,由条件记录号等构成 " 构建文本名称:通常由条件记录号(KONV-KNUMV_KO)组成,但有时也使用其他逻辑 " 注意:条件记录号(KONV-KNUMV_KO)是条件记录的编号,不是条件编号(KNUMV) " 如果条件记录号不为空,则使用它 IF <fs_konv>-knumv_ko IS NOT INITIAL. lv_text_name = <fs_konv>-knumv_ko. ELSE. " 否则,我们可以尝试构建:例如,条件类型+采购订单号+行项目号 CONCATENATE <fs_konv>-kschl lv_ebeln <fs_konv>-kposn INTO lv_text_name. ENDIF. CALL FUNCTION 'READ_TEXT' EXPORTING id = lv_text_id language = sy-langu name = lv_text_name object = lv_text_object TABLES lines = lt_lines EXCEPTIONS id = 1 language = 2 name = 3 not_found = 4 object = 5 reference_check = 6 wrong_access_to_archive = 7 OTHERS = 8. " lt_lines中存储了文本行,短文本通常在第一行 IF sy-subrc = 0 AND lt_lines IS NOT INITIAL. DATA(lv_short_text) = lt_lines[ 1 ]-tdline. ENDIF. ENDLOOP. ``` ### 3. **直接读取采购订单行项目文本** 另外,采购订单行项目本身可能有文本(比如在行项目中直接输入的文本),我们可以通过以下方式读取: ```abap DATA: lv_object TYPE thead-tdobject VALUE 'EKPO', " 对象为采购订单行项目 lv_id TYPE thead-tdid VALUE 'F', " 文本ID,行项目文本通常为F lv_name TYPE thead-tdname. " 文本名称:采购订单号+行项目号 CONCATENATE lv_ebeln lv_ebelp INTO lv_name. CALL FUNCTION 'READ_TEXT' EXPORTING id = lv_id language = sy-langu name = lv_name object = lv_object TABLES lines = lt_lines EXCEPTIONS ... " 同上 IF sy-subrc = 0. " 同样,短文本在第一行 ENDIF. ``` ### 4. **修改文本** 修改文本需要使用函数`SAVE_TEXT`(先删除旧文本再保存新文本)或直接使用`WRITE_TEXT`(覆盖)。但通常修改文本会通过标准事务进行,在ABAP中修改需要谨慎。 例如,修改条件文本: ```abap DATA: lt_lines TYPE TABLE OF tline. " 准备新文本 APPEND INITIAL LINE TO lt_lines ASSIGNING FIELD-SYMBOL(<line>). <line>-tdline = '新的运费文本'. CALL FUNCTION 'SAVE_TEXT' EXPORTING header = ls_header " 类型THEAD,包含object, id, name等 savemode_direct = abap_true TABLES lines = lt_lines EXCEPTIONS ... ``` 其中,`ls_header`需要设置: ```abap ls_header-tdobject = 'KONV'. ls_header-tdid = '0001'. ls_header-tdname = lv_text_name. " 同读取时构建的名称 ls_header-tdspras = sy-langu. ``` ### 总结: - **查看位置**:采购订单运费短文本可能存储在条件记录(KONV关联的文本)或行项目文本(EKPO关联的文本)中。 - **关键表**:`KONV`(条件行),`EKPO`(行项目),文本表(STXH/STXL,通过函数`READ_TEXT`访问)。 - **ABAP访问**:使用函数`READ_TEXT`读取文本,使用`SAVE_TEXT`或`WRITE_TEXT`修改文本。 注意:实际项目中,文本的存储方式可能因客户定制而异,建议先通过标准事务查看文本,然后使用ST05跟踪确定具体表。 --- ### §§相关问题§§ 1. 如何通过ABAP代码读取采购订单行项目的所有文本? 2. SAP中采购订单运费条件类型的配置步骤是什么? 3. 采购订单运费计算逻辑在SAP中如何实现? 4. 如何通过ST05跟踪工具定位采购订单文本存储的表? 5. 采购订单文本对象(TDID)有哪些常见类型?</think>### SAP ABAP 中运费采购订单短文本的定位与操作 在 SAP 系统中,采购订单(Purchase Order)的运费短文本主要通过**文本对象(Text Object)** 技术存储,核心表和字段如下: #### 1. **关键表及字段** | 表名 | 字段名 | 说明 | |---------------|---------------|----------------------------------------------------------------------| | **EKPO** | `TXZ01` | **行项目短文本**(直接存储采购订单行项目的短文本描述)[^1] | | | `EBELN` | 采购订单号(关联文本对象) | | | `EBELP` | 行项目号(关联文本对象) | | **STXH** | `TDOBJECT` | 文本对象(采购订单固定为 `EKPO`) | | | `TDNAME` | 文本对象键值(由 `EBELN` + `EBELP` 组成) | | | `TDID` | 文本ID(运费文本通常为 `F` 或定制类型) | | **STXL** | `TDLINE` | **实际文本内容**(存储运费描述的长文本)[^2] | #### 2. **ABAP 查看运费短文本** ```abap DATA: lt_lines TYPE TABLE OF tline. CALL FUNCTION 'READ_TEXT' EXPORTING id = 'F' " 文本ID(行项目文本) language = sy-langu name = |{ vbeln }{ posnr }| " 组合键:订单号+行项目号 object = 'EKPO' " 采购订单文本对象 TABLES lines = lt_lines. LOOP AT lt_lines ASSIGNING FIELD-SYMBOL(<ls_line>). WRITE: / <ls_line>-tdline. " 输出运费文本内容 ENDLOOP. ``` #### 3. **修改运费短文本** ```abap DATA: lt_lines TYPE TABLE OF tline. APPEND '新运费描述文本' TO lt_lines. " 准备新文本 CALL FUNCTION 'SAVE_TEXT' EXPORTING header = VALUE thead( tdobject = 'EKPO' tdid = 'F' tdname = |{ vbeln }{ posnr }| tdspras = sy-langu ) TABLES lines = lt_lines EXCEPTIONS not_found = 1. IF sy-subrc = 0. COMMIT WORK. ENDIF. ``` #### 4. **定位逻辑** 1. **前台路径**: - ME23N 查看采购订单 → 选择行项目 → 菜单【附加】→ 【文本】 - 文本类型选择 **行项目文本(F)** 查看运费描述 2. **技术定位**: - 使用事务码 `SE16N` 查看表 `STXL` - 查询条件: `TDOBJECT = 'EKPO'` `TDID = 'F'` `TDNAME = 采购订单号+行项目号`(如 `4500001234000010`) > **注意**:实际文本ID(`TDID`)可能因配置而异,可通过SPRO路径确认: > **SPRO > 物料管理 > 采购 > 文本 > 定义文本类型** --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值