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
CLEAR wa_listfact.
MOVE-CORRESPONDING
- 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.