Skip to Content
avatar image
Former Member

RSA3 - Extractor shows duplicate records

Hi All,

We have created one generic extractor based function module, to extract data from file path AL11.

Issue: If we trigger infopackage in BW end, it fetch records according to the source (Source file). Whereas we have checked the extractor in RSA3, it shows more enteris.

Ex. Source file have 4 records.

If we triggered infopackage, it extracts only 4 records.

If we checked RSA3, it shows 40 records (based on Data extr. call).ie.,Data extr. call = 10, No of records =10*4 = 40.

Kindly give your input.

Thanks,

Angavai Elangovan

Add comment
10|10000 characters needed characters exceeded

  • Get RSS Feed

3 Answers

  • Jan 14, 2015 at 08:18 PM

    Hi Angavai,

    Can you please share your coding?

    Thanks,

    Sander

    Add comment
    10|10000 characters needed characters exceeded

  • avatar image
    Former Member
    Jan 15, 2015 at 12:01 AM

    Hi Angavai,

    Sounds like missing instructions before your endloop.

    IF I_INITFLAG = SBIWA_C_FLAG_ON.

    ....

      ENDLOOP.

      IF sy-subrc EQ 0.

          CLOSE CURSOR.

          RAISE NO_MORE_DATA.

      ENDIF.

      S_COUNTER = S_COUNTER + 1.

    ENDIF.

    ENDFUNCTION.

    Please share your code. Regards.

    Add comment
    10|10000 characters needed characters exceeded

  • avatar image
    Former Member
    Jan 15, 2015 at 05:55 AM

    Hi All,

    Thanks for your quick response.Below is the piece of code.

    FUNCTION xxxxxxxxx.

    *"----------------------------------------------------------------------

    *"*"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  XXXXXX OPTIONAL

    *"  EXCEPTIONS

    *"      NO_MORE_DATA

    *"      ERROR_PASSED_TO_MESS_HANDLER

    *"----------------------------------------------------------------------

    ** Data Declaration

    TYPES:

    * type declaration to hold file data

      BEGIN OF ty_file1,

        sarchitecture TYPE ZARCH_FROM_SAP,           

        splant   TYPE zplant1,                      

        spartner TYPE ZBU_PARTNER1,                 

        spartnername type ZPARTNER_NAME,            

        uarchitecture type ZARCH_TO_USF,            

        uplant   TYPE zplant2,                      

        upartner TYPE ZBU_PARTNER2,                 

        upartnername type ZPARTNER_NAME,            

        datum    TYPE Zdate,                        

        Flag     TYPE Zflag,                        

      END OF ty_file1,

      t_file1 TYPE STANDARD TABLE OF ty_file1.

    *Declaration to hold the data from XXXXXX table

      TYPES:

      BEGIN OF ty_data,

        partner   TYPE BU_PARTNER,

        territory TYPE CRMT_TERRITORY_ID,

      END OF ty_data.

    *Declaration for BUT000 table

    TYPES:

      BEGIN OF ty_but000,

        partner      TYPE BU_PARTNER ,

        partner_guid TYPE BU_PARTNER_GUID,

      END OF ty_but000.

    *Declaration for CRMD_TERR_ACCREL Table

    TYPES :

      BEGIN OF ty_extract,

        partner_guid TYPE BU_PARTNER_GUID,

      END OF ty_extract.

      TYPES : BEGIN OF L_BUT100,

               PARTNER TYPE BU_PARTNER,

               RLTYP TYPE BU_PARTNERROLE,

              END OF L_BUT100.

    *Declaration of internal table for holding the file data and logical reading of system

      DATA : pc_it_file1 TYPE t_file1,

             pv_file1    TYPE localfile.

      DATA:

        lv_line  TYPE char240,

        ls_file1 TYPE ty_file1,

       sysname  TYPE SBIWM_LOGSYS,

        client(3)   TYPE C,

        cnt  TYPE i.

    DATA:

      it_file1        TYPE t_file1,

      it_data         TYPE STANDARD TABLE OF ty_extract,

      wa_data1        TYPE ty_data,

      It_but000       TYPE STANDARD TABLE OF ty_but000,

      Wa_but000       TYPE ty_but000,

      wa_data_extract TYPE zcust_user,

      LT_BUT100 TYPE TABLE OF L_but100,

       LT_BUT000 TYPE TABLE OF ty_BUT000.

    * Auxiliary Selection criteria structure

      DATA: l_s_select TYPE srsc_s_select.

    * Maximum number of lines for DB table

      STATICS: s_s_if TYPE srsc_s_if_simple,

    * counter

              s_counter_datapakid LIKE sy-tabix,

    * cursor

              s_cursor TYPE cursor.

    * Select ranges

      RANGES: l_r_partner FOR but000-partner.

    * Initialization mode (first call by SAPI) or data transfer mode

    * (following calls) ?

      IF i_initflag = sbiwa_c_flag_on.

    ************************************************************************

    * Initialization: check input parameters

    *                 buffer input parameters

    *                 prepare data selection

    ************************************************************************

    * Check DataSource validity

        CASE i_dsource.

          WHEN 'XXXXXXXXX'.

          WHEN OTHERS.

            IF 1 = 2. MESSAGE e009(r3). ENDIF.

    * this is a typical log call. Please write every error message like this

            log_write 'E'                  "message type

                      'R3'                 "message class

                      '009'                "message number

                      i_dsource   "message variable 1

                      ' '.                 "message variable 2

            RAISE error_passed_to_mess_handler.

        ENDCASE.

        APPEND LINES OF i_t_select TO s_s_if-t_select.

    * Fill parameter buffer for data extraction calls

        s_s_if-requnr    = i_requnr.

        s_s_if-dsource = i_dsource.

        s_s_if-maxsize   = i_maxsize.

    * Fill field list table for an optimized select statement

    * (in case that there is no 1:1 relation between InfoSource fields

    * and database table fields this may be far from beeing trivial)

        APPEND LINES OF i_t_fields TO s_s_if-t_fields.

      ELSE.                 "Initialization mode or data extraction ?

    ************************************************************************

    * Data transfer: First Call      OPEN CURSOR + FETCH

    *                Following Calls FETCH only

    ************************************************************************

    * First data package -> OPEN CURSOR

        IF s_counter_datapakid = 0.

    * Fill range tables BW will only pass down simple selection criteria

    * of the type SIGN = 'I' and OPTION = 'EQ' or OPTION = 'BT'.

    *      LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'PARTNER'.

    *        MOVE-CORRESPONDING l_s_select TO l_r_partner.

    *        APPEND l_r_partner.

    *      ENDLOOP.

    * Determine number of database records to be read per FETCH statement

    * from input parameter I_MAXSIZE. If there is a one to one relation

    * between DataSource table lines and database entries, this is trivial.

    * In other cases, it may be impossible and some estimated value has to

    * be determined.

          OPEN CURSOR WITH HOLD s_cursor FOR

    *      SELECT TERR_GUID TERR_ID FROM CRMM_TERRITORY

    *                               WHERE TERR_ID LIKE 'T%'.

      SELECT PARTNER RLTYP FROM BUT100

                                   WHERE

                                       ( RLTYP = 'Z001' OR RLTYP = 'Z002' ).

    ENDIF.                                "First data package ?

    * Fetch records into interface table.

    *   named E_T_'Name of extract structure'.

        FETCH NEXT CURSOR s_cursor

                  APPENDING CORRESPONDING FIELDS

                   OF TABLE LT_BUT100

                   PACKAGE SIZE s_s_if-maxsize.

      IF sy-subrc <> 0.

          CLOSE CURSOR s_cursor.

        RAISE no_more_data.

       Else.

    *    CHECK LT_BUT100[] IS not INITIAL.

    *     if LT_BUT100[] is not initial.

    *        SELECT PARTNER PARTNER_GUID

    *          FROM BUT000

    *          INTO TABLE LT_BUT000

    *          FOR ALL ENTRIES IN LT_BUT100

    *          WHERE PARTNER = LT_BUT100-PARTNER.

    *        SORT LT_BUT000 BY PARTNER.

    *      endif.

    CALL FUNCTION 'RSA_LOGICAL_SYSTEM_BIW_GET'                " Function module which dynamically choose system and client

    *   EXPORTING

    *     I_WITHOUT_POPUP                = ' '

       IMPORTING

         E_LOGSYS_BIW                   = sysname

    *   EXCEPTIONS

    *     NO_LOGSYS_TO_THIS_CLIENT       = 1

    *     LOGSYS_CHANGED                 = 2

    *     OTHERS                         = 3

                .

      IF SY-SUBRC <> 0.

    * Implement suitable error handling here

      ELSE.

        client = sysname+7(3).

        sysname = sysname+0(3).

      ENDIF.

      CONCATENATE '/usr/app/sap/' sysname '/'

                  client '/SM/conversion/USF/XXXXXXXXXXX.txt'

      INTO pv_file1.

    *  pV_file1 = '/usr/app/sap/SC1/200/SM/conversion/XXXXXXXXXX.txt'.

      CLEAR cnt.

      OPEN DATASET pv_file1 FOR INPUT IN TEXT MODE ENCODING DEFAULT.

      IF sy-subrc IS NOT INITIAL.

    *   No access to read the Cust Plant XREF application server file

    *    MESSAGE i000 WITH text-i11.

      ELSE.

        DO.

          READ DATASET pv_file1 INTO lv_line.

          IF sy-subrc = 0.

            cnt = cnt + 1.

            IF cnt NE 1.

            SPLIT lv_line AT cl_abap_char_utilities=>horizontal_tab

             INTO ls_file1-sarchitecture

                  ls_file1-splant

                  ls_file1-spartner

                  ls_file1-spartnername

                  ls_file1-uarchitecture

                  ls_file1-uplant

                  ls_file1-upartner

                  ls_file1-upartnername

                  ls_file1-datum

                  ls_file1-Flag.

            CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'        "Function which converts the customer number to 10 digit

              EXPORTING

                INPUT         = ls_file1-spartner

             IMPORTING

               OUTPUT        = ls_file1-spartner

                      .

            APPEND ls_file1 TO pc_it_file1.

            ENDIF.

          ELSE.

            EXIT.

          ENDIF.

          ENDDO.

        CLOSE DATASET pv_file1.

    ENDIF.

      SORT pc_it_file1 BY spartner.

    DELETE ADJACENT DUPLICATES FROM pc_it_file1 COMPARING spartner.

    "Comparison of data from the file with the Account realtionship table

    IF pc_it_file1[] IS NOT INITIAL.

       SELECT partner

             partner_guid

        FROM BUT000

        INTO TABLE it_but000

         FOR ALL ENTRIES IN pc_it_file1

       WHERE partner = pc_it_file1-spartner.

    endif.

    IF it_but000[] IS NOT INITIAL.

       SELECT partner_GUID

         FROM CRMD_TERR_ACCREL

         INTO TABLE it_data

          FOR ALL ENTRIES IN it_but000

        WHERE partner_guid = it_but000-partner_guid.

    endif.

       SORT it_data BY partner_guid.

      Delete adjacent duplicates from it_data comparing partner_guid.

    LOOP AT it_but000 INTO wa_but000.

       READ TABLE it_data

          WITH KEY partner_guid = wa_but000-partner_guid

          BINARY SEARCH TRANSPORTING NO FIELDS.

       IF NOT SY-SUBRC EQ 0.

         wa_data_extract-sold_to = wa_but000-partner.

         wa_data_extract-territory = space.

         APPEND wa_data_extract TO E_T_DATA.

        ENDIF.

      ENDLOOP.

    SORT E_T_DATA BY SOLD_TO TERRITORY.

          DELETE ADJACENT DUPLICATES FROM E_T_DATA COMPARING SOLD_TO TERRITORY.

    ENDIF.

       s_counter_datapakid = s_counter_datapakid + 1.

       ENDIF.             "Initialization mode or data extraction ?

    ENDFUNCTION.

    Add comment
    10|10000 characters needed characters exceeded

    • John Lang Sander van Willigen

      Hi Angavai,

      Sanders proposed approach also has the advantage of being able to handle very large flat files and not hit any memory limit issues because the OPEN CURSOR will only pull the next single DataPacket worth of records from the database table.

      And remember to add a bit of housekeeping code as well. Where you CLOSE CURSOR also consider adding a statement to delete the data contents out of the database table that was used for the temporary storage of the flat file.

      Hope this helps.

      Kind regards,

      John.