BW数据加载时间分析程序

REPORT zrpbw_001 MESSAGE-ID zbw01.
TYPE-POOLS:slis.
TABLES:rsreqdone,rsbkrequest,rsbkdtp,rsldpio,rsstatmanpart,rsmoniptab.

DATA:gt_done     TYPE TABLE OF rsreqdone,
     gs_done     TYPE rsreqdone,
     gt_rsbkdtp  TYPE TABLE OF rsbkdtp,
     gs_rsbkdtp  TYPE rsbkdtp,
     gt_rsldpio  TYPE TABLE OF rsldpio,
     gs_rsldpio  TYPE rsldpio,
     gt_rsldpiot TYPE TABLE OF rsldpiot,
     gs_rsldpiot TYPE rsldpiot,
     gt_part     TYPE TABLE OF rsstatmanpart,
     gs_part     TYPE rsstatmanpart,
     gt_request  TYPE TABLE OF rsbkrequest,
     gs_request  TYPE rsbkrequest,
     gt_iptab    TYPE TABLE OF rsmoniptab,
     gs_iptab    TYPE rsmoniptab.

DATA:BEGIN OF gs_output,
       rnr         TYPE rsrequnr"数据传输请求号
       logdpid     TYPE rslogdpid,
       src         TYPE  rsbksrcnm,
       srctlogo    TYPE  rsbksrctlogo,
       tgt         TYPE  rsbktgtnm,
       tgttlogo    TYPE  rsbktgttlogo,
       bdate       TYPE sy-datum,
       btime       TYPE sy-uzeit,
       edate       TYPE sy-datum,
       etime       TYPE sy-uzeit,
       runtime     TYPE p DECIMALS 3,
       anz_recs    TYPE rsnumrecord,
       insert_recs TYPE rsnumrecord,
       tstatus     TYPE rsstatus,
     END OF gs_output,
     gt_output LIKE TABLE OF gs_output.

DATA:gt_fieldcat TYPE slis_t_fieldcat_alv,
     gs_fieldcat TYPE slis_fieldcat_alv,
     gs_layout   TYPE slis_layout_alv.

SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE t1.
SELECT-OPTIONS:s_bgdate FOR sy-datum DEFAULT sy-datum NO-EXTENSION OBLIGATORY.  "开始日期
" p_endate TYPE sy-datum DEFAULT '99991231'.  "结束日期

SELECTION-SCREEN END OF BLOCK blk1.

INITIALIZATION.
  t1 '选择条件'.

START-OF-SELECTION.
  PERFORM get_data.  "数据获取
  PERFORM display_alv.  "数据显示
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_data .
  DATA:l_second TYPE i.
  DATA:l_date     TYPE sy-datum,
       l_time     TYPE sy-uzeit,
       l_date_end TYPE sy-datum,
       l_time_end TYPE sy-uzeit.
  "由于后台表存放的时间是UTC时区时间,实际前台看到时间是UTC+8时区,两者相差8小时
  l_date = s_bgdate-low 1.
  l_time '160000'.
  IF s_bgdate-high IS NOT INITIAL.
    l_date_end = s_bgdate-high.
    l_time_end '160000'.
  ELSE.
    l_date_end = s_bgdate-low.
    l_time_end '160000'.
  ENDIF.

*抓取数据加载日志
  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_done
    FROM rsreqdone
    WHERE ( datum EQ l_date AND uzeit GE l_time )
      OR ( datum EQ l_date_end AND uzeit LE l_time_end )
      OR ( datum GT l_date AND datum LT l_date_end ).

  "删除DTP或者信息包为空的数据
  DELETE gt_done WHERE logdpid IS INITIAL.

  LOOP AT gt_done INTO gs_done.
    CLEAR gs_output.
    gs_output-rnr = gs_done-rnr.
    gs_output-logdpid = gs_done-logdpid.
    gs_output-tstatus = gs_done-tstatus.
    "开始时间时区转换成UTC+8
    PERFORM frm_calc_time USING 'UTC+8'
                            gs_done-datum
                            gs_done-uzeit
                    CHANGING gs_output-bdate
                             gs_output-btime.
    "结束时间时区转换成UTC+8
    PERFORM frm_calc_time USING 'UTC+8'
                            gs_done-tdatum
                            gs_done-tuzeit
                    CHANGING gs_output-edate
                             gs_output-etime.
    "计算时间差
    IF gs_output-bdate IS NOT INITIAL AND gs_output-edate IS NOT INITIAL.
      CLEAR l_second.
      CALL FUNCTION 'SALP_SM_CALC_TIME_DIFFERENCE'
        EXPORTING
          date_1  = gs_output-bdate
          time_1  = gs_output-btime
          date_2  = gs_output-edate
          time_2  = gs_output-etime
        IMPORTING
          seconds = l_second.

      gs_output-runtime = l_second / 60.
    ENDIF.

    APPEND gs_output TO gt_output.
  ENDLOOP.

  "  DELETE gt_output WHERE runtime IS INITIAL.


  "补充源对象,源对象类型,目标对象,目标对象类型
  IF gt_output IS NOT INITIAL.
    "DTP信息
    SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_rsbkdtp
      FROM rsbkdtp
      FOR ALL ENTRIES IN gt_output
      WHERE dtp = gt_output-logdpid
        AND objvers 'A'.
    SORT gt_rsbkdtp BY dtp.

    "INFOPACKAGE信息
    SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_rsldpio
      FROM rsldpio
      FOR ALL ENTRIES IN gt_output
      WHERE logdpid = gt_output-logdpid
        AND objvers 'A'.
    SORT gt_rsldpio BY logdpid.

    IF gt_rsldpio IS NOT INITIAL.
      SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_rsldpiot
      FROM rsldpiot
      FOR ALL ENTRIES IN gt_rsldpio
      WHERE langu 1
        AND logdpid = gt_rsldpio-logdpid
        AND objvers 'A'.
      SORT gt_rsldpiot BY logdpid.
    ENDIF.

    "请求数据条目数
*    SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_part
*      FROM rsstatmanpart
*      FOR ALL ENTRIES IN gt_output
*      WHERE rnr = gt_output-rnr.
*    SORT gt_part BY rnr.
    "DTP请求数据条目数
    SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_request
      FROM rsbkrequest
      FOR ALL ENTRIES IN gt_output
      WHERE request = gt_output-rnr.
    SORT gt_request BY request.

    "信息包数据条目数
    SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_iptab
      FROM rsmoniptab
      FOR ALL ENTRIES IN gt_output
      WHERE rnr = gt_output-rnr.
    DELETE gt_iptab WHERE rqrecord IS INITIAL.
    SORT gt_iptab BY rnr ip_nr DESCENDING.
    DELETE ADJACENT DUPLICATES FROM gt_iptab COMPARING rnr.

    LOOP AT gt_output INTO gs_output.
      CLEAR gs_rsbkdtp.
      "补充DTP源对象,目标对象,对象类型
      READ TABLE gt_rsbkdtp INTO gs_rsbkdtp WITH KEY
      dtp = gs_output-logdpid BINARY SEARCH.
      IF sy-subrc 0.
        gs_output-src = gs_rsbkdtp-src.
        gs_output-srctlogo = gs_rsbkdtp-srctlogo.
        gs_output-tgt   = gs_rsbkdtp-tgt.
        gs_output-tgttlogo = gs_rsbkdtp-tgttlogo.
      ENDIF.

      CLEAR:gs_rsldpio,gs_rsldpiot.
      READ TABLE gt_rsldpio INTO gs_rsldpio WITH KEY
      logdpid = gs_output-logdpid BINARY SEARCH.
      IF sy-subrc 0.         
READ TABLE gt_rsldpiot INTO gs_rsldpiot WITH KEY       logdpid 
= gs_rsldpio-logdpid BINARY SEARCH.         gs_output
-src = gs_rsldpiot-text.         gs_output
-srctlogo 'ISIP'.         
CONCATENATE gs_rsldpio-oltpsource gs_rsldpio-logsys INTO gs_output-tgt SEPARATED BY space.         gs_output
-tgttlogo 'RSDS'.       
ENDIF.       

"补充请求中数据条目数       
CLEAR gs_request.       
READ TABLE gt_request INTO gs_request WITH KEY request = gs_output-rnr BINARY SEARCH.       
IF sy-subrc 0.
*        IF gs_request-tstate = 4.  "已删除的
*          DELETE gt_output.
*          CONTINUE.
*        ENDIF.         gs_output
-anz_recs = gs_request-linesread.       
ENDIF.       
CLEAR gs_iptab.       
READ TABLE gt_iptab INTO gs_iptab WITH KEY rnr = gs_output-rnr BINARY SEARCH.       
IF sy-subrc 0.         gs_output
-anz_recs = gs_iptab-rqrecord.       
ENDIF.       

MODIFY gt_output FROM gs_output.     
ENDLOOP.   
ENDIF.   

SORT gt_output BY  runtime  DESCENDING tgttlogo DESCENDING.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_alv .   
DATA: l_col_pos TYPE sy-cucol.   
DEFINE build_fieldcat.     l_col_pos 
= l_col_pos + 1.     
CLEAR gs_fieldcat.     gs_fieldcat
-col_pos       = l_col_pos.     gs_fieldcat
-fieldname     = &1.     gs_fieldcat
-seltext_m     = &2.     
APPEND gs_fieldcat TO gt_fieldcat.   
END-OF-DEFINITION.   

"输出字段   
REFRESH gt_fieldcat.   build_fieldcat
:'LOGDPID' '信息包',                  
'SRC' '源对象',                  
'SRCTLOGO' '源对象类型',                  
'TGT' '目标对象',                  
'TGTTLOGO' '目标对象类型',                  
'BDATE' '开始日期',                  
'BTIME' '开始时间',                  
'EDATE' '结束日期',                  
'ETIME' '结束时间',                  
'RUNTIME' '运行时间(分)',                  
'ANZ_RECS' '传输的记录',                  
'TSTATUS' '状态'.   gs_layout

-colwidth_optimize 'X'.   

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'     
EXPORTING
*     I_CALLBACK_PROGRAM                = ' '
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME                  =
*     I_BACKGROUND_ID                   = ' '
*     I_GRID_TITLE  =
*     I_GRID_SETTINGS                   =       is_layout     
= gs_layout       it_fieldcat   
= gt_fieldcat
*     IT_EXCLUDING  =
*     IT_SPECIAL_GROUPS                 =
*     IT_SORT       =
*     IT_FILTER     =
*     IS_SEL_HIDE   =
*     I_DEFAULT     = 'X'
*     I_SAVE        = ' '     
TABLES       t_outtab      
= gt_output     
EXCEPTIONS       program_error 
1       
OTHERS        2.   
IF sy-subrc <> 0.
* Implement suitable error handling here   
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CALC_TIME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0164   text
*      -->P_GS_DONE_DATUM  text
*      -->P_GS_DONE_UZEIT  text
*      <--P_GS_OUTPUT_BDATE  text
*      <--P_GS_OUTPUT_BTIME  text
*----------------------------------------------------------------------*
FORM frm_calc_time  USING   u_timez TYPE sy-zonlo                              u_date 
TYPE sy-datum                              u_time 
TYPE sy-uzeit                 
CHANGING c_date TYPE sy-datum                          c_time 
TYPE uzeit.   

DATA: l_tstampl     TYPE timestampl,         l_txttime
(30).   

CLEAR:c_date,c_time.   

CONCATENATE u_date u_time INTO l_txttime.   l_tstampl 
= l_txttime.   

CONVERT TIME STAMP l_tstampl TIME ZONE u_timez     
INTO DATE c_date TIME c_time.
ENDFORM.

原文地址:https://www.cnblogs.com/xmqlv20081008/p/7284260.html