cancel
Showing results for 
Search instead for 
Did you mean: 

Loyalty - Status for Member Activities

OlgenH
Participant
0 Kudos

Hello,

I'm trying to set up a loyalty management sceneario on SAP CRM Ehp2. Practically we have to create member activities which will then be processed and will update the membership points.

Based on SAP documentation the MA can be processed:

  • Batch processing: Member activities are moved to Ready for Batch status from the UI or through creating records directly in the “Ready for Batch” status using the LSMW report. When a member activity is created and set to this status, a report program RLOY_ENGINE_SCHEDULE scheduled by the loyalty engine picks up these activities from the Ready for Batch status and processes them.

What I'm trying to do is create MA using FM CRM_LOY_MA_CREATE_API, but I'm not able to set the status to "Ready for Batch" (System Status = I8122 and User Status = E0004). I've checked the settings for the status profile and everything is correct. I'm able to create MA only in status "Created", but these are not processed by RLOY_ENGINE_SCHEDULE.

Is there a way to create MA in status "Ready for Batch" or am I missing some configuration?

Thanks,

Best,

Olgen

View Entire Topic
Caique
Employee
Employee
0 Kudos

Hello Olgen,

There is template to create member activities using LSMW. You can check in SAP Note 1331292 - Upload of Loyalty Member Activities via LSMW.

Here is a sample program using the status you have mentioned before:

Find for *******STATUS*********************


REPORT  zXXX_XXX_XXXX_XX.

**********************************************************************
*   TIPOS (ty_...)                                                   *
**********************************************************************
TYPES: BEGIN OF ty_programa,
                  program_id TYPE crm_mktpl_external_id,
                  guid       TYPE crm_mktpl_ib_mktproject_guid,
       END OF   ty_programa.

TYPES: BEGIN OF ty_tvarv,
                  program_id TYPE crm_mktpl_external_id,
       END OF   ty_tvarv.

TYPES: BEGIN OF ty_prog,
        key TYPE char1,
        value  TYPE char20,
        END OF  ty_prog.

**********************************************************************
*   TABELAS INTERNAS (it_...)                                        *
**********************************************************************
DATA: it_prog     TYPE TABLE OF ty_prog,
      it_values_a TYPE TABLE OF dd07v,
      it_files    TYPE TABLE OF eps2fili,
      it_values   TYPE TABLE OF string,
      it_zcrmt021 TYPE TABLE OF zcrmt021,
      it_programa TYPE TABLE OF ty_programa,
      it_tvarv    TYPE TABLE OF ty_tvarv,
      it_gen      TYPE crmt_loy_ma_gen_attr,
      it_spe      TYPE crmt_loy_ma_specific_attr.

**********************************************************************
*   WORK AREAS (wa_...)                                              *
**********************************************************************
DATA: wa_files    TYPE eps2fili,
      wa_zcrmt021 TYPE zcrmt021,
      wa_programa TYPE ty_programa.

**********************************************************************
*   Variaveis (lv_...)                                               *
**********************************************************************
DATA: lv_file           TYPE string,
      lv_path           TYPE string,
      lv_path_processed TYPE string,
      lv_content        TYPE string,
      lv_count          TYPE n LENGTH 13,
      lv_result         TYPE boolean,
      lv_path_pro_stva  TYPE epsf-epsdirnam,
      lv_path_stva      TYPE eps2filnam.


START-OF-SELECTION.

  PERFORM: load_tvarv,
           load_ztable,
           read_directory,
           get_programs,
           process_all_files.

*&---------------------------------------------------------------------*
*&      Form  PROCESS_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM process_file USING lv_count.

  DATA lv_values       TYPE char13.
  DATA lv_values_aux   TYPE char13.
  DATA lv_final        TYPE sy-tabix.
  DATA lv_next         TYPE sy-tabix.
  DATA lv_tabix        TYPE sy-tabix.
  DATA lv_partner      TYPE bu_partner.
  DATA wa_gen          TYPE crms_loy_ma_gen_attr.
  DATA wa_prog         LIKE LINE OF it_prog.
  DATA wa_spe          TYPE crms_loy_ma_specific_attr.
  DATA lv_amt          TYPE crm_loy_ma_amount.
  DATA wa_mens         TYPE loyd_msh_mems.

  lv_final = lv_count - 1.

  LOOP AT it_values INTO lv_values.

    lv_tabix = sy-tabix.
    lv_next = sy-tabix + 1.

    READ TABLE it_values INTO lv_values_aux INDEX lv_next.

    lv_partner = lv_values.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = lv_partner
      IMPORTING
        output = lv_partner.

    SELECT SINGLE partner_guid
      INTO wa_gen-member_guid
      FROM but000
      WHERE partner = lv_partner.
    IF sy-subrc NE 0.
      CONTINUE.
    ENDIF.

    READ TABLE it_prog INTO wa_prog WITH KEY key = wa_zcrmt021-programa.
    IF sy-subrc NE 0.
      CONTINUE.
    ENDIF.

    READ TABLE it_programa INTO wa_programa WITH KEY program_id = wa_prog-value.
    IF sy-subrc NE 0.
      CONTINUE.
    ENDIF.

    wa_gen-program_guid = wa_programa-guid.

    SELECT guid
      UP TO 1 ROWS
      INTO wa_gen-membership_guid
      FROM loyd_msh_mems
      WHERE memb_guid = wa_gen-member_guid
      AND   loy_prog_guid = wa_gen-program_guid.
    ENDSELECT.
    IF sy-subrc NE 0.
      CONTINUE.
    ENDIF.

    IF wa_zcrmt021-tipo EQ 'R'.
      wa_spe-point_qual = 'QUALIFYING'.
    ELSEIF wa_zcrmt021-tipo EQ 'Q'.
      wa_spe-point_qual = 'QUALIFYING_ONLY'.
    ENDIF.

    wa_gen-guid = wa_gen-membership_guid.
    wa_gen-category = 'GPA'."'ACCRUAL'.
    IF wa_zcrmt021-programa EQ 'P'.
      wa_gen-process_type = 'ACML_PAMAIS'."'ZPRODUCT'.
    ELSEIF wa_zcrmt021-programa EQ 'E'.
      wa_gen-process_type = 'ACML_CLEX'.
    ENDIF.
    wa_gen-process_mode  = 'N'.
    wa_gen-parship_ext_des = wa_zcrmt021-descr.

*******STATUS*********************

    wa_gen-estat = 'E0004'.

*******STATUS*********************


    INSERT wa_gen INTO TABLE it_gen.
    wa_spe-guid = wa_gen-membership_guid.
    lv_amt = lv_values_aux.
    wa_spe-amount = lv_amt.
    wa_spe-currency = 'BRL'.
    wa_spe-points = lv_amt.
    wa_spe-process_mode = 'N'.
    INSERT wa_spe INTO TABLE it_spe.


    IF lv_tabix = lv_final.
      EXIT.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " PROCESS_FILE
*&---------------------------------------------------------------------*
*&      Form  MOVE_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_PATH  text
*      -->P_LV_PATH_PROCESSED  text
*----------------------------------------------------------------------*
FORM move_file_and_commit  USING    p_lv_path
                                    p_lv_path_processed.

*  DATA:  teste TYPE sapb-sappfad, "Alterado por limitação de tamanho
*         teste2 TYPE sapb-sappfad.
*
*  teste  = p_lv_path.
*  teste2 = p_lv_path_processed.

  CALL FUNCTION 'ZZARCHIVFILE_SERVER_TO_SERVER'
    EXPORTING
      sourcepath       = p_lv_path
      targetpath       = p_lv_path_processed
    EXCEPTIONS
      error_file       = 1
      no_authorization = 2
      OTHERS           = 3.
  IF sy-subrc = 0.
    DELETE DATASET p_lv_path.
    IF sy-subrc <> 0.
      wa_zcrmt021-status = 'Error'.
      wa_zcrmt021-data_fim = sy-datum.
      UPDATE zcrmt021 FROM wa_zcrmt021.
    ELSE.
      wa_zcrmt021-status = 'Processado'.
      wa_zcrmt021-data_fim = sy-datum.
      UPDATE zcrmt021 FROM wa_zcrmt021.
      COMMIT WORK.
    ENDIF.
  ENDIF.
ENDFORM.                    " MOVE_FILE
*&---------------------------------------------------------------------*
*&      Form  ERROR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM error .
  wa_zcrmt021-status = 'Error'.
  wa_zcrmt021-data_fim = sy-datum.
  UPDATE zcrmt021 FROM wa_zcrmt021.
  COMMIT WORK.
ENDFORM.                    " ERROR
*&---------------------------------------------------------------------*
*&      Form  GET_PROGRAMS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_programs .


  DATA: lo_core     TYPE REF TO cl_crm_bol_core,
        lo_result   TYPE REF TO if_bol_bo_col,
        lo_entity   TYPE REF TO cl_crm_bol_entity,
        lo_query    TYPE REF TO cl_crm_bol_dquery_service.
  DATA: it_values_n TYPE TABLE OF dd07v.
  DATA: it_tipo     TYPE TABLE OF ty_prog.
  DATA: wa_tipo     TYPE ty_prog.
  DATA: wa_prog     TYPE ty_prog.
  DATA: wa_values   TYPE dd07v.


  lo_core = cl_crm_bol_core=>get_instance( ).
  lo_core->start_up( iv_appl_name = 'LOY' ).
  lo_query = cl_crm_bol_dquery_service=>get_instance( 'LOYProgramAdvSearch' ).
  lo_result = lo_query->get_query_result( ).

  CHECK lo_result IS BOUND.
  lo_entity ?= lo_result->get_first( ).
  WHILE lo_entity IS BOUND.
    wa_programa-program_id = lo_entity->get_property_as_string( iv_attr_name = 'EXTERNAL_ID' ).
    TRANSLATE wa_programa-program_id TO UPPER CASE.
    READ TABLE it_tvarv WITH KEY program_id = wa_programa-program_id TRANSPORTING NO FIELDS.
    IF sy-subrc EQ 0.
      wa_programa-guid = lo_entity->get_property_as_string( iv_attr_name = 'GUID' ).
      wa_programa-program_id = lo_entity->get_property_as_string( iv_attr_name = 'EXTERNAL_ID' ).
      APPEND wa_programa TO it_programa.
    ENDIF.
    lo_entity ?= lo_result->get_next( ).
  ENDWHILE.

  CALL FUNCTION 'DD_DOMA_GET'
    EXPORTING
      domain_name   = 'ZCRM_LOY_PROGRAMA'
    TABLES
      dd07v_tab_a   = it_values_a
      dd07v_tab_n   = it_values_n
    EXCEPTIONS
      illegal_value = 1
      op_failure    = 2
      OTHERS        = 3.

  LOOP AT it_values_a INTO wa_values.
    wa_prog-value = wa_values-ddtext.
    wa_prog-key = wa_values-domvalue_l.
    APPEND wa_prog TO it_prog.
  ENDLOOP.

ENDFORM.                    " GET_PROGRAMS
*&---------------------------------------------------------------------*
*&      Form  LOAD_TVARV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM load_tvarv .

  SELECT low
    INTO TABLE it_tvarv
    FROM tvarvc
    WHERE name = 'LOY_CRED_MASS-PROGRAMAS'.

  SELECT SINGLE low
    INTO lv_path_stva
    FROM tvarvc
    WHERE name = 'LOY_CRED_MASS-DIR_TO_PROCESS'
    AND   type = 'P'
    AND   numb = 0.

  SELECT SINGLE low
    INTO lv_path_pro_stva
    FROM tvarvc
    WHERE name = 'LOY_CRED_MASS-DIR_PROCESSED'
    AND   type = 'P'
    AND   numb = 0.

ENDFORM.                    " LOAD_TVARV
*&---------------------------------------------------------------------*
*&      Form  LOAD_ZTABLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM load_ztable .

  SELECT *
    INTO TABLE it_zcrmt021
    FROM zcrmt021
    WHERE status <> 'Processado'.
  IF sy-subrc EQ 0.
    SORT it_zcrmt021 BY nome_file.
  ENDIF.

ENDFORM.                    " LOAD_ZTABLE
*&---------------------------------------------------------------------*
*&      Form  READ_DIRECTORY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM read_directory .

  CALL FUNCTION 'EPS2_GET_DIRECTORY_LISTING'
    EXPORTING
      iv_dir_name            = lv_path_stva
    TABLES
      dir_list               = it_files
    EXCEPTIONS
      invalid_eps_subdir     = 1
      sapgparam_failed       = 2
      build_directory_failed = 3
      no_authorization       = 4
      read_directory_failed  = 5
      too_many_read_errors   = 6
      empty_directory_list   = 7
      OTHERS                 = 8.
  IF sy-subrc <> 0.
    MESSAGE e003(crm_action).
  ENDIF.

ENDFORM.                    " READ_DIRECTORY
*&---------------------------------------------------------------------*
*&      Form  PROCESS_ALL_FILES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM process_all_files .

DATA: it_guid TYPE CRMT_LOY_COM_GUIDS.
DATA: wa_gen LIKE LINE OF it_gen.

  LOOP AT it_files INTO wa_files.

    CLEAR: lv_file, lv_path, lv_path_processed, it_gen ,it_spe.

    lv_file = wa_files-name.


    READ TABLE it_zcrmt021 INTO wa_zcrmt021 WITH KEY nome_file = lv_file BINARY SEARCH.
    IF sy-subrc <> 0.
      CONTINUE.
    ENDIF.


    CONCATENATE: lv_path_stva lv_file     INTO lv_path,
                 lv_path_pro_stva lv_file INTO lv_path_processed.


    OPEN DATASET lv_path FOR INPUT IN TEXT MODE ENCODING DEFAULT WITH SMART LINEFEED.
    IF sy-subrc EQ 0.
      DO.
        READ DATASET lv_path INTO lv_content.
        IF sy-subrc EQ 0.
          SPLIT lv_content AT ';' INTO TABLE it_values.
          DESCRIBE TABLE it_values LINES lv_count.
          IF lv_count >= 2.
            PERFORM process_file USING lv_count.
          ENDIF.
        ELSE.
          PERFORM error.
          EXIT.
        ENDIF.
      ENDDO.
      CLOSE DATASET lv_path.

      READ TABLE it_zcrmt021 INTO wa_zcrmt021 WITH KEY nome_file = lv_file BINARY SEARCH.
      IF sy-subrc EQ 0.
        IF NOT it_gen IS INITIAL.
          CALL FUNCTION 'CRM_LOY_MA_CREATE_API'
            EXPORTING
              iv_commit        = 'X'
            IMPORTING
              ev_success       = lv_result
            CHANGING
              ct_data_genattr  = it_gen
              ct_data_specattr = it_spe.
          IF lv_result EQ abap_true.
            LOOP AT it_gen INTO wa_gen.
              APPEND wa_gen-guid TO it_guid.
            ENDLOOP.
              CLEAR lv_result.
              CALL FUNCTION 'CRM_LOY_MA_PROCESS'
                EXPORTING
                  it_ma_guids                  = it_guid
               IMPORTING
                 EV_SUCCESS                   = lv_result
                 ET_DATA_GENATTR              = it_gen.
            IF lv_result EQ abap_true.
              PERFORM move_file_and_commit USING lv_path lv_path_processed.
            ELSE.
              PERFORM error.
            ENDIF.
          ELSE.
            PERFORM error.
          ENDIF.
        ENDIF.
      ENDIF.
    ELSE.
      PERFORM error.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " PROCESS_ALL_FILES


Beside this, in the program RLOY_ENGINE_SCHEDULE you select the status of the member activity. So you can also process member activities with "Created" status and in background.

Hope this helps!

With my best regards,

Caíque