将日期与两个表中的日期范围进行比较
Comparing date with a date range in two tables
我正在尝试使用 table 更改另一个 table。我需要使用一个使用固定日期(工作日期)的 table(我们称之为 tab1)。另一个 table (tab2) 在两个 table 条目(开始日期和结束日期)中使用时间范围。
我想使用 tab1 根据日期检查 tab2 中的条目是否存在。如果tab2中没有tab1,则更改tab1的状态。
我的想法是在 READ 之外使用 LOOP AT TABLE,但我遗漏了一些重要的东西。
问候 Sruscht
编辑:抱歉,我的问题不清楚。这是我的代码,我试过一次,但它在删除时设置了所有状态。
LOOP AT lt_tab1 ASSIGNING <fs_tab1>
WHERE workdate GE lt_tab2-enddate
AND workdate LE lt_tab2-startdate.
ENDLOOP.
IF sy-subrc NE 0.
"set lt_tab1-status on delete
ENDIF.
如果条目在 table tab2 中被删除,它们在 table tab1 中不会改变。换句话说,tab1 没有更新。
然后必须改变tab1中的状态,使系统在其他程序中不显示and/or applications.As 已经说过,tab1使用固定日期,tab2使用时间范围,描述为开始和结束日期。
我的想法是遍历itab1 并在itab2 中查找条目。如果条目不在itab2中,那么itab1的状态就改变了。
抱歉,问题太长了,但我对这个案例有很大的疑问。
我所说的重要事情是解决方案。
它必须是这样的:
LOOP AT tab2
WHERE startdate LE tab1-fixdate
AND enddate GE tab1-fixdate
ASSIGNING ...
... "entry found
ENDLOOP.
IF sy-subrc NE 0.
... "there was no corresponding entry
ENDIF.
您必须使用两个嵌套循环来完成此操作。一个用于 lt_tab1 中的所有条目,一个内部循环扫描 lt_tab2 以查找与 tab1 中的当前条目匹配的任何条目。然后您可以使用标志来指示是否找到了匹配的条目。
DATA lv_found_match TYPE abap_bool.
LOOP AT lt_tab1 ASSIGNING <fs_tab1>.
" find out if there is a matching entry in table 2 for this entry
lv_found_match = abap_false.
LOOP AT lt_itab2 ASSIGNING <fs_tab2>.
IF <fs_tab2>-startdate <= <fs_tab1>-workdate AND
<fs_tab2>-enddate >= <fs_tab1>-workdate.
lv_found_match = abap_true.
EXIT. " the LOOP AT
ENDIF.
ENDLOOP.
IF lv_found_match = abap_true.
" there is a match
ELSE.
" there isn't a match
ENDIF.
ENDLOOP.
我正在尝试使用 table 更改另一个 table。我需要使用一个使用固定日期(工作日期)的 table(我们称之为 tab1)。另一个 table (tab2) 在两个 table 条目(开始日期和结束日期)中使用时间范围。
我想使用 tab1 根据日期检查 tab2 中的条目是否存在。如果tab2中没有tab1,则更改tab1的状态。
我的想法是在 READ 之外使用 LOOP AT TABLE,但我遗漏了一些重要的东西。
问候 Sruscht
编辑:抱歉,我的问题不清楚。这是我的代码,我试过一次,但它在删除时设置了所有状态。
LOOP AT lt_tab1 ASSIGNING <fs_tab1>
WHERE workdate GE lt_tab2-enddate
AND workdate LE lt_tab2-startdate.
ENDLOOP.
IF sy-subrc NE 0.
"set lt_tab1-status on delete
ENDIF.
如果条目在 table tab2 中被删除,它们在 table tab1 中不会改变。换句话说,tab1 没有更新。 然后必须改变tab1中的状态,使系统在其他程序中不显示and/or applications.As 已经说过,tab1使用固定日期,tab2使用时间范围,描述为开始和结束日期。
我的想法是遍历itab1 并在itab2 中查找条目。如果条目不在itab2中,那么itab1的状态就改变了。
抱歉,问题太长了,但我对这个案例有很大的疑问。
我所说的重要事情是解决方案。
它必须是这样的:
LOOP AT tab2
WHERE startdate LE tab1-fixdate
AND enddate GE tab1-fixdate
ASSIGNING ...
... "entry found
ENDLOOP.
IF sy-subrc NE 0.
... "there was no corresponding entry
ENDIF.
您必须使用两个嵌套循环来完成此操作。一个用于 lt_tab1 中的所有条目,一个内部循环扫描 lt_tab2 以查找与 tab1 中的当前条目匹配的任何条目。然后您可以使用标志来指示是否找到了匹配的条目。
DATA lv_found_match TYPE abap_bool.
LOOP AT lt_tab1 ASSIGNING <fs_tab1>.
" find out if there is a matching entry in table 2 for this entry
lv_found_match = abap_false.
LOOP AT lt_itab2 ASSIGNING <fs_tab2>.
IF <fs_tab2>-startdate <= <fs_tab1>-workdate AND
<fs_tab2>-enddate >= <fs_tab1>-workdate.
lv_found_match = abap_true.
EXIT. " the LOOP AT
ENDIF.
ENDLOOP.
IF lv_found_match = abap_true.
" there is a match
ELSE.
" there isn't a match
ENDIF.
ENDLOOP.