ABAP 时间相关函数、搜索帮助

本文详细介绍了ABAP中与日期和时间相关的函数,包括获取月份最后一天、计算日期间隔、转换时间格式、检查日期时间合法性等功能,并提到了搜索帮助如F4_DATE和F4_CLOCK。

文章目录

前言

一:日期相关函数

1.获取输入日期月份的最后一天

1.1:LAST_DAY_OF_MONTHS

1.2:DATE_GET_MONTH_LASTDAY

1.3:RP_LAST_DAY_OF_MONTHS

1.4:BKK_GET_MONTH_LASTDAY 

2.获取两个日期之间的天、周、月、年数(HR_99S_INTERVAL_BETWEEN_DATES) 

3.获取日期期间的天数(DAYS_BETWEEN_TWO_DATES)

4.获取输入日期的星期几(DAY_IN_WEEK)

5.获的两个日期之间的分钟数(DELTA_TIME_DAY_HOUR)

6.获取时间+ - 天 月 日的日期

6.1:RP_CALC_DATE_IN_INTERVAL

6.2:FIMA_DATE_CREATE

6.3:MONTH_PLUS_DETERMINE

6.4:CCM_GO_BACK_MONTHS

7.转换日期为内部数字格式(CONVERT_DATE_TO_INTERNAL) 

8.获取当前日期周周一周日的日期及年的周数(GET_WEEK_INFO_BASED_ON_DATE)

9.获取该年第几周的第一天日期(WEEK_GET_FIRST_DAY)

二.日期、时间搜索帮助

1.日期搜索帮助(F4_DATE)

2.时间搜索帮助(F4_CLOCK) 

3.年月搜索帮助弹框(POPUP_TO_SELECT_MONTH) 

三.时间12->24小时制转换(HRVE_CONVERT_TIME) 

四.检查日期、时间合法

1.检查日期(DATE_CHECK_PLAUSIBILITY)

2.检查时间(TIME_CHECK_PLAUSIBILITY) 

总结
​​​​


前言

ABAP时间相关函数、搜索帮助,持续更新。。。

一:日期相关函数

1.获取输入日期月份的最后一天

1.1:LAST_DAY_OF_MONTHS

*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_001
*& 程序描述:ABAP 时间相关函数
*& 创 建 者:JIANGYH
*& 创建日期:2023/11/22
*&---------------------------------------------------------------------*
*& 版本     修改者(公司)     日期         修改描述
*& 1.0.0    XXXX           YYYYMMDD      创建程序
*&---------------------------------------------------------------------*
REPORT ytest_001.

DATA lv_datum TYPE sy-datum.

CALL FUNCTION 'LAST_DAY_OF_MONTHS'
  EXPORTING
    day_in            = '20240423'     "输入日期
  IMPORTING
    last_day_of_month = lv_datum        "返回日期:20240430
  EXCEPTIONS
    day_in_no_date    = 1
    OTHERS            = 2.

1.2:DATE_GET_MONTH_LASTDAY

*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_001
*& 程序描述:ABAP 时间相关函数
*& 创 建 者:JIANGYH
*& 创建日期:2023/11/22
*&---------------------------------------------------------------------*
*& 版本     修改者(公司)     日期         修改描述
*& 1.0.0    XXXX           YYYYMMDD      创建程序
*&---------------------------------------------------------------------*
REPORT ytest_001.

DATA:lv_data TYPE sy-datum.

CALL FUNCTION 'DATE_GET_MONTH_LASTDAY'
  EXPORTING
    i_date = '20240401'
  IMPORTING
    e_date = lv_data.  " 20240430


BREAK-POINT.

1.3:RP_LAST_DAY_OF_MONTHS

*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_001
*& 程序描述:ABAP 时间相关函数
*& 创 建 者:JIANGYH
*& 创建日期:2023/11/22
*&---------------------------------------------------------------------*
*& 版本     修改者(公司)     日期         修改描述
*& 1.0.0    XXXX           YYYYMMDD      创建程序
*&---------------------------------------------------------------------*
REPORT ytest_001.

DATA:lv_data TYPE sy-datum.

CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
  EXPORTING
    day_in            = '20240423'    "输入日期
  IMPORTING
    last_day_of_month = lv_data       "返回最后一天日期:20240430
  EXCEPTIONS
    day_in_no_date    = 1
    OTHERS            = 2.


BREAK-POINT.

1.4:BKK_GET_MONTH_LASTDAY 

*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_001
*& 程序描述:ABAP 时间相关函数
*& 创 建 者:JIANGYH
*& 创建日期:2023/11/22
*&---------------------------------------------------------------------*
*& 版本     修改者(公司)     日期         修改描述
*& 1.0.0    XXXX           YYYYMMDD      创建程序
*&---------------------------------------------------------------------*
REPORT ytest_001.

DATA:lv_data TYPE sy-datum.

CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'
  EXPORTING
    i_date = '20240423'           "输入日期
  IMPORTING
    e_date = lv_data.             "返回最后一天日期:20240330

BREAK-POINT.

2.获取两个日期之间的天、周、月、年数(HR_99S_INTERVAL_BETWEEN_DATES) 

*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_001
*& 程序描述:ABAP 时间相关函数
*& 创 建 者:JIANGYH
*& 创建日期:2023/11/22
*&---------------------------------------------------------------------*
*& 版本     修改者(公司)     日期         修改描述
*& 1.0.0    XXXX           YYYYMMDD      创建程序
*&---------------------------------------------------------------------*
REPORT ytest_001.

DATA: lv_d TYPE i,
      lv_w TYPE i,
      lv_m TYPE i,
      lv_y TYPE i.

DATA month_tab TYPE TABLE OF p99sg_month_tab_row.

CALL FUNCTION 'HR_99S_INTERVAL_BETWEEN_DATES'
  EXPORTING
    begda     = '20230423'       " 开始日期
    endda     = '20240423'       " 截止日期
  IMPORTING
    days      = lv_d          " 返回天数:367
    c_weeks   = lv_w          " 返回周数:52
    c_months  = lv_m          " 返回月数:12
    c_years   = lv_y          " 返回年数:1
    month_tab = month_tab.    " 期间月份首尾日

*month_tab:
*05 2023  20230501  20230531
*06 2023  20230601  20230630
*07 2023  20230701  20230731
*08 2023  20230801  20230831
*09 2023  20230901  20230930
*10 2023  20231001  20231031
*11 2023  20231101  20231130
*12 2023  20231201  20231231
*01 2024  20240101  20240131
*02 2024  20240201  20240229
*03 2024  20240301  20240331

BREAK-POINT.

3.获取日期期间的天数(DAYS_BETWEEN_TWO_DATES)

*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_001
*& 程序描述:ABAP 时间相关函数
*& 创 建 者:JIANGYH
*& 创建日期:2023/11/22
*&---------------------------------------------------------------------*
*& 版本     修改者(公司)     日期         修改描述
*& 1.0.0    XXXX           YYYYMMDD      创建程序
*&--------------------------------
ABAP中,为画面字段追加检索帮助(Search Help)通常通过**数据元素(Data Element)**或**屏幕字段属性**配置实现,也可以通过代码动态增强。以下是详细方法和最佳实践: --- ### **1. 通过数据元素配置检索帮助** #### **(1)基本步骤** 1. **创建/修改数据元素**: - 使用事务码`SE11`进入数据元素维护界面。 - 在“附加数据”标签页的“参数ID”或“搜索帮助”字段中指定预定义的检索帮助(如`MAT1`、`KNA1`)。 2. **关联到屏幕字段**: - 在屏幕画布(Screen Painter,事务码`SE80`)中,选择目标字段。 - 在“属性”标签页的“数据元素”字段中输入已配置的数据元素。 #### **示例:为物料号字段添加MAT1检索帮助** ```ABAP * 数据元素ZMATERIAL配置(SE11) * 附加数据 -> 搜索帮助: MAT1 * 屏幕字段属性(SE80) * 字段名: MATNR * 数据元素: ZMATERIAL " 自动继承MAT1检索帮助 ``` --- ### **2. 通过屏幕属性直接绑定检索帮助** #### **(1)静态绑定** 在屏幕属性中直接指定检索帮助名称: ```ABAP * 屏幕字段属性(SE80) * 字段名: KUNNR * 检索帮助: DEBI " 客户主数据检索帮助 ``` #### **(2)动态绑定(代码控制)** 通过`PROCESS ON VALUE-REQUEST`事件动态触发检索帮助: ```ABAP PROCESS ON VALUE-REQUEST. FIELD matnr MODULE matnr_help. MODULE matnr_help INPUT. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'MATNR' dynpprog = sy-repid dynpnr = sy-dynnr dynprofield = 'MATNR' value_org = 'S' TABLES value_tab = lt_materials. " 自定义内表作为数据源 ENDMODULE. ``` --- ### **3. 自定义检索帮助实现** #### **(1)基于内表的检索帮助** ```ABAP * 定义内表作为数据源 DATA: lt_materials TYPE TABLE OF mara. * 填充测试数据 SELECT matnr, maktx FROM mara INTO TABLE lt_materials UP TO 100 ROWS. * 在PBO模块中准备检索帮助 MODULE prepare_f4 OUTPUT. SORT lt_materials BY matnr. ENDMODULE. * 在PAI的VALUE-REQUEST事件中触发 MODULE matnr_f4 INPUT. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'MATNR' pval_low = matnr " 当前字段值作为默认值 TABLES value_tab = lt_materials return_tab = DATA(lt_return). IF lt_return IS NOT INITIAL. READ TABLE lt_return INTO DATA(ls_return) INDEX 1. matnr = ls_return-fieldval. " 回填选中值 ENDIF. ENDMODULE. ``` #### **(2)基于数据库表的检索帮助** ```ABAP * 使用标准检索帮助(如MAT1) MODULE matnr_f4 INPUT. CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST' EXPORTING tabname = 'MARA' fieldname = 'MATNR' searchhelp = 'MAT1' IMPORTING selectfield = DATA(lv_matnr). matnr = lv_matnr. ENDMODULE. ``` --- ### **4. 高级技术** #### **(1)多条件检索帮助** ```ABAP * 定义结构包含多个字段 TYPES: BEGIN OF ty_material, matnr TYPE matnr, maktx TYPE maktx, mtart TYPE mtart, END OF ty_material. DATA: lt_materials TYPE TABLE OF ty_material. * 在F4调用中传递多个返回字段 CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'MATNR' dynprofield = 'MATNR' value_org = 'S' TABLES value_tab = lt_materials return_tab = DATA(lt_return). ``` #### **(2)动态过滤检索帮助** ```ABAP * 根据其他字段值过滤检索结果 MODULE customer_f4 INPUT. DATA: lv_country TYPE land1. lv_country = country. " 假设country字段已填充 CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST' EXPORTING tabname = 'KNA1' fieldname = 'KUNNR' additional_parameters = VALUE #( ( fieldname = 'LAND1' fieldval = lv_country ) ) IMPORTING selectfield = kunnr. ENDMODULE. ``` #### **(3)Web Dynpro中的检索帮助** ```ABAP * 在Web Dynpro组件中配置 METHOD onf4_matnr. DATA(lo_node) = wd_context->get_child_node( 'MATERIAL_NODE' ). DATA(lo_helper) = wd_this->wd_get_api( )->get_search_help( 'MAT1' ). lo_helper->set_parameter( EXPORTING iv_param_name = 'MATNR' iv_value = matnr ). lo_helper->execute( ). ENDMETHOD. ``` --- ### **5. 最佳实践** #### **(1)性能优化** - **限制数据量**:在检索帮助内表中添加`WHERE`条件或使用`UP TO n ROWS`。 - **索引优化**:确保检索帮助依赖的表字段有适当索引。 #### **(2)用户体验** - **默认值设置**:通过`pval_low`参数预设当前字段值。 - **多选支持**:使用`F4IF_MULTI_VALUE_REQUEST`实现多选。 #### **(3)错误处理** ```ABAP TRY. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'MATNR' TABLES value_tab = lt_materials. CATCH cx_root INTO DATA(lx_error). MESSAGE lx_error->get_text( ) TYPE 'E'. ENDTRY. ``` --- ### **6. 调试与验证** #### **(1)检索帮助日志** - 使用事务码`SM30`查看表`F4IF_SHLP_LOG`中的检索帮助调用记录。 #### **(2)调试工具** - 在`F4IF_*`函数调用处设置断点,检查输入/输出参数。 #### **(3)性能分析** - 使用`SAT`(System Trace)分析检索帮助的执行时间。 --- ### **7. 完整示例:屏幕字段检索帮助集成** ```ABAP REPORT z_f4_demo. TABLES: mara. DATA: lt_materials TYPE TABLE OF mara. * 屏幕定义(SE80) * 字段: MATNR * 检索帮助: MAT1(或通过代码动态实现) * PBO模块 MODULE status_0100 OUTPUT. SET PF-STATUS 'STATUS100'. SET TITLEBAR 'TITLE100'. " 准备检索帮助数据 SELECT matnr, maktx, mtart FROM mara INTO TABLE lt_materials UP TO 200 ROWS. ENDMODULE. * PAI模块 - VALUE-REQUEST事件 MODULE matnr_f4 INPUT. DATA: lt_return TYPE TABLE OF ddshretval. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'MATNR' dynpprog = sy-repid dynpnr = sy-dynnr dynprofield = 'MARA-MATNR' value_org = 'S' TABLES value_tab = lt_materials return_tab = lt_return. IF lt_return IS NOT INITIAL. READ TABLE lt_return INTO DATA(ls_return) INDEX 1. mara-matnr = ls_return-fieldval. ENDIF. ENDMODULE. * 主程序 START-OF-SELECTION. CALL SCREEN 100. ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值