Additional Blogs by Members
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member
0 Kudos

The requirement is to create a datasource using function module approach, which can handle delta as well. We can use the function modules RSAX_BIW_GET_DATA or RSVD BW_GET_DELTA_DATA as template.

As the interface of the above mentioned templates is’ F1’, we can handle various extraction modes from within the function module (*make use of i_updmode).

The Puzzle:

Everything works perfectly for full mode, but for the delta extraction mode, the parameter i_updmode is not populated correctly.

Let us debug the extractor program.

We observe, for the extraction mode – full, the variable l_fname has the value ZIRSVD_BW_GET_DELTA_DATA (user specified FM).

But for delta request, the extractor program is calling the function module specified in RSAOT type group.

And at a later stage, the Generic FM is being called with i_updmode as FULL. Hence in either way, the function module is not able to handle the selection based on the extraction mode.

Let us try from the enhancement spot:

Let us try to handle the entire logic (for full and delta) from the enhancement spot. In the following code, a cursor is set for the select statement based on the value of i_updmode. The value for the current pointer and repeat pointer can be referred from the table ROOSGENDLM. A sample code is given below.

METHOD if_ex_rsu5_sapi_badi~data_transform.
  CASE i_datasource.

    WHEN 'ZDS_FM_TEST2'.
      DATA var  TYPE rsaot_oltpsource.
      DATA: t_sel TYPE sbiwa_s_select.
      DATA: sel_opt  TYPE RANGE OF ztest_db-zsl_field,
            wa LIKE LINE OF sel_opt.
      DATA : cur TYPE cursor,
            curnt_ptr TYPE roosgendlm-deltaid,repeatptr TYPE roosgendlm- repeatid.

      SELECT deltaid FROM roosgendlm INTO curnt_ptr  WHERE oltpsource = 'ZDS_FM_TEST2'.
      ENDSELECT.

      LOOP AT i_t_select INTO t_sel  WHERE fieldnm = 'ZSL_FIELD'.
        MOVE-CORRESPONDING t_sel  TO wa.
        APPEND wa TO sel_opt.
      ENDLOOP.
      DATA : itab TYPE TABLE OF ztest_db.

      CASE i_updmode.
        WHEN 'F' OR 'C'.

          OPEN CURSOR cur FOR  SELECT * FROM ztest_db WHERE zsl_field IN sel_opt.
        WHEN 'D'.
          OPEN CURSOR cur FOR  SELECT * FROM  ztest_db
          WHERE zsl_field  IN sel_opt AND ztimestamp > curnt_ptr ."condition
        WHEN OTHERS.
      ENDCASE.
      FETCH NEXT CURSOR cur APPENDING  TABLE itab .
      IF sy-subrc <> 0.
        CLOSE CURSOR cur.
      ENDIF.

      REFRESH c_t_data.
      c_t_data[] = itab[].
    WHEN OTHERS.
  ENDCASE.
ENDMETHOD.

 

Alternatively, we can create another function module and pass the parameters .

A word of caution:

The function module will be called again and again if we do not raise any exception. Raise the exception no_more_data to get out of the function module.

Now the request is being handled from the enhancement spot.

 

Disclaimer:

This document is provided without a warranty of any kind, either express or implied, including but not limited to, the implied warranties of merchantability, fitness for a particular purpose, or non-infringement. All texts in this blog are personal opinions and observations of the author.

2 Comments