您的位置:首页 > 其它

SM35/BDC Record / Log 导出

2016-03-30 14:42 357 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: