Subscribe

RSS Feed (xml)

Powered By

Skin Design:
Free Blogger Skins

Powered by Blogger

Thursday, February 21, 2008

Defining a local type dynamically using abap

You can now define a local type dynamically.

This is only supported in 6.40. Here's how it goes:

REPORT ZDANY_DYN_LOCAL_TYPES.

****************** hardcoded "old style" local type *******************
* This is a normal hardcoded local type
 types : begin of typ_hardcoded,
         l_count type i,
         lt_sflight type sflight.
 types : end of typ_hardcoded.
* create a table based on hardcoded type
 data : lt_hardcoded type table of typ_hardcoded.
     
****************** dynamic "new wave" local type *******************
 types: typ_count type i.
     
 field-symbols :  type any table.
 data: dref type ref to data,
       itab_type type ref to cl_abap_tabledescr,
       struct_type type ref to cl_abap_structdescr,
       elem_type type ref to cl_abap_elemdescr,
       comp_tab type cl_abap_structdescr=>component_table,
       comp_fld type cl_abap_structdescr=>component.

* We read information about each fields of SFLIGHT (see ABAP FAQ #2)

struct_type ?= cl_abap_typedescr=>describe_by_name( 'SFLIGHT' ).

* We also need the information about the type "typ_count", note that

* we should use class cl_abap_elemdescr instead of cl_abap_typedescr

elem_type ?= cl_abap_elemdescr=>describe_by_name( 'TYP_COUNT' ).

* we read all fleids of SFLIGHT and create a component table

comp_tab = struct_type->get_components( ).

* We add manually the counter

comp_fld-name = 'L_COUNT'.

comp_fld-type = elem_type.

insert comp_fld into comp_tab index 1.

* we create the structure

struct_type = cl_abap_structdescr=>create( comp_tab ).

* ... and the internal table

itab_type = cl_abap_tabledescr=>create( struct_type ).

* The new thing here is the "type handle" which create a pointer to a

* handle

create data dref type handle itab_type.

* we finally assign a field symbol to the pointer because we cannot

* directly access a pointer.

assign dref->* to .

* At the end of this small program, internal table lt_hardcoded and

* lt_dynamic are the same

break-point.

You can now define a local type dynamically.

This is only supported in 6.40. Here's how it goes:

REPORT ZDANY_DYN_LOCAL_TYPES.

****************** hardcoded "old style" local type *******************
* This is a normal hardcoded local type
 types : begin of typ_hardcoded,
         l_count type i,
         lt_sflight type sflight.
 types : end of typ_hardcoded.
* create a table based on hardcoded type
 data : lt_hardcoded type table of typ_hardcoded.
     
****************** dynamic "new wave" local type *******************
 types: typ_count type i.
     
 field-symbols :  type any table.
 data: dref type ref to data,
       itab_type type ref to cl_abap_tabledescr,
       struct_type type ref to cl_abap_structdescr,
       elem_type type ref to cl_abap_elemdescr,
       comp_tab type cl_abap_structdescr=>component_table,
       comp_fld type cl_abap_structdescr=>component.

* We read information about each fields of SFLIGHT (see ABAP FAQ #2)

struct_type ?= cl_abap_typedescr=>describe_by_name( 'SFLIGHT' ).

* We also need the information about the type "typ_count", note that

* we should use class cl_abap_elemdescr instead of cl_abap_typedescr

elem_type ?= cl_abap_elemdescr=>describe_by_name( 'TYP_COUNT' ).

* we read all fleids of SFLIGHT and create a component table

comp_tab = struct_type->get_components( ).

* We add manually the counter

comp_fld-name = 'L_COUNT'.

comp_fld-type = elem_type.

insert comp_fld into comp_tab index 1.

* we create the structure

struct_type = cl_abap_structdescr=>create( comp_tab ).

* ... and the internal table

itab_type = cl_abap_tabledescr=>create( struct_type ).

* The new thing here is the "type handle" which create a pointer to a

* handle

create data dref type handle itab_type.

* we finally assign a field symbol to the pointer because we cannot

* directly access a pointer.

assign dref->* to .

* At the end of this small program, internal table lt_hardcoded and

* lt_dynamic are the same

break-point.

No comments:

Post a Comment

Content

Recent Topics