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

举报
Jerry Wang 发表于 2021/11/07 16:35:31 2021/11/07
【摘要】 使用事务码CRM_SURVEY_SUITE进行编辑。选中Activities这个应用类型,点击新建按钮:双击Survey的根节点,点击编辑按钮维护Suvey的标题:Survey的正文布局类型(Layout)我选择了列表List:这个List包含了两个元素:1. Are you able to program with ABAP?2. Are you able to program with ...

使用事务码CRM_SURVEY_SUITE进行编辑。选中Activities这个应用类型,点击新建按钮:

双击Survey的根节点,点击编辑按钮维护Suvey的标题:

Survey的正文布局类型(Layout)我选择了列表List:

这个List包含了两个元素:

1. Are you able to program with ABAP?

2. Are you able to program with Java?

客户怎样回答这个问题呢?我选择的是通过Checkbox的方式回答。

提交按钮采用SAP系统默认实现。最终生成的Survey模板如下图所示:

下一步需要为这个新建的Survey(调查问卷)创建一个外部可访问的url。点击Generate Url按钮:

维护如下属性,点击Generate URL后,生成对应URL。

将该url发送给用户,就可以填写调查问卷了。

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

看这个名为Jerry’s Programming Skill的survey,只有两个问题。

以第一个问题Are you able to work with ABAP?为例,使用菜单Goto->Switch Between HTML <-> XML Display显示该Survey的XML源代码:

最核心的有三部分:

1. QuestionId: 问题编号 question1

对应如下区域:

2. AnswerId:问题回答的占位区域 - place holder, answer1_placeholder.

对应如下name属性的值:

3. Answer value:问题的具体回答,对应如下区域的value属性。

可以在Goto->Expert Mode里修改XML标签的属性:

默认生成的id都为GUID,可读性很差,可以在此处修改成可读性更好的ID。

需求就是我用ABAP的某个函数从数据库读取一个字符串出来,该字符串的内容是一个网页。

网页的form里包含了很多隐藏的input field。我的任务是解析出name为svyValueGuid的input field的值:FA163EEF573D1ED89E89C7FE5E7C4715

最简单粗暴的做法是:利用ABAP的FIND FIRST OCCURRENCE关键字首先找到svyValueGuid的偏移量,然后从这个偏移量出发,再找到第一个>的偏移量,这样问题就化简为在子串type=“hidden” value=“FA163EEF573D1ED89E89C7FE5E7C4715”,这样问题就简单多了。但是这种办法比较笨重,代码很冗余。

有没有更快捷的办法呢?那就是使用ABAP regular expression,即正则表达式。

请看下列的测试代码:

REPORT ztest_interface.

DATA: lv_input TYPE string,

reg_pattern TYPE string.

lv_input = `<body>` &&

`<div class="Title">Jerry's Programming Skill survey</div>` &&

`<form action="Survey.htm?sap-client=001">` &&

`<input name="svyApplicationId" type="hidden" value="CRM_SURVEY_ACTIVITY">` &&

`<input name="svyValueGuid" type="hidden" value="FA163EEF573D1ED89E89C7FE5E7C4715">` &&

`<input name="SurveyId" type="hidden" value="JERRY_TEST">` &&

`<div Id="" class="Section1">` && `</form></body>`.

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

TRY.

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

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

IF lo_matcher->match( ) <> abap_true.

WRITE:/ 'fail in input scan!'.

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(<sub>) INDEX 1.

data(lv_sub) = lv_input+<sub>-offset(<sub>-length).

WRITE:/ 'result: ', lv_sub.

CATCH cx_root INTO DATA(cx_root).

WRITE:/ cx_root->get_text( ).

RETURN.

ENDTRY.

执行结果:

解决问题的核心思路是这个正则表达式:*.svyValueGuid(?:.)value="(.)">.SurveyId.

通过捕获分组操作符,一对小括号,将32位的GUID值进行捕获。这种解法比FIND FIRST OCCURANCE的代码量要少。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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