之前的程序在后面的使用过程中发现了一些Bug,更重要的是ODS激活一遇到错误就自动退出,导致异常只会显示第一条,而实际情况可能会有好几笔类似数据,所以最近做了一些更新。
与之前相比,修正了值存在空格无法更新的Bug外,另外变成对所有的行都进行扫描并找出异常字符进行更新。
*&---------------------------------------------------------------------*
*& Report Z1RD0017
*&
*&---------------------------------------------------------------------*
*& Created By: Reed Lei (20100401)
*& todo: Replace the inValid character in ODS New Data Table
*& Selection Texts
*& L_D Alert Date
*& L_LIST Only Display InValid Data ?
*& L_ODS ODS Name
*&---------------------------------------------------------------------*
REPORT z1rd0017.
TABLES:rsdodso.
TYPES:
BEGIN OF bal_s_lout,
* handle of this control representation
handle TYPE balcnthndl,
* initial input
profile TYPE bal_s_prof,
log_hndl TYPE bal_t_logh,
msg_hndl TYPE bal_t_msgh,
log_filt TYPE bal_s_lfil,
log_cfil TYPE bal_t_cfil,
msg_filt TYPE bal_s_mfil,
msg_cfil TYPE bal_t_cfil,
* controls
container TYPE REF TO cl_gui_container,
splitter TYPE REF TO cl_gui_splitter_container,
tree TYPE REF TO cl_gui_column_tree,
grid TYPE REF TO cl_gui_alv_grid,
event_rec TYPE REF TO object,
* converted profile
use_grid TYPE boolean,
prof_int TYPE bal_s_iprf,
* data to be displayed
t_log_hndl TYPE bal_t_logh,
t_msg_hndl TYPE bal_t_msgh,
* data for tree
t_columns TYPE bal_t_hdrs,
t_node TYPE bal_t_node,
t_item TYPE bal_t_item,
tree_logs TYPE bal_t_trlg,
tree_msgs TYPE bal_t_trms,
* current state
count_all TYPE bal_s_scnt,
cur_node TYPE tv_nodekey,
longtexts_exist TYPE boolean,
params_exist TYPE boolean,
sel_msgty TYPE bal_s_smty,
ucomm_data TYPE bal_s_cbuc,
* tabname for the flat ALV-table for using in REUSE_ALV_LIST_DISPLAY
tabname_alv TYPE tabname,
END OF bal_s_lout,
bal_t_lout TYPE SORTED TABLE OF bal_s_lout
WITH UNIQUE KEY handle
INITIAL SIZE 1.
DATA: log_handle TYPE balloghndl.
DATA: l_s_prof TYPE bal_s_prof,
l_t_logh TYPE bal_t_logh.
DATA: l_sx_display_profile TYPE bal_s_prof,
ls_display_profile TYPE bal_s_prof.
* Get display profile for popup
CONSTANTS:
true TYPE boolean VALUE 'X',
false TYPE boolean VALUE ' '.
DATA:
g_access_control_done TYPE boolean.
DATA:
BEGIN OF g OCCURS 0,
control_handle TYPE balcnthndl,
profile TYPE bal_s_prof,
prof_int TYPE bal_s_iprf,
sel_msgty TYPE bal_s_smty,
custom_container TYPE REF TO cl_gui_custom_container,
docking_container TYPE REF TO cl_gui_docking_container,
END OF g.
DATA:
BEGIN OF wa_ods,
odsobject TYPE rsdodsobject,
fieldname(20),
value(20),
END OF wa_ods.
DATA:it_ods LIKE TABLE OF wa_ods.
DATA g_log_handles TYPE bal_t_logh .
DATA: g_log_profile TYPE bal_s_prof,l_retcode TYPE i.
DATA: l_ln TYPE balloghndl.
DATA: l_log_filter TYPE bal_s_lfil,
l_log_headers TYPE balhdr_t WITH HEADER LINE.
DATA: l_lognumber TYPE bal_r_logn WITH HEADER LINE.
DATA: l_aldate TYPE bal_r_date WITH HEADER LINE.
DATA: l_object TYPE LINE OF bal_r_obj ,
l_subobject TYPE LINE OF bal_r_sub,
l_extnumber TYPE LINE OF bal_r_extn.
DATA: l_msgid(10),l_msgno(10),
l_rsm1187_msg(100) VALUE 'Error getting SID for ODS object',
l_brain060_msg1(100) VALUE 'Value ',
l_brain060_msg2(100) VALUE '(hex.',
l_brain060_msg3(100) VALUE ') of characteristic',
l_brain060_msg4(100) VALUE 'contains invalid characters',
l_str(255),
l_msg(255).
DATA: citab LIKE TABLE OF l_str.
DATA: l_index LIKE sy-index.
DATA: l_lines TYPE i .
FIELD-SYMBOLS:
<d_t> TYPE bal_t_lout,
<d> TYPE bal_s_lout,
<l_t_messtab> TYPE table,
<wa> TYPE ANY,
<comp> TYPE ANY,
<l_t_mess_alv> TYPE table.
PARAMETERS:l_list AS CHECKBOX DEFAULT 'X'.
*PARAMETERS l_chall AS CHECKBOX DEFAULT 'X' NO-DISPLAY . "check and update the all rows
*SELECT-OPTIONS: l_c FOR l_lognumber-low NO INTERVALS.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME. TITLE text-100.
SELECT-OPTIONS:l_ods FOR rsdodso-odsobject NO INTERVALS NO-EXTENSION OBLIGATORY.
SELECT-OPTIONS: l_d FOR l_aldate-low OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
l_d-sign = 'I'.
l_d-option = 'EQ'.
l_d-low = sy-datum.
APPEND l_d.
START-OF-SELECTION.
*APPEND LINES OF l_c TO l_log_filter-lognumber.
APPEND LINES OF l_d TO l_log_filter-aldate.
l_object-sign = 'I'.
l_object-option = 'EQ'.
l_object-low = 'RSSM'.
APPEND l_object TO l_log_filter-object.
l_subobject-sign = 'I'.
l_subobject-option = 'EQ'.
l_subobject-low = 'MON'.
APPEND l_subobject TO l_log_filter-subobject.
l_extnumber-sign = 'I'.
l_extnumber-option = 'EQ'.
CONCATENATE 'MON:PROTOCOLL_ACTION-ODSAC-' l_ods-low INTO l_extnumber-low .
APPEND l_extnumber TO l_log_filter-extnumber.
CALL FUNCTION 'BAL_DB_SEARCH'
EXPORTING
i_s_log_filter = l_log_filter
IMPORTING
e_t_log_header = l_log_headers[]
EXCEPTIONS
log_not_found = 1.
DESCRIBE TABLE l_log_headers LINES l_lines.
IF l_lines EQ 0 .
WRITE: 'Without Error Log'.
EXIT.
ENDIF.
*DELETE l_log_headers WHERE msg_cnt_al NE 11. "abnormal message is total 11 lines.
LOOP AT l_log_headers .
CLEAR:g_log_handles[].
l_ln = l_log_headers-log_handle.
INSERT l_ln INTO TABLE g_log_handles.
CALL FUNCTION 'BAL_DSP_PROFILE_SINGLE_LOG_GET'
IMPORTING
e_s_display_profile = l_sx_display_profile
EXCEPTIONS
OTHERS = 0.
CALL FUNCTION 'BAL_DB_LOAD'
EXPORTING
i_t_log_handle = g_log_handles
i_exception_if_already_loaded = space
EXCEPTIONS
OTHERS = 1.
*********************************************************************
* set data to be displayed
*********************************************************************
CALL FUNCTION 'BAL_CNTL_CREATE'
EXPORTING
i_container = g-custom_container
i_s_display_profile = g-profile
i_t_log_handle = g_log_handles
IMPORTING
e_control_handle = g-control_handle
EXCEPTIONS
profile_inconsistent = 1
OTHERS = 2.
PERFORM. load(saplsbal_cntl).
ASSIGN ('(SAPLSBAL_CNTL)D_T[]') TO <d_t>.
IF NOT <d_t> IS ASSIGNED.
* 251(BL): "Control does not exist."
MESSAGE e251(bl) INTO sy-msgli.
EXIT.
ENDIF.
ENDLOOP.
LOOP AT <d_t> ASSIGNING <d> .
* point to message data table
IF <d>-prof_int-msgtabname IS INITIAL.
CONTINUE.
ENDIF.
ASSIGN (<d>-prof_int-msgtabname) TO <l_t_messtab>.
LOOP AT <l_t_messtab> ASSIGNING <wa> .
ASSIGN COMPONENT '%_MSGID' OF STRUCTURE <wa> TO <comp>.
l_msgid = <comp>.
ASSIGN COMPONENT '%_MSGNO' OF STRUCTURE <wa> TO <comp>.
l_msgno = <comp>.
IF l_msgid EQ 'RSM1' AND l_msgno EQ '187'.
CLEAR: citab[].
ASSIGN COMPONENT 'T_MSG' OF STRUCTURE <wa> TO <comp>.
l_str = <comp>.
* SPLIT l_rsm1187_msg AT space INTO TABLE citab.
* LOOP AT citab INTO l_msg.
REPLACE FIRST OCCURRENCE OF l_rsm1187_msg IN l_str WITH '' .
* ENDLOOP.
CONDENSE l_str.
wa_ods-odsobject = l_str.
ENDIF.
IF l_msgid EQ 'BRAIN' AND
( l_msgno EQ '060' OR l_msgno EQ '059').
CLEAR: citab[].
ASSIGN COMPONENT 'T_MSG' OF STRUCTURE <wa> TO <comp>.
l_str = <comp>.
* SPLIT l_brain060_msg AT space INTO TABLE citab.
* LOOP AT citab INTO l_msg.
* REPLACE FIRST OCCURRENCE OF l_msg IN l_str WITH '' .
* ENDLOOP.
*** Marked by Reedlei 20100610
REPLACE FIRST OCCURRENCE OF l_brain060_msg1 IN l_str WITH '|' .
REPLACE FIRST OCCURRENCE OF l_brain060_msg2 IN l_str WITH '|' .
REPLACE FIRST OCCURRENCE OF l_brain060_msg3 IN l_str WITH '|' .
REPLACE FIRST OCCURRENCE OF l_brain060_msg4 IN l_str WITH '|' .
*** Added by Reedlei 20100610
SPLIT l_str AT '|' INTO TABLE citab.
LOOP AT citab INTO l_msg.
l_index = sy-tabix.
CONDENSE l_msg.
IF l_msg IS INITIAL.
DELETE citab INDEX l_index.
ENDIF.
ENDLOOP.
READ TABLE citab INDEX 1 INTO l_msg.
*** Marked by Reedlei 20100610
CONDENSE l_msg.
wa_ods-value = l_msg.
READ TABLE citab INDEX 3 INTO l_msg.
CONDENSE l_msg.
wa_ods-fieldname = l_msg.
ENDIF.
ENDLOOP.
IF NOT wa_ods-fieldname IS INITIAL AND
NOT wa_ods-odsobject IS INITIAL AND
NOT wa_ods-value IS INITIAL.
APPEND wa_ods TO it_ods.
ENDIF.
ENDLOOP.
DATA:
l_entries TYPE i.
***********************************************************************
* destroy containers
***********************************************************************
IF NOT g-docking_container IS INITIAL.
CALL METHOD g-docking_container->free
EXCEPTIONS
THERS = 0.
ENDIF.
IF NOT g-custom_container IS INITIAL.
CALL METHOD g-custom_container->free
EXCEPTIONS
THERS = 0.
ENDIF.
***********************************************************************
* reduce stack
***********************************************************************
CLEAR g.
DESCRIBE TABLE g LINES l_entries.
IF l_entries > 0.
READ TABLE g INDEX l_entries.
DELETE g INDEX l_entries.
ENDIF.
SORT it_ods.
DELETE ADJACENT DUPLICATES FROM it_ods.
DATA:l_up(200),l_st(200),l_wh(200),l_new(200).
DATA: fieldnm TYPE rsdiobjfieldnm.
WRITE: AT 10(15) 'ODS NAME' , 30(15) 'FieldName', 60(15)'Value'.
ULINE AT /5(70).
LOOP AT it_ods INTO wa_ods.
CONCATENATE ' /BIC/A' wa_ods-odsobject '40' INTO l_up.
SELECT SINGLE fieldnm FROM rsdiobj INTO fieldnm
WHERE iobjnm = wa_ods-fieldname AND bjvers = 'A'.
SELECT (fieldnm) INTO TABLE citab FROM (l_up).
SORT citab.
DELETE ADJACENT DUPLICATES FROM citab.
LOOP AT citab INTO l_str.
CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
EXPORTING
intext = l_str
IMPORTING
uttext = l_new.
IF l_new NE l_str.
CONCATENATE ' ' fieldnm ' = ''' l_new '''' INTO l_st.
CONCATENATE ' ' fieldnm ' = ''' l_str '''' INTO l_wh.
IF NOT l_list EQ 'X'.
UPDATE (l_up)
SET (l_st)
WHERE (l_wh).
ENDIF.
WRITE : AT /10(15) wa_ods-odsobject ,
28 wa_ods-fieldname,55 l_str+0(40) LEFT-JUSTIFIED.
ENDIF.
ENDLOOP.
ENDLOOP.
* ENDIF.