原文链接:Custom input helps
以日历周为例说明值帮助和 FOR 表达式
示例
数据元素 KWEEK
指的是格式为 YYYYMM 的工厂日历周。遗憾的是,这个字段没有标准的搜索帮助。
ABAP 词典中的数据元素 KWEEK
:

在搜索帮助 RSCALWEEK
和 /BI0/OCALWEEK
中有替代方案。
- 搜索帮助弹出窗口
/BI0/OCALWEEK

- 搜索帮助弹出窗口
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
运算符。在这个内部迭代中,我们将填充表格值。
实施自定义搜索帮助
创建搜索帮助
创建自定义搜索帮助:
- 打开 Eclipse 中的 ABAP 开发工具或 SAP GUI 中的事务
SE80
(资源库浏览器)或SE11
(ABAP 词典)。 - 按照 SAP 帮助门户上创建基本搜索帮助中所述的步骤操作。
- 如下图所示,定义日历周 (
KWEEK
)、年 (AJAHR
) 和周 (WEEKN
) 参数。 - 保存新建的搜索帮助:创建并激活搜索帮助出口(见下文)。
- 最后,指定出口并激活搜索帮助。
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.
更多阅读
- FOR - Conditional Iteration, ABAP Keyword Documentation
- Input Help in Dialog Modules, SAP Help Portal
- Creating Elementary Search Helps, SAP Help Portal
总结
这篇文章通过一个具体的例子说明了当标准 SAP 无法满足要求时,如何提供值列表。除了在运行时生成值列表,并使用相应的搜索帮助出口创建自定义搜索帮助外,我们还看到了 "FOR "表达式的有趣应用。