首页 > 其他分享 >根据指定关键字搜索指定时间范围内的 SAP CRM 中间件 BDOC 的 ABAP 小工具分享

根据指定关键字搜索指定时间范围内的 SAP CRM 中间件 BDOC 的 ABAP 小工具分享

时间:2023-09-14 10:11:06浏览次数:45  
标签:BDOC 中间件 指定 lv smw3 TYPE bdoc id CRM

工具源代码如下:

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

程序输入参数

  1. start:开始日期,用于指定要搜索的BDOC的起始日期,默认为系统当前日期(sy-datlo)。
  2. end:结束日期,用于指定要搜索的BDOC的结束日期,默认为系统当前日期(sy-datlo)。
  3. keyword:关键字,用于指定要搜索的关键字,默认为"CRMA"。

程序变量说明

  1. lv_bdoc_id:用于存储固定的BDOC ID。
  2. lt_header:标准内表,用于存储从smw3_bdoc表中检索到的BDOC记录。
  3. lv_xml:用于存储BDOC的XML数据(以二进制形式)。
  4. lv_count:用于存储符合时间范围的BDOC记录数量。
  5. lv_string:用于存储将XML数据转换为字符串后的内容。

主要处理逻辑

  1. 首先,程序通过SELECT语句从smw3_bdoc表中检索满足指定时间范围的BDOC记录,并将它们存储在lt_header内表中。
  2. 如果没有找到符合时间范围的BDOC记录,程序将输出消息 "No BDOC exists for given time period." 并结束执行。
  3. 如果找到符合时间范围的BDOC记录,程序将计算符合时间范围的BDOC记录的数量(lv_count)。
  4. 然后,程序通过循环遍历lt_header内表中的每个BDOC记录。
  5. 在循环中,程序会调用display_progress子程序以显示搜索进度。
  6. 接下来,程序将调用get_bdoc_ext_via_id子程序来获取BDOC的XML数据,并将其存储在lv_xml变量中。
  7. 然后,程序将XML数据转换为字符串格式。
  8. 最后,程序在转换后的字符串中搜索指定的关键字,如果找到匹配的关键字,就会打印出BDOC的ID。

下面是示例执行过程:

假设输入参数为:

  • start:2023年01月01日
  • end:2023年12月31日
  • keyword:'CRMA'
  1. 程序首先从smw3_bdoc表中检索符合时间范围的BDOC记录。
  2. 如果找到符合条件的BDOC记录,程序将计算符合时间范围的BDOC记录的数量。
  3. 然后,程序会逐个遍历这些BDOC记录。
  4. 对于每个BDOC记录,程序会显示搜索进度,并调用get_bdoc_ext_via_id子程序来获取BDOC的XML数据。
  5. 获取的XML数据将被转换为字符串。
  6. 然后,程序将搜索字符串中是否包含关键字'CRMA'。
  7. 如果找到匹配的关键字,程序将打印出相应的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数据转换为字符串进行搜索。

标签:BDOC,中间件,指定,lv,smw3,TYPE,bdoc,id,CRM
From: https://www.cnblogs.com/sap-jerry/p/17701771.html

相关文章

  • Spring容器跳过指定对象初始化扫
    在Spring容器中,如果你希望跳过指定对象的初始化扫描,你可以使用`@ComponentScan`注解的`excludeFilters`属性来实现。`excludeFilters`属性可以指定扫描时需要排除的类或接口。例如,假设你有一个名为`MyBean`的对象,你不希望它被Spring容器初始化扫描。你可以创建一个自定义的过滤器来......
  • linux 中实现指定列进行去重复
     001、awk[root@pc1test02]#lsa.txt[root@pc1test02]#cata.txtaiibkkajjcyyb77ett[root@pc1test02]#awk'!ay[$1]++'a.txtaiibkkcyyett 002、sort-u[root@pc1test02]#lsa.txt[root@pc1test02]#cata.txtaiibkk......
  • html 铆钉跳转指定元素 元素id
    目录html铆钉跳转指定元素元素idhtml铆钉跳转指定元素元素id标识该元素的唯一身份,并且可以在其他地方引用比如,通过a标题跳转到指定的位置:<p><ahref="#C4">查看章节4</a></p><h2>章节1</h2><p>这边显示该章节的内容……</p><h2>章节2</h2><p>这边显示该章节......
  • go-zero 生成中间件
    1.API编写 2.生成API 生成后的目录如下 ......
  • 信创简报:2022年服务器国产化中间件替代品信息一览表
    国产化软件新浪潮:jdkredismysqltomcatnginx改造替代品及信创名录玄明Hanko​软件开发行业研发经理 43人赞同了该文章一、JDK/OpenJDK替代品1、龙芯JDK龙芯JDK:基于龙芯CPU平台的Java开发工具包,支持x86、ARM等架构。产品链接:http://www.loo......
  • C#中Math.Round(指定四舍五入)、Math.Ceiling和Math.Floor的用法
    1.Math.Round:四舍六入五取偶Math.Round(17.475728155339805,2,MidpointRounding.AwayFromZero)=17.48Math.Round(0.0)//0Math.Round(0.1)//0Math.Round(0.2)//0Math.Round(0.3)//0Math.Round(0.4)//0Math.Round(0.5)//0Math.Round(0.6)//1Math.Round(0.7)//1Math.Roun......
  • 使用json.dump(citys_data, f, ensure_ascii=False)写文件的时候,如果要写入汉字,则要指
    这个代码例子为获取链家网里所有的城市,然后将按照{省名:{市名:url},{市名:url}....}的方式importrequestsfromlxmlimportetreeimportjsondefget_all_city():url="https://www.lianjia.com/city/"#全国城市列表headers={'User-Agent':'Mozill......
  • 查找字符串最长公共子串,请编码实现一个命令行工具,找出指定的2个字符串的最长公共子串
    要求给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。输入描述命令行工具接收两个字符串参数。输入字符串的合法字符集为[a-zA-Z0-9],大小写敏感,无需考虑异常输入场景。输出描述输出一行最长公共子串示例输入1ABCD2345G12345EF输出2345解法一:滑......
  • chrome浏览器清除指定站点的cookies
    图1:图2:图3:......
  • hdfs批量上传下载文件和删除指定目录下文件
    hdfs批量上传下载文件和删除指定目录下文件一、hdfs批量下载文件hdfsdfs-gets3a://bigdata/infra/zeppelin/notebook/二、hdfs批量上传文件hdfsdfs-put./*/bigdata/infr/zeppelin/notebook/三、hdfs删除指定目录hdfsdfs-rm-r/bigdata/infra/zeppelin/notebook/wei.ji10......