SM35/BDC Record / Log 导出

来源:互联网 发布:宝拉珍选授权的淘宝店 编辑:程序博客网 时间:2024/05/14 18:15
REPORT  z_barry_sm35_log NO STANDARD PAGE HEADING LINE-SIZE 380.

TABLES: apqi,t100.
FIELD-SYMBOLS: <mtxt>,<vtxt>.
DATA: itab LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA: it_apqi TYPE STANDARD TABLE OF apqi WITH HEADER LINE.
DATA  BEGIN OF bdcld  OCCURS 0.
        INCLUDE STRUCTURE bdcld.
DATA: logname(80),
      local_host(12),
      cnt TYPE i,
      active(1) TYPE c,
      temseid TYPE rstsoname.      " TemSe ID
DATA  END OF bdcld .
DATA  selected_protocol LIKE sy-index .
DATA: logtab LIKE bdcld OCCURS 0 WITH HEADER LINE,
      logtab_temse LIKE apql OCCURS 0 WITH HEADER LINE.
DATA: logname(80).
DATA  BEGIN OF bdclm  OCCURS 0.
        INCLUDE STRUCTURE bdclm.
DATA: longtext TYPE bdc_mpar,
      isdetail(1) TYPE c,
      END OF bdclm .
DATA: lm LIKE bdclm,
      save_mpar TYPE bdc_mpar,
      mtext(124) TYPE c ,
      mtext1(124) TYPE c,
      mtext2(273) TYPE c,
      digits(10) TYPE c VALUE '0123456789',
      parcnt  TYPE i,
      sp_len  TYPE i,
      mtvaroff TYPE i,
      do_condense TYPE c,
      charcnt TYPE i,
      wcnt TYPE i,
      mparcnt TYPE i,
      qfound(04) TYPE n,
      x(1) VALUE 'X'.
DATA: BEGIN OF mt,
       off(02) TYPE n,
       len(02) TYPE n,
       text(99),
      END OF mt.
DATA: BEGIN OF mttab  OCCURS 4,
       off(02) TYPE n,
       len(02) TYPE n,
       text(99),
      END OF mttab.
DATA: BEGIN OF par,
        len(02) TYPE n,
        text(254),
      END OF par.

PARAMETERS: p_group LIKE apqi-groupid .
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE t1.
PARAMETERS: record RADIOBUTTON GROUP typ USER-COMMAND sele DEFAULT 'X'.
PARAMETERS: log RADIOBUTTON GROUP typ.
SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.
  IF p_group IS INITIAL.
    p_group = '*'.
  ENDIF.
  PERFORM get_bdc_list USING p_group.

AT LINE-SELECTION.
  IF record = 'X'.
    PERFORM get_bdc_data.
  ELSE.
    PERFORM get_bdc_log.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  get_bdc_list
*&---------------------------------------------------------------------*
FORM get_bdc_list USING gname TYPE apqi-groupid.
  CALL FUNCTION 'BDC_OBJECT_SELECT'
    EXPORTING
      name             = gname
      datatype         = 'BDC'
    TABLES
      apqitab          = it_apqi
    EXCEPTIONS
      invalid_datatype = 1
      OTHERS           = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  LOOP AT it_apqi.
    WRITE :/ it_apqi-groupid,it_apqi-creator,it_apqi-credate ,it_apqi-cretime .
    HIDE: it_apqi-qid.
  ENDLOOP.
ENDFORM.                    "get_bdc_list

*&---------------------------------------------------------------------*
*&      Form  get_bdc_data
*&---------------------------------------------------------------------*
FORM get_bdc_data.
  CALL FUNCTION 'BDC_OBJECT_READ'
    EXPORTING
      queue_id         = it_apqi-qid
    TABLES
      dynprotab        = itab
    EXCEPTIONS
      not_found        = 1
      system_failure   = 2
      invalid_datatype = 3
      OTHERS           = 4.
  IF sy-subrc <> 0.
  ENDIF.

*  EDITOR-CALL FOR itab DISPLAY-MODE.
  LOOP AT itab.
    PERFORM write_wa USING itab 'XXXXX' 'X' 'X'.
  ENDLOOP.
ENDFORM.                    "get_bdc_data

*---------------------------------------------------------------------*
*       FORM write_wa                                                 *
*---------------------------------------------------------------------*
FORM write_wa USING wa fieldmask newline alllen.
  DATA: str TYPE string ,
        str_idx TYPE string ,
        f_index TYPE i ,
        f_len TYPE i .
  FIELD-SYMBOLS: <f_field> .
  f_len = STRLEN( fieldmask ).
  IF newline = 'X'. WRITE  / ''.ENDIF.
  POSITION 1 .
  DO .
    ASSIGN COMPONENT sy-index OF STRUCTURE wa TO <f_field>.
    IF sy-subrc <> 0 OR sy-index > f_len.
      EXIT.
    ELSE.
      str_idx = sy-index .
      CONDENSE str_idx.
      f_index = sy-index - 1.
      IF fieldmask+f_index(1) = 'X'.
        IF alllen = ''.
          str = <f_field> .
          WRITE str.
        ELSE.
          WRITE <f_field>.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDDO.
ENDFORM.                    "write_wa

*&---------------------------------------------------------------------*
*&      Form  get_bdc_log
*&---------------------------------------------------------------------*
FORM get_bdc_log.
  PERFORM get_logfiles_from_temse USING it_apqi-qid.

  SORT bdcld BY edate DESCENDING etime DESCENDING.
  DESCRIBE TABLE bdcld LINES selected_protocol.
  IF selected_protocol > 0.
    PERFORM get_log USING 1.          " most recent log -> bdclm
    PERFORM extend_message_texts.     " extended texts -> bdclm
    selected_protocol = 1.
  ENDIF.
  LOOP AT bdclm.
    PERFORM write_wa USING bdclm 'XXX XXXXXXX X' 'X' 'X'.
  ENDLOOP.
ENDFORM.                    "get_bdc_log

*&---------------------------------------------------------------------*
*&      Form  get_logfiles_from_temse
*&---------------------------------------------------------------------*
FORM get_logfiles_from_temse USING qid TYPE apqi-qid.
  CLEAR logtab_temse[].
  CLEAR bdcld[].

  SELECT * FROM apql INTO TABLE logtab_temse WHERE qid = qid.

  CHECK sy-subrc = 0.
  DATA: wa_log LIKE LINE OF logtab_temse,
        wa_ld  LIKE LINE OF bdcld.

  LOOP AT logtab_temse INTO wa_log.
    CLEAR wa_ld.
    wa_ld-temseid = wa_log-temseid.
    wa_ld-lmand   = wa_log-mandant.
    wa_ld-edate   = wa_log-credate.
    wa_ld-etime   = wa_log-cretime.
    wa_ld-luser   = wa_log-creator.
    wa_ld-grpn    = wa_log-groupid.
    wa_ld-quid    = wa_log-qid.
    wa_ld-local_host = wa_log-destsys(8).
    APPEND wa_ld TO bdcld.
  ENDLOOP.

ENDFORM.                    "get_logfiles_from_temse

*&---------------------------------------------------------------------*
*&      Form  get_log
*&---------------------------------------------------------------------*
FORM get_log USING log_index.

  DATA: BEGIN OF logtable OCCURS 50,
          enterdate LIKE btctle-enterdate,
          entertime LIKE btctle-entertime,
          logmessage(400) TYPE c,
        END OF logtable.
  DATA:
        external_date(10),
        internal_date TYPE d.


  READ TABLE bdcld INDEX log_index.
  logname = bdcld-logname.

* get logfile contents from TemSe
  PERFORM read_bdc_log_plain TABLES logtable
                             USING  bdcld-temseid bdcld-lmand.

  IF sy-subrc <> 0.
    MESSAGE s004(ts).
    EXIT.
  ENDIF.

  CLEAR bdclm[].
  LOOP AT logtable.
    CALL 'DATE_CONV_INT_TO_EXT'
         ID 'DATINT' FIELD logtable-enterdate
         ID 'DATEXT' FIELD external_date.

    CALL 'DATE_CONV_EXT_TO_INT'
         ID 'DATEXT' FIELD external_date
         ID 'DATINT' FIELD internal_date.
    IF sy-subrc NE 0.
      CONTINUE.
    ENDIF.

    CLEAR bdclm.
    bdclm-indate  = logtable-enterdate.
    bdclm-intime  = logtable-entertime.
    bdclm+14(352) = logtable-logmessage.
    IF bdclm-mcnt > 0.
      bdclm-mcnt = bdclm-mcnt - 1.
    ENDIF.

    IF bdclm-mid EQ '00'.
      IF   ( bdclm-mnr EQ '162' )
        OR ( bdclm-mnr EQ '368' ).
        bdclm-isdetail = 'X'.
      ENDIF.
    ENDIF.

    APPEND bdclm.
  ENDLOOP.
ENDFORM.                    "get_log

*&---------------------------------------------------------------------*
*&      Form  extend_message_texts
*&---------------------------------------------------------------------*
FORM extend_message_texts.
  LOOP AT bdclm.
    lm = bdclm. save_mpar = bdclm-mpar.
    PERFORM get_text.
    bdclm-longtext = mtext.
    bdclm-mpar = save_mpar.
    MODIFY bdclm.
  ENDLOOP.
ENDFORM.                    "extend_message_texts

*&---------------------------------------------------------------------*
*&      Form  get_text
*&---------------------------------------------------------------------*
FORM get_text.
  DATA: shiftln TYPE i,
        vartcnt TYPE i,
        fdpos LIKE sy-fdpos.

  IF bdclm-mparcnt CN digits.
    bdclm-mparcnt = 0.
  ENDIF.

  SELECT SINGLE * FROM t100
   WHERE sprsl = sy-langu
   AND  arbgb  = bdclm-mid
   AND  msgnr  = bdclm-mnr.
*
  IF sy-subrc EQ 0.
    CLEAR: mtext,parcnt,mparcnt,charcnt,wcnt,mt,sp_len,sy-fdpos.
    MOVE bdclm-mparcnt TO mparcnt.
    IF t100-text CA '$&'.
      MOVE t100-text TO mtext1.
    ELSE.
      MOVE t100-text TO mtext.
      EXIT.
    ENDIF.

    REFRESH mttab.
    CLEAR shiftln.
    DO mparcnt TIMES.
      CLEAR: par, mttab.
      MOVE bdclm-mpar TO par.
      IF par-len CN digits OR par-len EQ 0.
        par-len  = 1.
        par-text = ' '.
        shiftln  = 2.
      ELSE.
        shiftln = par-len + 2.
      ENDIF.
      WRITE par-text TO mttab-text(par-len).
      MOVE par-len  TO mttab-len.
      MOVE mparcnt  TO mttab-off.
      APPEND mttab.
      SHIFT bdclm-mpar BY shiftln PLACES.
    ENDDO.
*
    mtext2 = mtext1.
    IF bdclm-mid EQ  '00' AND
       bdclm-mnr EQ '368' AND
       bdclm-mart EQ 'S'.
      CLEAR mtext2.
      CLEAR mttab.
      READ TABLE mttab INDEX 1.
      WRITE mttab-text TO mtext2+0(mttab-len).
      CLEAR mttab.
      READ TABLE mttab INDEX 2.
      WRITE mttab-text TO mtext2+35(mttab-len).
      mtext = mtext2.
      EXIT.
    ENDIF.

    do_condense = x.
    CLEAR: mt, vartcnt, mtvaroff.
    WHILE vartcnt LE 3.
      vartcnt = vartcnt + 1.
      IF mtext1 CA '$&'.
        parcnt = parcnt + 1.
        IF sy-fdpos GT 0.
          fdpos = sy-fdpos - 1.
        ELSE.
          fdpos = sy-fdpos.
        ENDIF.
        SHIFT mtext1 BY sy-fdpos PLACES.
        IF mtext1(1) EQ '&'.
          SHIFT mtext1 BY 1 PLACES.
          CASE mtext1(1).
            WHEN ' '.                              "'& '
              PERFORM replace_var USING '& ' parcnt fdpos.
            WHEN '$'.                              "'&&'
              PERFORM replace_var USING '&&' 0      fdpos.
            WHEN '1'.                                       "'&1'
              PERFORM replace_var USING '&1' 1      fdpos.
            WHEN '2'.                                       "'&2'
              PERFORM replace_var USING '&2' 2      fdpos.
            WHEN '3'.                                       "'&3'
              PERFORM replace_var USING '&3' 3      fdpos.
            WHEN '4'.                                       "'&4'
              PERFORM replace_var USING '&4' 4      fdpos.
            WHEN OTHERS.                           "'&'
              PERFORM replace_var USING '&<' parcnt fdpos.
          ENDCASE.
        ENDIF.
        IF mtext1(1) EQ '$'.
          SHIFT mtext1 BY 1 PLACES.
          CASE mtext1(1).
            WHEN ' '.                              "'$ '
              PERFORM replace_var USING '$ ' parcnt  fdpos.
            WHEN '$'.                              "'$$'
              PERFORM replace_var USING '$$' 0       fdpos.
            WHEN '1'.                                       "'$1'
              PERFORM replace_var USING '$1' 1       fdpos.
            WHEN '2'.                                       "'$2'
              PERFORM replace_var USING '$2' 2       fdpos.
            WHEN '3'.                                       "'$3'
              PERFORM replace_var USING '$3' 3       fdpos.
            WHEN '4'.                                       "'$4'
              PERFORM replace_var USING '$4' 4       fdpos.
            WHEN OTHERS.                           "'$'
              PERFORM replace_var USING '$<' parcnt  fdpos.
          ENDCASE.
        ENDIF.
      ENDIF.
    ENDWHILE.
*
    IF mtext2 CA '%%_D_%%'.
      REPLACE '%%_D_%%' WITH '$' INTO mtext2.
    ENDIF.
    IF mtext2 CA '%%_A_%%'.
      REPLACE '%%_A_%%' WITH '&' INTO mtext2.
    ENDIF.
    IF do_condense EQ space.
      mtext = mtext2.
    ELSE.
      CONDENSE mtext2 .
      mtext = mtext2.
    ENDIF.
  ELSE.
    mtext = '???????????????????????????????????????????????????'.
  ENDIF.
*
ENDFORM.                    "get_text

*&---------------------------------------------------------------------*
*&      Form  READ_BDC_LOG_PLAIN
*&---------------------------------------------------------------------*
FORM read_bdc_log_plain TABLES log_table
                        USING  log_name log_client.

  DATA: charcp LIKE rststype-charco VALUE '0000'.

  FREE log_table.

  CALL FUNCTION 'RSTS_GET_ATTRIBUTES'
    EXPORTING
      authority     = ' '
      client        = log_client
      name          = log_name
    IMPORTING
      charco        = charcp
    EXCEPTIONS
      fb_error      = 1
      fb_rsts_other = 2
      no_object     = 3
      no_permission = 4
      OTHERS        = 5.

  IF cl_abap_char_utilities=>charsize > 1.
    charcp = '0000'.
  ENDIF.

  CALL FUNCTION 'RSTS_OPEN_RLC'
    EXPORTING
      name           = log_name
      client         = log_client
      authority      = 'BATCH'
      prom           = 'I'
      rectyp         = 'VNL----'
      charco         = charcp
    EXCEPTIONS
      fb_call_handle = 4
      fb_error       = 8
      fb_rsts_noconv = 12
      fb_rsts_other  = 16
      no_object      = 20
      OTHERS         = 24.

  IF sy-subrc > 0.
    EXIT.
  ENDIF.

  CALL FUNCTION 'RSTS_READ'
    TABLES
      datatab        = log_table
    EXCEPTIONS
      fb_call_handle = 4
      fb_error       = 8
      fb_rsts_noconv = 12
      fb_rsts_other  = 16
      OTHERS         = 16.

  IF sy-subrc > 0.
    EXIT.
  ENDIF.

  CALL FUNCTION 'RSTS_CLOSE'
    EXCEPTIONS
      OTHERS = 4.

  IF sy-subrc > 0.
    EXIT.
  ENDIF.
ENDFORM. " READ_BDC_LOG_PLAIN

*&---------------------------------------------------------------------*
*&      Form  replace_var
*&---------------------------------------------------------------------*
FORM replace_var USING vark vari varpos.

  DATA: var(02),
        var1,
        moff TYPE i.

  CLEAR: mttab , moff.
  var = vark.
  SHIFT var BY 1 PLACES.
  CASE var.
    WHEN ' '.                              "'& '
      READ TABLE mttab INDEX vari.
      IF sy-subrc EQ 0.
        moff = varpos + mtvaroff.
        ASSIGN mtext2+moff(*) TO <mtxt>.
        ASSIGN mttab-text(mttab-len) TO <vtxt>.
        var1 = vark.
        REPLACE var1 WITH <vtxt>     INTO <mtxt>.
        mtvaroff = mttab-len.
      ELSE.
        IF vari GT mparcnt.
          moff = varpos + mtvaroff.
          ASSIGN mtext2+moff(*) TO <mtxt>.
          REPLACE vark WITH '  ' INTO <mtxt>.
          mtvaroff = 2.
        ELSE.
          moff = varpos + mtvaroff.
          ASSIGN mtext2+moff(*) TO <mtxt>.
          REPLACE vark WITH '%%_Z_%%' INTO <mtxt>.
          mtvaroff = 7.
        ENDIF.
      ENDIF.
    WHEN '$'.                              "'&&'
      moff = varpos + mtvaroff.
      ASSIGN mtext2+moff(*) TO <mtxt>.
      REPLACE vark WITH '%%_D_%%' INTO <mtxt>.
      mtvaroff = 7.
    WHEN '&'.                              "'&&'
      moff = varpos + mtvaroff.
      ASSIGN mtext2+moff(*) TO <mtxt>.
      REPLACE vark WITH '%%_A_%%' INTO <mtxt>.
      mtvaroff = 7.
    WHEN '<'.                                               "'&1'
      READ TABLE mttab INDEX vari.
      IF sy-subrc EQ 0.
        IF vark EQ '&<'.
          moff = varpos + mtvaroff.
          ASSIGN mtext2+moff(*) TO <mtxt>.
          ASSIGN mttab-text(mttab-len) TO <vtxt>.
          REPLACE '&' WITH <vtxt>     INTO <mtxt>.
          mtvaroff = mttab-len.
        ENDIF.
        IF vark EQ '$<'.
          moff = varpos + mtvaroff.
          ASSIGN mtext2+moff(*) TO <mtxt>.
          ASSIGN mttab-text(mttab-len) TO <vtxt>.
          REPLACE '$' WITH <vtxt>     INTO <mtxt>.
          mtvaroff = mttab-len.
        ENDIF.
      ELSE.
        IF vark EQ '&<'.
          moff = varpos + mtvaroff.
          ASSIGN mtext2+moff(*) TO <mtxt>.
          REPLACE '&' WITH ' ' INTO <mtxt>.
          mtvaroff = 1.
        ENDIF.
        IF vark EQ '$<'.
          moff = varpos + mtvaroff.
          ASSIGN mtext2+moff(*) TO <mtxt>.
          REPLACE '$' WITH ' ' INTO <mtxt>.
          mtvaroff = 1.
        ENDIF.
      ENDIF.
    WHEN '1'.                                               "'&1'
      READ TABLE mttab INDEX 1.
      IF sy-subrc EQ 0.
        moff = varpos + mtvaroff.
        ASSIGN mtext2+moff(*) TO <mtxt>.
        ASSIGN mttab-text(mttab-len) TO <vtxt>.
        REPLACE vark WITH <vtxt>     INTO <mtxt>.
        mtvaroff = mttab-len.
      ELSE.
        IF vari GT mparcnt.
          moff = varpos + mtvaroff.
          ASSIGN mtext2+moff(*) TO <mtxt>.
          REPLACE vark WITH '  ' INTO <mtxt>.
          mtvaroff = 2.
        ELSE.
          moff = varpos + mtvaroff.
          ASSIGN mtext2+moff(*) TO <mtxt>.
          REPLACE vark WITH '%%_Z_%%' INTO <mtxt>.
          mtvaroff = 7.
        ENDIF.
      ENDIF.
    WHEN '2'.                                               "'&2'
      READ TABLE mttab INDEX 2.
      IF sy-subrc EQ 0.
        moff = varpos + mtvaroff.
        ASSIGN mtext2+moff(*) TO <mtxt>.
        ASSIGN mttab-text(mttab-len) TO <vtxt>.
        REPLACE vark WITH <vtxt>     INTO <mtxt>.
        mtvaroff = mttab-len.
      ELSE.
        IF vari GT mparcnt.
          moff = varpos + mtvaroff.
          ASSIGN mtext2+moff(*) TO <mtxt>.
          REPLACE vark WITH '  ' INTO <mtxt>.
          mtvaroff = 2.
        ELSE.
          moff = varpos + mtvaroff.
          ASSIGN mtext2+moff(*) TO <mtxt>.
          REPLACE vark WITH '%%_Z_%%' INTO <mtxt>.
          mtvaroff = 7.
        ENDIF.
      ENDIF.
    WHEN '3'.                                               "'&3'
      READ TABLE mttab INDEX 3.
      IF sy-subrc EQ 0.
        moff = varpos + mtvaroff.                    "neu
        ASSIGN mtext2+moff(*) TO <mtxt>.              "neu
        ASSIGN mttab-text(mttab-len) TO <vtxt>.
        REPLACE vark WITH <vtxt>     INTO <mtxt>.     "neu
        mtvaroff = mttab-len.                        "neu
      ELSE.
        IF vari GT mparcnt.
          moff = varpos + mtvaroff.                    "neu
          ASSIGN mtext2+moff(*) TO <mtxt>.              "neu
          REPLACE vark WITH '  ' INTO <mtxt>.     "neu
          mtvaroff = 2.                        "neu
        ELSE.
          moff = varpos + mtvaroff.                    "neu
          ASSIGN mtext2+moff(*) TO <mtxt>.              "neu
          REPLACE vark WITH '%%_Z_%%' INTO <mtxt>.     "neu
          mtvaroff = 7.                   "neu
        ENDIF.
      ENDIF.
    WHEN '4'.                                               "'&4'
      READ TABLE mttab INDEX 4.
      IF sy-subrc EQ 0.
        moff = varpos + mtvaroff.                    "neu
        ASSIGN mtext2+moff(*) TO <mtxt>.              "neu
        ASSIGN mttab-text(mttab-len) TO <vtxt>.
        REPLACE vark WITH <vtxt>     INTO <mtxt>.     "neu
        mtvaroff = mttab-len.                        "neu
      ELSE.
        IF vari GT mparcnt.
          moff = varpos + mtvaroff.                    "neu
          ASSIGN mtext2+moff(*) TO <mtxt>.              "neu
          REPLACE vark WITH '  ' INTO <mtxt>.     "neu
          mtvaroff = 2.                        "neu
        ELSE.
          moff = varpos + mtvaroff.                    "neu
          ASSIGN mtext2+moff(*) TO <mtxt>.              "neu
          REPLACE vark WITH '%%_Z_%%' INTO <mtxt>.     "neu
          mtvaroff = 7.                   "neu
        ENDIF.
      ENDIF.
*
  ENDCASE.
  do_condense = space.
ENDFORM.                    "replace_var
0 0