一个报表中用户提出了这样的需求, 与其花时间找标准函数(还不知道有没有),不如干脆自己写一个,代码如下:
&---------------------------------------------------------------------*
*& Form getdate
*&---------------------------------------------------------------------*
* 以当前日期为准,计算月间隔日期
*----------------------------------------------------------------------*
FORM culc_date USING p_diff_m
CHANGING p_v_date.
DATA:v_year_n(4) TYPE n,
v_year_c(4) TYPE c,
v_month_n(2) TYPE n,
v_month_c(2) TYPE c,
v_day_n(2) TYPE n,
v_day_c(2) TYPE c,
v_date_c(8) TYPE c,
v_mod1 TYPE i,
v_mod2 TYPE i,
v_mod3 TYPE i.
v_month_c = sy-datum+4(2).
v_month_n = v_month_c.
v_year_c = sy-datum+0(4).
v_year_n = v_year_c.
v_day_c = sy-datum+6(2).
v_month_n = v_month_n - p_diff_m.
IF v_month_n <= 0.
v_month_n = v_month_n + 12 + p_diff_m - 1.
v_year_n = v_year_n - 1.
ENDIF.
CASE v_month_n .
WHEN 4 OR 6 OR 9 OR 11.
IF v_day_n = 31.
v_day_n = 30.
ENDIF.
WHEN 2.
v_mod1 = v_year_n MOD 4.
v_mod2 = v_year_n MOD 400.
v_mod3 = v_year_n MOD 100.
IF ( ( v_mod1 = 0 ) OR ( v_mod2 = 0 ) ) AND ( v_mod3 <> 0 ).
IF ( v_day_n > 29 ).
v_day_n = 29.
ENDIF.
ELSE.
IF ( v_day_n > 28 ).
v_day_n = 28.
ENDIF.
ENDIF.
ENDCASE.
v_year_c = v_year_n.
v_month_c = v_month_n.
CONCATENATE v_year_c v_month_c v_day_c INTO v_date_c.
p_v_date = v_date_c.
ENDFORM. " getdate
*&---------------------------------------------------------------------*
*& Form calc_shlf
*&---------------------------------------------------------------------*
* 计算当前库龄
*----------------------------------------------------------------------*
* -->P_WA_RESULT_BUDAT text
*----------------------------------------------------------------------*
FORM calc_shlf USING p_budat "报产日期
CHANGING p_shlf. "库龄
DATA:v_year_n_sy TYPE i,
v_year_n TYPE i,
v_year_c(4) TYPE c,
v_month_n_sy TYPE i,
v_month_n TYPE i,
v_month_c(2) TYPE c,
v_day_n_sy TYPE i,
v_day_n TYPE i,
v_day_c(2) TYPE c,
v_year_diff TYPE i,
v_month_diff TYPE i,
v_day_diff TYPE i,
v_mod_4 TYPE i,
v_mod_100 TYPE i,
v_mod_400 TYPE i.
v_year_n_sy = sy-datum+0(4). " current year
v_month_n_sy = sy-datum+4(2). " current month
v_day_n_sy = sy-datum+6(2). " current day
v_year_n = p_budat+0(4).
v_month_n = p_budat+4(2).
v_day_n = p_budat+6(2).
v_day_diff = sy-datum - p_budat.
IF ( v_day_diff > 365 ) .
v_year_diff = v_day_diff / 365. " 取模
ENDIF.
IF ( v_month_n_sy < v_month_n ).
v_month_diff = v_month_n_sy + 12 - v_month_n.
ELSE.
v_month_diff = v_month_n_sy - v_month_n.
ENDIF.
v_day_diff = v_day_n_sy - v_day_n.
IF ( v_day_diff < 0 ).
v_month_diff = v_month_diff - 1.
ENDIF.
CASE v_month_n.
WHEN 4 OR 6 OR 9 OR 11. " 30 days
PERFORM calc_day_diff USING 30 v_day_diff
v_day_n v_day_n_sy
CHANGING v_day_diff.
WHEN 1 OR 3 OR 5 OR 7 OR 8 OR 10 OR 12 . " 31 days
PERFORM calc_day_diff USING 31 v_day_diff
v_day_n v_day_n_sy
CHANGING v_day_diff.
WHEN 2. " 28 or 29 days
v_mod_4 = v_year_n MOD 4.
v_mod_400 = v_year_n MOD 400.
v_mod_100 = v_year_n MOD 100.
IF ( ( v_mod_4 = 0 ) OR ( v_mod_400 = 0 ) ) AND ( v_mod_400 <> 0 ).
PERFORM calc_day_diff USING 29 v_day_diff
v_day_n v_day_n_sy
CHANGING v_day_diff.
ELSE.
PERFORM calc_day_diff USING 28 v_day_diff
v_day_n v_day_n_sy
CHANGING v_day_diff.
ENDIF.
ENDCASE.
p_shlf = space.
IF ( v_year_diff > 0 ).
v_year_c = v_year_diff.
CONCATENATE v_year_c '年' INTO p_shlf.
ENDIF.
IF ( v_month_diff > 0 ).
v_month_c = v_month_diff.
CONCATENATE p_shlf v_month_c '月' INTO p_shlf.
ENDIF.
IF ( v_day_diff >= 0 ).
v_day_c = v_day_diff.
CONCATENATE p_shlf v_day_c '天' INTO p_shlf.
ENDIF.
ENDFORM. "2 calc_shlf
*&---------------------------------------------------------------------*
*& Form calc_day_diff
*&---------------------------------------------------------------------*
* 计算间隔日期
*----------------------------------------------------------------------*
FORM calc_day_diff USING p_days_per_month
p_day_diff_value
p_day_n
p_day_n_sy
CHANGING p_day_diff.
IF ( p_day_diff_value < 0 ).
p_day_diff = p_days_per_month - p_day_n + p_day_n_sy.
ELSE.
IF ( p_day_n_sy > p_days_per_month ).
p_day_diff = p_days_per_month - p_day_n.
ELSE.
p_day_diff = p_day_n_sy - p_day_n.
ENDIF.
ENDIF.
ENDFORM. " calc_day_diff