ABAP 换行符,TAB KEY 替换方式

本文介绍了ABAP中换行符、TABKEY等的表示方式,包括如何在数据文件输出时使用TABKEY进行字段分割,并讨论了这些符号在DB中的保存形式以及置换处理的方法。
  * 46C以下的版本:
  DATA: l_string TYPE string.
  DATA: l_enter  TYPE string VALUE '0D0A'.  "回车
  CONSTANTS: l_tab TYPE x VALUE '09'.
  * 470以上的版本:
*TAB分隔符
  CLASS cl_abap_char_utilities DEFINITION LOAD.
  CONSTANTS: l_tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab.
所有字符在下面的类中:
cl_abap_char_utilities=>horizontal_tab — 09
cl_abap_char_utilities=>CR_LF ———- 0D0A
cl_abap_char_utilities=>VERTICAL_TAB — 0B
cl_abap_char_utilities=>NEWLINE —- 0A
cl_abap_char_utilities=>FORM_FEED —- 0C  cl_abap_char_utilities=>BACKSPACE — 08
如果是要单独取得回车或者换行(不是回车加换行),可以采用:
cl_abap_char_utilities=>CR_LF(1)
cl_abap_char_utilities=>CR_LF 1(1)
从EXCEl文件中传上的文件的回车符就是cl_abap_char_utilities=>CR_LF 1(1)
****************************************************另一篇博文
ABAP中有关于换行符,TAB KEY等 收藏


① 换行符,TAB KEY等的表示
在数据文件输出的时候,有时候需要使各个字段间用TAB KEY进行分割。
那么,TAB KEY在ABAP中是如何表示的,就是写入一个TAB KEY吗?
事实上,在类对象CL_ABAP_CHAR_UTILITIES中已经事先定义好了如换行符,TAB KEY等。
CR_LF 换行符
HORIZONTAL_TAB 水平方向的TAB KEY
VERTICAL_TAB 竖直方向的TAB KEY
FORM_FEED 改页
例: CONCATENATE COL1 COL2 CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB INTO …


② 换行符,TAB KEY等在DB中保存
换行符,TAB KEY等在SAP的DB中被存为“#“。
虽然被保存为#,但在报表中仍能正常显示。


③ 换行符,TAB KEY等的置换处理
换行符,TAB KEY等的置换不能简单的用REPLACE命令进行处理。
正确的处理如下:
CALL FUNCTION 'NLS_GET_FRONTEND_CP'
EXPORTING
LANGU = SY-LANGU
IMPORTING
FRONTEND_CODEPAGE = CPCODEPAGE
EXCEPTIONS
ILLEGAL_SYST_CODEPAGE = 1
NO_FRONTEND_CP_FOUND = 2
INTERNAL_OR_DB_ERROR = 3
OTHERS = 4.


CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
EXPORTING
INTEXT = INTEXT
INTER_CP = CPCODEPAGE
REPLACEMENT = 32
IMPORTING
OUTTEXT = OUTTEXT
EXCEPTIONS
INVALID_CODEPAGE = 1
CODEPAGE_MISMATCH = 2
INTERNAL_ERROR = 3
CANNOT_CONVERT = 4
FIELDS_NOT_TYPE_C = 5
OTHERS = 6.
<think>我们讨论的是ABAP中的RANGE表。RANGE表在ABAP中常用于构建条件范围,特别是在数据库查询的WHERE条件中,可以表示一个字段的多个区间条件(如BETWEEN, IN等)。RANGE表实际上是一个标准内表,其行结构包含以下几个字段: SIGN: 类型为CHAR1,取值为'I'(包含)或'E'(排除) OPTION: 类型为CHAR2,表示操作符,如'EQ'(等于)、'BT'(介于之间)、'NE'(不等于)等 LOW: 范围的下限 HIGH: 范围的上限(当使用BT、NB等操作符时需要) 下面我们将详细介绍如何定义、填充和使用RANGE表。 步骤1:定义RANGE表 有两种方式定义RANGE表: a) 使用标准类型RANGE OF,但需要先定义元素类型 b) 直接使用TYPE RANGE OF后面跟字段类型(如TYPE RANGE OF matnr) 步骤2:填充RANGE表 可以使用VALUE #(...)直接构造,也可以逐行APPEND。 步骤3:在ABAP语句中使用(如SELECT、LOOP等) 示例代码:</think>### ABAP `RANGE` 表详解:高效数据筛选利器 在 ABAP 中,`RANGE` 表是用于**动态条件筛选**的核心数据结构,特别适用于数据库查询、内表筛选等场景。它本质上是包含 `SIGN`、`OPTION`、`LOW`、`HIGH` 字段的标准内表。 --- ### 1. RANGE 表结构解析 | 字段名 | 类型 | 长度 | 说明 | |--------|------|------|------| | SIGN | C | 1 | 包含/排除标志:`I`(包含), `E`(排除) | | OPTION | C | 2 | 比较运算符:`EQ`(等于), `BT`(介于), `NE`(不等于)等 | | LOW | 任意 | - | 范围下限值 | | HIGH | 任意 | - | 范围上限值(仅用于 `BT`/`NB`) | --- ### 2. 创建 RANGE 表的三种方式 #### 方式1:直接类型声明 ```abap " 定义物料号范围表 DATA: gt_matnr_range TYPE RANGE OF matnr. ``` #### 方式2:基于结构体定义 ```abap TYPES: BEGIN OF ty_custom_range, sign TYPE ddsign, option TYPE ddoption, low TYPE kunnr, high TYPE kunnr, END OF ty_custom_range. DATA: gt_customer_range TYPE TABLE OF ty_custom_range. ``` #### 方式3:使用 RTTS 动态创建 ```abap DATA: lo_type TYPE REF TO cl_abap_datadescr, lt_range TYPE REF TO data. lo_type = cl_abap_datadescr=>describe_by_name( 'BUKRS' ). " 公司代码类型 CREATE DATA lt_range TYPE RANGE OF (lo_type->absolute_name). ASSIGN lt_range->* TO FIELD-SYMBOL(<fs_range>). ``` --- ### 3. RANGE 表填充方法 #### 方法1:VALUE 操作符(推荐) ```abap gt_matnr_range = VALUE #( ( sign = 'I' option = 'EQ' low = 'MAT001' ) " 包含 MAT001 ( sign = 'I' option = 'BT' low = 'MAT100' high = 'MAT200' ) " 包含 MAT100-MAT200 ( sign = 'E' option = 'EQ' low = 'MAT999' ) " 排除 MAT999 ). ``` #### 方法2:APPEND 语句 ```abap APPEND VALUE #( sign = 'I' option = 'GE' low = '20240101' ) TO gt_date_range. ``` #### 方法3:函数生成 ```abap CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST' EXPORTING fieldname = 'KUNNR' TABLES return_tab = gt_customer_range. ``` --- ### 4. 实际应用场景 #### 场景1:数据库查询 ```abap SELECT * FROM vbak INTO TABLE @DATA(gt_orders) WHERE vbeln IN @gt_vbeln_range " 销售单据范围 AND erdat IN @gt_date_range. " 日期范围 ``` #### 场景2:内表筛选 ```abap DATA(gt_filtered_data) = FILTER #( gt_source_data USING KEY primary_key WHERE werks IN gt_plant_range AND matkl IN gt_matkl_range ). ``` #### 场景3:ALV 筛选器 ```abap DATA: go_alv TYPE REF TO cl_salv_table. go_alv->get_filters( )->add_filter( columnname = 'LIFNR' sign = 'I' option = 'BT' low = 'V0001' high = 'V9999' ). ``` --- ### 5. 高级操作技巧 #### 技巧1:范围合并 ```abap APPEND LINES OF gt_range1 TO gt_combined_range. APPEND LINES OF gt_range2 TO gt_combined_range. SORT gt_combined_range BY low high. DELETE ADJACENT DUPLICATES FROM gt_combined_range. ``` #### 技巧2:范围反转 ```abap LOOP AT gt_range ASSIGNING FIELD-SYMBOL(<range>). <range>-sign = COND #( WHEN <range>-sign = 'I' THEN 'E' ELSE 'I' ). ENDLOOP. ``` #### 技巧3:动态范围生成 ```abap DATA: lv_sql_cond TYPE string. LOOP AT gt_range ASSIGNING FIELD-SYMBOL(<r>). DATA(lv_cond) = |{ <r>-low }| && COND #( WHEN <r>-option = 'BT' THEN | AND { <r>-high }| ELSE '' ). lv_sql_cond = |{ lv_sql_cond } OR (FIELD { <r>-sign } { <r>-option } { lv_cond })|. ENDLOOP. " 生成动态 WHERE 条件 SELECT * FROM mara WHERE (lv_sql_cond). ``` --- ### 6. 性能优化指南 1. **索引优化**: ```abap " 确保范围表按 LOW 字段排序 SORT gt_range BY low. ``` 2. **范围合并**: ```abap " 合并连续范围 LOOP AT gt_range ASSIGNING <curr>. AT END OF low. <curr>-high = <curr>-low. " 单值范围优化 ENDAT. ENDLOOP. ``` 3. **避免大范围**: ```abap " 限制范围大小 IF lines( gt_range ) > 1000. " 分批次处理 ENDIF. ``` 4. **使用 BINARY SEARCH**: ```abap READ TABLE gt_range WITH KEY low = lv_value BINARY SEARCH TRANSPORTING NO FIELDS. ``` --- ### 7. 实际应用案例:物料状态筛选器 ```abap DATA: gt_mat_status TYPE RANGE OF msta. " 构建状态范围 gt_mat_status = VALUE #( ( sign = 'I' option = 'EQ' low = 'A' ) " 激活 ( sign = 'I' option = 'EQ' low = 'B' ) " 冻结 ( sign = 'E' option = 'EQ' low = 'X' ) " 删除 ). " 应用筛选 SELECT matnr, maktx FROM mara INTO TABLE @DATA(gt_materials) WHERE mstae IN @gt_mat_status AND matnr IN @gt_matnr_range. " 显示结果 cl_demo_output=>display( gt_materials ). ``` --- ### 常见错误处理 1. **类型不匹配**: ```abap TRY. gt_range = VALUE #( ( sign = 'I' option = 'EQ' low = lv_value ) ). CATCH cx_sy_conversion_error. " 处理类型转换错误 ENDTRY. ``` 2. **空范围处理**: ```abap IF gt_range IS INITIAL. " 处理空范围情况 ELSE. " 正常处理 ENDIF. ``` 3. **无效选项**: ```abap IF <range>-option NOT IN ('EQ','NE','GT','LT','GE','LE','BT','NB'). " 抛出异常 ENDIF. ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值