ツールのソースコードは次のとおりです。
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.
使用インターフェース:
smw3_bdoc
この ABAP プログラムの機能は、SAP システムのテーブルから指定された時間範囲内の BDOC (ビジネス ドキュメント) データを取得し、各 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
ステートメントを通じてテーブルから指定された時間範囲を満たす BDOC レコードを取得しsmw3_bdoc
、lt_header
内部。 - 時間範囲に一致する BDOC レコードが見つからない場合、プログラムは「指定された期間に BDOC が存在しません。」というメッセージを出力して実行を終了します。
- 時間範囲に一致する BDOC レコードが見つかった場合、プログラムは時間範囲に一致する BDOC レコードの数をカウントします (
lv_count
)。 - 次に、プログラムは
lt_header
内部テーブル内の各 BDOC レコードをループします。 - ループ内で、プログラムは
display_progress
サブルーチンを呼び出して検索の進行状況を表示します。 - 次に、プログラムは
get_bdoc_ext_via_id
サブルーチンを呼び出して BDOC の XML データを取得し、lv_xml
変数に格納します。 - 次に、プログラムは XML データを文字列形式に変換します。
- 最後に、変換された文字列から指定されたキーワードを検索し、一致するキーワードが見つかった場合は、BDOC ID が出力されます。
実行例を次に示します。
入力パラメータが次のとおりであると仮定します。
start
:2023年1月1日end
:2023年12月31日keyword
:'CRMA'
- プログラムはまず、
smw3_bdoc
時間範囲に一致する BDOC レコードをテーブルから取得します。 - 一致する BDOC レコードが見つかった場合、プログラムは時間範囲に一致する BDOC レコードの数をカウントします。
- 次に、プログラムはこれらの BDOC レコードを 1 つずつ調べます。
- 各 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 データを検索用の文字列に変換することができます。