vlei 发表于 2015-9-20 08:04:58

SAP BW ODS无效字符自动处理程序

  之前的程序在后面的使用过程中发现了一些Bug,更重要的是ODS激活一遇到错误就自动退出,导致异常只会显示第一条,而实际情况可能会有好几笔类似数据,所以最近做了一些更新。
  与之前相比,修正了值存在空格无法更新的Bug外,另外变成对所有的行都进行扫描并找出异常字符进行更新。
  *&---------------------------------------------------------------------*
*& ReportZ1RD0017
*&
*&---------------------------------------------------------------------*
*& 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
*&---------------------------------------------------------------------*
  REPORTz1rd0017.
  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 TYPErsdodsobject,
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 TYPEbal_s_prof,l_retcode                  TYPE i.
DATA: l_ln TYPE balloghndl.
DATA: l_log_filterTYPE bal_s_lfil,
      l_log_headers TYPE balhdr_t WITH HEADER LINE.
DATA: l_lognumber TYPEbal_r_logn WITH HEADER LINE.
DATA: l_aldate    TYPE bal_r_date WITH HEADER LINE.
  DATA: l_object TYPE LINE OFbal_r_obj ,
      l_subobjectTYPE LINE OF bal_r_sub,
      l_extnumberTYPE 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_listAS CHECKBOX DEFAULT 'X'.
*PARAMETERS l_challAS 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 b1WITH FRAME. TITLE text-100.
SELECT-OPTIONS:l_ods FOR rsdodso-odsobject   NO INTERVALS NO-EXTENSIONOBLIGATORY.
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 ATl_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' ORl_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: fieldnmTYPE 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.
页: [1]
查看完整版本: SAP BW ODS无效字符自动处理程序