Rozszerzanie ekstraktora w SAP CRM

Firma SAP wraz ze swoim cudownym systemem CRM (i nie tylko) dostarcza szereg predefiniowanych ekstraktorów przy pomocy, których możemy wyekstrahować dane do hurtowni danych. Niestety jak to w życiu bywa coś co jest dostarczone razem z systemem nie spełnia naszych wymagań i tak jest też z ekstraktorami.
Spróbuję tu pokazać na prostym przykładzie jak można rozszerzyć ekstraktor o dodatkowe pola, uzupełnić je danymi i przetestować tak powstałą strukturę. Jako przykład weźmiemy ekstraktor o dużo mówiącej nazwie 0CRM_SALES_ACT_I, który odpowiada za wydobycie danych dotyczących pozycji aktywności.

  1. Rozszerzanie struktury ekstrakcyjnej
  2. W transakcji RSA6 odnajdujemy standardowy ekstraktor 0CRM_SALES_ACT_I. Wybieramy funkcję „Rozszerzanie struktury ekstraktu”. Wpisujemy odpowiednią nazwę dla struktury append lub akceptujemy tą zaproponowaną przez system (u mnie: ZACRMT_BW_DS_ACTIVITY_I). Nazwa ta w tym przypadku nie ma większego znaczenia.
    Na zakładce „Składniki” dodajemy odpowiednie pola:

    • ZZUSR_STAT - typ składnika CRM_J_STATUS
    • ZZSTSMA - typ składnika CRM_J_STSMA

    Przy zapisywaniu projektu wybieramy odpowiedni pakiet (np. ZCRM_BI) i tworzymy zlecenie transportowe.
    Aby wyświetlić/edytować nowo rozszerzoną strukturę musimy wyjść/wejść ponownie do transakcji RSA6, zaznaczyć ekstraktor 0CRM_SALES_ACT_I i wybrać przycisk "Edycja źródła danych".
    W kolejnym ekranie odnajdujemy stworzone wcześniej pola i odznaczamy dla nich opcje „Ukrycie pola” i „ Pole znane tylko w EXIT klienta”, następnie zapisujemy ekstraktor.

  3. Implementacja rozszerzenia – BAdI
  4. Po rozszerzeniu struktury, nowo dodane pole musi zostać wypełnione danymi. SAP dostarcza wiele mechanizmów do realizacji tego celu. W tym przypadku zostało wykorzystane BAdI typu CRM_BWA_MFLOW. Tego typu BAdI wykorzystujemy dla źródeł danych typowo CRM-owych.
    W transakcji SE19 (Edytor BAdI) tworzymy nową implementację dla CRM_BWA_MFLOW o nazwie ZCRM_SALES_ACT_I_BAD (nazwa dowolna).
    Akceptujemy zaproponowane przez system lub podajemy własne nazwy dla tworzonych klas i interfejsów. W tym przypadku są to odpowiednio: ZCL_IM_CRM_SALES_ACT_I_BAD i IF_EX_CRM_BWA_MFLOW.
    Implementacja funkcjonalności sprowadza się do edycji metody ENHANCE_DATA_SOURCE. Kod odpowiedzialny za uzupełnianie pól dodanych wcześniej do struktury ekstrakcyjnej wygląda następująco:

    method IF_EX_CRM_BWA_MFLOW~ENHANCE_DATA_SOURCE.
    FIELD-SYMBOLS: <l_s_data> TYPE crmt_bw_ds_activity_i,
    <l_s_tj30_stat> TYPE v_tj30,
    <l_s_jest_buf> TYPE crmt_jest_buf
    .
    DATA: l_guid16 TYPE crmt_object_guid.
    DATA: lt_jest_buf TYPE crmt_jest_buf_tab,
    lv_obtyp TYPE jsto-obtyp,
    lv_stsma TYPE jsto-stsma,
    lv_stonr TYPE tj30-stonr,
    lt_status TYPE TABLE OF jstat,
    lt_tj30_stat TYPE TABLE OF v_tj30
    .
    IF i_datasource = '0CRM_SALES_ACT_I'.
    LOOP AT ct_data ASSIGNING <l_s_data>.
    l_guid16 = <l_s_data>-guid.
    CLEAR lt_jest_buf.
    CALL FUNCTION 'CRM_STATUS_READ'
    EXPORTING objnr = l_guid16
    IMPORTING et_jest_buf = lt_jest_buf
    obtyp = lv_obtyp
    stsma = lv_stsma
    stonr = lv_stonr
    TABLES status = lt_status
    EXCEPTIONS object_not_found = 1
    .
    IF sy-subrc = 0 AND lv_stsma <> ''.
    CLEAR lt_tj30_stat.
    CALL FUNCTION 'CRM_GET_STATUS_PROFILE'
    EXPORTING iv_stsma = lv_stsma
    TABLES et_status = lt_tj30_stat
    EXCEPTIONS stsma_not_found =1
    .
    IF sy-subrc = 0.
    LOOP AT lt_tj30_stat ASSIGNING <l_s_tj30_stat>.
    READ TABLE lt_jest_buf WITH KEY stat = <l_s_tj30_stat>-estat ASSIGNING <l_s_jest_buf>.
    IF sy-subrc = 0. "Jest odpowiedni status
    <l_s_data>-zzusr_stat = <l_s_jest_buf>-stat. "przekopiowanie do wynikowej tabeli
    <l_s_data>-zzstsma = lv_stsma.
    ENDIF.
    ENDLOOP.
    ENDIF.
    ENDIF.
    ENDLOOP.
    ENDIF.
    endmethod.

  5. Testowanie ekstraktora
  6. Ekstraktor możemy przetestować w transakcji RSA3. Aby wyświetlić dodatkowe pola przy wyświetlaniu listy wynikowej należy wybrać "Bieżące…" z menu narzędzi z listy kolumn po prawej stronie wybrać dodatkowe pola i przycisnąć "Kopiowanie".