2020-08-23 13:02发布
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
我需要找到给定日期的最近的星期四。 有没有可用的功能模块?...
例如:如果给定日期为星期六的15/02/2020,则应将日期返回为最近的星期四13/02/2020。
如果给定的日期是星期二的18/02/2020,则应返回最近的星期四的20/02/2020。
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。
在我的系统中,它给了我13.02.2020奇怪的...
在我的代码中有一行,不是正常的(我将其改编为使day_number工作) :
DATA(lv_day_number)=(iv_date MOD 7)-1.
可以尝试删除" -1"
1 。 使用FM DAY_IN_WEEK获取给定日期的星期几(1-7)。
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。 结束。
但是根据您的新示例,您再次想要其他东西。 所以应该是同一周内最近的一天??? 您需要提供一个完整的示例,说明用户何时结束和开始一周,以及一周的开始和结束的"最近"日期。
2。 计算从今天到下一个<选择日期>的天数差:从今天开始减去<选择日期>(例如2 =星期二或7 =星期日)。 如果大于0,则这是直到<选择的日期>的天数。 如果小于零,则需要在负数上加上"一周",即7天,以获取下一周的<选择日期>。 如果该值为零,则需要根据今天的"截止"时间来决定是今天的<选定日期>还是下周<选定的日期>。
但是,您也可以直接使用 在循环中直接添加下一个FM,始终添加1天,直到您按下(除非已经是,并且您对此感到满意为止)为止
3。 使用FM RP_CALC_DATE_IN_INTERVAL计算给定日期以及与下一个<选择日期>的天数之差,并获得结果日期
嗨露丝兰,
尝试以下程序获取最近的星期四。
报告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。
日期可能随时更改,例如以下测试用例:
情况1:对于用户1,给定日期为2020年2月19日,星期四为星期四,因此根据您的逻辑,它将返回为20/02/2020。
情况2:对于用户1,给定日期为19/02/2020,并且用户希望星期二为星期二,则日期应为18/02/2020。
情况3:对于用户1,给定日期为19/02/2020,并且用户希望将日期设为星期一,则日期应返回为17/02/2020。
是否有可用的功能模块来执行此操作?..
谢谢
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。
此逻辑适用于所有测试用例:)
感谢
最多设置5个标签!
P_NUMB是星期几
星期一-> 1,.....星期日-> 7
在我的系统中,它给了我13.02.2020奇怪的...
在我的代码中有一行,不是正常的(我将其改编为使day_number工作) :
可以尝试删除" -1"
1 。 使用FM DAY_IN_WEEK获取给定日期的星期几(1-7)。
2。 计算从今天到下一个星期四的天数差:从今天开始减去星期四(4)(例如2 =星期二或7 =星期日)。 如果大于0,则这是到星期四的天数。 如果它小于零,则需要在负数上加上"一周",即7天,以获取下周的星期四。 如果为零,则需要确定是星期四还是下周四,具体取决于"截断"时间。
但是,您也可以直接在循环中直接使用下一个FM,始终添加1天 直到您打了星期四(除非已经是星期四并且您可以使用它;)
3。 使用FM RP_CALC_DATE_IN_INTERVAL计算给定日期以及到下一个星期四的天数之差,并得到结果日期
更新:
当然可以将上述伪代码"更改"为 符合您的"新"要求。 那是一个变更请求;)。 如果给定的日期已经是给定的工作日,则下一个实际的编码(抱歉,我没有对其进行测试)将为您提供以下(!)或与最近日期相同的日期。 如果一定是下一个工作日,则需要在第一次计算lv_current_weekday之前先将1添加到ev_nearest_date。 我正在等待下一个更改请求。...
所以您去了:
但是根据您的新示例,您再次想要其他东西。
所以应该是同一周内最近的一天??? 您需要提供一个完整的示例,说明用户何时结束和开始一周,以及一周的开始和结束的"最近"日期。
2。 计算从今天到下一个<选择日期>的天数差:从今天开始减去<选择日期>(例如2 =星期二或7 =星期日)。 如果大于0,则这是直到<选择的日期>的天数。 如果小于零,则需要在负数上加上"一周",即7天,以获取下一周的<选择日期>。 如果该值为零,则需要根据今天的"截止"时间来决定是今天的<选定日期>还是下周<选定的日期>。
但是,您也可以直接使用 在循环中直接添加下一个FM,始终添加1天,直到您按下(除非已经是,并且您对此感到满意为止)为止
3。 使用FM RP_CALC_DATE_IN_INTERVAL计算给定日期以及与下一个<选择日期>的天数之差,并获得结果日期
嗨露丝兰,
尝试以下程序获取最近的星期四。
日期可能随时更改,例如以下测试用例:
情况1:对于用户1,给定日期为2020年2月19日,星期四为星期四,因此根据您的逻辑,它将返回为20/02/2020。
情况2:对于用户1,给定日期为19/02/2020,并且用户希望星期二为星期二,则日期应为18/02/2020。
情况3:对于用户1,给定日期为19/02/2020,并且用户希望将日期设为星期一,则日期应返回为17/02/2020。
是否有可用的功能模块来执行此操作?..
谢谢
此逻辑适用于所有测试用例:)
感谢
一周热门 更多>