Tips and Tricks for the ABAP® Programming Language

Y9030012: A fast alternative to “COLLECT itab”

The testing data for an internal table is created by a random number generator (see Y9030010). In contrast to COLLECT itab, the number of the table entries is not limited. The construction of the internal table is carried out in a sorted manner and in the case of a double key the processed values are summed up .

The line number depends on the data volumes and the keywords. If the keyword is available, the generated value will be summed to the positions.

– Insert keyword: The generated value will be transferred

– Append keyword: The generated value will be also transferred.

Parameter entries:
NUMBER 100: With this parameter entry, the number DO loop runs is determined to generate random numbers . The random number generator of “Y9030010” can be used relatively simply in other, own reports.

ABAP-Source-Code

You can cut and paste the source code directly into the ABAP-Workbench.

REPORT Y9030012 LINE-SIZE 130.   "Release 3.1G, 4.5A
************************************************************************
* Copyright (c) 1999 by CT-Team, 33415 Verl, http://www.ct-software.com
*
*     You can use or modify this report for your own work as long
*               as you don't try to sell or republish it.
*      In no event will the author be liable for indirect, special,
*        Incidental, or consequental damages (if any) arising out of
*                       the use of this report.
*
*//////////////////////////////////////////////////////////////////////*
 BREAK-POINT.
 MOVE: 'Alternative to ''COLLECT itab'' for table construction '
        TO SY-TITLE.
*//////////////////////////////////////////////////////////////////////*
 PARAMETERS: ANZAHL(3) TYPE N DEFAULT ' 15'.
***************         Internal tables           **********************
 DATA: BEGIN OF ITAB OCCURS 100,
        CFELD4(4) TYPE C,
        IFELD TYPE I,
        PFELD3(3) TYPE P,
        PFELD5(5) TYPE P,
        ANZAHL(3) TYPE P,
       END OF ITAB.
*
***************         Field strings             **********************
 DATA: BEGIN OF ITAB1,
        CFELD4(4) TYPE C,
        IFELD TYPE I,
        PFELD3(3) TYPE P,
        PFELD5(5) TYPE P,
       END OF ITAB1.
************************************************************************
*
*//////////////////////////////////////////////////////////////////////*
*************               Main Section             *******************
*//////////////////////////////////////////////////////////////////////*
*
*.......................................................................
 END-OF-SELECTION.
 PERFORM GENERIEREN-DATEN-ITAB1.
 PERFORM DISPLAY-ITAB.
*
*//////////////////////////////////////////////////////////////////////*
*************                Subroutines             *******************
*//////////////////////////////////////////////////////////////////////*
*
************************************************************************
*         Generate random numbers for the table head line
************************************************************************
 FORM GENERIEREN-DATEN-ITAB1.
*
  WRITE:/1 'Step 1: Create the head line data for ITAB1' COLOR 5.
  SKIP 2. ULINE.
*.......Fill head line of ITAB1 with random numbers ....................
  IF ANZAHL EQ SPACE.
     MOVE '10' TO ANZAHL.
     WRITE: /1 'Parameter entry was set to ''10'' '.
  ENDIF.
*.......................................................................
  DO ANZAHL TIMES.
*
    PERFORM ERZEUGEN-PSEUDOZUFALL USING ITAB1-CFELD4 4 'A'.
    PERFORM ERZEUGEN-PSEUDOZUFALL USING ITAB1-IFELD 3 'N'.       "max 9
    PERFORM ERZEUGEN-PSEUDOZUFALL USING ITAB1-PFELD3 2 'N'.
    PERFORM ERZEUGEN-PSEUDOZUFALL USING ITAB1-PFELD5 4 'N'.
    MOVE 'ABC' TO ITAB1-CFELD4+0(3).
*
    PERFORM AUFBAU-TABELLE-ITAB.
    CLEAR ITAB.
  ENDDO.
*
 ENDFORM.
************************************************************************
*    The internal table ITAB is build with COLLECT and INSERT          *
************************************************************************
 FORM AUFBAU-TABELLE-ITAB.
*
  IF SY-INDEX EQ 1.                             "from last do loop
     WRITE:/1 'Step 2: Create the table ITAB ' COLOR 3.
     SKIP 2. ULINE.
  ENDIF.
*.......................................................................
*
    READ TABLE ITAB WITH KEY ITAB1-CFELD4 BINARY SEARCH.
*                                  see also  .... TRANSPORTING NO FIELDS
    CASE SY-SUBRC.
      WHEN 0.
         WRITE: /1 'Prepare key, only addition: '.
         PERFORM DISPLAY-KOPFZEILE-ITAB1.
*.......................................................................
         ADD ITAB1-IFELD TO ITAB-IFELD.
         ADD ITAB1-PFELD3 TO ITAB-PFELD3.
         ADD ITAB1-PFELD5 TO ITAB-PFELD5.
         ADD 1 TO ITAB-ANZAHL.
         MODIFY ITAB INDEX SY-TABIX.              "-------> MODIFY
*
      WHEN 4.
        WRITE: /1 'Key will be inserted       : '.
        PERFORM DISPLAY-KOPFZEILE-ITAB1.
        MOVE-CORRESPONDING ITAB1 TO ITAB.
        ADD 1 TO ITAB-ANZAHL.
        INSERT ITAB INDEX SY-TABIX.               "-------> INSERT
*
      WHEN 8.
        WRITE: /1 'Key will be append         : '.
        PERFORM DISPLAY-KOPFZEILE-ITAB1.
        MOVE-CORRESPONDING ITAB1 TO ITAB.
        ADD 1 TO ITAB-ANZAHL.
        APPEND ITAB.                              "-------> APPEND
*
      WHEN OTHERS.
        WRITE: /1 'Surprise-RC-Code in '' AUFBAU-ITAB'' ', SY-SUBRC.
    ENDCASE.
*
 ENDFORM.
************************************************************************
*                 Output of the generated table
************************************************************************
 FORM DISPLAY-ITAB.
*
  SKIP 2. ULINE.
  WRITE:/1 'Step 3: The content of table ITAB: ' COLOR 6.
  ULINE.
*.......................................................................
  MOVE SPACE TO ITAB.
  LOOP AT ITAB.
    WRITE: /1 ITAB-CFELD4,
              ITAB-IFELD,
              ITAB-PFELD3,
              ITAB-PFELD5,
              ITAB-ANZAHL COLOR 3.
  ENDLOOP.
*
 ENDFORM.
************************************************************************
*                 Output of head line of  ITAB1
************************************************************************
 FORM DISPLAY-KOPFZEILE-ITAB1.
*
    WRITE: 35 ITAB1-CFELD4,
              ITAB1-IFELD,
              ITAB1-PFELD3,
              ITAB1-PFELD5.
*
 ENDFORM.
************************************************************************
************************************************************************
************************************************************************
*  Example call for the generation                                     *
************************************************************************
*FORM GENERATE-ZUFALL.
*
* DO 100   TIMES.
*  PERFORM ERZEUGEN-PSEUDOZUFALL USING ITAB1-IFELD 4 'N'.
*  PERFORM ERZEUGEN-PSEUDOZUFALL USING ITAB1-CFELD 5 'A'.
*  APPEND ITAB1.                      "1           2  3
* ENDDO.
*ENDFORM.
********************* DOCU  ********************************************
**.....Parameter........................................................
**  1 = ITAB1-CFELD --> real   table field name
**  2 =           5 --> Length in bytes which should be filled
**  3 =    A oder N --> A lphabetic content, N umeric Content
**.....Limitations......................................................
**  I fields    maximum 9  chars
**  P fields    maximum 30 chars
**  C, N-Felder maximum 30 chars
*
************************************************************************
************************************************************************
*           Creation of test data                                      *
************************************************************************
 FORM ERZEUGEN-PSEUDOZUFALL USING TARGET LAENGE TYP.

 DATA: E_RAND TYPE F.
 DATA: Z_TIME(31) TYPE N.
 DATA: Z_P(16) TYPE P VALUE '999999999999999999996467'.
 DATA: Z_A(16) TYPE P VALUE '671354420908421773035669'.
 DATA: Z_C(16) TYPE P.
 DATA: Z_ZUFALL TYPE F.
*
 GET RUN TIME FIELD Z_TIME.
*.......................................................................
 FIELD-SYMBOLS: <FS1>, <FS2>.
 DATA: AUSW_NUM(10) TYPE C VALUE '0123456789'.
 DATA: AUSW_ABC(27) TYPE C VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ '.
 DATA: Z_AUSWAHL(30) TYPE N.
 DATA: BEGINN TYPE I.
 DATA: NFELD(30) TYPE N.
 DATA: CFELD(30) TYPE C.
 DATA: Z_OFFSET(2) TYPE N.

************************************************************************
  IF E_RAND EQ 0.
     GET RUN TIME FIELD Z_TIME.
     MOVE SY-UZEIT TO E_RAND.
     ADD Z_TIME+27(4) TO E_RAND.
     ADD Z_TIME+26(5) TO E_RAND.
     CLEAR Z_TIME.
  ENDIF.
*-----------------------------------------------------------------------
*
   DO LAENGE TIMES.
    E_RAND = ( Z_A * E_RAND + 1 ) MOD Z_P.
    Z_ZUFALL = E_RAND / Z_P.
*.......................................................................
    IF TYP EQ 'N'.                                    "numeric field
      DO LAENGE TIMES.
         Z_ZUFALL = Z_ZUFALL * 10.
      ENDDO.
      MOVE Z_ZUFALL TO Z_AUSWAHL.
      Z_OFFSET = 29 - LAENGE + 1.
      ASSIGN Z_AUSWAHL+Z_OFFSET(1) TO <FS2>.    "can be directly used
      WRITE <FS2> TO NFELD+BEGINN.
      ADD 1 TO BEGINN.
    ENDIF.
************************************************************************
    IF TYP EQ 'A'.                                  "Alphabetic field
       MOVE E_RAND   TO Z_AUSWAHL.
       Z_AUSWAHL = Z_AUSWAHL MOD 27.            "26 letters and blank
       ASSIGN AUSW_ABC+Z_AUSWAHL(1) TO <FS1>.
       WRITE <FS1> TO CFELD+BEGINN.
       ADD 1 TO BEGINN.
    ENDIF.
*-----------------------------------------------------------------------
    E_RAND = E_RAND / 10000000000000.
    E_RAND = E_RAND / 10000000.
  ENDDO.
*
  IF TYP EQ 'N'.
     MOVE NFELD TO TARGET.
  ENDIF.
  IF TYP EQ 'A'.
     MOVE CFELD TO TARGET.
  ENDIF.
*
 ENDFORM.
************************************************************************
******************* END OF PROGRAM *************************************
************************************************************************