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 <lt_data>.
IF NOT lr_data IS INITIAL.
LOOP AT <lt_data> ASSIGNING <l_data>.
CLEAR wa_listfact.
MOVE-CORRESPONDING <l_data> 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: <lt_data>, <l_data>.
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.