Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Program For Parsing2
1. * Note: The routines in this program are called from other programs.
* Doing a 'WHERE-USED' search for a specific routine in this
* program will probably retrieve no results. However, if you
* do a 'WHERE-USED' search for this program, ZLIST_FIELDS_RTTI
* itself, you will find the other programs which use these forms.
* Such a search should always be done before any changes are
* made to the routines in this program, in order to make sure
* all existing calls to the routines remain valid.
REPORT zlist_fields_rtti.
*----------------------------------------------------------------------*
* Program: ZLIST_FIELDS_RTTI
* Author: Gordon Tobias
* Date: Dec 2006
* Description: This program contains routines intended to be called
* from other programs, to list the contents of structured
* records, field by field. It uses RTTI (Run Time Typing
* Info - from ABAP objects methods) to identify the name
* and length of each field in the record.
*
* Initially, there are 4 routines that can be called:
*---------------------------
* FORM list_record_fields USING p_rec.
* FORM list_record_fields prints the field #, name, and length.
*---------------------------
* FORM list_fields_with_cols USING p_rec.
* FORM list_fields_with_cols prints the field #, name, length, and
* the starting and ending columns of the field.
*---------------------------
* FORM list_specific_fields TABLES so_fnum
* so_fname
* USING p_rec.
* FORM list_specific_fields print the same information as the
* list_fields_with_columns, but it accepts two additional parms:
* SELECT-OPTIONS table for a 3 digit numeric fields, and a 30 char
* alphabetic field. These two parms can restrict the fields listed
* on the report just just specific numbers (e.g. field 1-5) or names
* (i.e. list just the PERNR field, or exclude all FILLER* fields).
*---------------------------
* FORM convert_to_CSV USING pu_rec
* pu_hdr_flag
* CHANGING pc_csvrec
*
* FORM convert_to_CSV reads a structured record, pu_rec, and
2. * generates a text field formatted as a CSV record of the fields
* in the structured record. If the pu_hdr_flag = 'HDR', the CSV
* record will contain the field names instead of the field values,
* thus creating a header record for the CSV file.
*----------------------------------------------------------------------*
DATA: num3(3) TYPE n.
DATA: field_name(30) TYPE c.
SELECTION-SCREEN COMMENT /1(72) text-001.
SELECTION-SCREEN COMMENT /1(72) text-002.
SELECTION-SCREEN SKIP 1.
SELECT-OPTIONS: s_fnum FOR num3,
s_fname FOR field_name.
START-OF-SELECTION.
MESSAGE e016(rp) WITH 'This is not an executable program'.
EXIT.
*&---------------------------------------------------------------------*
*& Form list_record_fields
*&---------------------------------------------------------------------*
* List the relative field number in the record, and the name, length,
* and contents for every field in the record
*----------------------------------------------------------------------*
FORM list_record_fields USING p_rec. quot;any structured record
FIELD-SYMBOLS <fs> TYPE ANY.
DATA: w_index TYPE i,
w_len TYPE i,
first_line_flag(1) TYPE c.
DATA: d_ref TYPE REF TO data.
FIELD-SYMBOLS: <fs_wa> TYPE ANY, <fs_comp> TYPE ANY.
DATA: desc_ref TYPE REF TO cl_abap_structdescr,
wa_comp TYPE abap_compdescr. quot;component description
ASSIGN p_rec TO <fs_wa>.
first_line_flag = 'Y'.
w_index = 0.
desc_ref ?= cl_abap_typedescr=>describe_by_data( <fs_wa> ).
LOOP AT desc_ref->components INTOwa_comp.
3. w_index = sy-tabix.
ASSIGN COMPONENT w_index OF STRUCTURE p_rec TO <fs>.
IF sy-subrc = 0.
IF first_line_flag = 'Y'.
SKIP 1.
first_line_flag = 'N'.
ENDIF.
IF wa_comp-type_kind NE 'P'.
w_len = strlen( <fs> ).
ELSE.
w_len = 0.
ENDIF.
IF w_len > 0.
WRITE: / 'Field', (3) w_index NO-SIGN,
wa_comp-name(17),
'(' NO-GAP, (3) wa_comp-length NO-SIGN NO-GAP,
') = ''' NO-GAP,
<fs>(w_len) NO-GAP, ''''.
ELSEIF wa_comp-type_kind = 'P'.
WRITE: / 'Field', (3) w_index NO-SIGN,
wa_comp-name(17),
'(P' NO-GAP, (2) wa_comp-length NO-SIGN NO-GAP,
') = ''' NO-GAP, <fs> NO-GAP, ''''.
ELSE.
WRITE: / 'Field', (3) w_index NO-SIGN, wa_comp-name(17),
'(' NO-GAP, (3) wa_comp-length NO-SIGN NO-GAP,
') = '''''.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. quot; list_record_fields
*&---------------------------------------------------------------------*
*& Form list_fields_with_cols
*&---------------------------------------------------------------------*
* List the field info (name, position # in record, length) as well as
* the starting and ending columns in t e record.
h
*----------------------------------------------------------------------*
FORM list_fields_with_cols USING p_rec. quot;any structured record
FIELD-SYMBOLS <fs> TYPE ANY.
DATA: w_index TYPE i,
w_len TYPE i,
w_field_start TYPE i,
w_field_end TYPE i,
first_line_flag(1) TYPE c.
5. (4) w_field_end NO-SIGN,
wa_comp-name(15),
'(' NO-GAP, (3) wa_comp-length NO-SIGN NO-GAP,
') = '''''.
ENDIF.
w_field_start = w_field_end + 1.
ENDIF.
ENDLOOP.
ENDFORM. quot; list_fields_with_cols
*&---------------------------------------------------------------------*
*& Form list_specific_fields
*&---------------------------------------------------------------------*
* List the field info (name, position # in record, length) as well as
* the starting and ending columns in t e record. This routine accepts
h
* 2 select-options tables, to indicate the specific fields to li t. s
* e.g. print field numbers 1 to 5, and 9. Or print all *NAME* fields.
*----------------------------------------------------------------------*
FORM list_specific_fields TABLES so_fnum quot;SELECT-OPTIONS for NUM3
so_fname quot;SELECT-OPTIONS for fld name
USING p_rec. quot;any structured record
FIELD-SYMBOLS <fs> TYPE ANY.
DATA: w_index TYPE i,
w_len TYPE i,
w_field_start TYPE i,
w_field_end TYPE i,
first_line_flag(1) TYPE c.
DATA: d_ref TYPE REF TO data.
FIELD-SYMBOLS: <fs_wa> TYPE ANY, <fs_comp> TYPE ANY.
DATA: desc_ref TYPE REF TO cl_abap_structdescr,
wa_comp TYPE abap_compdescr.
ASSIGN p_rec TO <fs_wa>.
first_line_flag = 'Y'.
w_index = 0.
w_field_start = 1.
desc_ref ?= cl_abap_typedescr=>describe_by_data( <fs_wa> ).
LOOP AT desc_ref->components INTOwa_comp.
w_index = sy-tabix.
*- Do field number & field name match the fields to be listed?
ASSIGN COMPONENT w_index OF STRUCTURE p_rec TO <fs>.
IF sy-subrc = 0.
6. IF wa_comp-type_kind NE 'P'. quot;Packed fields don't have STRLEN
w_len = strlen( <fs> ).
ELSE.
w_len = 0.
ENDIF.
w_field_end = w_field_start + wa_comp-length - 1.
IF w_index IN so_fnum AND wa_comp-name IN so_fname.
IF first_line_flag = 'Y'.
SKIP 1.
first_line_flag = 'N'.
ENDIF.
IF w_len > 0.
WRITE: / 'Field', (3) w_index NO-SIGN,
(4) w_field_start NO-SIGN NO-GAP,
'-' NO-GAP,
(4) w_field_end NO-SIGN,
wa_comp-name(15),
'(' NO-GAP, (3) wa_comp-length NO-SIGN NO-GAP,
') = ''' NO-GAP,
<fs>(w_len) NO-GAP, ''''.
ELSEIF wa_comp-type_kind = 'P'.
WRITE: / 'Field', (3) w_index NO-SIGN,
(4) w_field_start NO-SIGN NO-GAP,
'-' NO-GAP,
(4) w_field_end NO-SIGN,
wa_comp-name(15),
'(P' NO-GAP, (2) wa_comp-length NO-SIGN NO-GAP,
') = ''' NO-GAP, <fs> NO-GAP, ''''.
ELSE. quot;field length is ZERO --> empty of data
WRITE: / 'Field', (3) w_index NO-SIGN,
(4) w_field_start NO-SIGN NO-GAP,
'-' NO-GAP,
(4) w_field_end NO-SIGN,
wa_comp-name(15),
'(' NO-GAP, (3) wa_comp-length NO-SIGN NO-GAP,
') = '''''.
ENDIF.
ENDIF. quot;if w_index in so_fnum and wa_comp-name in so-fname
w_field_start = w_field_end + 1.
ELSE.
WRITE: / 'Error assigning field #', w_index,
'(', wa_comp-name, ') to <Field String>'.
ENDIF. quot;IF sy-subrc = 0 on ASSIGN COMPONENT command
ENDLOOP.
ENDFORM. quot; list_specific_fields
7. *&---------------------------------------------------------------------*
*& Form convert_to_CSV
*&---------------------------------------------------------------------*
* Instead of printing the record contents to spool, convert the
* structured record to a single string formatted as a CSV file line:
* Quotes around each field, and commas between fields.
*----------------------------------------------------------------------*
FORM convert_to_csv USING pu_rec
pu_hdr_flag
CHANGING pc_csvrec.
FIELD-SYMBOLS <fs> TYPE ANY.
DATA: w_index TYPE i,
w_len TYPE i,
first_line_flag(1) TYPE c,
w_string(60) TYPE c,
w_csvrec1(2000) TYPE c,
w_csvrec2(2100) TYPE c.
CONSTANTS: c_quote(1) TYPE c VALUE 'quot;',
c_comma(1) TYPE c VALUE ','.
DATA: d_ref TYPE REF TO data.
FIELD-SYMBOLS: <fs_wa> TYPE ANY, <fs_comp> TYPE ANY.
DATA: desc_ref TYPE REF TO cl_abap_structdescr,
wa_comp TYPE abap_compdescr. quot;component description
ASSIGN pu_rec TO <fs_wa>.
CLEAR: pc_csvrec, w_csvrec1, w_csvrec2.
first_line_flag = 'Y'.
w_index = 0.
desc_ref ?= cl_abap_typedescr=>describe_by_data( <fs_wa> ).
LOOP AT desc_ref->components INTOwa_comp.
w_index = sy-tabix.
ASSIGN COMPONENT w_index OF STRUCTURE pu_rec TO <fs>.
IF sy-subrc = 0.
IF pu_hdr_flag = 'HDR'.
WRITE wa_comp-name TO w_string.
ELSE.
WRITE <fs> TO w_string.
ENDIF.
SHIFT w_string LEFT DELETING LEADING space.
CONCATENATE c_quote w_string c_quote INTO w_string.
IF first_line_flag = 'Y'.
w_csvrec2 = w_string.