在ABAP中,常用函数分为**字符串处理**、**日期时间处理**、**数学计算**、**内表操作**、**类型转换**和**系统信息获取**等类别。以下是详细分类及示例:
---
## **1. 字符串处理函数**
### **1.1 `CONCATENATE_TEXT`(字符串拼接)**
- **功能**:将多个字符串拼接成一个(支持分隔符)。
- **替代方案**:直接使用 `CONCATENATE` 语句或 `&&` 运算符。
```abap
DATA(lv_result) = |{ 'Hello' } { 'World' }|. " ABAP 7.4+ 模板字符串
```
### **1.2 `SUBSTRING`(截取子串)**
- **功能**:从字符串中提取指定位置的子串。
```abap
DATA(lv_text) = 'ABAP Programming'.
DATA(lv_sub) = lv_text+6(11). " 从第6位开始取11个字符
WRITE: / lv_sub. " 输出: Programming
```
### **1.3 `STRLEN`(获取字符串长度)**
```abap
DATA(lv_len) = strlen( 'ABAP' ). " 返回4
```
### **1.4 `TO_UPPER` / `TO_LOWER`(大小写转换)**
```abap
DATA(lv_upper) = to_upper( 'abap' ). " 返回'ABAP'
DATA(lv_lower) = to_lower( 'ABAP' ). " 返回'abap'
```
### **1.5 `REPLACE`(字符串替换)**
```abap
DATA(lv_text) = 'ABAP is great'.
REPLACE 'great' WITH 'awesome' IN lv_text.
WRITE: / lv_text. " 输出: ABAP is awesome
```
---
## **2. 日期时间处理函数**
### **2.1 `SY-DATUM` / `SY-UZEIT`(系统日期时间)**
- **功能**:获取当前系统日期和时间。
```abap
WRITE: / 'Today is:', sy-datum, 'Time:', sy-uzeit.
```
### **2.2 `CONVERT_DATE_TO_INTERNAL` / `CONVERT_DATE_TO_EXTERNAL`**
- **功能**:在内部格式(YYYYMMDD)和外部格式(DD.MM.YYYY)间转换。
```abap
DATA(lv_ext_date) = '25.12.2023'.
DATA(lv_int_date) TYPE d.
CONVERT DATE lv_ext_date INTO INTERNAL DATE lv_int_date.
WRITE: / lv_int_date. " 输出: 20231225
```
### **2.3 `CL_ABAP_TSTMP`(时间戳操作)**
- **功能**:处理高精度时间戳(如UTC时间)。
```abap
DATA(lo_tstmp) = cl_abap_tstmp=>utc_now( ).
WRITE: / lo_tstmp->get_time( ).
```
### **2.4 `ADD_DAYS` / `SUBTRACT_DAYS`(日期加减)**
```abap
DATA(lv_date) = sy-datum.
ADD 7 DAYS TO lv_date. " 加7天
WRITE: / 'Next week:', lv_date.
```
---
## **3. 数学计算函数**
### **3.1 `ABS`(绝对值)**
```abap
DATA(lv_abs) = abs( -10 ). " 返回10
```
### **3.2 `ROUND` / `TRUNC`(四舍五入/截断)**
```abap
DATA(lv_round) = round( 3.14159, 2 ). " 返回3.14
DATA(lv_trunc) = trunc( 3.14159, 1 ). " 返回3.1
```
### **3.3 `SQRT` / `POW`(平方根/幂运算)**
```abap
DATA(lv_sqrt) = sqrt( 16 ). " 返回4
DATA(lv_pow) = pow( 2, 3 ). " 返回8(2^3)
```
### **3.4 `NUMCHECK`(数字格式校验)**
```abap
IF numcheck( '123.45' ) = 0.
WRITE: / 'Valid number'.
ELSE.
WRITE: / 'Invalid number'.
ENDIF.
```
---
## **4. 内表操作函数**
### **4.1 `LINES`(获取内表行数)**
```abap
DATA: gt_data TYPE TABLE OF string.
gt_data = VALUE #( ('A') ('B') ('C') ).
WRITE: / 'Table has', lines( gt_data ), 'rows'. " 输出3
```
### **4.2 `LINE_EXISTS`(检查行是否存在)**
```abap
READ TABLE gt_data WITH KEY table_line = 'B' TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
WRITE: / 'Row exists'.
ENDIF.
```
### **4.3 `SORT`(内表排序)**
```abap
SORT gt_data BY table_line DESCENDING. " 降序排序
```
### **4.4 `DELETE_ADJACENT_DUPLICATES`(去重)**
```abap
gt_data = VALUE #( ('A') ('A') ('B') ).
DELETE ADJACENT DUPLICATES FROM gt_data COMPARING table_line.
" 结果: ('A'), ('B')
```
---
## **5. 类型转换函数**
### **5.1 `CONVERT_STRING_TO_NUMBER`(字符串转数字)**
```abap
DATA(lv_num) TYPE i.
CONVERT STRING '123' TO NUMBER lv_num.
WRITE: / lv_num. " 输出123
```
### **5.2 `MOVE_CORRESPONDING`(结构字段映射)**
```abap
TYPES: BEGIN OF ty_source,
id TYPE i,
name TYPE string,
END OF ty_source,
BEGIN OF ty_target,
id TYPE i,
desc TYPE string,
END OF ty_target.
DATA: ls_source TYPE ty_source,
ls_target TYPE ty_target.
ls_source-id = 1.
ls_source-name = 'Test'.
MOVE-CORRESPONDING ls_source TO ls_target. " 仅复制同名字段
```
### **5.3 `CASTING`(类型强制转换)**
```abap
DATA(lv_text) = '42'.
DATA(lv_num) = CAST i( lv_text ). " 需确保字符串可转换
```
---
## **6. 系统信息函数**
### **6.1 `SY-UNAME`(当前用户名)**
```abap
WRITE: / 'Current user:', sy-uname.
```
### **6.2 `SY-SYSID`(系统ID)**
```abap
WRITE: / 'System ID:', sy-sysid.
```
### **6.3 `CL_GUI_FRONTEND_SERVICES`(前端服务)**
- **功能**:获取客户端信息(如屏幕分辨率)。
```abap
DATA: lv_width TYPE i,
lv_height TYPE i.
cl_gui_frontend_services=>get_screen_size(
EXPORTING
display_type = cl_gui_frontend_services=>display_type_main
IMPORTING
width = lv_width
height = lv_height
).
```
---
## **7. 实用工具函数**
### **7.1 `CL_ABAP_RANDOM`(随机数生成)**
```abap
DATA(lo_rand) = cl_abap_random=>create( seed = sy-uzeit ).
DATA(lv_rand) = lo_rand->intin_range( low = 1 high = 100 ).
WRITE: / 'Random number:', lv_rand.
```
### **7.2 `CL_ABAP_EXCEPTION`(异常处理)**
```abap
TRY.
DATA(lv_div) = 1 / 0. " 触发除零异常
CATCH cx_sy_zerodivide INTO DATA(lx_error).
WRITE: / 'Error:', lx_error->get_text( ).
ENDTRY.
```
### **7.3 `CL_ABAP_CONV_IN_CE`(编码转换)**
```abap
DATA(lv_utf8) = cl_abap_conv_in_ce=>create( encoding = 'UTF-8' )->convert( '中文' ).
```
---
## **8. 完整示例**
```abap
REPORT z_abap_functions_demo.
" 字符串处理
DATA(lv_name) = 'John'.
DATA(lv_greeting) = |Hello, { to_upper( lv_name ) }!|.
WRITE: / lv_greeting. " 输出: Hello, JOHN!
" 日期计算
DATA(lv_today) = sy-datum.
ADD 30 DAYS TO lv_today.
WRITE: / '30 days later:', lv_today.
" 数学计算
DATA(lv_pi) = round( 3.1415926, 3 ).
WRITE: / 'PI:', lv_pi. " 输出: 3.142
" 内表操作
TYPES: BEGIN OF ty_employee,
id TYPE i,
name TYPE string,
END OF ty_employee.
DATA: gt_employees TYPE TABLE OF ty_employee,
gs_employee TYPE ty_employee.
gt_employees = VALUE #(
( id = 1 name = 'Alice' )
( id = 2 name = 'Bob' )
).
LOOP AT gt_employees INTO gs_employee.
WRITE: / 'Employee:', gs_employee-id, gs_employee-name.
ENDLOOP.
```
---