ABAP Select data from SAP table RM61F into internal table

Get Example source ABAP code based on a different SAP table
  

Below is a number of ABAP code snippets to demonstrate how to select data from SAP RM61F table and store it within an internal table, including using the newer @DATA inline declaration methods. It also shows you various ways to process this data using ABAP work area, inline declaration or field symbols including executing all the relevant CONVERSION_EXIT routines specific to RM61F. See here for more generic Select statement tips.

Sometimes data within SAP is stored within the database table in a different format to what it is displayed to the user. These input/output conversation FM routines are what translates the data between the two formats.

There is also a full declaration of the RM61F table where each field has a char/string type for you to simply copy and paste. This allows you to use processing that is only available to these field types such as the CONCATENATE statement.

DATA: IT_RM61F TYPE STANDARD TABLE OF RM61F,
      WA_RM61F TYPE RM61F,
      GD_STR TYPE STRING.

DATA: lo_typedescr type REF TO cl_abap_typedescr.
DATA: lv_fieldname type fieldname.

FIELD-SYMBOLS: <FIELD> TYPE any.
FIELD-SYMBOLS: <RM61F> TYPE RM61F.

*Process all fields in table header/work area as string values
  PERFORM process_as_string_field_values CHANGING wa_RM61F.

SELECT *
*restrict ABAP select to first 10 rows
 UP TO 10 ROWS      
  FROM RM61F
  INTO TABLE IT_RM61F.

*Select data and declare internal table using in-line method @DATA
*SELECT *
*  FROM RM61F
*  INTO TABLE @DATA(IT_RM61F2).
*--Further methods of using ABAP code to  select data from SAP database tables

*You can also declare the header/work area using the in-line DATA declaration method
READ TABLE IT_RM61F INDEX 1 INTO DATA(WA_RM61F2).


*Demonstrate how to loop at an internal table and update values using a FIELD-SYMBOL
LOOP AT IT_RM61F ASSIGNING <RM61F>.
*To update a field value using a field symbol simply change the value via the field symbol pointer
<RM61F>-MATNR = 1.
<RM61F>-WERKS = 1.
<RM61F>-DISPO = 1.
<RM61F>-MANDT = 1.
<RM61F>-STDAY = 1.
ENDLOOP.

LOOP AT IT_RM61F INTO WA_RM61F.
*Write horizonal line to screen report.
  WRITE:/ sy-uline.

*Write selected data to screen/report before conversion.
  WRITE:/ sy-vline,   WA_RM61F-ENDAY, sy-vline,
WA_RM61F-STDAB, sy-vline,
WA_RM61F-ENDAB, sy-vline,
WA_RM61F-SLDAY, sy-vline,
WA_RM61F-VERID, sy-vline,
WA_RM61F-AUFNR, sy-vline.
ENDLOOP. *Add any further fields from structure WA_RM61F you want to display... WRITE:/ sy-uline. * Aternatively use generic code to Write field values (and NAME) to screen report DO. ASSIGN COMPONENT sy-index OF STRUCTURE wa_RM61F TO <field>. IF sy-subrc <> 0. EXIT. ENDIF. WRITE:/ 'Field Value', <field>, sy-vline. gd_str = <field> . lo_typedescr ?= CL_ABAP_DATADESCR=>DESCRIBE_BY_DATA( <field> ). lv_fieldname = lo_typedescr->GET_RELATIVE_NAME( ). WRITE:/ 'Field Name', lv_fieldname. ENDDO. *Redo loop but convert all fields from internal to out value LOOP AT IT_RM61F INTO WA_RM61F. *Write horizonal line to screen report. WRITE:/ sy-uline. *Convert all fields to display/output versions using conversion routines PERFORM convert_all_field_values CHANGING wa_EKKO. ENDLOOP. *&---------------------------------------------------------------------* *& Form convert_all_field_values *&---------------------------------------------------------------------* FORM convert_all_field_values CHANGING p_EKKO LIKE wa_EKKO. DATA: ld_input(1000) TYPE c, ld_output(1000) TYPE C.

*Conversion exit MATN1, internal->external for field MATNR CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT' EXPORTING input = WA_RM61F-MATNR IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-MATNR.
WRITE:/ 'New Value:', ld_input.

*Conversion exit ALPHA, internal->external for field AUFNR CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = WA_RM61F-AUFNR IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-AUFNR.
WRITE:/ 'New Value:', ld_input.

*Conversion exit ALPHA, internal->external for field REFNR CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = WA_RM61F-REFNR IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-REFNR.
WRITE:/ 'New Value:', ld_input.

*Conversion exit MATN1, internal->external for field MATN2 CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT' EXPORTING input = WA_RM61F-MATN2 IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-MATN2.
WRITE:/ 'New Value:', ld_input.

*Conversion exit ALPHA, internal->external for field STLAL CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = WA_RM61F-STLAL IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-STLAL.
WRITE:/ 'New Value:', ld_input.

*Conversion exit ALPHA, internal->external for field SLAL2 CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = WA_RM61F-SLAL2 IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-SLAL2.
WRITE:/ 'New Value:', ld_input.

*Conversion exit ALPHA, internal->external for field APLAL CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = WA_RM61F-APLAL IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-APLAL.
WRITE:/ 'New Value:', ld_input.

*Conversion exit ALPHA, internal->external for field ALAL2 CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = WA_RM61F-ALAL2 IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-ALAL2.
WRITE:/ 'New Value:', ld_input.

*Conversion exit GJAHR, internal->external for field JAHR1 CALL FUNCTION 'CONVERSION_EXIT_GJAHR_OUTPUT' EXPORTING input = WA_RM61F-JAHR1 IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-JAHR1.
WRITE:/ 'New Value:', ld_input.

*Conversion exit GJAHR, internal->external for field JAHR2 CALL FUNCTION 'CONVERSION_EXIT_GJAHR_OUTPUT' EXPORTING input = WA_RM61F-JAHR2 IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-JAHR2.
WRITE:/ 'New Value:', ld_input.

*Conversion exit GJAHR, internal->external for field JAHR3 CALL FUNCTION 'CONVERSION_EXIT_GJAHR_OUTPUT' EXPORTING input = WA_RM61F-JAHR3 IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-JAHR3.
WRITE:/ 'New Value:', ld_input.

*Conversion exit MATN1, internal->external for field PGRUP CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT' EXPORTING input = WA_RM61F-PGRUP IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-PGRUP.
WRITE:/ 'New Value:', ld_input.

*Conversion exit ALPHA, internal->external for field PLNUM CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = WA_RM61F-PLNUM IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-PLNUM.
WRITE:/ 'New Value:', ld_input.

*Conversion exit ALPHA, internal->external for field KDAUF CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = WA_RM61F-KDAUF IMPORTING output = ld_input.
WRITE:/ 'Org Value:', WA_RM61F-KDAUF.
WRITE:/ 'New Value:', ld_input.
ENDFORM. *&---------------------------------------------------------------------* *& Form process_as_string_field_values *&---------------------------------------------------------------------* FORM process_as_string_field_values CHANGING p_EKKO LIKE wa_EKKO. TYPES: BEGIN OF T_RM61F_STR,
MATNR TYPE STRING,
WERKS TYPE STRING,
DISPO TYPE STRING,
MANDT TYPE STRING,
STDAY TYPE STRING,
ENDAY TYPE STRING,
STDAB TYPE STRING,
ENDAB TYPE STRING,
SLDAY TYPE STRING,
VERID TYPE STRING,
AUFNR TYPE STRING,
AUART TYPE STRING,
REFNR TYPE STRING,
XPLID TYPE STRING,
XMATN TYPE STRING,
XORDR TYPE STRING,
MEINS TYPE STRING,
KOMPF TYPE STRING,
PER01 TYPE STRING,
PER02 TYPE STRING,
PER03 TYPE STRING,
PER04 TYPE STRING,
PER05 TYPE STRING,
KRIT1 TYPE STRING,
FLD01 TYPE STRING,
FLD02 TYPE STRING,
FLD03 TYPE STRING,
FLD04 TYPE STRING,
FLD05 TYPE STRING,
ZEILE TYPE STRING,
SPALT TYPE STRING,
ZLMAX TYPE STRING,
SPMAX TYPE STRING,
MDV01 TYPE STRING,
MDV02 TYPE STRING,
MATN2 TYPE STRING,
WERK2 TYPE STRING,
VERI2 TYPE STRING,
MD012 TYPE STRING,
MD022 TYPE STRING,
DISP2 TYPE STRING,
STLAL TYPE STRING,
SLAL2 TYPE STRING,
STLAN TYPE STRING,
SLAN2 TYPE STRING,
APLAL TYPE STRING,
ALAL2 TYPE STRING,
APLAW TYPE STRING,
ALAW2 TYPE STRING,
SOBSL TYPE STRING,
SOBS2 TYPE STRING,
ADATU TYPE STRING,
BDATU TYPE STRING,
AUFSI TYPE STRING,
SELEKT TYPE STRING,
SUMMENANZ TYPE STRING,
PERTG TYPE STRING,
PERWO TYPE STRING,
PERMO TYPE STRING,
PERPK TYPE STRING,
PERBP TYPE STRING,
PLIDTEXT1 TYPE STRING,
PLIDTEXT2 TYPE STRING,
FA_SICHTB TYPE STRING,
PA_SICHTB TYPE STRING,
KALID TYPE STRING,
PER_FIRST TYPE STRING,
PER_LAST TYPE STRING,
TEXT20_1 TYPE STRING,
TEXT20_2 TYPE STRING,
DAT_PER_F TYPE STRING,
DAT_PER_L TYPE STRING,
SCH_PER_F TYPE STRING,
SCH_PER_L TYPE STRING,
TEXT20_3 TYPE STRING,
TEXT20_4 TYPE STRING,
TEXT10_1 TYPE STRING,
TEXT10_2 TYPE STRING,
TEXT10_3 TYPE STRING,
TEXT10_4 TYPE STRING,
JAHR1 TYPE STRING,
JAHR2 TYPE STRING,
JAHR3 TYPE STRING,
PER1 TYPE STRING,
PER2 TYPE STRING,
PER3 TYPE STRING,
TEXT40_1 TYPE STRING,
TEXT40_2 TYPE STRING,
VORG_NACH TYPE STRING,
TAUFT TYPE STRING,
TASTA TYPE STRING,
FRETX TYPE STRING,
ZLSPL TYPE STRING,
ALUNT TYPE STRING,
ALUEB TYPE STRING,
UEBUNT TYPE STRING,
GZEIT TYPE STRING,
ZEISC TYPE STRING,
ZEIFR TYPE STRING,
SEITEAKT TYPE STRING,
SEITEGES TYPE STRING,
EINH_PL1 TYPE STRING,
EINH_PL2 TYPE STRING,
EINH_IND TYPE STRING,
EINH1 TYPE STRING,
EINH2 TYPE STRING,
TEXT40_3 TYPE STRING,
SUMMANZ2 TYPE STRING,
ERHOE TYPE STRING,
VERRI TYPE STRING,
QUOTE TYPE STRING,
XLINE TYPE STRING,
XKOSA TYPE STRING,
XGRUP TYPE STRING,
XMAT2 TYPE STRING,
LINE1 TYPE STRING,
LINE2 TYPE STRING,
PGRUP TYPE STRING,
EINH_PG TYPE STRING,
EINH_L1 TYPE STRING,
EINH_L2 TYPE STRING,
PLNUM TYPE STRING,
SELED TYPE STRING,
BEMDV TYPE STRING,
SMDV1 TYPE STRING,
SMDV2 TYPE STRING,
SLIN1 TYPE STRING,
KPFLG TYPE STRING,
XLINS TYPE STRING,
HNAME TYPE STRING,
SAKOS TYPE STRING,
SAFER TYPE STRING,
SAKO2 TYPE STRING,
SAFE2 TYPE STRING,
RFDA1 TYPE STRING,
RFDA2 TYPE STRING,
RFDA3 TYPE STRING,
ERWMD TYPE STRING,
ABBED TYPE STRING,
ABVER TYPE STRING,
ABREI TYPE STRING,
ABAND TYPE STRING,
ABNZU TYPE STRING,
LELIW TYPE STRING,
SORTM TYPE STRING,
SORTL TYPE STRING,
SORTA TYPE STRING,
SORTE TYPE STRING,
NETPL TYPE STRING,
BRTPL TYPE STRING,
LGOR1 TYPE STRING,
LGOR2 TYPE STRING,
KNDPL TYPE STRING,
PROPL TYPE STRING,
MSTPL TYPE STRING,
VORPL TYPE STRING,
LGORT TYPE STRING,
KDAUF TYPE STRING,
GRKDA TYPE STRING,
GRDEM TYPE STRING,
GRVFU TYPE STRING,
GRCOV TYPE STRING,
GRPQU TYPE STRING,
GRALL TYPE STRING,
FKABD TYPE STRING,
RKABD TYPE STRING,
GRAZM TYPE STRING,
FIXSP TYPE STRING,
XLISH TYPE STRING,
ANZKA TYPE STRING,
EXCEL TYPE STRING,
PER_C2_STA TYPE STRING,
PER_C2_END TYPE STRING,END OF T_EKKO_STR. DATA: WA_RM61F_STR type T_EKKO_STR. DATA: ld_text TYPE string. LOOP AT IT_EKKO INTO WA_EKKO. MOVE-CORRESPONDING wa_EKKO TO WA_EKKO_STR. CONCATENATE: sy-vline
WA_RM61F_STR-MATNR sy-vline
WA_RM61F_STR-WERKS sy-vline
WA_RM61F_STR-DISPO sy-vline
WA_RM61F_STR-MANDT sy-vline
WA_RM61F_STR-STDAY sy-vline
WA_RM61F_STR-ENDAY sy-vline
WA_RM61F_STR-STDAB sy-vline
WA_RM61F_STR-ENDAB sy-vline
WA_RM61F_STR-SLDAY sy-vline
WA_RM61F_STR-VERID sy-vline
WA_RM61F_STR-AUFNR sy-vline
WA_RM61F_STR-AUART sy-vline
WA_RM61F_STR-REFNR sy-vline
WA_RM61F_STR-XPLID sy-vline
WA_RM61F_STR-XMATN sy-vline
WA_RM61F_STR-XORDR sy-vline
WA_RM61F_STR-MEINS sy-vline
WA_RM61F_STR-KOMPF sy-vline
WA_RM61F_STR-PER01 sy-vline
WA_RM61F_STR-PER02 sy-vline
WA_RM61F_STR-PER03 sy-vline
WA_RM61F_STR-PER04 sy-vline
WA_RM61F_STR-PER05 sy-vline
WA_RM61F_STR-KRIT1 sy-vline
WA_RM61F_STR-FLD01 sy-vline
WA_RM61F_STR-FLD02 sy-vline
WA_RM61F_STR-FLD03 sy-vline
WA_RM61F_STR-FLD04 sy-vline
WA_RM61F_STR-FLD05 sy-vline
WA_RM61F_STR-ZEILE sy-vline
WA_RM61F_STR-SPALT sy-vline
WA_RM61F_STR-ZLMAX sy-vline
WA_RM61F_STR-SPMAX sy-vline
WA_RM61F_STR-MDV01 sy-vline
WA_RM61F_STR-MDV02 sy-vline
WA_RM61F_STR-MATN2 sy-vline
WA_RM61F_STR-WERK2 sy-vline
WA_RM61F_STR-VERI2 sy-vline
WA_RM61F_STR-MD012 sy-vline
WA_RM61F_STR-MD022 sy-vline
WA_RM61F_STR-DISP2 sy-vline
WA_RM61F_STR-STLAL sy-vline
WA_RM61F_STR-SLAL2 sy-vline
WA_RM61F_STR-STLAN sy-vline
WA_RM61F_STR-SLAN2 sy-vline
WA_RM61F_STR-APLAL sy-vline
WA_RM61F_STR-ALAL2 sy-vline
WA_RM61F_STR-APLAW sy-vline
WA_RM61F_STR-ALAW2 sy-vline
WA_RM61F_STR-SOBSL sy-vline
WA_RM61F_STR-SOBS2 sy-vline
WA_RM61F_STR-ADATU sy-vline
WA_RM61F_STR-BDATU sy-vline
WA_RM61F_STR-AUFSI sy-vline
WA_RM61F_STR-SELEKT sy-vline
WA_RM61F_STR-SUMMENANZ sy-vline
WA_RM61F_STR-PERTG sy-vline
WA_RM61F_STR-PERWO sy-vline
WA_RM61F_STR-PERMO sy-vline
WA_RM61F_STR-PERPK sy-vline
WA_RM61F_STR-PERBP sy-vline
WA_RM61F_STR-PLIDTEXT1 sy-vline
WA_RM61F_STR-PLIDTEXT2 sy-vline
WA_RM61F_STR-FA_SICHTB sy-vline
WA_RM61F_STR-PA_SICHTB sy-vline
WA_RM61F_STR-KALID sy-vline
WA_RM61F_STR-PER_FIRST sy-vline
WA_RM61F_STR-PER_LAST sy-vline
WA_RM61F_STR-TEXT20_1 sy-vline
WA_RM61F_STR-TEXT20_2 sy-vline
WA_RM61F_STR-DAT_PER_F sy-vline
WA_RM61F_STR-DAT_PER_L sy-vline
WA_RM61F_STR-SCH_PER_F sy-vline
WA_RM61F_STR-SCH_PER_L sy-vline
WA_RM61F_STR-TEXT20_3 sy-vline
WA_RM61F_STR-TEXT20_4 sy-vline
WA_RM61F_STR-TEXT10_1 sy-vline
WA_RM61F_STR-TEXT10_2 sy-vline
WA_RM61F_STR-TEXT10_3 sy-vline
WA_RM61F_STR-TEXT10_4 sy-vline
WA_RM61F_STR-JAHR1 sy-vline
WA_RM61F_STR-JAHR2 sy-vline
WA_RM61F_STR-JAHR3 sy-vline
WA_RM61F_STR-PER1 sy-vline
WA_RM61F_STR-PER2 sy-vline
WA_RM61F_STR-PER3 sy-vline
WA_RM61F_STR-TEXT40_1 sy-vline
WA_RM61F_STR-TEXT40_2 sy-vline
WA_RM61F_STR-VORG_NACH sy-vline
WA_RM61F_STR-TAUFT sy-vline
WA_RM61F_STR-TASTA sy-vline
WA_RM61F_STR-FRETX sy-vline
WA_RM61F_STR-ZLSPL sy-vline
WA_RM61F_STR-ALUNT sy-vline
WA_RM61F_STR-ALUEB sy-vline
WA_RM61F_STR-UEBUNT sy-vline
WA_RM61F_STR-GZEIT sy-vline
WA_RM61F_STR-ZEISC sy-vline
WA_RM61F_STR-ZEIFR sy-vline
WA_RM61F_STR-SEITEAKT sy-vline
WA_RM61F_STR-SEITEGES sy-vline
WA_RM61F_STR-EINH_PL1 sy-vline
WA_RM61F_STR-EINH_PL2 sy-vline
WA_RM61F_STR-EINH_IND sy-vline
WA_RM61F_STR-EINH1 sy-vline
WA_RM61F_STR-EINH2 sy-vline
WA_RM61F_STR-TEXT40_3 sy-vline
WA_RM61F_STR-SUMMANZ2 sy-vline
WA_RM61F_STR-ERHOE sy-vline
WA_RM61F_STR-VERRI sy-vline
WA_RM61F_STR-QUOTE sy-vline
WA_RM61F_STR-XLINE sy-vline
WA_RM61F_STR-XKOSA sy-vline
WA_RM61F_STR-XGRUP sy-vline
WA_RM61F_STR-XMAT2 sy-vline
WA_RM61F_STR-LINE1 sy-vline
WA_RM61F_STR-LINE2 sy-vline
WA_RM61F_STR-PGRUP sy-vline
WA_RM61F_STR-EINH_PG sy-vline
WA_RM61F_STR-EINH_L1 sy-vline
WA_RM61F_STR-EINH_L2 sy-vline
WA_RM61F_STR-PLNUM sy-vline
WA_RM61F_STR-SELED sy-vline
WA_RM61F_STR-BEMDV sy-vline
WA_RM61F_STR-SMDV1 sy-vline
WA_RM61F_STR-SMDV2 sy-vline
WA_RM61F_STR-SLIN1 sy-vline
WA_RM61F_STR-KPFLG sy-vline
WA_RM61F_STR-XLINS sy-vline
WA_RM61F_STR-HNAME sy-vline
WA_RM61F_STR-SAKOS sy-vline
WA_RM61F_STR-SAFER sy-vline
WA_RM61F_STR-SAKO2 sy-vline
WA_RM61F_STR-SAFE2 sy-vline
WA_RM61F_STR-RFDA1 sy-vline
WA_RM61F_STR-RFDA2 sy-vline
WA_RM61F_STR-RFDA3 sy-vline
WA_RM61F_STR-ERWMD sy-vline
WA_RM61F_STR-ABBED sy-vline
WA_RM61F_STR-ABVER sy-vline
WA_RM61F_STR-ABREI sy-vline
WA_RM61F_STR-ABAND sy-vline
WA_RM61F_STR-ABNZU sy-vline
WA_RM61F_STR-LELIW sy-vline
WA_RM61F_STR-SORTM sy-vline
WA_RM61F_STR-SORTL sy-vline
WA_RM61F_STR-SORTA sy-vline
WA_RM61F_STR-SORTE sy-vline
WA_RM61F_STR-NETPL sy-vline
WA_RM61F_STR-BRTPL sy-vline
WA_RM61F_STR-LGOR1 sy-vline
WA_RM61F_STR-LGOR2 sy-vline
WA_RM61F_STR-KNDPL sy-vline
WA_RM61F_STR-PROPL sy-vline
WA_RM61F_STR-MSTPL sy-vline
WA_RM61F_STR-VORPL sy-vline
WA_RM61F_STR-LGORT sy-vline
WA_RM61F_STR-KDAUF sy-vline
WA_RM61F_STR-GRKDA sy-vline
WA_RM61F_STR-GRDEM sy-vline
WA_RM61F_STR-GRVFU sy-vline
WA_RM61F_STR-GRCOV sy-vline
WA_RM61F_STR-GRPQU sy-vline
WA_RM61F_STR-GRALL sy-vline
WA_RM61F_STR-FKABD sy-vline
WA_RM61F_STR-RKABD sy-vline
WA_RM61F_STR-GRAZM sy-vline
WA_RM61F_STR-FIXSP sy-vline
WA_RM61F_STR-XLISH sy-vline
WA_RM61F_STR-ANZKA sy-vline
WA_RM61F_STR-EXCEL sy-vline
WA_RM61F_STR-PER_C2_STA sy-vline
WA_RM61F_STR-PER_C2_END sy-vline INTO ld_text SEPARATED BY SPACE. *Add any further fields from structure WA_EKKO_STR you want to CONCATENATE... ENDLOOP. ENDFORM.