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


    之前的程序在后面的使用过程中发现了一些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.

  • 相关阅读:
    外观模式
    享元模式
    装饰模式
    适配器模式
    组合模式
    典型用户模板与场景
    知识圈APP开发记录(十二)
    知识圈APP开发记录(十一)
    知识圈APP开发记录(十)
    周总结(七)
  • 原文地址:https://www.cnblogs.com/omygod/p/2186020.html
Copyright © 2020-2023  润新知