‎2008 Aug 06 11:13 AM
Hi All,
I have a small issue like.I have created batch input session through the program and i have run the batch session in SM35 sucessfully. The log is generated.I want to display this log through my report.
Is there any function module for this.I know tat we can use APQL table and BDCLd and BDCLM.
in BDCLD and BDCLM strctures the values will be strored.How to read the data from those strctures.
Is there any FM to get the data from those structures.
‎2008 Aug 06 11:16 AM
Try this sample code..may be it will help u..
REPORT zepo_bi_log LINE-SIZE 255.
TABLES: apqd, apqi, t100, bdcdata.
DATA: BEGIN OF st-ifile,
trans LIKE apqd-trans,
field1(132),
field2(132),
field3(132),
field4(132),
field5(132),
type(4),
END OF st-ifile,
BEGIN OF ifields OCCURS 5,
fnam TYPE bdcdata-fnam,
fieldtext TYPE dfies-fieldtext,
intlen TYPE dd03l-intlen,
outputlen TYPE dd03l-leng,
END OF ifields,
w_dfies LIKE dfies.
DATA: iapqd LIKE apqd OCCURS 0 WITH HEADER LINE.
DATA: ifile LIKE st-ifile OCCURS 0 WITH HEADER LINE.
DATA: paramname(11) VALUE 'bdc/logfile',
logname(80) VALUE 'D:\usr\sap\DEV\SYS\global\BIS70M000600.LOG',
logname1(80),
s_logname(80),
ec TYPE i,
one TYPE i VALUE 1,
bdcld# TYPE i,
log_flag,
counter_err TYPE i,
l_counter(7) TYPE n,
parcnt TYPE i,
do_condense TYPE c,
mtvaroff TYPE i,
x(1) VALUE 'X',
mparcnt TYPE i,
charcnt TYPE i,
wcnt TYPE i,
sp_len TYPE i,
digits(10) TYPE c VALUE '0123456789',
mtext(124) TYPE c,
mtext1(124) TYPE c,
mtext2(273) TYPE c,
line_count TYPE i,
protcnt TYPE i.
DATA: BEGIN OF mttab OCCURS 4,
off(02) TYPE n,
len(02) TYPE n,
text(80),
END OF mttab.
DATA: BEGIN OF mt,
off(02) TYPE n,
len(02) TYPE n,
text(80),
END OF mt.
DATA: BEGIN OF file.
INCLUDE rstr0112.
DATA: END OF file.
DATA: BEGIN OF par,
len(02) TYPE n,
text(80),
END OF par.
DATA: shiftlen TYPE i VALUE 0,
protflen TYPE i VALUE 0,
protfoff TYPE i VALUE 0,
rlen TYPE i VALUE 0.
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.
DATA: END OF bdcld.
DATA: logtab LIKE bdcld OCCURS 0 WITH HEADER LINE,
logtab_temse LIKE apql OCCURS 0 WITH HEADER LINE.
DATA: BEGIN OF bdclda OCCURS 0.
INCLUDE STRUCTURE bdcld.
DATA: END OF bdclda.
DATA: it_apqi LIKE apqi OCCURS 0 WITH HEADER LINE.
DATA: save_mpar TYPE bdc_mpar.
DATA: BEGIN OF bdclm OCCURS 0.
INCLUDE STRUCTURE bdclm.
DATA: counter TYPE i,
longtext TYPE bdc_mpar,
END OF bdclm.
DATA: BEGIN OF prot_list OCCURS 0.
INCLUDE rstr0112.
DATA: seen(1),
to_be_deleted(1),
has_changed(1),
local_host(12),
END OF prot_list.
DATA: field_offset TYPE i,
field_length TYPE i,
rec_cnt TYPE i,
found TYPE i,
j TYPE i,
jc(1),
k TYPE i,
kc(1),
field_txt(12),
p_field_txt(8),
c20(20),
c21(20),
c22(20).
needed for check if TemSe interface is active:
DATA: protparam(60) VALUE 'bdc/new_protocol',
newprot(3) VALUE 'off',
selected_protocol TYPE i.
DATA: w_tabname LIKE dfies-tabname,
w_fieldname LIKE dfies-fieldname,
w_space(132) TYPE c.
DATA: w_grpid(12).
DATA: p_qid(20).
FIELD-SYMBOLS: <p_field>,
<mtxt>,
<vtxt>,
<field>.
***
Selection screen
***
SELECTION-SCREEN BEGIN OF BLOCK qid WITH FRAME TITLE text-001.
Group Selection
PARAMETERS: p_grpid LIKE apqi-groupid DEFAULT 'IT*'.
SELECT-OPTIONS: so_date FOR apqi-credate DEFAULT sy-datum NO-EXTENSION.
SELECTION-SCREEN END OF BLOCK qid.
SELECTION-SCREEN BEGIN OF BLOCK type WITH FRAME TITLE text-002.
Messages Selection
SELECT-OPTIONS: so_mart FOR bdclm-mart DEFAULT 'E',
so_mid FOR bdclm-mid,
so_mnr FOR bdclm-mnr.
SELECTION-SCREEN END OF BLOCK type.
SELECTION-SCREEN BEGIN OF BLOCK fields WITH FRAME TITLE text-003.
Field Output Selection
PARAMETERS: p_field1 LIKE bdcdata-fnam DEFAULT 'RP50G-PERNR',
p_field2 LIKE bdcdata-fnam DEFAULT 'RP50G-BEGDA',
p_field3 LIKE bdcdata-fnam DEFAULT 'RP50G-ENDDA',
p_field4 LIKE bdcdata-fnam,
p_field5 LIKE bdcdata-fnam.
SELECTION-SCREEN END OF BLOCK fields.
***
At selection screen
***
AT SELECTION-SCREEN ON so_date.
IF so_date-low IS INITIAL.
so_date-low = sy-datum.
MESSAGE e065(29).
ENDIF.
***
Start of selection
***
START-OF-SELECTION.
IF p_grpid IS INITIAL.
p_grpid = '*'.
ENDIF.
MOVE p_grpid TO w_grpid.
REPLACE '*' WITH '%' INTO w_grpid.
IF so_date-high LT so_date-low.
so_date-high = so_date-low.
ENDIF.
SELECT * FROM apqi WHERE groupid LIKE w_grpid
AND credate GE so_date-low
AND credate LE so_date-high.
WRITE:/ apqi-groupid HOTSPOT, apqi-creator,
apqi-credate, apqi-cretime.
HIDE: apqi-qid,
apqi-groupid, apqi-creator, apqi-credate, apqi-cretime.
ENDSELECT.
***
At line selection
***
AT LINE-SELECTION.
REFRESH: bdclm,
prot_list,
iapqd,
it_apqi,
ifile,
ifields,
bdcld.
k = 0.
DO 5 TIMES.
k = k + 1.
kc = k.
CONCATENATE 'p_field' kc INTO p_field_txt.
ASSIGN (p_field_txt) TO <p_field>.
IF <p_field> = space.
CONTINUE.
ENDIF.
ifields-fnam = <p_field>.
TRANSLATE ifields-fnam TO UPPER CASE.
SPLIT ifields-fnam AT '-' INTO w_tabname w_fieldname.
SELECT SINGLE intlen leng
FROM dd03l
INTO (ifields-intlen,ifields-outputlen)
WHERE tabname = w_tabname
AND fieldname = w_fieldname.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
ifields-fieldtext = w_fieldname.
APPEND ifields.
ENDDO.
logname = space.
line_count = 0.
p_qid = apqi-qid.
WRITE:/ apqi-groupid , apqi-creator , apqi-credate , apqi-cretime.
WRITE:/.
WRITE:/ ' LINE' , ' TRAN '.
LOOP AT ifields.
WRITE: ifields-fieldtext(ifields-outputlen).
ENDLOOP.
WRITE: 'TYPE' , 'ERROR MSG'.
it_apqi-qid = p_qid.
PERFORM f_get_logfiles_for_qid.
IF selected_protocol > 0.
PERFORM f_get_log.
PERFORM f_extend_message_texts.
ENDIF.
LOOP AT bdclm WHERE mart IN so_mart AND
mid IN so_mid AND
mnr IN so_mnr.
SELECT * INTO TABLE iapqd
FROM apqd WHERE qid = p_qid AND
trans = bdclm-tcnt.
SORT iapqd BY qid trans block.
LOOP AT iapqd.
IF ifile-trans NE iapqd-trans.
IF ifile-trans NE space.
APPEND ifile.
ENDIF.
ENDIF.
k = 0.
found = 0.
LOOP AT ifields.
k = k + 1.
kc = k.
CONCATENATE 'ifile-field' kc INTO field_txt.
ASSIGN ifields-fnam TO <p_field>.
ASSIGN (field_txt) TO <field>.
IF <p_field> = space OR NOT <field> IS INITIAL.
CONTINUE.
ENDIF.
Retrieve content of the field
SEARCH iapqd-vardata FOR <p_field>.
IF sy-subrc = 0.
found = 1.
field_length = STRLEN( <p_field> ).
field_offset = sy-fdpos + field_length + 1.
IF field_offset > iapqd-varlen.
CONTINUE.
ENDIF.
<field> = iapqd-vardata+field_offset(ifields-intlen).
ENDIF.
ENDLOOP.
ifile-trans = iapqd-trans.
ENDLOOP.
ADD 1 TO line_count.
WRITE:/ line_count,
ifile-trans.
k = 0.
LOOP AT ifields.
k = k + 1.
kc = k.
CONCATENATE 'ifile-field' kc INTO field_txt.
ASSIGN (field_txt) TO <field>.
IF <field> IS INITIAL.
WRITE: w_space(ifields-outputlen).
ELSE.
WRITE: <field>(ifields-outputlen).
ENDIF.
ENDLOOP.
ifile-type = bdclm-mart.
WRITE: ifile-type.
PERFORM f_get_text1.
WRITE: mtext.
CLEAR: ifile.
ENDLOOP.
----
FORM F_GET_TEXT1 *
----
FORM f_get_text1.
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.
par-len = 1.
ENDIF.
WRITE par-text TO mttab-text(par-len).
MOVE par-len TO mttab-len.
MOVE mparcnt TO mttab-off.
APPEND mttab.
shiftln = par-len + 2.
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. " neu 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 f_replace_var USING '& ' parcnt fdpos.
WHEN '$'. "'&&'
PERFORM f_replace_var USING '&&' 0 fdpos.
WHEN '1'.
PERFORM f_replace_var USING '&1' 1 fdpos.
WHEN '2'.
PERFORM f_replace_var USING '&2' 2 fdpos.
WHEN '3'.
PERFORM f_replace_var USING '&3' 3 fdpos.
WHEN '4'.
PERFORM f_replace_var USING '&4' 4 fdpos.
WHEN OTHERS. "'&'
PERFORM f_replace_var USING '&<' parcnt fdpos.
ENDCASE.
ENDIF.
IF mtext1(1) EQ '$'.
SHIFT mtext1 BY 1 PLACES.
CASE mtext1(1).
WHEN ' '. "'$ '
PERFORM f_replace_var USING '$ ' parcnt fdpos.
WHEN '$'. "'$$'
PERFORM f_replace_var USING '$$' 0 fdpos.
WHEN '1'.
PERFORM f_replace_var USING '$1' 1 fdpos.
WHEN '2'.
PERFORM f_replace_var USING '$2' 2 fdpos.
WHEN '3'.
PERFORM f_replace_var USING '$3' 3 fdpos.
WHEN '4'.
PERFORM f_replace_var USING '$4' 4 fdpos.
WHEN OTHERS. "'$'
PERFORM f_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 = '???????????????????????????????????????????????????'(999).
ENDIF.
ENDFORM. " F_GET_TEXT1
----
FORM F_REPLACE_VAR *
----
FORM f_replace_var USING vark vari varpos.
DATA: var(02),
var1,
moff TYPE i,
len TYPE i,
vlen 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 '<'.
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'.
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'.
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'.
READ TABLE mttab INDEX 3.
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 '4'.
READ TABLE mttab INDEX 4.
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.
ENDCASE.
do_condense = space.
ENDFORM. " F_REPLACE_VAR
----
FORM F_GET_LOGFILE_FOR_QID *
----
FORM f_get_logfiles_for_qid.
Get log from TemSe if it is active
PERFORM f_get_logfiles_from_temse.
IF bdcld[] IS INITIAL.
newprot = 'OFF'.
Get logs from common log file
CALL 'C_SAPGPARAM' ID 'NAME' FIELD paramname
ID 'VALUE' FIELD logname.
PERFORM f_list_protocol_files.
LOOP AT prot_list.
logname = prot_list-name.
PERFORM f_log_dir.
ENDLOOP.
ENDIF.
Now bdcld contains the log files for the given qid
SORT bdcld BY edate DESCENDING etime DESCENDING.
DESCRIBE TABLE bdcld LINES selected_protocol.
ENDFORM. " F_GET_LOGFILES_FOR_QID
----
FORM F_FILL_PROT_LIST *
----
FORM f_fill_prot_list USING prot_files.
DATA: logname1(80),
new_logfile(04) VALUE 'BI* ',
old_logfile(06) VALUE 'bdclog'.
CLEAR: logname1,
prot_list,
protcnt.
REFRESH: prot_list.
protflen = STRLEN( prot_files ).
MOVE prot_files TO logname1.
WHILE shiftlen LE protflen.
IF logname1 CP '#B#I'.
IF sy-fdpos EQ 0.
shiftlen = 2.
ELSE.
shiftlen = sy-fdpos.
ENDIF.
protfoff = protfoff + shiftlen.
SHIFT logname1 BY shiftlen PLACES.
ELSE.
shiftlen = protflen + 1.
protfoff = protfoff - 2.
ENDIF.
ENDWHILE.
IF protfoff LE 0.
protfoff = 0.
ENDIF.
rlen = 80 - protfoff.
WRITE space TO prot_files+protfoff(rlen).
WRITE new_logfile TO prot_files+protfoff(4).
PERFORM f_search_prot USING prot_files.
WRITE space TO prot_files+protfoff(rlen).
WRITE old_logfile TO prot_files+protfoff(6).
PERFORM f_search_prot USING prot_files.
ENDFORM. " F_FILL_PROT_LIST
----
FORM F_LOG_DIR *
----
FORM f_log_dir.
CLEAR bdclda. REFRESH bdclda.
CALL 'ReadLogDirA' ID 'LOGN' FIELD logname
ID 'DTAB' FIELD bdclda-sys
ID 'AINF' FIELD one
ID 'ECNT' FIELD ec.
IF sy-subrc NE 0 OR ec = 0.
EXIT.
ENDIF.
LOOP AT bdclda WHERE lmand = sy-mandt AND quid = it_apqi-qid.
MOVE-CORRESPONDING bdclda TO bdcld.
MOVE logname TO bdcld-logname.
MOVE prot_list-local_host TO bdcld-local_host.
APPEND bdcld.
ENDLOOP.
ENDFORM. " F_LOG_DIR.
----
FORM F_SEARCH_PROT *
----
FORM f_search_prot USING prot_files.
DATA: errcnt(2) TYPE p VALUE 0.
CALL 'C_DIR_READ_START' ID 'FILE' FIELD prot_files
ID 'ERRNO' FIELD file-errno
ID 'ERRMSG' FIELD file-errmsg.
IF sy-subrc <> 0.
WRITE:/ 'error call C_DIR_READ_START sy-subrc' , sy-subrc.
ENDIF.
DO.
Read protocol file
CLEAR file.
CALL 'C_DIR_READ_NEXT'
ID 'TYPE' FIELD file-type
ID 'NAME' FIELD file-name
ID 'LEN' FIELD file-len
ID 'OWNER' FIELD file-owner
ID 'MTIME' FIELD file-mtime
ID 'MODE' FIELD file-mode
ID 'ERRNO' FIELD file-errno
ID 'ERRMSG' FIELD file-errmsg.
MOVE sy-subrc TO file-subrc.
CASE sy-subrc.
WHEN 0.
CASE file-type(1).
WHEN 'F'. " normal file.
MOVE 1 TO file-useable.
WHEN 'f'. " normal file.
MOVE 1 TO file-useable.
WHEN OTHERS. " Directory, device, fifo, socket,...
MOVE 0 TO file-useable.
ENDCASE.
IF file-len = 0.
MOVE 0 TO file-useable.
ENDIF.
WHEN 1.
EXIT.
WHEN OTHERS. " SY-SUBRC >= 2
ADD 1 TO errcnt.
IF errcnt > 10.
EXIT.
ENDIF.
IF sy-subrc = 5.
MOVE: '???' TO file-type,
'???' TO file-owner,
'???' TO file-mode.
ENDIF.
MOVE 0 TO file-useable.
ENDCASE.
MOVE-CORRESPONDING file TO prot_list.
SHIFT file-name BY protfoff PLACES.
MOVE file-name TO prot_list-local_host.
protcnt = protcnt + 1.
APPEND prot_list.
ENDDO.
CALL 'C_DIR_READ_FINISH'
ID 'ERRNO' FIELD file-errno
ID 'ERRMSG' FIELD file-errmsg.
ENDFORM. " F_SEARCH_PROT
&----
*& Form F_LIST_PROTOCOL_FILES *
&----
FORM f_list_protocol_files.
CLEAR: logname1, prot_list, protcnt.
REFRESH: prot_list.
protflen = STRLEN( logname ).
MOVE logname TO logname1.
WHILE shiftlen LE protflen.
IF logname1 CP '#B#I'. "suchen nach muster #B#I
IF sy-fdpos EQ 0. "nur grou00DFbuchstaben
shiftlen = 2.
ELSE.
shiftlen = sy-fdpos.
ENDIF.
protfoff = protfoff + shiftlen.
SHIFT logname1 BY shiftlen PLACES.
ELSE.
shiftlen = protflen + 1.
protfoff = protfoff - 2.
ENDIF.
ENDWHILE.
IF protfoff LE 0.
protfoff = 0.
ENDIF.
rlen = 80 - protfoff.
WRITE space TO logname+protfoff(rlen).
WRITE 'BI* ' TO logname+protfoff(4).
PERFORM f_search_prot USING logname.
ENDFORM. " F_LIST_PROTOCOL_FILES
&----
*& Form F_GET_LOGFILES_FROM_TEMSE *
&----
FORM f_get_logfiles_from_temse.
are there any logs in the TemSe for this QID ?
CLEAR logtab_temse[].
CLEAR bdcld[].
SELECT * FROM apql INTO TABLE logtab_temse
WHERE qid = apqi-qid.
CHECK sy-subrc = 0.
some logs were found: now put this info into table bdcld.
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. " F_GET_LOGFILES_FROM_TEMSE
&----
*& Form F_GET_LOG *
&----
FORM f_get_log.
DATA: BEGIN OF logtable OCCURS 50,
enterdate LIKE btctle-enterdate,
entertime LIKE btctle-entertime,
logmessage(352) TYPE c,
END OF logtable.
DATA: external_date(10),
internal_date TYPE d.
READ TABLE bdcld INDEX 1.
logname = bdcld-logname.
IF newprot = 'OFF'.
get logfile contents from common log file
CALL 'ReadLogPartitionA' ID 'LOGN' FIELD logname
ID 'ETAB' FIELD bdclm-sys
ID 'PART' FIELD bdcld
ID 'ECNT' FIELD ec.
IF sy-subrc <> 0. MESSAGE s325(00). ENDIF.
IF ec = 0. MESSAGE s324(00). ENDIF.
ELSE.
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.
APPEND bdclm.
ENDLOOP.
ENDIF.
ENDFORM. " F_GET_LOG
&----
*& Form F_EXTEND_MESSAGE_TEXTS *
&----
FORM f_extend_message_texts.
LOOP AT bdclm.
save_mpar = bdclm-mpar.
PERFORM f_get_text.
bdclm-longtext = mtext.
bdclm-mpar = save_mpar.
MODIFY bdclm.
ENDLOOP.
ENDFORM. " F_EXTEND_MESSAGE_TEXTS
&----
*& Form F_GET_TEXT *
&----
FORM f_get_text.
DATA: shiftln TYPE i,
vartcnt TYPE i,
fdpos LIKE sy-fdpos.
IF bdclm-mparcnt CN digits. "Korrupter Datensatz:
bdclm-mparcnt = 0. "z.B. Hexnullen
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 '$&'. "Kennung fuer parameter:
MOVE t100-text TO mtext1. " alt '$' --- neu '&'
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. "convert_no_number
par-len = 1. "entschu00E4rfen
ENDIF.
WRITE par-text TO mttab-text(par-len).
MOVE par-len TO mttab-len.
MOVE mparcnt TO mttab-off.
APPEND mttab.
shiftln = par-len + 2.
SHIFT bdclm-mpar BY shiftln PLACES.
ENDDO.
mtext2 = mtext1.
IF bdclm-mid EQ '00' AND " sonderbehandlung s00368
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 f_replace_var USING '& ' parcnt fdpos.
WHEN '$'.
PERFORM f_replace_var USING '&&' 0 fdpos.
WHEN '1'.
PERFORM f_replace_var USING '&1' 1 fdpos.
WHEN '2'.
PERFORM f_replace_var USING '&2' 2 fdpos.
WHEN '3'.
PERFORM f_replace_var USING '&3' 3 fdpos.
WHEN '4'.
PERFORM f_replace_var USING '&4' 4 fdpos.
WHEN OTHERS.
PERFORM f_replace_var USING '&<' parcnt fdpos.
ENDCASE.
ENDIF.
IF mtext1(1) EQ '$'.
SHIFT mtext1 BY 1 PLACES.
CASE mtext1(1).
WHEN ' '.
PERFORM f_replace_var USING '$ ' parcnt fdpos.
WHEN '$'.
PERFORM f_replace_var USING '$$' 0 fdpos.
WHEN '1'.
PERFORM f_replace_var USING '$1' 1 fdpos.
WHEN '2'.
PERFORM f_replace_var USING '$2' 2 fdpos.
WHEN '3'.
PERFORM f_replace_var USING '$3' 3 fdpos.
WHEN '4'.
PERFORM f_replace_var USING '$4' 4 fdpos.
WHEN OTHERS.
PERFORM f_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. " F_GET_TEXT
Read plain log from TemSe
INCLUDE rsbdcil3.
‎2008 Aug 06 11:16 AM
Try this sample code..may be it will help u..
REPORT zepo_bi_log LINE-SIZE 255.
TABLES: apqd, apqi, t100, bdcdata.
DATA: BEGIN OF st-ifile,
trans LIKE apqd-trans,
field1(132),
field2(132),
field3(132),
field4(132),
field5(132),
type(4),
END OF st-ifile,
BEGIN OF ifields OCCURS 5,
fnam TYPE bdcdata-fnam,
fieldtext TYPE dfies-fieldtext,
intlen TYPE dd03l-intlen,
outputlen TYPE dd03l-leng,
END OF ifields,
w_dfies LIKE dfies.
DATA: iapqd LIKE apqd OCCURS 0 WITH HEADER LINE.
DATA: ifile LIKE st-ifile OCCURS 0 WITH HEADER LINE.
DATA: paramname(11) VALUE 'bdc/logfile',
logname(80) VALUE 'D:\usr\sap\DEV\SYS\global\BIS70M000600.LOG',
logname1(80),
s_logname(80),
ec TYPE i,
one TYPE i VALUE 1,
bdcld# TYPE i,
log_flag,
counter_err TYPE i,
l_counter(7) TYPE n,
parcnt TYPE i,
do_condense TYPE c,
mtvaroff TYPE i,
x(1) VALUE 'X',
mparcnt TYPE i,
charcnt TYPE i,
wcnt TYPE i,
sp_len TYPE i,
digits(10) TYPE c VALUE '0123456789',
mtext(124) TYPE c,
mtext1(124) TYPE c,
mtext2(273) TYPE c,
line_count TYPE i,
protcnt TYPE i.
DATA: BEGIN OF mttab OCCURS 4,
off(02) TYPE n,
len(02) TYPE n,
text(80),
END OF mttab.
DATA: BEGIN OF mt,
off(02) TYPE n,
len(02) TYPE n,
text(80),
END OF mt.
DATA: BEGIN OF file.
INCLUDE rstr0112.
DATA: END OF file.
DATA: BEGIN OF par,
len(02) TYPE n,
text(80),
END OF par.
DATA: shiftlen TYPE i VALUE 0,
protflen TYPE i VALUE 0,
protfoff TYPE i VALUE 0,
rlen TYPE i VALUE 0.
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.
DATA: END OF bdcld.
DATA: logtab LIKE bdcld OCCURS 0 WITH HEADER LINE,
logtab_temse LIKE apql OCCURS 0 WITH HEADER LINE.
DATA: BEGIN OF bdclda OCCURS 0.
INCLUDE STRUCTURE bdcld.
DATA: END OF bdclda.
DATA: it_apqi LIKE apqi OCCURS 0 WITH HEADER LINE.
DATA: save_mpar TYPE bdc_mpar.
DATA: BEGIN OF bdclm OCCURS 0.
INCLUDE STRUCTURE bdclm.
DATA: counter TYPE i,
longtext TYPE bdc_mpar,
END OF bdclm.
DATA: BEGIN OF prot_list OCCURS 0.
INCLUDE rstr0112.
DATA: seen(1),
to_be_deleted(1),
has_changed(1),
local_host(12),
END OF prot_list.
DATA: field_offset TYPE i,
field_length TYPE i,
rec_cnt TYPE i,
found TYPE i,
j TYPE i,
jc(1),
k TYPE i,
kc(1),
field_txt(12),
p_field_txt(8),
c20(20),
c21(20),
c22(20).
needed for check if TemSe interface is active:
DATA: protparam(60) VALUE 'bdc/new_protocol',
newprot(3) VALUE 'off',
selected_protocol TYPE i.
DATA: w_tabname LIKE dfies-tabname,
w_fieldname LIKE dfies-fieldname,
w_space(132) TYPE c.
DATA: w_grpid(12).
DATA: p_qid(20).
FIELD-SYMBOLS: <p_field>,
<mtxt>,
<vtxt>,
<field>.
***
Selection screen
***
SELECTION-SCREEN BEGIN OF BLOCK qid WITH FRAME TITLE text-001.
Group Selection
PARAMETERS: p_grpid LIKE apqi-groupid DEFAULT 'IT*'.
SELECT-OPTIONS: so_date FOR apqi-credate DEFAULT sy-datum NO-EXTENSION.
SELECTION-SCREEN END OF BLOCK qid.
SELECTION-SCREEN BEGIN OF BLOCK type WITH FRAME TITLE text-002.
Messages Selection
SELECT-OPTIONS: so_mart FOR bdclm-mart DEFAULT 'E',
so_mid FOR bdclm-mid,
so_mnr FOR bdclm-mnr.
SELECTION-SCREEN END OF BLOCK type.
SELECTION-SCREEN BEGIN OF BLOCK fields WITH FRAME TITLE text-003.
Field Output Selection
PARAMETERS: p_field1 LIKE bdcdata-fnam DEFAULT 'RP50G-PERNR',
p_field2 LIKE bdcdata-fnam DEFAULT 'RP50G-BEGDA',
p_field3 LIKE bdcdata-fnam DEFAULT 'RP50G-ENDDA',
p_field4 LIKE bdcdata-fnam,
p_field5 LIKE bdcdata-fnam.
SELECTION-SCREEN END OF BLOCK fields.
***
At selection screen
***
AT SELECTION-SCREEN ON so_date.
IF so_date-low IS INITIAL.
so_date-low = sy-datum.
MESSAGE e065(29).
ENDIF.
***
Start of selection
***
START-OF-SELECTION.
IF p_grpid IS INITIAL.
p_grpid = '*'.
ENDIF.
MOVE p_grpid TO w_grpid.
REPLACE '*' WITH '%' INTO w_grpid.
IF so_date-high LT so_date-low.
so_date-high = so_date-low.
ENDIF.
SELECT * FROM apqi WHERE groupid LIKE w_grpid
AND credate GE so_date-low
AND credate LE so_date-high.
WRITE:/ apqi-groupid HOTSPOT, apqi-creator,
apqi-credate, apqi-cretime.
HIDE: apqi-qid,
apqi-groupid, apqi-creator, apqi-credate, apqi-cretime.
ENDSELECT.
***
At line selection
***
AT LINE-SELECTION.
REFRESH: bdclm,
prot_list,
iapqd,
it_apqi,
ifile,
ifields,
bdcld.
k = 0.
DO 5 TIMES.
k = k + 1.
kc = k.
CONCATENATE 'p_field' kc INTO p_field_txt.
ASSIGN (p_field_txt) TO <p_field>.
IF <p_field> = space.
CONTINUE.
ENDIF.
ifields-fnam = <p_field>.
TRANSLATE ifields-fnam TO UPPER CASE.
SPLIT ifields-fnam AT '-' INTO w_tabname w_fieldname.
SELECT SINGLE intlen leng
FROM dd03l
INTO (ifields-intlen,ifields-outputlen)
WHERE tabname = w_tabname
AND fieldname = w_fieldname.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
ifields-fieldtext = w_fieldname.
APPEND ifields.
ENDDO.
logname = space.
line_count = 0.
p_qid = apqi-qid.
WRITE:/ apqi-groupid , apqi-creator , apqi-credate , apqi-cretime.
WRITE:/.
WRITE:/ ' LINE' , ' TRAN '.
LOOP AT ifields.
WRITE: ifields-fieldtext(ifields-outputlen).
ENDLOOP.
WRITE: 'TYPE' , 'ERROR MSG'.
it_apqi-qid = p_qid.
PERFORM f_get_logfiles_for_qid.
IF selected_protocol > 0.
PERFORM f_get_log.
PERFORM f_extend_message_texts.
ENDIF.
LOOP AT bdclm WHERE mart IN so_mart AND
mid IN so_mid AND
mnr IN so_mnr.
SELECT * INTO TABLE iapqd
FROM apqd WHERE qid = p_qid AND
trans = bdclm-tcnt.
SORT iapqd BY qid trans block.
LOOP AT iapqd.
IF ifile-trans NE iapqd-trans.
IF ifile-trans NE space.
APPEND ifile.
ENDIF.
ENDIF.
k = 0.
found = 0.
LOOP AT ifields.
k = k + 1.
kc = k.
CONCATENATE 'ifile-field' kc INTO field_txt.
ASSIGN ifields-fnam TO <p_field>.
ASSIGN (field_txt) TO <field>.
IF <p_field> = space OR NOT <field> IS INITIAL.
CONTINUE.
ENDIF.
Retrieve content of the field
SEARCH iapqd-vardata FOR <p_field>.
IF sy-subrc = 0.
found = 1.
field_length = STRLEN( <p_field> ).
field_offset = sy-fdpos + field_length + 1.
IF field_offset > iapqd-varlen.
CONTINUE.
ENDIF.
<field> = iapqd-vardata+field_offset(ifields-intlen).
ENDIF.
ENDLOOP.
ifile-trans = iapqd-trans.
ENDLOOP.
ADD 1 TO line_count.
WRITE:/ line_count,
ifile-trans.
k = 0.
LOOP AT ifields.
k = k + 1.
kc = k.
CONCATENATE 'ifile-field' kc INTO field_txt.
ASSIGN (field_txt) TO <field>.
IF <field> IS INITIAL.
WRITE: w_space(ifields-outputlen).
ELSE.
WRITE: <field>(ifields-outputlen).
ENDIF.
ENDLOOP.
ifile-type = bdclm-mart.
WRITE: ifile-type.
PERFORM f_get_text1.
WRITE: mtext.
CLEAR: ifile.
ENDLOOP.
----
FORM F_GET_TEXT1 *
----
FORM f_get_text1.
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.
par-len = 1.
ENDIF.
WRITE par-text TO mttab-text(par-len).
MOVE par-len TO mttab-len.
MOVE mparcnt TO mttab-off.
APPEND mttab.
shiftln = par-len + 2.
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. " neu 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 f_replace_var USING '& ' parcnt fdpos.
WHEN '$'. "'&&'
PERFORM f_replace_var USING '&&' 0 fdpos.
WHEN '1'.
PERFORM f_replace_var USING '&1' 1 fdpos.
WHEN '2'.
PERFORM f_replace_var USING '&2' 2 fdpos.
WHEN '3'.
PERFORM f_replace_var USING '&3' 3 fdpos.
WHEN '4'.
PERFORM f_replace_var USING '&4' 4 fdpos.
WHEN OTHERS. "'&'
PERFORM f_replace_var USING '&<' parcnt fdpos.
ENDCASE.
ENDIF.
IF mtext1(1) EQ '$'.
SHIFT mtext1 BY 1 PLACES.
CASE mtext1(1).
WHEN ' '. "'$ '
PERFORM f_replace_var USING '$ ' parcnt fdpos.
WHEN '$'. "'$$'
PERFORM f_replace_var USING '$$' 0 fdpos.
WHEN '1'.
PERFORM f_replace_var USING '$1' 1 fdpos.
WHEN '2'.
PERFORM f_replace_var USING '$2' 2 fdpos.
WHEN '3'.
PERFORM f_replace_var USING '$3' 3 fdpos.
WHEN '4'.
PERFORM f_replace_var USING '$4' 4 fdpos.
WHEN OTHERS. "'$'
PERFORM f_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 = '???????????????????????????????????????????????????'(999).
ENDIF.
ENDFORM. " F_GET_TEXT1
----
FORM F_REPLACE_VAR *
----
FORM f_replace_var USING vark vari varpos.
DATA: var(02),
var1,
moff TYPE i,
len TYPE i,
vlen 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 '<'.
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'.
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'.
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'.
READ TABLE mttab INDEX 3.
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 '4'.
READ TABLE mttab INDEX 4.
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.
ENDCASE.
do_condense = space.
ENDFORM. " F_REPLACE_VAR
----
FORM F_GET_LOGFILE_FOR_QID *
----
FORM f_get_logfiles_for_qid.
Get log from TemSe if it is active
PERFORM f_get_logfiles_from_temse.
IF bdcld[] IS INITIAL.
newprot = 'OFF'.
Get logs from common log file
CALL 'C_SAPGPARAM' ID 'NAME' FIELD paramname
ID 'VALUE' FIELD logname.
PERFORM f_list_protocol_files.
LOOP AT prot_list.
logname = prot_list-name.
PERFORM f_log_dir.
ENDLOOP.
ENDIF.
Now bdcld contains the log files for the given qid
SORT bdcld BY edate DESCENDING etime DESCENDING.
DESCRIBE TABLE bdcld LINES selected_protocol.
ENDFORM. " F_GET_LOGFILES_FOR_QID
----
FORM F_FILL_PROT_LIST *
----
FORM f_fill_prot_list USING prot_files.
DATA: logname1(80),
new_logfile(04) VALUE 'BI* ',
old_logfile(06) VALUE 'bdclog'.
CLEAR: logname1,
prot_list,
protcnt.
REFRESH: prot_list.
protflen = STRLEN( prot_files ).
MOVE prot_files TO logname1.
WHILE shiftlen LE protflen.
IF logname1 CP '#B#I'.
IF sy-fdpos EQ 0.
shiftlen = 2.
ELSE.
shiftlen = sy-fdpos.
ENDIF.
protfoff = protfoff + shiftlen.
SHIFT logname1 BY shiftlen PLACES.
ELSE.
shiftlen = protflen + 1.
protfoff = protfoff - 2.
ENDIF.
ENDWHILE.
IF protfoff LE 0.
protfoff = 0.
ENDIF.
rlen = 80 - protfoff.
WRITE space TO prot_files+protfoff(rlen).
WRITE new_logfile TO prot_files+protfoff(4).
PERFORM f_search_prot USING prot_files.
WRITE space TO prot_files+protfoff(rlen).
WRITE old_logfile TO prot_files+protfoff(6).
PERFORM f_search_prot USING prot_files.
ENDFORM. " F_FILL_PROT_LIST
----
FORM F_LOG_DIR *
----
FORM f_log_dir.
CLEAR bdclda. REFRESH bdclda.
CALL 'ReadLogDirA' ID 'LOGN' FIELD logname
ID 'DTAB' FIELD bdclda-sys
ID 'AINF' FIELD one
ID 'ECNT' FIELD ec.
IF sy-subrc NE 0 OR ec = 0.
EXIT.
ENDIF.
LOOP AT bdclda WHERE lmand = sy-mandt AND quid = it_apqi-qid.
MOVE-CORRESPONDING bdclda TO bdcld.
MOVE logname TO bdcld-logname.
MOVE prot_list-local_host TO bdcld-local_host.
APPEND bdcld.
ENDLOOP.
ENDFORM. " F_LOG_DIR.
----
FORM F_SEARCH_PROT *
----
FORM f_search_prot USING prot_files.
DATA: errcnt(2) TYPE p VALUE 0.
CALL 'C_DIR_READ_START' ID 'FILE' FIELD prot_files
ID 'ERRNO' FIELD file-errno
ID 'ERRMSG' FIELD file-errmsg.
IF sy-subrc <> 0.
WRITE:/ 'error call C_DIR_READ_START sy-subrc' , sy-subrc.
ENDIF.
DO.
Read protocol file
CLEAR file.
CALL 'C_DIR_READ_NEXT'
ID 'TYPE' FIELD file-type
ID 'NAME' FIELD file-name
ID 'LEN' FIELD file-len
ID 'OWNER' FIELD file-owner
ID 'MTIME' FIELD file-mtime
ID 'MODE' FIELD file-mode
ID 'ERRNO' FIELD file-errno
ID 'ERRMSG' FIELD file-errmsg.
MOVE sy-subrc TO file-subrc.
CASE sy-subrc.
WHEN 0.
CASE file-type(1).
WHEN 'F'. " normal file.
MOVE 1 TO file-useable.
WHEN 'f'. " normal file.
MOVE 1 TO file-useable.
WHEN OTHERS. " Directory, device, fifo, socket,...
MOVE 0 TO file-useable.
ENDCASE.
IF file-len = 0.
MOVE 0 TO file-useable.
ENDIF.
WHEN 1.
EXIT.
WHEN OTHERS. " SY-SUBRC >= 2
ADD 1 TO errcnt.
IF errcnt > 10.
EXIT.
ENDIF.
IF sy-subrc = 5.
MOVE: '???' TO file-type,
'???' TO file-owner,
'???' TO file-mode.
ENDIF.
MOVE 0 TO file-useable.
ENDCASE.
MOVE-CORRESPONDING file TO prot_list.
SHIFT file-name BY protfoff PLACES.
MOVE file-name TO prot_list-local_host.
protcnt = protcnt + 1.
APPEND prot_list.
ENDDO.
CALL 'C_DIR_READ_FINISH'
ID 'ERRNO' FIELD file-errno
ID 'ERRMSG' FIELD file-errmsg.
ENDFORM. " F_SEARCH_PROT
&----
*& Form F_LIST_PROTOCOL_FILES *
&----
FORM f_list_protocol_files.
CLEAR: logname1, prot_list, protcnt.
REFRESH: prot_list.
protflen = STRLEN( logname ).
MOVE logname TO logname1.
WHILE shiftlen LE protflen.
IF logname1 CP '#B#I'. "suchen nach muster #B#I
IF sy-fdpos EQ 0. "nur grou00DFbuchstaben
shiftlen = 2.
ELSE.
shiftlen = sy-fdpos.
ENDIF.
protfoff = protfoff + shiftlen.
SHIFT logname1 BY shiftlen PLACES.
ELSE.
shiftlen = protflen + 1.
protfoff = protfoff - 2.
ENDIF.
ENDWHILE.
IF protfoff LE 0.
protfoff = 0.
ENDIF.
rlen = 80 - protfoff.
WRITE space TO logname+protfoff(rlen).
WRITE 'BI* ' TO logname+protfoff(4).
PERFORM f_search_prot USING logname.
ENDFORM. " F_LIST_PROTOCOL_FILES
&----
*& Form F_GET_LOGFILES_FROM_TEMSE *
&----
FORM f_get_logfiles_from_temse.
are there any logs in the TemSe for this QID ?
CLEAR logtab_temse[].
CLEAR bdcld[].
SELECT * FROM apql INTO TABLE logtab_temse
WHERE qid = apqi-qid.
CHECK sy-subrc = 0.
some logs were found: now put this info into table bdcld.
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. " F_GET_LOGFILES_FROM_TEMSE
&----
*& Form F_GET_LOG *
&----
FORM f_get_log.
DATA: BEGIN OF logtable OCCURS 50,
enterdate LIKE btctle-enterdate,
entertime LIKE btctle-entertime,
logmessage(352) TYPE c,
END OF logtable.
DATA: external_date(10),
internal_date TYPE d.
READ TABLE bdcld INDEX 1.
logname = bdcld-logname.
IF newprot = 'OFF'.
get logfile contents from common log file
CALL 'ReadLogPartitionA' ID 'LOGN' FIELD logname
ID 'ETAB' FIELD bdclm-sys
ID 'PART' FIELD bdcld
ID 'ECNT' FIELD ec.
IF sy-subrc <> 0. MESSAGE s325(00). ENDIF.
IF ec = 0. MESSAGE s324(00). ENDIF.
ELSE.
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.
APPEND bdclm.
ENDLOOP.
ENDIF.
ENDFORM. " F_GET_LOG
&----
*& Form F_EXTEND_MESSAGE_TEXTS *
&----
FORM f_extend_message_texts.
LOOP AT bdclm.
save_mpar = bdclm-mpar.
PERFORM f_get_text.
bdclm-longtext = mtext.
bdclm-mpar = save_mpar.
MODIFY bdclm.
ENDLOOP.
ENDFORM. " F_EXTEND_MESSAGE_TEXTS
&----
*& Form F_GET_TEXT *
&----
FORM f_get_text.
DATA: shiftln TYPE i,
vartcnt TYPE i,
fdpos LIKE sy-fdpos.
IF bdclm-mparcnt CN digits. "Korrupter Datensatz:
bdclm-mparcnt = 0. "z.B. Hexnullen
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 '$&'. "Kennung fuer parameter:
MOVE t100-text TO mtext1. " alt '$' --- neu '&'
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. "convert_no_number
par-len = 1. "entschu00E4rfen
ENDIF.
WRITE par-text TO mttab-text(par-len).
MOVE par-len TO mttab-len.
MOVE mparcnt TO mttab-off.
APPEND mttab.
shiftln = par-len + 2.
SHIFT bdclm-mpar BY shiftln PLACES.
ENDDO.
mtext2 = mtext1.
IF bdclm-mid EQ '00' AND " sonderbehandlung s00368
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 f_replace_var USING '& ' parcnt fdpos.
WHEN '$'.
PERFORM f_replace_var USING '&&' 0 fdpos.
WHEN '1'.
PERFORM f_replace_var USING '&1' 1 fdpos.
WHEN '2'.
PERFORM f_replace_var USING '&2' 2 fdpos.
WHEN '3'.
PERFORM f_replace_var USING '&3' 3 fdpos.
WHEN '4'.
PERFORM f_replace_var USING '&4' 4 fdpos.
WHEN OTHERS.
PERFORM f_replace_var USING '&<' parcnt fdpos.
ENDCASE.
ENDIF.
IF mtext1(1) EQ '$'.
SHIFT mtext1 BY 1 PLACES.
CASE mtext1(1).
WHEN ' '.
PERFORM f_replace_var USING '$ ' parcnt fdpos.
WHEN '$'.
PERFORM f_replace_var USING '$$' 0 fdpos.
WHEN '1'.
PERFORM f_replace_var USING '$1' 1 fdpos.
WHEN '2'.
PERFORM f_replace_var USING '$2' 2 fdpos.
WHEN '3'.
PERFORM f_replace_var USING '$3' 3 fdpos.
WHEN '4'.
PERFORM f_replace_var USING '$4' 4 fdpos.
WHEN OTHERS.
PERFORM f_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. " F_GET_TEXT
Read plain log from TemSe
INCLUDE rsbdcil3.