根据网上的代码,结合SAP改写。
REPORT Z_CALLENDAR .
*因为要加很多的数据,所以用宏来添加算了
DEFINE ADD_TABLE .
&1-NAME = &2 .
APPEND &1 .
END-OF-DEFINITION .
*这里是天的名字,初一………
DATA: BEGIN OF R_DAYNAME ,
NAME(4) TYPE C ,
END OF R_DAYNAME .
DATA: I_DAYNAME LIKE R_DAYNAME OCCURS 0 WITH HEADER LINE .
*这里是月的名字,正月………
DATA: BEGIN OF R_MONNAME ,
NAME(2) TYPE C ,
END OF R_MONNAME .
DATA: I_MONNAME LIKE R_MONNAME OCCURS 0 WITH HEADER LINE .
*这里是月的差额数据
DATA: BEGIN OF R_MONTHADD ,
NAME TYPE I ,
END OF R_MONTHADD .
DATA: I_MONTHADD LIKE R_MONTHADD OCCURS 0 WITH HEADER LINE .
*这里就是农历转换表的数据,每100一更新
DATA: BEGIN OF R_NONGLIDATA,
NAME TYPE I ,
END OF R_NONGLIDATA .
DATA: I_NONGLIDATA LIKE R_NONGLIDATA OCCURS 0 WITH HEADER LINE .
*这里输入日期,是公历日期
PARAMETER P_DATUM LIKE SY-DATUM .
START-OF-SELECTION .
**加数据,就不用多说了
ADD_TABLE I_DAYNAME '初一' .
ADD_TABLE I_DAYNAME '初二' .
ADD_TABLE I_DAYNAME '初三' .
ADD_TABLE I_DAYNAME '初四' .
ADD_TABLE I_DAYNAME '初五' .
ADD_TABLE I_DAYNAME '初六' .
ADD_TABLE I_DAYNAME '初七' .
ADD_TABLE I_DAYNAME '初八' .
ADD_TABLE I_DAYNAME '初九' .
ADD_TABLE I_DAYNAME '初十' .
ADD_TABLE I_DAYNAME '十一' .
ADD_TABLE I_DAYNAME '十二' .
ADD_TABLE I_DAYNAME '十三' .
ADD_TABLE I_DAYNAME '十四' .
ADD_TABLE I_DAYNAME '十五' .
ADD_TABLE I_DAYNAME '十六' .
ADD_TABLE I_DAYNAME '十七' .
ADD_TABLE I_DAYNAME '十八' .
ADD_TABLE I_DAYNAME '十九' .
ADD_TABLE I_DAYNAME '二十' .
ADD_TABLE I_DAYNAME '廿一' .
ADD_TABLE I_DAYNAME '廿二' .
ADD_TABLE I_DAYNAME '廿三' .
ADD_TABLE I_DAYNAME '廿四' .
ADD_TABLE I_DAYNAME '廿五' .
ADD_TABLE I_DAYNAME '廿六' .
ADD_TABLE I_DAYNAME '廿七' .
ADD_TABLE I_DAYNAME '廿八' .
ADD_TABLE I_DAYNAME '廿九' .
ADD_TABLE I_DAYNAME '三十' .
ADD_TABLE I_MONNAME '正' .
ADD_TABLE I_MONNAME '二' .
ADD_TABLE I_MONNAME '三' .
ADD_TABLE I_MONNAME '四' .
ADD_TABLE I_MONNAME '五' .
ADD_TABLE I_MONNAME '六' .
ADD_TABLE I_MONNAME '七' .
ADD_TABLE I_MONNAME '八' .
ADD_TABLE I_MONNAME '九' .
ADD_TABLE I_MONNAME '十' .
ADD_TABLE I_MONNAME '冬' .
ADD_TABLE I_MONNAME '腊' .
ADD_TABLE I_MONTHADD 0 .
ADD_TABLE I_MONTHADD 31 .
ADD_TABLE I_MONTHADD 59 .
ADD_TABLE I_MONTHADD 90 .
ADD_TABLE I_MONTHADD 120 .
ADD_TABLE I_MONTHADD 151 .
ADD_TABLE I_MONTHADD 181 .
ADD_TABLE I_MONTHADD 212 .
ADD_TABLE I_MONTHADD 243 .
ADD_TABLE I_MONTHADD 273 .
ADD_TABLE I_MONTHADD 304 .
ADD_TABLE I_MONTHADD 334 .
ADD_TABLE I_NONGLIDATA 2635 .
ADD_TABLE I_NONGLIDATA 333387 .
ADD_TABLE I_NONGLIDATA 1701 .
ADD_TABLE I_NONGLIDATA 1748 .
ADD_TABLE I_NONGLIDATA 267701 .
ADD_TABLE I_NONGLIDATA 694 .
ADD_TABLE I_NONGLIDATA 2391 .
ADD_TABLE I_NONGLIDATA 133423 .
ADD_TABLE I_NONGLIDATA 1175 .
ADD_TABLE I_NONGLIDATA 396438 .
ADD_TABLE I_NONGLIDATA 3402 .
ADD_TABLE I_NONGLIDATA 3749 .
ADD_TABLE I_NONGLIDATA 331177 .
ADD_TABLE I_NONGLIDATA 1453 .
ADD_TABLE I_NONGLIDATA 694 .
ADD_TABLE I_NONGLIDATA 201326 .
ADD_TABLE I_NONGLIDATA 2350 .
ADD_TABLE I_NONGLIDATA 465197 .
ADD_TABLE I_NONGLIDATA 3221 .
ADD_TABLE I_NONGLIDATA 3402 .
ADD_TABLE I_NONGLIDATA 400202 .
ADD_TABLE I_NONGLIDATA 2901 .
ADD_TABLE I_NONGLIDATA 1386 .
ADD_TABLE I_NONGLIDATA 267611 .
ADD_TABLE I_NONGLIDATA 605 .
ADD_TABLE I_NONGLIDATA 2349 .
ADD_TABLE I_NONGLIDATA 137515 .
ADD_TABLE I_NONGLIDATA 2709 .
ADD_TABLE I_NONGLIDATA 464533 .
ADD_TABLE I_NONGLIDATA 1738 .
ADD_TABLE I_NONGLIDATA 2901 .
ADD_TABLE I_NONGLIDATA 330421 .
ADD_TABLE I_NONGLIDATA 1242 .
ADD_TABLE I_NONGLIDATA 2651 .
ADD_TABLE I_NONGLIDATA 199255 .
ADD_TABLE I_NONGLIDATA 1323 .
ADD_TABLE I_NONGLIDATA 529706 .
ADD_TABLE I_NONGLIDATA 3733 .
ADD_TABLE I_NONGLIDATA 1706 .
ADD_TABLE I_NONGLIDATA 398762 .
ADD_TABLE I_NONGLIDATA 2741 .
ADD_TABLE I_NONGLIDATA 1206 .
ADD_TABLE I_NONGLIDATA 267438 .
ADD_TABLE I_NONGLIDATA 2647 .
ADD_TABLE I_NONGLIDATA 1318 .
ADD_TABLE I_NONGLIDATA 204070 .
ADD_TABLE I_NONGLIDATA 3477 .
ADD_TABLE I_NONGLIDATA 461653 .
ADD_TABLE I_NONGLIDATA 1386 .
ADD_TABLE I_NONGLIDATA 2413 .
ADD_TABLE I_NONGLIDATA 330077.
ADD_TABLE I_NONGLIDATA 1197 .
ADD_TABLE I_NONGLIDATA 2637 .
ADD_TABLE I_NONGLIDATA 268877 .
ADD_TABLE I_NONGLIDATA 3365 .
ADD_TABLE I_NONGLIDATA 531109 .
ADD_TABLE I_NONGLIDATA 2900 .
ADD_TABLE I_NONGLIDATA 2922 .
ADD_TABLE I_NONGLIDATA 398042 .
ADD_TABLE I_NONGLIDATA 2395 .
ADD_TABLE I_NONGLIDATA 1179 .
ADD_TABLE I_NONGLIDATA 267415 .
ADD_TABLE I_NONGLIDATA 2635 .
ADD_TABLE I_NONGLIDATA 661067 .
ADD_TABLE I_NONGLIDATA 1701 .
ADD_TABLE I_NONGLIDATA 1748 .
ADD_TABLE I_NONGLIDATA 398772 .
ADD_TABLE I_NONGLIDATA 2742 .
ADD_TABLE I_NONGLIDATA 2391 .
ADD_TABLE I_NONGLIDATA 330031.
ADD_TABLE I_NONGLIDATA 1175 .
ADD_TABLE I_NONGLIDATA 1611 .
ADD_TABLE I_NONGLIDATA 200010 .
ADD_TABLE I_NONGLIDATA 3749 .
ADD_TABLE I_NONGLIDATA 527717 .
ADD_TABLE I_NONGLIDATA 1452 .
ADD_TABLE I_NONGLIDATA 2742 .
ADD_TABLE I_NONGLIDATA 332397 .
ADD_TABLE I_NONGLIDATA 2350 .
ADD_TABLE I_NONGLIDATA 3222 .
ADD_TABLE I_NONGLIDATA 268949 .
ADD_TABLE I_NONGLIDATA 3402 .
ADD_TABLE I_NONGLIDATA 3493 .
ADD_TABLE I_NONGLIDATA 133973 .
ADD_TABLE I_NONGLIDATA 1386 .
ADD_TABLE I_NONGLIDATA 464219 .
ADD_TABLE I_NONGLIDATA 605 .
ADD_TABLE I_NONGLIDATA 2349 .
ADD_TABLE I_NONGLIDATA 334123 .
ADD_TABLE I_NONGLIDATA 2709 .
ADD_TABLE I_NONGLIDATA 2890 .
ADD_TABLE I_NONGLIDATA 267946 .
ADD_TABLE I_NONGLIDATA 2773 .
ADD_TABLE I_NONGLIDATA 592565 .
ADD_TABLE I_NONGLIDATA 1210 .
ADD_TABLE I_NONGLIDATA 2651 .
ADD_TABLE I_NONGLIDATA 395863 .
ADD_TABLE I_NONGLIDATA 1323 .
ADD_TABLE I_NONGLIDATA 2707 .
ADD_TABLE I_NONGLIDATA 265877 .
*都是一些控制变量
DATA: WCY TYPE I ,
WCM TYPE I ,
WCD TYPE I .
DATA: NTD TYPE I ,NIE TYPE I ,
L_M TYPE I ,L_I TYPE I ,
L_K TYPE I ,L_N TYPE I ,
L_N1 TYPE I ,
L_NBIT TYPE I .
DATA: NONGLI(30) TYPE C ,
NONGLIDAY(10) TYPE C ,
SHUXIANG(10) TYPE C .
*取得输入的日期
WCY = P_DATUM+0(4) .
WCM = P_DATUM+4(2) .
WCD = P_DATUM+6(2) .
*取得输入的日期到初始日期的天数
DATA: L_NUM TYPE I .
READ TABLE I_MONTHADD INDEX WCM .
*如果是闰年而且是2月份以后,则天数加1
DATA: BDATE TYPE D VALUE '19210208'.
NTD = P_DATUM - BDATE + 1.
L_M = 1 .
DATA: L_M1 TYPE I VALUE '1'.
*循环开始,设置一个循环结束标志
WHILE NIE <> 1 .
* L_M1 = L_M + 1 .
READ TABLE I_NONGLIDATA INDEX L_M .
* 判断是否有闰月,指农历的闰月
IF I_NONGLIDATA-NAME < 4095 .
* 没有,则一共有12个月,因为下标从0开始,所以设置成11
L_K = 11 .
ELSE .
L_K = 12 .
ENDIF .
L_N = L_K .
WHILE L_N >= 0 .
READ TABLE I_NONGLIDATA INDEX L_M .
L_NBIT = I_NONGLIDATA-NAME .
L_I = 1 .
L_N1 = L_N + 1 .
WHILE L_I < L_N1 .
L_NBIT = L_NBIT DIV 2 .
L_I = L_I + 1 .
ENDWHILE .
L_NBIT = L_NBIT MOD 2 .
DATA: L_NBIT1 TYPE I .
L_NBIT1 = L_NBIT + 29 .
IF NTD <= L_NBIT1 .
NIE = 1 .
EXIT .
ENDIF .
NTD = NTD - 29 - L_NBIT .
L_N = L_N - 1 .
ENDWHILE .
IF NIE = 1 .
EXIT .
ENDIF.
L_M = L_M + 1 .
ENDWHILE .
WCY = 1921 + L_M .
WCM = L_K - L_N + 1 .
WCD = NTD .
**ok,计算完毕,如果有闰月的话,执行下面一段
IF L_K = 12 .
READ TABLE I_NONGLIDATA INDEX L_M .
DATA: L_TEMP TYPE I.
L_TEMP = I_NONGLIDATA-NAME / 65536 + 1 .
IF WCM = L_TEMP .
WCM = 1 - WCM .
ELSEIF WCM > L_TEMP .
WCM = WCM - 1 .
ENDIF.
ENDIF.
*这里就是输出的设置了
IF WCM < 1 .
L_TEMP = -1 * WCM .
READ TABLE I_MONNAME INDEX L_TEMP .
NONGLIDAY = I_MONNAME-NAME .
ELSE .
READ TABLE I_MONNAME INDEX WCM .
ENDIF.
**取得日期,然后输出
READ TABLE I_DAYNAME INDEX WCD .
CONCATENATE I_MONNAME-NAME '月' I_DAYNAME-NAME INTO NONGLIDAY .
WRITE: P_DATUM, NONGLI,NONGLIDAY .
阅读(997) | 评论(1) | 转发(0) |