SAP 自定义日历周搜索帮助 F4

原文链接:Custom input helps

以日历周为例说明值帮助和 FOR 表达式

示例

数据元素 KWEEK 指的是格式为 YYYYMM 的工厂日历周。遗憾的是,这个字段没有标准的搜索帮助。

ABAP 词典中的数据元素 KWEEK:

在搜索帮助 RSCALWEEK 和 /BI0/OCALWEEK 中有替代方案。

  1. 搜索帮助弹出窗口 /BI0/OCALWEEK
  1. 搜索帮助弹出窗口 RSCALWEEK

但是,这些方法对用户并不友好,部分原因是输入的开始时间太远。因此,让我们通过自定义实现来帮助最终用户轻松选择一周。

实现方法

数据类型:值列表列

为了给最终用户提供一个可能性列表,我们首先需要确定要显示的相关字段及其各自的数据类型。在我们的示例中,我们选择了年份、周号和日历周(前述两个字段的连接)。

ABAP 复制代码
"data type for value help entries
TYPES:
  BEGIN OF week_calendar_value_help,
    year          TYPE ajahr,
    week          TYPE weekn,
    calendar_week TYPE kweek,
  END OF week_calendar_value_help,
  t_week_calendar_value_help TYPE STANDARD TABLE OF
    week_calendar_value_help WITH DEFAULT KEY.

工厂日历周自定义搜索帮助中的参数:

准备值

假设最终用户可以选择当年、过去两年和未来两年的日历周。这种需求是 FOR 表达式的理想用例,我们可以通过嵌套的方式使用 FOR 表达式来填充每个相关年份的所有周值(52 表示一年中的周数)。

Notes: 由于有些年份有 53 个星期,因此这只是一种简化的表示方法。请参阅下面的演示程序,了解考虑到这一点的完整代码。

ABAP 复制代码
CONSTANTS weeks_in_a_year TYPE i VALUE 52.

CONSTANTS value_help_years_in_past TYPE i VALUE 2.
CONSTANTS value_help_years_in_future TYPE i VALUE 2.

"prepare value help table containing calendar week numbers
"going x amount of years in the past and future
DATA(calendar_weeks) = VALUE t_week_calendar_value_help(
  LET current_year = sy-datum(4) IN
  FOR year = CONV int2( current_year - value_help_years_in_past )
    UNTIL year > current_year + value_help_years_in_future
  FOR weeknumber = 1 UNTIL weeknumber > weeks_in_a_year
    LET week = |{ CONV char2( weeknumber ) ALPHA = IN }|
      IN ( year = year
           week = weeknumber
           calendar_week = |{ year }{ week }| ) ).

让我们来分解上面的代码片段。

首先,我们使用 VALUE 操作符构建值帮助表。在表中,我们使用 LET 表达式为当前年份定义了一个辅助变量。

然后,我们使用 FOR 运算符开始第一次条件迭代:

我们指定要从过去两年(year = CONV int2( current_year - value_help_years_in_past)迭代到未来两年(UNTIL year > current_year + value_help_years_in_future)。在这个主迭代中,我们对一年(52)中的周数进行第二次迭代,再次使用 FOR 运算符。在这个内部迭代中,我们将填充表格值。

实施自定义搜索帮助

创建搜索帮助

创建自定义搜索帮助:

  1. 打开 Eclipse 中的 ABAP 开发工具或 SAP GUI 中的事务 SE80(资源库浏览器)或 SE11(ABAP 词典)。
  2. 按照 SAP 帮助门户上创建基本搜索帮助中所述的步骤操作。
  3. 如下图所示,定义日历周 (KWEEK)、年 (AJAHR) 和周 (WEEKN) 参数。
  4. 保存新建的搜索帮助:创建并激活搜索帮助出口(见下文)。
  5. 最后,指定出口并激活搜索帮助。

ABAP 词典中的新建的自定义搜索帮助,如图:

创建搜索帮助出口

为快速上手,请复制演示功能模块 F4IF_SHLP_EXIT_EXAMPLE。无需更改界面:

在 SE37 事务中复制演示搜索帮助退出:

如上所述,下面搜索帮助出口中的代码使用嵌套的 FOR 表达式向最终用户提供周日历值列表。在这里,用户可以选择过去或未来两年内的任何一周。

Tips:由于有些年份有 53 个星期,因此这只是一种简化的表示方法。请参阅下面的演示程序,了解考虑到这一点的完整代码。

ABAP 复制代码
FUNCTION zca_kweek_sh_exit.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCR_TAB_T
*"      RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     VALUE(SHLP) TYPE  SHLP_DESCR_T
*"     VALUE(CALLCONTROL) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------

  IF callcontrol-step = 'DISP'.
    TYPES:
      BEGIN OF week_calendar_value_help,
        year          TYPE ajahr,
        week          TYPE weekn,
        calendar_week TYPE kweek,
      END OF week_calendar_value_help,
      t_week_calendar_value_help TYPE STANDARD TABLE OF
        week_calendar_value_help WITH DEFAULT KEY.

    "handle 'F4'/value help request for the week calendar parameter
    CONSTANTS weeks_in_a_year TYPE i VALUE 52.

    CONSTANTS value_help_years_in_past TYPE i VALUE 2.
    CONSTANTS value_help_years_in_future TYPE i VALUE 2.

    "prepare value help table containing calendar week numbers
    "going x amount of years in the past and future
    DATA(calendar_weeks) = VALUE t_week_calendar_value_help(
      LET current_year = sy-datum(4) IN
      FOR year = CONV int2( current_year - value_help_years_in_past )
        UNTIL year > current_year + value_help_years_in_future
      FOR weeknumber = 1 UNTIL weeknumber > weeks_in_a_year
        LET week = |{ CONV char2( weeknumber ) ALPHA = IN }|
          IN ( year = year
               week = weeknumber
               calendar_week = |{ year }{ week }| ) ).


    LOOP AT calendar_weeks ASSIGNING FIELD-SYMBOL(<calender_week>).
      LOOP AT shlp_tab[ 1 ]-fielddescr ASSIGNING FIELD-SYMBOL(<fielddescr>).
        ASSIGN COMPONENT <fielddescr>-fieldname 
          OF STRUCTURE <calender_week> TO FIELD-SYMBOL(<value>).
        CALL FUNCTION 'F4UT_PARAMETER_RESULTS_PUT'
          EXPORTING
            parameter         = <fielddescr>-fieldname
            value             = <value>
            fieldname         = CONV dfies-lfieldname( <fielddescr>-fieldname )
          TABLES
            shlp_tab          = shlp_tab
            record_tab        = record_tab
            source_tab        = calendar_weeks
          CHANGING
            shlp              = shlp
            callcontrol       = callcontrol
          EXCEPTIONS
            parameter_unknown = 1
            OTHERS            = 2.

      ENDLOOP.
    ENDLOOP.
  ENDIF.
ENDFUNCTION.

运行时生成值列表

第二种方法是处理选择屏幕的值请求,无需创建自定义搜索帮助,而是在运行时生成值列表。

使用搜索帮助的好处

请注意,在使用这种方法之前,应重新考虑自定义搜索帮助是否是更好的选择。搜索帮助可以附加到数据元素或结构的字段上。然后,F4 帮助就会自动提供给该数据元素或结构的所有用户。

实现

可通过功能模块 F4IF_INT_TABLE_VALUE_REQUEST 实现自编程值表。

SAP 帮助门户清楚地介绍了如何使用该功能。

该功能模块显示您在 ABAP 程序中创建的值表。自编程的值表作为表参数 VALUE_TAB 传递给功能模块。如果指定了导入参数 DYNPPROG、DYNPNR 和 DYNPROFIELD,用户的选择将返回屏幕上的相应字段。如果指定表格参数 RETURN_TAB,则选择将返回表格。

示例程序

下面的演示程序将上述功能模块与嵌套 FOR 表达式(参见 "准备值")结合使用,为最终用户提供了一个值列表。在这里,用户可以选择过去或未来两年内的任意一周。

此外,这种实现方式还考虑到了某些年份包含 53 周而不是 52 周这一事实。一年中的周数是通过调用 FM DATE_GET_WEEK 的辅助方法确定的。现以 2026 年为例进行说明。

运行时生成的值列表:

查看演示程序:

ABAP 复制代码
*&---------------------------------------------------------------------*
*& Report ZKWEEKDEMO
*&---------------------------------------------------------------------*
*& Demo program for custom value help for factory calendar week (KWEEK)
*&
*& https://www.laurix.com/post/abap/search-help/calendar-week/
*&---------------------------------------------------------------------*
REPORT zkweekdemo.

"data type for value help entries
TYPES:
  BEGIN OF week_calendar_value_help,
    year          TYPE ajahr,
    week          TYPE weekn,
    calendar_week TYPE kweek,
  END OF week_calendar_value_help,
  t_week_calendar_value_help TYPE STANDARD TABLE OF
    week_calendar_value_help WITH DEFAULT KEY.

"Helper class for determining the number of weeks in a given year
CLASS lcl_week_number_helper DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS get_weeks_in_year
      IMPORTING
        iv_year                   TYPE ajahr
      RETURNING
        VALUE(rv_amount_of_weeks) TYPE i.
ENDCLASS.

CLASS lcl_week_number_helper IMPLEMENTATION.
  METHOD get_weeks_in_year.
    DATA lv_max_calendar_week TYPE kweek.
    DATA(lv_last_day_of_year) = CONV dats( |{ iv_year }1231| ).

    WHILE lv_max_calendar_week(4) NE iv_year AND sy-subrc = 0.
      CALL FUNCTION 'DATE_GET_WEEK'
        EXPORTING
          date = lv_last_day_of_year
        IMPORTING
          week = lv_max_calendar_week.

      "try again with an earlier date
      "if the week returned is in the wrong/next year
      lv_last_day_of_year -= 1.
    ENDWHILE.

    rv_amount_of_weeks = CONV #( lv_max_calendar_week+4 ).
  ENDMETHOD.
ENDCLASS.

PARAMETERS pa_kweek TYPE kweek.

"handle 'F4'/value help request for the week calendar parameter
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_kweek.
  "2026 is an example of a year with 53 ISO calendar weeks
  CONSTANTS start_year TYPE i VALUE 2026.
  CONSTANTS value_help_years_in_past TYPE i VALUE 2.
  CONSTANTS value_help_years_in_future TYPE i VALUE 2.

  "prepare value help table containing calendar week numbers
  "going x amount of years in the past and future
  DATA(calendar_weeks) = VALUE t_week_calendar_value_help(
    FOR current_year = start_year - value_help_years_in_past
      UNTIL current_year > start_year + value_help_years_in_future

      FOR weeknumber = 1
        "determine number of weeks in each year
        "since some years have 53 weeks
        UNTIL weeknumber > lcl_week_number_helper=>get_weeks_in_year( CONV #( current_year ) )

        LET week = |{ CONV char2( weeknumber ) ALPHA = IN }|
         IN ( year = current_year
              week = weeknumber
              calendar_week = |{ current_year }{ week }| ) ).

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'CALENDAR_WEEK'
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = 'PA_KWEEK'
      value_org       = 'S'
    TABLES
      value_tab       = calendar_weeks
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.

更多阅读

总结

这篇文章通过一个具体的例子说明了当标准 SAP 无法满足要求时,如何提供值列表。除了在运行时生成值列表,并使用相应的搜索帮助出口创建自定义搜索帮助外,我们还看到了 "FOR "表达式的有趣应用。

相关推荐
lazy H9 小时前
【计算机网络】第 2 篇:一条数据如何穿过网络?彻底理解数据封装与解封装
网络·经验分享·后端·学习·计算机网络
我命由我123459 小时前
软件工程概念 - 可插拔性
java·后端·学习·java-ee·系统架构·软件工程·学习方法
Bazingga9 小时前
RAG路由全景:一个问题走到岔路口,谁来指路
后端
云边有个稻草人9 小时前
从日志到落库:数据集成产品 KFS 如何打通异构数据库实时同步链路
后端
努力小陈19 小时前
从 Java 到 Go:后端工程师的 30 分钟语法速查
后端
Thneonl9 小时前
一个 502,十种病因:nginx 反代排障分诊树
后端·架构
花间相见9 小时前
【计算基础|MySQL09】索引(下):失效与设计
数据库·后端·面试
南丘山9 小时前
接口自动化测试从零搭:31 条用例跑 4 秒,抓出 6 个权限缺陷
后端
掘金小豆9 小时前
Spring AI 实战:从一次可运行的模型调用到 RAG 体系
后端·程序员·ai编程
前端小万9 小时前
探索副业五个月,最终以放弃告终
前端·后端·面试