abap 实现输入日期 显示全年日历功能

*&---------------------------------------------------------------------*
*& Report ZJFTCY_02
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zjftcy_02.


PARAMETERS input TYPE d OBLIGATORY.

DATA:BEGIN OF wa_yday ,
       month TYPE char02,
       datum TYPE sy-datum,
       day   TYPE i,
       rq    TYPE char02,
       flg   TYPE xfeld,
       pos   TYPE i,
*       level TYPE i,
       line  TYPE i,
     END OF wa_yday.

DATA: BEGIN OF date_a,
        j(4),
        m(2),
        t(2),
      END OF date_a.

DATA: gt_yday       LIKE TABLE OF wa_yday,
      date_b        LIKE  date_a,
      days_input    TYPE d,
      days_output   TYPE d,
      dayssum_month TYPE i,
      counter_month TYPE i VALUE 12,
      p_wotnr       TYPE p.
DATA counter1 TYPE i.
DATA counterline TYPE i VALUE 1.
DATA maxline TYPE i VALUE 1.
DATA initial TYPE i VALUE 7.
*DATA maxline2 TYPE i VALUE 1.
*DATA maxline3 TYPE i VALUE 1.

date_a-j = input+0(4).
date_a-t = input+6(2).


DO counter_month TIMES.
*一个月的天数
  counter1 = sy-index.
  IF counter1 <= 9.
    date_a-m = 0 && counter1.
  ELSE.
    date_a-m = counter1.
  ENDIF.
  days_input = date_a.

  CALL FUNCTION 'LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = days_input
    IMPORTING
      last_day_of_month = days_output
    EXCEPTIONS
      day_in_no_date    = 1
      OTHERS            = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
  dayssum_month =  days_output+6(2).

*行初始化

  IF counter1 = 4 OR counter1 = 7 OR counter1 = 10  .
    counterline = maxline + 4.
    initial =  counterline.
  ELSE.
    counterline = initial.
  ENDIF.


  DO dayssum_month TIMES.
    CLEAR wa_yday.
    wa_yday-month = counter1.
    wa_yday-day = sy-index.

    date_b = days_input+0(6).
    IF wa_yday-day <= 9.
      date_b-t = 0 && wa_yday-day.
    ELSE.
      date_b-t = wa_yday-day.
    ENDIF.

    wa_yday-datum = date_b.
*周几
    CALL FUNCTION 'DAY_IN_WEEK'
      EXPORTING
        datum = wa_yday-datum
      IMPORTING
        wotnr = p_wotnr.

    wa_yday-rq = p_wotnr.

*行数 列的位置


    IF wa_yday-rq = 7.
      wa_yday-line = counterline.
      counterline = counterline + 1.
      IF counter1 = 3 OR counter1 = 6 OR counter1 = 9 OR counter1 = 12.
        wa_yday-flg = 'X'.
      ENDIF.
    ELSEIF  sy-index = dayssum_month.
      IF counter1 = 3 OR counter1 = 6 OR counter1 = 9 OR counter1 = 12.
        wa_yday-flg = 'X'.
      ENDIF.
      wa_yday-line = counterline.
      counterline = counterline + 1.
    ELSE.
      wa_yday-line = counterline.
    ENDIF.

    IF maxline < counterline.
      maxline = counterline.
    ENDIF.

*位置 第几列
    CASE counter1.
      WHEN 1 OR 4 OR 7 OR 10.
        wa_yday-pos = 10 * wa_yday-rq .

      WHEN 2 OR 5 OR 8 OR 11.
        wa_yday-pos = 72 + 10 * wa_yday-rq .

      WHEN OTHERS.
        wa_yday-pos = 144 + 10 * wa_yday-rq .

    ENDCASE.
    APPEND wa_yday TO gt_yday.
  ENDDO.


ENDDO.
*输出



*基本布局
DEFINE format_monoutput.
  WRITE  AT:  10(63) &1 CENTERED COLOR COL_POSITIVE,
              82(63) &2 CENTERED COLOR COL_POSITIVE,
              154(63) &3 CENTERED COLOR COL_POSITIVE.
END-OF-DEFINITION.

DEFINE  format_rqoutput.
  WRITE AT:10 |{ '一' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           20 |{ '二' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           30 |{ '三' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           40 |{ '四' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           50 |{ '五' WIDTH = 6 ALIGN = LEFT }| COLOR COL_GROUP ,
           56 |{ '六' WIDTH = 10 ALIGN = CENTER }| COLOR COL_TOTAL ,
           66 |{ '日' WIDTH = 6 ALIGN = RIGHT }| COLOR COL_TOTAL .

*WRITE AT:82'一' ,92 '二' ,102'三', 112'四', 122'五', 132'六',142'日'.
  WRITE AT:82 |{ '一' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           92 |{ '二' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           102 |{ '三' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           112 |{ '四' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           122 |{ '五' WIDTH = 6 ALIGN = LEFT }| COLOR COL_GROUP ,
           128 |{ '六' WIDTH = 10 ALIGN = CENTER }| COLOR COL_TOTAL ,
           138 |{ '日' WIDTH = 6 ALIGN = RIGHT }| COLOR COL_TOTAL .
*WRITE AT:154'一' ,164 '二' ,174'三', 184'四', 194'五', 204'六',214'日'.
  WRITE AT:154 |{ '一' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           164 |{ '二' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           174 |{ '三' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           184 |{ '四' WIDTH = 10 ALIGN = LEFT }| COLOR COL_GROUP ,
           194 |{ '五' WIDTH = 6 ALIGN = LEFT }| COLOR COL_GROUP ,
           200 |{ '六' WIDTH = 10 ALIGN = CENTER }| COLOR COL_TOTAL,
           210 |{ '日' WIDTH = 6 ALIGN = RIGHT }| COLOR COL_TOTAL.

END-OF-DEFINITION.


SKIP TO LINE 2.
WRITE AT: 112 '年历:' COLOR COL_NEGATIVE,117 date_a-j COLOR COL_NEGATIVE.
SKIP TO LINE 5.
*WRITE AT: 40 'JANUARY' COLOR COL_POSITIVE  , 112 'FEBRUARY'COLOR COL_HEADING, 184 'MARCH'COLOR COL_HEADING .
*WRITE AT: 10 |{ 'JANUARY' WIDTH = 63 ALIGN = CENTER }|  COLOR COL_POSITIVE  ,
*          82 |{ 'FEBRUARY' WIDTH = 63 ALIGN = CENTER }|  COLOR COL_POSITIVE ,
*          154 |{ 'MARCH' WIDTH = 63 ALIGN = CENTER }|  COLOR COL_POSITIVE  .
format_monoutput : 'JANUARY'
                  'FEBRUARY'
                  'MARCH'.
SKIP TO LINE 6.
format_rqoutput.

SKIP TO LINE 14.
format_monoutput : 'APRIL'
                  'MAY'
                  'JUNE'.
SKIP TO LINE 15.
format_rqoutput.

SKIP TO LINE 24.
format_monoutput : 'JULY'
                  'AUGUST'
                  'SEPTEMBER'.
SKIP TO LINE 25.
format_rqoutput.

SKIP TO LINE 33.
format_monoutput : 'OCTOBER'
                  'NOVEMBER'
                  'DECEMBER'.
SKIP TO LINE 34.
format_rqoutput.

*数字输出
LOOP AT gt_yday INTO wa_yday .
  IF wa_yday-rq = 6 OR wa_yday-rq = 7.
    SKIP TO LINE wa_yday-line .
    WRITE AT  wa_yday-pos(3) wa_yday-day COLOR COL_TOTAL.
  ELSE.
    SKIP TO LINE wa_yday-line .
    WRITE AT  wa_yday-pos(3) wa_yday-day.
  ENDIF.

ENDLOOP.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值