SAP BW ODS無效字元自動處理程式
這程式寫得真不容易!
因為一直找不到讀取BALDAT這個表的RAW型別資料的程式,只能把標準程式扣出來用。標準程式是彈出視窗顯示錯誤日誌的,一直沒找到或沒讀懂讀取RAW的程式段,所以我採用讀取ALV的方式把資料讀入內表,因為有好多段,看不懂,所以可能有幾個Function是不需要的,我儘量採用註釋掉看結果的方法,不斷縮短程式碼。 最終留下本程式的上半段。 下半段把日誌分解開來,因為要寫成通用的程式,所以需要提取 ODS名稱,FieldName,以及出錯的值。
前後花了三天的時間,不知道是否值得。 總覺得自己好像把自己一步一步趕到某個深淵。
程式有三個變數:
1. 是否只顯示異常資訊
2. ODS名稱 (因為實在分辨不出日誌中的錯誤日誌,只能採用這個條件來控制日誌數量,比較失敗。)
3. 發生日期
*&---------------------------------------------------------------------*
*& Report Z1RD0017
*&
*&---------------------------------------------------------------------*
*& Created By: Reed Lei (20100401)
*& todo: Replace the inValid character in ODS New Data Table
*&---------------------------------------------------------------------*
REPORT z1rd0017.
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.
*PARAMETERS:l_c.
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_msg(100) VALUE 'Value (hex. ) of characteristic 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:
PARAMETERS:l_list AS CHECKBOX DEFAULT 'X'.
*SELECT-OPTIONS: l_c FOR l_lognumber-low NO INTERVALS.
PARAMETERS:l_ods(12) OBLIGATORY.
SELECT-OPTIONS: l_d FOR l_aldate-low OBLIGATORY.
*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 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.
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
IF NOT
* 251(BL): "Control does not exist."
MESSAGE e251(bl) INTO sy-msgli.
EXIT.
ENDIF.
ENDLOOP.
LOOP AT
* point to message data table
IF
CONTINUE.
ENDIF.
ASSIGN (
LOOP AT
ASSIGN COMPONENT '%_MSGID' OF STRUCTURE
l_msgid =
ASSIGN COMPONENT '%_MSGNO' OF STRUCTURE
l_msgno =
IF l_msgid EQ 'RSM1' AND l_msgno EQ '187'.
CLEAR: citab[].
ASSIGN COMPONENT 'T_MSG' OF STRUCTURE
l_str =
SPLIT l_rsm1187_msg AT space INTO TABLE citab.
LOOP AT citab INTO l_msg.
REPLACE FIRST OCCURRENCE OF l_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
l_str =
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.
SPLIT l_str AT space INTO TABLE citab.
LOOP AT citab INTO l_msg.
l_index = sy-tabix.
IF l_msg IS INITIAL.
DELETE citab INDEX l_index.
ENDIF.
ENDLOOP.
READ TABLE citab INDEX 1 INTO l_msg.
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.
LOOP AT it_ods INTO wa_ods.
ULINE .
WRITE:/ wa_ods-odsobject , wa_ods-fieldname,wa_ods-value.
CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
EXPORTING
intext = wa_ods-value
IMPORTING
uttext = l_new.
IF sy-subrc <> 0.
l_new = ''.
ENDIF.
SELECT SINGLE fieldnm FROM rsdiobj INTO fieldnm
WHERE iobjnm = wa_ods-fieldname AND bjvers = 'A'.
IF sy-subrc EQ 0.
CONCATENATE ' /BIC/A' wa_ods-odsobject '40' INTO l_up.
CONCATENATE ' ' fieldnm ' = ' l_new '' INTO l_st.
CONCATENATE ' ' fieldnm ' = ' wa_ods-value '' INTO l_wh.
IF l_list NE 'X'.
UPDATE (l_up)
SET (l_st)
WHERE (l_wh).
IF sy-subrc EQ 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
ELSE.
WRITE:/ 'UPDATE ' , l_up.
WRITE:/ 'SET ' , l_st.
WRITE:/ 'WHERE ', l_wh.
ENDIF.
ENDIF.
ENDLOOP.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/554557/viewspace-659691/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 無效字元字元
- 解析XML檔案時,無效的XML 字元 (Unicode: 0x7)異常處理XML字元Unicode
- 如何處理快取導致的無效曝光快取
- java.sql.SQLSyntaxErrorExceptionORA-00911無效字元JavaSQLErrorException字元
- ios+appium 自動化 click 無效iOSAPP
- Android Studio 設定自動清除無效 importAndroidImport
- MyBatis 跳脫字元處理MyBatis字元
- ChatExcel--自動處理表格Excel
- SAP-FI模組 如何處理自動生成會計憑證增強
- 06.字元和字串處理字元字串
- Mysql自動處理同步報錯MySql
- MyBatis - java.sql.SQLSyntaxErrorException: ORA-00911: 無效字元MyBatisJavaSQLErrorException字元
- 汙水處理自動化控制與汙水處理廠集中控制
- 字元編碼與檔案處理字元
- lua自動化指令碼關於文字讀寫和特殊不可見字元轉換的處理指令碼字元
- Python自動化處理Excel資料PythonExcel
- IDEA如何整理程式碼格式,格式化程式碼,去除無效依賴,自動縮排等Idea
- ctfmon.exe是什麼程式?ctfmon.exe程式不能自動啟動的處理方法
- win10電腦無法自動修復怎麼辦_win10電腦無法完成自動修復如何處理Win10
- Hammerspoon for Mac自動化批處理軟體Mac
- 【python技巧】文字處理-re庫字元匹配Python字元
- SQL server 特殊字元"u0000"處理SQLServer字元
- 小程式:無限自動滾動的Gallery
- 證券行業檔案自動化處理行業
- 如何在 Python 中自動化處理 Excel 表格?PythonExcel
- 智慧文字自動處理(Intelligent text automatic processing)(二)Intel
- SpringBoot 配置CORS處理前後端分離跨域配置無效問題解析Spring BootCORS後端跨域
- win10ie主頁修改了無效怎麼回事 win10修改ie瀏覽器主頁無效怎麼處理Win10瀏覽器
- 祂無處不在 -- 疾病的處理.
- SAP Fiori 的附件處理(Attachment handling)
- SAP MM MRP Type PD + Lot Size HB 組合無效?
- 【TensorFlow重大升級】自動將Python程式碼轉為TFGraph,大幅簡化動態圖處理!Python
- 介面自動化如何處理介面依賴問題
- 自動化測試中的驗證碼處理
- 如何處理不穩定的自動化測試?
- 介面自動化的前置條件怎麼處理
- bitlocker自動解鎖失效win10怎麼解決 win10系統bitlocker無法自動解鎖處理方法Win10
- [譯] 最詳細的 CSS 字元轉義處理CSS字元
- 如何處理 MySQL 萬用字元的模糊查詢MySql字元