ALV台账统计表
在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.
總結
- 上一篇: ALV分类合计功能实现
- 下一篇: OO实现ALV TABLE 十一:ALV