This Blog post should give you an idea about how to read CRM survey question/answers value in ABAP code stored against a business transaction and validate the combinations.
The Business requirement was to convert the CRM Survey XML and read the Questions & answers on the survey and validate it, if transaction is saved on a particular status. If validation fails then throw error message and prevent saving of the transaction.
Each CRM Survey question/answer has a default technical value attached to it which can be changed as per Business requirement by enabling expert mode via transaction (CRM_SURVEY_SUITE ). This technical value will be used to validate the questions/answer
2. Attach the survey to the respective Business transaction via SPRO configuration.
3.Redefine your trigger point where you want to put the validation, In my case the requirement was to not to allow the transaction to be saved to ‘Qualified’ status from the UI if the answers combinations are not valid.
iv_survey_id = Survey Name ( used to create survey in CRM_SURVEY_SUITE)
iv_oppotunity_guid = Transaction guid
DATA: lit_question_ids TYPE crm_svy_api_xml_t,
wa_question_id TYPE string,
lit_answer_ids TYPE crm_svy_api_xml_t,
wa_answer_ids TYPE string,
wa_questionnaire TYPE survy_s_all_values,
lt_questionnaire TYPE survy_t_all_values,
lt_survey_values_table TYPE survy_t_all_values,
lt_no_display TYPE crm_svy_api_parameter_t,
lv_object_guid TYPE crmt_object_guid.
DATA: lv_guid TYPE crmt_object_guid,
lt_survey TYPE crmt_survey_comt,
ls_survey TYPE crmt_survey_com,
lr_survey_values TYPE REF TO cl_crm_svy_values,
ls_xml_string TYPE string.
CHECK iv_oppotunity_guid IS NOT INITIAL AND iv_survey_id IS NOT INITIAL.
CALL FUNCTION 'CRM_SURVEY_READ_OW'
iv_guid = iv_oppotunity_guid
iv_kind = 'A'
et_survey_com_latest_version = lt_survey
parameter_error = 1
record_not_found = 2
at_least_one_record_not_found = 3
OTHERS = 4.
IF sy-subrc = 0.
DELETE lt_survey WHERE surveyid <> iv_survey_id.
CHECK lt_survey IS NOT INITIAL.
READ TABLE lt_survey INTO ls_survey INDEX 1.
DATA(lv_xml) = ls_survey-valuexml.
IF lv_xml IS INITIAL.
CALL FUNCTION 'CRM_SVY_VALUES_READ'
valueguid = ls_survey-valueguid
valueversion = ls_survey-valueversion
status = 'C'
x_value_xml = lv_xml.
CALL FUNCTION 'CRM_SVY_DB_CONVERT_HEX2STRING'
x = lv_xml
s = ls_xml_string.
" get all questions & their answers
CALL METHOD lr_survey_values->values_get_all
et_all_values = lt_survey_values_table.
IF lt_survey_values_table IS NOT INITIAL.
yt_survey_values = lt_survey_values_table.
Debugger snapshot of survey values table which shows all questions/answers combinations filled in the Survey( these are the technical value provided at the time of survey creation in Step 1)
Now validate this table entries against your possible combinations and prevent saving of the transaction, In my case we maintained the possible combination in the BRF+ framework.
Also, there are lot of other useful methods in standard class 'CL_CRM_SVY_VALUES' which can be utilised as per business requirement such as hiding questions,updating the answers or adding mandatory questions etc.