Le code source de l'outil est le suivant :
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.
Interface d'utilisation :
smw3_bdoc
La fonction de ce programme ABAP est de récupérer les données BDOC (Business Document) dans un intervalle de temps spécifié à partir de la table du système SAP, puis de rechercher le contenu de chaque BDOC pour trouver les BDOC contenant les mots-clés spécifiés, et si une correspondance est trouvée , c'est imprimé. Voici des instructions détaillées et des exemples :
Nom du programme :zscan_bdoc_via_keyword
Paramètres d'entrée du programme :
start
: Date de début, permet de préciser la date de début du BDOC à rechercher, la valeur par défaut est la date actuelle du système (sy-datlo
).end
: Date de fin, permet de préciser la date de fin du BDOC à rechercher, la valeur par défaut est la date actuelle du système (sy-datlo
).keyword
: Mot-clé, utilisé pour spécifier le mot-clé à rechercher, la valeur par défaut est "CRMA".
Description des variables du programme :
lv_bdoc_id
: Utilisé pour stocker l’ID BDOC fixe.lt_header
: Table interne standard utilisée pour stockersmw3_bdoc
les enregistrements BDOC récupérés de la table.lv_xml
: Données XML utilisées pour stocker le BDOC (sous forme binaire).lv_count
: utilisé pour stocker le nombre d'enregistrements BDOC qui correspondent à la plage horaire.lv_string
: Utilisé pour stocker le contenu après avoir converti les données XML en chaînes.
Logique de traitement principale :
- Tout d'abord, le programme récupère les enregistrements BDOC qui correspondent à la plage de temps spécifiée
SELECT
à partir de la table via des instructionssmw3_bdoc
et les stocke danslt_header
la table interne . - Si aucun enregistrement BDOC correspondant à la plage de temps n'est trouvé, le programme affichera le message "Aucun BDOC n'existe pour une période donnée" et mettra fin à l'exécution.
- Si un enregistrement BDOC correspondant à la plage horaire est trouvé, le programme comptera le nombre d'enregistrements BDOC correspondant à la plage horaire (
lv_count
). - Le programme parcourt ensuite
lt_header
chaque enregistrement BDOC dans la table interne. - Dans la boucle, le programme appelle
display_progress
un sous-programme pour afficher la progression de la recherche. - Ensuite, le programme appellera
get_bdoc_ext_via_id
un sous-programme pour obtenir les données XML du BDOC et les stockera danslv_xml
une variable. - Le programme convertit ensuite les données XML au format chaîne.
- Enfin, le programme recherche le mot-clé spécifié dans la chaîne convertie. Si un mot-clé correspondant est trouvé, l'ID BDOC sera imprimé.
Voici un exemple d'exécution :
Supposons que les paramètres d'entrée sont :
start
: 1 janvier 2023end
: 31 décembre 2023keyword
:'CRMA'
- Le programme
smw3_bdoc
récupère d'abord les enregistrements BDOC correspondant à la plage horaire de la table. - Si un enregistrement BDOC correspondant est trouvé, le programme comptera le nombre d'enregistrements BDOC qui correspondent à la plage horaire.
- Ensuite, le programme parcourra ces enregistrements BDOC un par un.
- Pour chaque enregistrement BDOC, le programme affiche la progression de la recherche et appelle
get_bdoc_ext_via_id
un sous-programme pour obtenir les données XML BDOC. - Les données XML obtenues seront converties en chaîne.
- Le programme recherchera ensuite le mot-clé « CRMA » dans la chaîne.
- Si un mot-clé correspondant est trouvé, le programme imprimera l'ID BDOC correspondant.
Un exemple de résultat pourrait ressembler à ceci :
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%
Dans cet exemple, le programme affiche d'abord la progression de la recherche, puis trouve un BDOC contenant le mot-clé « CRMA ». L'ID du BDOC est « FA163E8EAB031EE496D7B1616132B3D2 », le programme imprime donc le message correspondant.
La fonction principale du programme est de rechercher des mots-clés dans la collection de données BDOC spécifiée, et il peut traiter une grande quantité de données BDOC, afficher la progression de la recherche et convertir les données XML en chaînes pour la recherche.