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

举报
Jerry Wang 发表于 2021/11/07 16:37:57 2021/11/07
【摘要】 Jerry之前曾经写过两篇关于SAP CRM Survey调查问卷的技术文章:SAP CRM Survey调查问卷的模型设计原理解析如何使用SAP CRM Marketing Survey创建一个市场问卷调查我们在浏览器里填写调查问卷的内容,点击Save保存按钮之后,调查问卷的结果被存储到ABAP后台。在ABAP后台系统的Survey Suite工具里,能看到用户填写的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.

有同事问这个问题:lv_s是从int4转过来的,长度为2,和硬编码的lv_s2(长度为1)相比,后面多了个空格。

为什么?查SAP ABAP的编程帮助F1 help。

帮助文档说的很清楚了:如果赋值操作的目的字段(Target字段),即赋值号的左边操作数的类型为string,如果赋值之前的整数是负数,则在赋值后的字符串变量尾部增添一个"-"负号,否则增添一个空白符(blank)。

同样,在这个help的附近,解释了为什么把line 4的类型从string改成sstring之后,长度一下就变成20的原因:

类似这种ABAP赋值操作的隐式类型转换和显式类型转换在实际编程开发工作中也要注意。

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

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

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

断点会触发如下。

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。