工具源代码如下:
REPORT zscan_bdoc_via_keyword.
PARAMETERS: start TYPE smw3_bdoc-snd_date OBLIGATORY DEFAULT sy-datlo,
end TYPE smw3_bdoc-snd_date OBLIGATORY DEFAULT sy-datlo,
keyword TYPE string LOWER CASE OBLIGATORY DEFAULT 'CRMA'.
DATA: lv_bdoc_id TYPE smw3_bdoc1-bdoc_id VALUE 'FA163E8EAB031EE496D7B1616132B3D2',
lt_header TYPE STANDARD TABLE OF smw3_bdoc,
lv_xml TYPE xstring,
lv_count TYPE i,
lv_string TYPE string.
START-OF-SELECTION.
PERFORM main.
FORM main.
SELECT * INTO TABLE lt_header FROM smw3_bdoc WHERE snd_date >= start AND snd_date <= end.
IF sy-subrc <> 0.
WRITE: / 'No BDOC exists for given time period.'.
RETURN.
ENDIF.
lv_count = lines( lt_header ).
LOOP AT lt_header ASSIGNING FIELD-SYMBOL(<header>).
PERFORM display_progress USING sy-tabix.
PERFORM get_bdoc_ext_via_id USING <header>-bdoc_id CHANGING lv_xml.
CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
EXPORTING
im_xstring = lv_xml
IMPORTING
ex_string = lv_string.
FIND keyword IN lv_string.
IF sy-subrc = 0.
WRITE: / 'found search keyword in BDOC: ' , <header>-bdoc_id.
ENDIF.
CLEAR: lv_xml, lv_string.
ENDLOOP.
ENDFORM.
FORM get_bdoc_ext_via_id USING iv_id TYPE smw3_bdoc1-bdoc_id CHANGING cv_xml TYPE any.
DATA: wa_smw3_bdoc TYPE smw3_fhd,
l_dtyp TYPE smw3_ddic1,
bdoc_ext TYPE REF TO data.
FIELD-SYMBOLS: <b_ext> TYPE any.
CALL METHOD cl_smw_bdocstore=>get_bdoc
EXPORTING
bdoc_id = iv_id
get_bdoc_header = 'X'
IMPORTING
bdoc_header = wa_smw3_bdoc
EXCEPTIONS
OTHERS = 4.
ASSERT sy-subrc = 0.
IF wa_smw3_bdoc-ddic2 IS INITIAL.
"MESSAGE s006(smw3).
" No BDoc extension available (no messaging BDoc).
WRITE: / 'Not BDOC extension avaible for BDOC id: ' , lv_bdoc_id.
EXIT.
ENDIF.
* create data refs
l_dtyp = wa_smw3_bdoc-ddic2 .
CREATE DATA bdoc_ext TYPE (l_dtyp).
ASSIGN: bdoc_ext->* TO <b_ext>.
CLEAR: <b_ext>.
CALL METHOD cl_smw_bdocstore=>get_bdoc
EXPORTING
bdoc_id = iv_id
get_bdoc_header = ' '
get_body_ext = 'X'
IMPORTING
bdoc_body_ext = <b_ext>
EXCEPTIONS
invalid_bdoc_id = 1
inconsistent_body = 2
failed = 3
OTHERS = 4.
CHECK sy-subrc = 0.
PERFORM get_xml_source USING <b_ext> CHANGING cv_xml.
CLEAR: <b_ext>, bdoc_ext.
ENDFORM.
FORM display_progress USING iv_percent.
DATA: lv_percent type i,
lv_text TYPE string.
lv_percent = iv_percent * 100 / lv_count.
lv_text = 'In process... ' && lv_percent && '%'.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = lv_percent
text = lv_text.
eNDFORM.
FORM get_xml_source USING is_ext TYPE any CHANGING cv_xml TYPE xstring.
DATA:
* x_xml_tab TYPE swr_t_html,
lv_rc TYPE sy-subrc,
lref_document TYPE REF TO if_ixml_document,
lref_data_as_dom TYPE REF TO if_ixml_element.
* Maps a ABAP variable into a DOM structure
CALL FUNCTION 'SDIXML_DATA_TO_DOM'
EXPORTING
name = 'MESSAGE'
dataobject = is_ext
* CONTROL =
IMPORTING
data_as_dom = lref_data_as_dom
CHANGING
document = lref_document
* TYPE_HANDLE =
EXCEPTIONS
illegal_name = 1
OTHERS = 2.
ASSERT sy-subrc = 0.
CALL METHOD lref_document->append_child
EXPORTING
new_child = lref_data_as_dom
RECEIVING
rval = lv_rc.
ASSERT sy-subrc = 0.
* SDIXML_DOM_TO_XML
CALL FUNCTION 'SDIXML_DOM_TO_XML'
EXPORTING
document = lref_document
IMPORTING
xml_as_string = cv_xml
EXCEPTIONS
OTHERS = 1.
ASSERT sy-subrc = 0.
ENDFORM.
使用界面:
这段ABAP程序的作用是从SAP系统的smw3_bdoc
表中检索指定时间范围内的BDOC(Business Document)数据,然后搜索每个BDOC的内容以查找包含指定关键字的BDOC,并在找到匹配的情况下将其打印出来。以下是详细的说明和示例:
程序名称:zscan_bdoc_via_keyword
程序输入参数:
start
:开始日期,用于指定要搜索的BDOC的起始日期,默认为系统当前日期(sy-datlo
)。end
:结束日期,用于指定要搜索的BDOC的结束日期,默认为系统当前日期(sy-datlo
)。keyword
:关键字,用于指定要搜索的关键字,默认为"CRMA"。
程序变量说明:
lv_bdoc_id
:用于存储固定的BDOC ID。lt_header
:标准内表,用于存储从smw3_bdoc
表中检索到的BDOC记录。lv_xml
:用于存储BDOC的XML数据(以二进制形式)。lv_count
:用于存储符合时间范围的BDOC记录数量。lv_string
:用于存储将XML数据转换为字符串后的内容。
主要处理逻辑:
- 首先,程序通过
SELECT
语句从smw3_bdoc
表中检索满足指定时间范围的BDOC记录,并将它们存储在lt_header
内表中。 - 如果没有找到符合时间范围的BDOC记录,程序将输出消息 "No BDOC exists for given time period." 并结束执行。
- 如果找到符合时间范围的BDOC记录,程序将计算符合时间范围的BDOC记录的数量(
lv_count
)。 - 然后,程序通过循环遍历
lt_header
内表中的每个BDOC记录。 - 在循环中,程序会调用
display_progress
子程序以显示搜索进度。 - 接下来,程序将调用
get_bdoc_ext_via_id
子程序来获取BDOC的XML数据,并将其存储在lv_xml
变量中。 - 然后,程序将XML数据转换为字符串格式。
- 最后,程序在转换后的字符串中搜索指定的关键字,如果找到匹配的关键字,就会打印出BDOC的ID。
下面是示例执行过程:
假设输入参数为:
start
:2023年01月01日end
:2023年12月31日keyword
:'CRMA'
- 程序首先从
smw3_bdoc
表中检索符合时间范围的BDOC记录。 - 如果找到符合条件的BDOC记录,程序将计算符合时间范围的BDOC记录的数量。
- 然后,程序会逐个遍历这些BDOC记录。
- 对于每个BDOC记录,程序会显示搜索进度,并调用
get_bdoc_ext_via_id
子程序来获取BDOC的XML数据。 - 获取的XML数据将被转换为字符串。
- 然后,程序将搜索字符串中是否包含关键字'CRMA'。
- 如果找到匹配的关键字,程序将打印出相应的BDOC ID。
示例输出可能如下所示:
In process... 10%
In process... 20%
In process... 30%
found search keyword in BDOC: FA163E8EAB031EE496D7B1616132B3D2
In process... 40%
In process... 50%
In process... 60%
In process... 70%
In process... 80%
In process... 90%
在这个示例中,程序首先显示搜索进度,然后找到了一个包含关键字'CRMA'的BDOC,该BDOC的ID为'FA163E8EAB031EE496D7B1616132B3D2',所以程序打印了相应的消息。
程序的主要功能是在指定的BDOC数据集合中搜索关键字,并且能够处理大量的BDOC数据,显示搜索进度,以及将XML数据转换为字符串进行搜索。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。