Findind给定日期的最近日期(sap Abap)

2020-08-23 13:02发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我需要找到给定日期的最近的星期四。 有没有可用的功能模块?...

例如:如果给定日期为星期六的15/02/2020,则应将日期返回为最近的星期四13/02/2020。

如果给定的日期是星期二的18/02/2020,则应返回最近的星期四的20/02/2020。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我需要找到给定日期的最近的星期四。 有没有可用的功能模块?...

例如:如果给定日期为星期六的15/02/2020,则应将日期返回为最近的星期四13/02/2020。

如果给定的日期是星期二的18/02/2020,则应返回最近的星期四的20/02/2020。

付费偷看设置
发送
8条回答
空代码
1楼 · 2020-08-23 13:25.采纳回答

P_NUMB是星期几

星期一-> 1,.....星期日-> 7


 类别lc_date_finder定义。

   公共部分。
     方法get_nearest_date
       输入
         iv_date TYPE系统
         iv_day_number TYPE i
       正在返回
         VALUE(rv_nearest_date)TYPE系统。
 ENDCLASS。



 参数p_date类型sydatum缺省sy-data。
 参数p_numbd TYPE i默认值4。
 写新的lc_date_finder()-> get_nearest_date(iv_date = p_date
                                                iv_day_number = p_numbd)。



 类别lc_date_finder IMPLEMENTATION。
   方法get_nearest_date。
     DATA(lv_day_number)=(iv_date MOD 7)-1。
     DATA(lv_delta_pos)= abs(lv_day_number-iv_day_number)。
     DATA(lv_delta_neg)= abs(iv_day_number-(lv_day_number + 7))。
     rv_nearest_date = COND#(当lv_delta_pos GT lv_delta_neg
                                 然后iv_date-lv_delta_neg
                                 ELSE iv_date + lv_delta_pos)。
   终结法。
 ENDCLASS。




 
compass1988
2楼-- · 2020-08-23 13:40

在我的系统中,它给了我13.02.2020奇怪的...

在我的代码中有一行,不是正常的(我将其改编为使day_number工作) :

 DATA(lv_day_number)=(iv_date MOD 7)-1. 

可以尝试删除" -1"

Nir深蓝
3楼-- · 2020-08-23 13:18

1 。 使用FM DAY_IN_WEEK获取给定日期的星期几(1-7)。

  • (如果需要,也可以输入FM DATE_TO_DAY:星期一至星期日)

2。 计算从今天到下一个星期四的天数差:从今天开始减去星期四(4)(例如2 =星期二或7 =星期日)。 如果大于0,则这是到星期四的天数。 如果它小于零,则需要在负数上加上"一周",即7天,以获取下周的星期四。 如果为零,则需要确定是星期四还是下周四,具体取决于"截断"时间。
但是,您也可以直接在循环中直接使用下一个FM,始终添加1天 直到您打了星期四(除非已经是星期四并且您可以使用它;)

3。 使用FM RP_CALC_DATE_IN_INTERVAL计算给定日期以及到下一个星期四的天数之差,并得到结果日期

更新:

当然可以将上述伪代码"更改"为 符合您的"新"要求。 那是一个变更请求;)。 如果给定的日期已经是给定的工作日,则下一个实际的编码(抱歉,我没有对其进行测试)将为您提供以下(!)或与最近日期相同的日期。 如果一定是下一个工作日,则需要在第一次计算lv_current_weekday之前先将1添加到ev_nearest_date。 我正在等待下一个更改请求。...

所以您去了:

"输入/输出参数
 数据:iv_given_date TYPE系统数据VALUE系统数据,
       iv_given_weekday TYPE int4 VALUE'4',
       ev_nearest_date TYPE数据表。

 变量
 常量:lc_known_monday TYPE sydatum VALUE'19000101'。
 数据:lv_current_weekday TYPE int4。

 算法
 ev_nearest_date = iv_given_date。
 lv_current_weekday =(ev_nearest_date-lc_known_monday)mod 7 + 1。

 lv_current_weekday <> iv_given_weekday。
   将1加到ev_nearest_date。
   lv_current_weekday =(ev_nearest_date-lc_known_monday)mod 7 + 1。
 结束。

但是根据您的新示例,您再次想要其他东西。
所以应该是同一周内最近的一天??? 您需要提供一个完整的示例,说明用户何时结束和开始一周,以及一周的开始和结束的"最近"日期。

南山jay
4楼-- · 2020-08-23 13:15

2。 计算从今天到下一个<选择日期>的天数差:从今天开始减去<选择日期>(例如2 =星期二或7 =星期日)。 如果大于0,则这是直到<选择的日期>的天数。 如果小于零,则需要在负数上加上"一周",即7天,以获取下一周的<选择日期>。 如果该值为零,则需要根据今天的"截止"时间来决定是今天的<选定日期>还是下周<选定的日期>。

但是,您也可以直接使用 在循环中直接添加下一个FM,始终添加1天,直到您按下(除非已经是,并且您对此感到满意为止)为止

3。 使用FM RP_CALC_DATE_IN_INTERVAL计算给定日期以及与下一个<选择日期>的天数之差,并获得结果日期

梦想连接
5楼-- · 2020-08-23 13:35

嗨露丝兰,

尝试以下程序获取最近的星期四。

报告zdev_neat_tursday。

 数据gv_today TYPE d。
 数据:gv_tursday TYPE d。
 数据gv_wotnr TYPE p。
 数据:gv_dif TYPE p。

 参数p_dt类型bkpf-budat强制性。

       gv_today = p_dt。

       通话功能" DAY_IN_WEEK"
 出口
   基准= gv_today
 输入
   wotnr = gv_wotnr。

   如果gv_wotnr = 4。
   写:gv_today。
   其他。
   gv_dif = 4-gv_wotnr。
   gv_tursday = gv_today + gv_dif。
   写:gv_tursday。
   ENDIF。
绿领巾童鞋
6楼-- · 2020-08-23 13:40

日期可能随时更改,例如以下测试用例:

情况1:对于用户1,给定日期为2020年2月19日,星期四为星期四,因此根据您的逻辑,它将返回为20/02/2020。

情况2:对于用户1,给定日期为19/02/2020,并且用户希望星期二为星期二,则日期应为18/02/2020。

情况3:对于用户1,给定日期为19/02/2020,并且用户希望将日期设为星期一,则日期应返回为17/02/2020。

是否有可用的功能模块来执行此操作?..

谢谢

clasier
7楼-- · 2020-08-23 13:14
 CASE预期日期。
    当"星期一"。
       LV_EXP_DAY_NUM = 1。
    在"星期二"。
       LV_EXP_DAY_NUM = 2。
    星期三。
       LV_EXP_DAY_NUM = 3。
    星期四。
       LV_EXP_DAY_NUM = 4。
    当"星期五"。
       LV_EXP_DAY_NUM = 5。
    当"星期六"。
       LV_EXP_DAY_NUM = 6。
    当" SUNDAY"时。
       LV_EXP_DAY_NUM = 7。
    当别人。
        LV_EXP_DAY_NUM = 0。
 结束。
 DATA(LV_DAY_NUMBER)=(LV_CALC_DATE MOD 7)-1。
 DATA(LV_DIFF)= LV_DAY_NUMBER-LV_EXP_DAY_NUM
 如果LV_DIFF> 0并且LV_DIFF <4。
    LV_CALC_DATE = LV_CALC_DATE-LV_DIFF。
 ELSEIF LV_DIFF> 3。
    LV_DIFF = 7-LV_DIFF。
    LV_CALC_DATE = LV_CALC_DATE + LV_DIFF。"如果差异大于3
 ELSEIF LV_DIFF <-3。
     LV_DIFF = 7 + LV_DIFF。
     LV_CALC_DATE = LV_CALC_DATE-LV_DIFF。
 其他。
     LV_CALC_DATE = LV_CALC_DATE + ABS(LV_DIFF)。
 ENDIF。

此逻辑适用于所有测试用例:)

感谢

一周热门 更多>