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 传递给功能模块。如果指定了导入参数 DYNPPROGDYNPNRDYNPROFIELD,用户的选择将返回屏幕上的相应字段。如果指定表格参数 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 "表达式的有趣应用。

相关推荐
葡萄城技术团队7 小时前
GcWord V8.2 新版本:TOA/TA字段增强、模板标签管理与PDF导出优化
后端
葡萄城技术团队7 小时前
Java GcExcel V8.2 新版本:效率升级与功能突破
后端
花花无缺8 小时前
函数和方法的区别
java·后端·python
DS小龙哥8 小时前
基于华为云设计的智能水产养殖监控系统
后端
天天摸鱼的java工程师8 小时前
别再只会 new 了!八年老炮带你看透对象创建的 5 层真相
java·后端
洛阳泰山8 小时前
MaxKB4j智能体平台 Docker Compose 快速部署教程
java·人工智能·后端
AAA修煤气灶刘哥8 小时前
10 分钟吃透!同步异步不绕弯,MQ+RabbitMQ 入门到实操
后端·spring cloud·rabbitmq
努力的小郑8 小时前
MySQL索引(一):从数据结构到存储引擎的实现
后端·mysql
倚栏听风雨8 小时前
MapStruct
后端