Aller au contenu

Flux - Create Datasource on ALV grid program

http://scn.sap.com/community/data-warehousing/bw/blog/2014/03/13/innovative-to-create-a-bw-extractor

Exemple vu en mission :

FUNCTION zbw_itesoft_invoice2.

  • "----------------------------------------------------------------------
  • "*"Local Interface:
  • " IMPORTING
  • " VALUE(I_REQUNR) TYPE SRSC_S_IF_SIMPLE-REQUNR
  • " VALUE(I_DSOURCE) TYPE SRSC_S_IF_SIMPLE-DSOURCE OPTIONAL
  • " VALUE(I_MAXSIZE) TYPE SRSC_S_IF_SIMPLE-MAXSIZE OPTIONAL
  • " VALUE(I_INITFLAG) TYPE SRSC_S_IF_SIMPLE-INITFLAG OPTIONAL
  • " VALUE(I_READ_ONLY) TYPE SRSC_S_IF_SIMPLE-READONLY OPTIONAL
  • " VALUE(I_REMOTE_CALL) TYPE SBIWA_FLAG DEFAULT SBIWA_C_FLAG_OFF
  • " TABLES
  • " I_T_SELECT TYPE SRSC_S_IF_SIMPLE-T_SELECT OPTIONAL
  • " I_T_FIELDS TYPE SRSC_S_IF_SIMPLE-T_FIELDS OPTIONAL
  • " E_T_DATA STRUCTURE ZBW_STR_ITE_INV OPTIONAL
  • " EXCEPTIONS
  • " NO_MORE_DATA
  • " ERROR_PASSED_TO_MESS_HANDLER
  • "----------------------------------------------------------------------

STATICS: s_s_if TYPE srsc_s_if_simple,

s_counter_datapakid LIKE sy-tabix,

s_cursor TYPE cursor.


  • I. Initialization mode (1st call by SAPI)

IF i_initflag = sbiwa_c_flag_on.

  • I.1 - Check DataSource validity

IF i_dsource <> 'ZBW_ITESOFT_INVOICE2'.

log_write 'E' 'R3' '009' i_dsource ' '.

RAISE error_passed_to_mess_handler.

ENDIF.

  • I.2 - Load s_s_if variable.

APPEND LINES OF i_t_select TO s_s_if-t_select.

s_s_if-requnr    = i_requnr.

s_s_if-dsource   = i_dsource.

s_s_if-maxsize   = i_maxsize.

APPEND LINES OF i_t_fields TO s_s_if-t_fields.


  • II. 2nd Call

ELSE.


  • II.1 - First Datapackage

IF s_counter_datapakid = 0.


  • II.1.1 - Prepare variable for execution

  • Creation Date

REFRESH s_date.

LOOP AT s_s_if-t_select INTO l_s_select

WHERE fieldnm = 'CREDAT'.

MOVE-CORRESPONDING l_s_select TO s_date.

IF l_s_select-sign = 'I'

AND l_s_select-option = 'EQ'

AND l_s_select-low <> ''.

s_date-sign = 'I'.

s_date-option = 'BT'.

s_date-high = l_s_select-low.

APPEND s_date.

ELSE.

APPEND s_date.

ENDIF.

ENDLOOP.

IF s_date[] IS INITIAL.

s_date-low    =  '00010101'.               " It specifies the range starting value.

s_date-high   =  '99991231'.               " It specifies the range ending value.

s_date-option =  'BT'.                " specifies ranges value is in between.

s_date-sign   =  'I'.                     "specifies both inclussive.

APPEND s_date.

ENDIF.

  • Status

REFRESH s_status.

LOOP AT s_s_if-t_select INTO l_s_select

WHERE fieldnm = 'ZZSTATUT'.

MOVE-CORRESPONDING l_s_select TO s_status.

APPEND s_status.

ENDLOOP.


  • II.1.2 - Execution of ZRM03 transaction
  • and copy result in internal table

  • Important to set display = abap_false so the standard program won’t display the ALV

cl_salv_bs_runtime_info=>set(

EXPORTING display  = abap_false

metadata = abap_false

data     = abap_true ).

SUBMIT /itesoft/zbalancer_rapprman_01

WITH s_datsel IN s_date

WITH s_invst IN s_status

WITH cb_typmm = 'X'

WITH cb_typfi = 'X'

AND RETURN.

TRY.

cl_salv_bs_runtime_info=>get_data_ref(

IMPORTING r_data      = lr_data ).

ASSIGN lr_data->* TO .

IF NOT lr_data IS INITIAL.

LOOP AT ASSIGNING .

CLEAR wa_listfact.

MOVE-CORRESPONDING TO wa_listfact.

  • Update ZZSTATUT field (don't exist in ALV grid)

SELECT invstat INTO wa_listfact-zzstatut

FROM /itesoft/statust UP TO 1 ROWS

WHERE langu = sy-langu

AND statxt = wa_listfact-msgsta.

ENDSELECT.

APPEND wa_listfact TO it_listfact.

ENDLOOP.

ENDIF.

CATCH cx_salv_bs_sc_runtime_info.

MESSAGE 'Unable to retrieve ALV data' TYPE 'E'.

ENDTRY.


  • II.1.3 - Calculate nb of rows and
  • Init datapackage size

DESCRIBE TABLE it_listfact LINES w_nb_lignes.

IF w_nb_lignes = 0.

RAISE no_more_data.

ELSE.

w_first_record = 1.

IF s_s_if-maxsize >= w_nb_lignes.

w_last_record = w_nb_lignes.

ELSE.

w_last_record = s_s_if-maxsize.

ENDIF.

ENDIF.


  • II.1.4 - Clear variable and field symbols

cl_salv_bs_runtime_info=>clear_all( ).

UNASSIGN: , .

FREE lr_data.

ENDIF.


  • II.2 - For each package


  • Copy data in e_t_data by datapackage size

IF w_first_record > w_nb_lignes.

RAISE no_more_data.

ENDIF.

IF w_last_record > w_nb_lignes.

w_last_record = w_nb_lignes.

ENDIF.

LOOP AT it_listfact INTO wa_listfact

FROM w_first_record TO w_last_record.

APPEND wa_listfact TO e_t_data.

ENDLOOP.


  • Calculate next datapackage interval

w_first_record = w_last_record + 1.

w_last_record = w_first_record + s_s_if-maxsize - 1.

s_counter_datapakid = s_counter_datapakid + 1.

ENDIF.

ENDFUNCTION.