zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    苹果一体机发射Wi-Fi
    iphone 屏蔽系统自动更新,消除设置上的小红点
    data parameter is nil 异常处理
    copy与mutableCopy的区别总结
    java axis2 webservice
    mysql 远程 ip访问
    mysql 存储过程小问题
    mysql游标错误
    is not writable or has an invalid setter method错误的解决
    Struts2中关于"There is no Action mapped for namespace / and action name"的总结
  • 原文地址:https://www.cnblogs.com/omygod/p/2186020.html
Copyright © 2011-2022 走看看