使用 ABAP 函数读取 SAP CRM Survey 数据并解析

本文介绍源代码和解析。

源代码:

*&---------------------------------------------------------------------*
*& Report ZSURVEY_READ
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZSURVEY_READ.

DATA: vguid    TYPE crm_svy_db_sv_guid.
DATA: vvers    TYPE crm_svy_db_svers.
DATA: svy_content TYPE string.
DATA: ret TYPE bapiret1.
DATA: apppar   TYPE TABLE OF crm_svy_db_sv_pair.

data: lv_x type xstring.

 CALL FUNCTION 'CRM_SVY_SURVEY_GET'
      EXPORTING
        application_id     = 'CRM_SURVEY_ACTIVITY'
        survey_id          = 'JERRY_TEST'
        survey_version     = '0000000003'
        language           = 'E'
        media_type         = '01'
        parameter_xml      = 'CRM_SVY_BSP_SYSTEMPARAM.XML'
        values_guid        = vguid
        values_version     = vvers
      IMPORTING
        return             = ret
        content            = svy_content
      TABLES
        application_params = apppar.

call FUNCTION 'CRM_SVY_DB_CONVERT_STRING2HEX'
  EXPORTING
     s = svy_content
  IMPORTING
     x = lv_x.


DATA lr_conv TYPE REF TO cl_abap_conv_in_ce.

data: lv_request_xml type string.
CALL METHOD cl_abap_conv_in_ce=>create
  EXPORTING
    input = lv_x
  RECEIVING
    conv  = lr_conv.

CALL METHOD lr_conv->read
  IMPORTING
    data = lv_request_xml.

DATA(reg_pattern) = '.*svyValueGuid(?:.*)value="(.*)">.*SurveyId.*'.

DATA(lo_regex) = NEW cl_abap_regex( pattern = reg_pattern ).

DATA(lo_matcher) = lo_regex->create_matcher( EXPORTING text = lv_request_xml ).

IF lo_matcher->match( ) <> abap_true.
  WRITE:/ 'fail'.
  RETURN.
ENDIF.

DATA(lt_reg_match_result) = lo_matcher->find_all( ).

READ TABLE lt_reg_match_result ASSIGNING FIELD-SYMBOL(<match>) index 1.

read TABLE <match>-submatches ASSIGNING FIELD-SYMBOL(<submatch>) index 1.
data:lv type string.

lv = lv_request_xml+<submatch>-offset(<submatch>-length).

TRY.

reg_pattern = '.*<input(.*)>.*'.

lo_regex = NEW cl_abap_regex( pattern = reg_pattern ).

lo_matcher = lo_regex->create_matcher( EXPORTING text = lv ).

IF lo_matcher->match( ) <> abap_true.
  WRITE:/ 'fail in input scan'.
  RETURN.
ENDIF.


data: result_tab TYPE match_result_tab.


FIND ALL OCCURRENCES OF REGEX '<input(.*)>' IN lv RESULTS result_tab.

WRITE:/ lv.
BREAK-POINT.

CATCh cx_root into data(cx_root).
   WRITE:/ cx_root->get_text( ).
   return.
endtry.

CLEAR: lt_reg_match_result.

lt_reg_match_result = lo_matcher->find_all( ).

READ TABLE lt_reg_match_result ASSIGNING FIELD-SYMBOL(<input>) index 1.

WRITE:/ 'input:', lines( <input>-submatches ).

read TABLE <input>-submatches ASSIGNING <submatch> index 1.

data(new) = lv+<submatch>-offset(<submatch>-length).

WRITE:/ new.

这段 ABAP 代码的主要作用是从一个 CRM (Customer Relationship Management,客户关系管理) 系统中读取调查问卷的内容,并分析其中的数据。以下是对代码的详细解释:

  1. 报告声明和数据定义

    • REPORT ZSURVEY_READ.:定义了一个报告的名称,可能是自定义的 CRM 报告。
    • 数据定义部分声明了一些变量用于存储从 CRM 系统获取的数据。
  2. 调用 CRM 函数

    • CALL FUNCTION 'CRM_SVY_SURVEY_GET':这是一个函数调用,用于从 CRM 系统中获取调查问卷的信息。传递了一些参数,如应用程序 ID、调查 ID、版本等,以获取相关信息。获取的数据存储在 svy_content 变量中。
  3. 将内容转换为十六进制

    • CALL FUNCTION 'CRM_SVY_DB_CONVERT_STRING2HEX':这个函数调用将获取的调查问卷内容(svy_content)转换为十六进制编码,并将结果存储在 lv_x 变量中。
  4. 文本转码和分析

    • 使用 cl_abap_conv_in_ce 类来创建一个转码器,将十六进制数据转换为文本形式。
    • 然后,通过正则表达式匹配和分析 lv_request_xml,该 XML 包含了调查问卷的数据。
    • 此部分代码的目标是从 XML 中提取有关调查问卷的特定信息,例如 svyValueGuid 的值。
  5. 正则表达式匹配

    • 使用正则表达式来匹配 lv_request_xml 中的数据,提取关键信息。
    • DATA(reg_pattern)DATA(lo_regex) 用于定义和创建正则表达式对象。
    • lo_matcher 对象用于执行匹配操作,提取匹配结果。
  6. 异常处理

    • 使用 TRY-CATCH 块来处理可能的异常情况。如果正则表达式匹配失败,会生成一个异常。
    • 异常处理部分打印出异常信息并终止代码执行。
  7. 继续匹配

    • 在成功匹配 svyValueGuid 后,代码继续匹配 input 标签。这部分代码可能是为了提取与调查问卷相关的更多信息。
  8. 最终输出

    • 最后,代码提取匹配结果,并将结果存储在 new 变量中。
    • 结果被打印出来,可能是为了进一步处理或显示给用户。

这段代码的核心任务是从 CRM 系统中获取调查问卷的信息并对其进行分析。具体的调查问卷内容和所需信息可能会根据实际情况而有所不同。代码中使用了正则表达式来从 XML 数据中提取所需的信息,然后将其存储在变量中供后续处理使用。在实际应用中,这些数据可能会用于生成报告、分析用户反馈或其他与调查问卷相关的操作。

猜你喜欢

转载自blog.csdn.net/i042416/article/details/132836249