ALV台账统计表

    技术2022-05-20  37

    在sap开发中常常需要开发台账表,台账的统计时间是变动的, 我们通常会用临时程序来处理。我这里介绍一个简单的动态台账表(统计月份,周等在有限范围内)的实现方法。 1、申明内表 DATA: BEGIN OF gt_list OCCURS 0,         pernr    LIKE pa0001-pernr,        "员工编号         ename    LIKE pa0001-ename,        "员工姓名         gjj1 TYPE p DECIMALS 2,       "计算周期一字段         gjj2 TYPE p DECIMALS 2,       "         gjj3 TYPE p DECIMALS 2,       "         gjj4 TYPE p DECIMALS 2,       "         gjj5 TYPE p DECIMALS 2,       "         gjj6 TYPE p DECIMALS 2,       "         gjj7 TYPE p DECIMALS 2,       "         gjj8 TYPE p DECIMALS 2,       "         gjj9 TYPE p DECIMALS 2,       "         gjj10 TYPE p DECIMALS 2,       "         gjj11 TYPE p DECIMALS 2,       "         gjj12 TYPE p DECIMALS 2,       "计算周期12字段         gjj TYPE p DECIMALS 2,       "计算合计字段       END OF gt_list. 计算的周期字段由自己需求最大来定义,本例子是12个月的台账统计报表,所以只定义12个字段;

     

    2、定义统计周期参数 PARAMETERS: p_spmons TYPE s031-spmon OBLIGATORY MEMORY ID per DEFAULT sy-datum+0(6) . PARAMETERS: p_spmone  TYPE s031-spmon OBLIGATORY MEMORY ID per DEFAULT sy-datum+0(6) .

    3、在AT SELECTION-SCREEN.事件中检查台账期间的合法性 AT SELECTION-SCREEN.   CONCATENATE   p_spmons+0(6)  '01' INTO g_sdate.   CONCATENATE   p_spmone+0(6)  '01' INTO g_edate.   CALL FUNCTION 'LAST_DAY_OF_MONTHS'     EXPORTING       day_in            = g_edate     IMPORTING       last_day_of_month = g_edate.   IF g_sdate > g_edate.     MESSAGE '截止日期必须大于起始日期'   TYPE 'E'.   ENDIF.   CALL FUNCTION 'DURATION_DETERMINE'     EXPORTING       unit       = 'MON'     IMPORTING       duration   = g_count     CHANGING       start_date = g_sdate       end_date   = g_edate.   IF g_count > 12.     MESSAGE '台帐统计不能超过12个月份'   TYPE 'E'.   ENDIF.

    4、如何定义显示Grid字段格式(参见红色部分代码) FORM f_fieldcat_init USING im_fieldcat TYPE slis_t_fieldcat_alv                            im_sort TYPE slis_t_sortinfo_alv.   DATA: ls_fieldcat TYPE slis_fieldcat_alv,         ls_sort TYPE slis_sortinfo_alv.   DATA: s TYPE d.   DATA: month(5).   DATA: field(20).   DATA: n TYPE i. * "字段名要大写   s = g_sdate.

      REFRESH im_fieldcat.   REFRESH im_sort.   CLEAR ls_fieldcat.   ls_fieldcat-fieldname = 'ENAME'.   ls_fieldcat-seltext_l = '员工姓名'.   ls_fieldcat-outputlen = '10'.   APPEND ls_fieldcat TO im_fieldcat.

    *根据输入确定显示统计输出的字段   n = 1.   WHILE s+0(6) <= g_edate+0(6).     WRITE n TO month LEFT-JUSTIFIED.     CONCATENATE 'GJJ' month INTO month.     CONCATENATE s+0(6) '月' '金额'  INTO field.     CLEAR ls_fieldcat.     ls_fieldcat-fieldname =  month.     ls_fieldcat-seltext_m = field.     ls_fieldcat-outputlen = 15.     ls_fieldcat-do_sum    = 'X'.     ls_fieldcat-no_zero   = 'X'.     APPEND ls_fieldcat TO im_fieldcat.     n = n + 1.     CALL FUNCTION 'START_TIME_DETERMINE'       EXPORTING         duration   = -1         unit       = 'MON'       IMPORTING         start_date = s       CHANGING         end_date   = s.   ENDWHILE.

      CLEAR ls_fieldcat.   ls_fieldcat-fieldname =  'GJJ'.   ls_fieldcat-seltext_m =  '合计'.   ls_fieldcat-outputlen = 15.   ls_fieldcat-do_sum    = 'X'.   ls_fieldcat-no_zero   = 'X'.   APPEND ls_fieldcat TO im_fieldcat. endform.

    5、如何在计算时填写内表的合适字段   data: l_monthdur type i,         l_date type d.       l_date = sdate."数据的日期 *计算数据的日期和起始日期的月份差       CALL FUNCTION 'DURATION_DETERMINE'         EXPORTING           unit       = 'MON'         IMPORTING           duration   = l_monthdur         CHANGING           start_date = g_sdate           end_date   = l_date.       IF l_monthdur = 0.         l_monthdur = 1.       ENDIF. *根据月份差将数据算到相应字段           CASE l_monthdur.             WHEN 1.               gt_list-gjj1 = gt_list-gjj1 + wa_rt_header-betrg / 2.             WHEN 2.               gt_list-gjj2 = gt_list-gjj2 + wa_rt_header-betrg / 2.             WHEN 3.               gt_list-gjj3 = gt_list-gjj3 + wa_rt_header-betrg / 2.             WHEN 4.               gt_list-gjj4 = gt_list-gjj4 + wa_rt_header-betrg / 2.             WHEN 5.               gt_list-gjj5 = gt_list-gjj5 + wa_rt_header-betrg / 2.             WHEN 6.               gt_list-gjj6 = gt_list-gjj6 + wa_rt_header-betrg / 2.             WHEN 7.               gt_list-gjj7 = gt_list-gjj7 + wa_rt_header-betrg / 2.             WHEN 8.               gt_list-gjj8 = gt_list-gjj8 + wa_rt_header-betrg / 2.             WHEN 9.               gt_list-gjj9 = gt_list-gjj9 + wa_rt_header-betrg / 2.             WHEN 10.               gt_list-gjj10 = gt_list-gjj10 + wa_rt_header-betrg / 2.             WHEN 11.               gt_list-gjj11 = gt_list-gjj11 + wa_rt_header-betrg / 2.             WHEN 12.               gt_list-gjj12 = gt_list-gjj12 + wa_rt_header-betrg / 2.           ENDCASE.

     

     

     

    本文来自博客,转载请标明出处:http://blog.csdn.net/CompassButton/archive/2007/10/15/1826033.aspx


    最新回复(0)