写点什么

使用 ABAP 代码提交 SAP CRM Survey 调查问卷

作者:Jerry Wang
  • 2021 年 11 月 24 日
  • 本文字数:1609 字

    阅读完需:约 5 分钟

使用 ABAP 代码提交 SAP CRM Survey 调查问卷

Jerry 之前曾经写过两篇关于 SAP CRM Survey 调查问卷的技术文章:


  • SAP CRM Survey 调查问卷的模型设计原理解析

  • 如何使用 SAP CRM Marketing Survey 创建一个市场问卷调查


我们在浏览器里填写调查问卷的内容,点击 Save 保存按钮之后,调查问卷的结果被存储到 ABAP 后台。



在 ABAP 后台系统的 Survey Suite 工具里,能看到用户填写的 survey 结果。


比如下图的意思是:


问题 1:你会用 ABAP 编程吗?回答会的人有 11 个,不会的有 5 个。


问题 2:你会用 Java 编程吗?回答会的人有 10 个,不会的有 6 个。



现在我有一个需求:写一个 ABAP 程序,调用 SAP CRM Survey 的 API 来提交请求。


测试程序如下:


DATA(lo_tool) = NEW zcl_crm_survey_tool( ).
lo_tool->submit( iv_question1 = 'X' iv_question2 = '' ).
复制代码


执行之后,对比上图,会 ABAP 的多了 1 个人,不会 Java 的多了 1 个人。



问题的关键就是如何设计 zcl_crm_survey_tool?


Submit 的方法分 4 个步骤, 见下面注释:


METHOD submit.
DATA: ret TYPE BAPIRET1.
* Step1: get Survey Template
DATA(survey_template) = get_survey_template( ).
* Step2: create a new Survey instance guid
DATA(survey_guid) = get_new_survey_instance_guid( survey_template ).
* Step3: assemble request body
data(lv_request_body) = assemble_request_body( iv_question1 = iv_question1
iv_question2 = iv_question2
iv_guid = survey_guid ).
* Step4: Submit survey
CALL FUNCTION 'CRM_SVY_RESULT_DISPATCHER'
EXPORTING
survey_data = lv_request_body
IMPORTING
return = ret.
WRITE:/ |result: { ret-message } | COLOR COL_NEGATIVE.
COMMIT WORK AND WAIT.
ENDMETHOD.
复制代码

步骤 1:

通过方法 get_survey_template 拿到 Survey 的模板代码。


以前的文章已经讲过,Survey 模板以 XML 的格式存储在 SAP 后台系统,



然而最终用户在浏览器看到的 Survey 是 html 格式的,因此中间有一个步骤通过 SAP 标准的 XSLT 将 xml 转换成 html,并且生成一个新的 Survey 实例。这一系列的动作都封装在我写的方法 get_survey_template 里面。该方法返回 Survey 模板的 HTML 源代码,基于 xml 转换而成。


步骤 2:

方法 get_new_survey_instance_guid,通过正则表达式将前一步骤生成的 Survey 实例的 guid 提取出来。因为后续步骤提交 Survey 结果时,需要在请求体里加入这个实例 guid。



我采用的是正则表达式的方式解析出该 guid,详细步骤参考我的文章:使用 ABAP 正则表达式解析 HTML 标签

步骤 3:

assemble_request_body 构造提交的请求方法体。在浏览器里测试发现,如果两个问题的答案都为是,则发送的请求体如下:


svyApplicationId=CRM_SURVEY_ACTIVITY&SurveyId=JERRY_TEST&svySurveyId=JERRY_TEST&svyVersion=0000000003&SchemaVersion=1 &svySchemaVersion=1 &svyLanguage=EN&conid=&svyValueGuid=FA163EEF573D1ED89E9D22A316FC4754&svyValueVersion=0000000001&svyMandatoryMessage=Fill all mandatory fields before saving&survey/result/question1/answer1_placeholder=answer1_yes&survey/result/question2/answer2_placeholder=answer2_yes&onInputProcessing=SUBMIT


其中蓝色的 guid 则是步骤 2 提取出的 Survey 实例,红色的代表问题 1 的答案为是,紫色代表问题 2 的回答为是。



这些 XML 的详细原理,参考我的文章 SAP CRM Survey 调查问卷的模型设计原理解析。

步骤 4:

使用如下函数提交 Survey。


CALL FUNCTION 'CRM_SVY_RESULT_DISPATCHER'
EXPORTING
survey_data = lv_request_body
IMPORTING
return = ret.
复制代码


有的数据库表字段类型为 RAWSTRING,



包含的是 XML 的二进制内容,无法直接在 SE16 里显示。



如果确实想看其内容,怎么办?在下面 SE16 页面的命令提示栏输入命令/h, 回车进入调试模式。然后双击某一行:



断点会触发如下。



稍稍调试几步,能看到一个 SELECT SINGLE 语句,这个操作为了取待显示在明细页面上的单条记录。双击 SQL 取回的结果。



在调试器里显示的还是二进制代码:



从下拉菜单里选择 XML Browser,XML 的内容就出来了。



发布于: 3 小时前阅读数: 5
用户头像

Jerry Wang

关注

个人微信公众号:汪子熙 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。

评论

发布
暂无评论
使用 ABAP 代码提交 SAP CRM Survey 调查问卷