Update
This commit is contained in:
@@ -4536,36 +4536,176 @@ DATA(tdo_elem_string2) = CAST cl_abap_elemdescr( cl_abap_typedescr=>describe_by_
|
||||
#### Creating Elementary Types and Data Objects Dynamically
|
||||
|
||||
```abap
|
||||
"An elementary type and data object such as the following shall be
|
||||
DATA dref_elem TYPE REF TO data.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Creating a data object with elementary type dynamically
|
||||
*& Built-in ABAP type
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"An elementary type and data object such as the following shall be
|
||||
"created dynamically using a type description object.
|
||||
TYPES ty_c3 TYPE c LENGTH 3.
|
||||
DATA elemdobj TYPE ty_c3.
|
||||
DATA elem_dobj_1a TYPE ty_c3.
|
||||
DATA elem_dobj_1b TYPE c LENGTH 3.
|
||||
|
||||
"Creating the type dynamically (creating a type description object)
|
||||
"Creating a reference type dynamically using a type description object
|
||||
DATA(tdo_elem_1) = cl_abap_elemdescr=>get_c( 3 ).
|
||||
|
||||
"Creating an elementary data object dynamically using a type description object
|
||||
DATA dref_elem TYPE REF TO data.
|
||||
"Creating a data reference variable dynamically using a type description object
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_1.
|
||||
|
||||
ASSERT elemdobj = dref_elem->*.
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_for_dref_elem_1) = CAST cl_abap_elemdescr( cl_abap_typedescr=>describe_by_data( dref_elem->* ) ).
|
||||
DATA(applies_to_elem_1a) = tdo_for_dref_elem_1->applies_to_data( elem_dobj_1a ).
|
||||
DATA(applies_to_elem_1b) = tdo_for_dref_elem_1->applies_to_data( elem_dobj_1b ).
|
||||
ASSERT applies_to_elem_1a = abap_true.
|
||||
ASSERT applies_to_elem_1b = abap_true.
|
||||
|
||||
"Excursions
|
||||
"As shown above, the type description object can be retrieved using
|
||||
"other methods.
|
||||
DATA(tdo_elem_2) = CAST cl_abap_elemdescr( cl_abap_typedescr=>describe_by_name( 'TY_C3' ) ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_2.
|
||||
|
||||
DATA(tdo_elem_3) = CAST cl_abap_elemdescr( cl_abap_typedescr=>describe_by_data( elemdobj ) ).
|
||||
*&---------------------------------------------------------------------*
|
||||
*& get_* methods for built-in types
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"Character-like types
|
||||
TYPES c5 TYPE c LENGTH 5.
|
||||
DATA(tdo_elem_c5) = cl_abap_elemdescr=>get_c( 5 ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_c5.
|
||||
|
||||
TYPES n4 TYPE n LENGTH 4.
|
||||
DATA(tdo_elem_n4) = cl_abap_elemdescr=>get_n( 4 ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_n4.
|
||||
|
||||
TYPES str TYPE string.
|
||||
DATA(tdo_elem_string) = cl_abap_elemdescr=>get_string( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_string.
|
||||
|
||||
"Numeric types
|
||||
TYPES ty_i TYPE i.
|
||||
DATA(tdo_elem_i) = cl_abap_elemdescr=>get_i( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_i.
|
||||
|
||||
TYPES ty_int1 TYPE int1.
|
||||
DATA(tdo_elem_int1) = cl_abap_elemdescr=>get_int1( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_int1.
|
||||
|
||||
TYPES ty_int2 TYPE int2.
|
||||
DATA(tdo_elem_int2) = cl_abap_elemdescr=>get_int2( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_int2.
|
||||
|
||||
TYPES ty_int8 TYPE int8.
|
||||
DATA(tdo_elem_int8) = cl_abap_elemdescr=>get_int8( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_int8.
|
||||
|
||||
TYPES ty_dec16 TYPE decfloat16.
|
||||
DATA(tdo_elem_dec16) = cl_abap_elemdescr=>get_decfloat16( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_dec16.
|
||||
|
||||
TYPES ty_dec34 TYPE decfloat34.
|
||||
DATA(tdo_elem_dec34) = cl_abap_elemdescr=>get_decfloat34( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_dec34.
|
||||
|
||||
TYPES float TYPE f.
|
||||
DATA(tdo_elem_f) = cl_abap_elemdescr=>get_f( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_f.
|
||||
|
||||
TYPES pl16d14 TYPE p LENGTH 16 DECIMALS 14.
|
||||
DATA(tdo_elem_p) = cl_abap_elemdescr=>get_p( p_length = 16
|
||||
p_decimals = 14 ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_p.
|
||||
|
||||
"Date, time, time stamp
|
||||
TYPES ty_date TYPE d.
|
||||
DATA(tdo_elem_d) = cl_abap_elemdescr=>get_d( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_d.
|
||||
|
||||
TYPES ty_time TYPE t.
|
||||
DATA(tdo_elem_t) = cl_abap_elemdescr=>get_t( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_t.
|
||||
|
||||
TYPES ty_utcl TYPE utclong.
|
||||
DATA(tdo_elem_utcl) = cl_abap_elemdescr=>get_utclong( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_utcl.
|
||||
|
||||
"Byte-like types
|
||||
TYPES x10 TYPE x LENGTH 10.
|
||||
DATA(tdo_elem_x_l10) = cl_abap_elemdescr=>get_x( 10 ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_x_l10.
|
||||
|
||||
TYPES xstr TYPE xstring.
|
||||
DATA(tdo_elem_xstr) = cl_abap_elemdescr=>get_xstring( ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_xstr.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Creating a data object with elementary type dynamically
|
||||
*& DDIC data element
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"Note: The types int1 and int2 in the prvious code snippet represent
|
||||
"DDIC data elements, too.
|
||||
|
||||
"A reference type and variable such as the following shall be created
|
||||
"using a type description object.
|
||||
TYPES ty_ts TYPE timestampl.
|
||||
DATA elem_dobj_2a TYPE ty_ts.
|
||||
DATA elem_dobj_2b TYPE timestampl.
|
||||
|
||||
"Creating a reference type dynamically using a type description object
|
||||
"Note: The 'describe_by_name' method returns a reference of type ref to
|
||||
"cl_abap_typedescr. To use the type description object with the
|
||||
"CREATE DATA ... TYPE HANDLE ... statement, a cast is required.
|
||||
"The 'describe_by_name' method is available with cl_abap_typedescr,
|
||||
"cl_abap_elemdescr, and others.
|
||||
DATA(tdo_elem_2) = CAST cl_abap_datadescr( cl_abap_elemdescr=>describe_by_name( 'TIMESTAMPL' ) ).
|
||||
"Alternative using cl_abap_typedescr
|
||||
DATA(tdo_elem_w_cl_abap_typedescr) = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_name( 'TIMESTAMPL' ) ).
|
||||
|
||||
"Creating a data reference variable dynamically using a type description object
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_2.
|
||||
|
||||
"After HANDLE, a reference variable of the static type of class CL_ABAP_DATADESCR
|
||||
"or its subclasses is expected. So, the following CREATE DATA statement does not work.
|
||||
"A cast is required.
|
||||
DATA(tdo_elem_4) = cl_abap_typedescr=>describe_by_data( elemdobj ).
|
||||
"CREATE DATA dref_elem TYPE HANDLE tdo_elem_4.
|
||||
DATA(tdo_elem_5) = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_data( elemdobj ) ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_5.
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_for_dref_elem_2) = CAST cl_abap_elemdescr( cl_abap_typedescr=>describe_by_data( dref_elem->* ) ).
|
||||
DATA(applies_to_elem_2a) = tdo_for_dref_elem_2->applies_to_data( elem_dobj_2a ).
|
||||
DATA(applies_to_elem_2b) = tdo_for_dref_elem_2->applies_to_data( elem_dobj_2b ).
|
||||
ASSERT applies_to_elem_2a = abap_true.
|
||||
ASSERT applies_to_elem_2b = abap_true.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Excursions: Further methods of class cl_abap_elemdescr
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"The following examples cover a selection. For more information, refer
|
||||
"to the class documentation.
|
||||
|
||||
"---- 'describe_by_data' method ----
|
||||
"To get the underlying type's type description object.
|
||||
DATA a_number TYPE i.
|
||||
DATA(tdo_elem_descr_by_data) = cl_abap_elemdescr=>describe_by_data( a_number ).
|
||||
"Note: To use it with the CREATE DATA ... TYPE HANDLE ... statement, a cast is
|
||||
"required.
|
||||
DATA(cast_tdo_elem_descr_by_data) = CAST cl_abap_datadescr( tdo_elem_descr_by_data ).
|
||||
CREATE DATA dref_elem TYPE HANDLE cast_tdo_elem_descr_by_data.
|
||||
|
||||
"---- 'describe_by_name' method ----
|
||||
"To get the type description object based on a type passed by relative or absolute name
|
||||
DATA(tdo_elem_descr_by_name) = cl_abap_elemdescr=>describe_by_name( 'LAND1' ).
|
||||
DATA(cast_tdo_elem_descr_by_name) = CAST cl_abap_datadescr( tdo_elem_descr_by_name ).
|
||||
CREATE DATA dref_elem TYPE HANDLE cast_tdo_elem_descr_by_name.
|
||||
|
||||
"---- 'describe_by_data_ref' method ----
|
||||
"To get the underlying type's type description object, passed as reference.
|
||||
DATA data_ref TYPE REF TO data.
|
||||
data_ref = NEW i( 123 ).
|
||||
DATA(tdo_elem_descr_by_data_ref) = cl_abap_elemdescr=>describe_by_data_ref( data_ref ).
|
||||
DATA(cast_tdo_elem_desc_by_data_ref) = CAST cl_abap_datadescr( tdo_elem_descr_by_data_ref ).
|
||||
CREATE DATA dref_elem TYPE HANDLE cast_tdo_elem_desc_by_data_ref.
|
||||
|
||||
"---- 'get_by_kind' method ----
|
||||
"To get a type description object by type kind.
|
||||
DATA(tdo_elem_get_by_kind_string) = cl_abap_elemdescr=>get_by_kind( cl_abap_elemdescr=>typekind_string ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_get_by_kind_string.
|
||||
|
||||
DATA(tdo_elem_get_by_kind_c5) = cl_abap_elemdescr=>get_by_kind( p_type_kind = cl_abap_elemdescr=>typekind_char p_length = 5 ).
|
||||
CREATE DATA dref_elem TYPE HANDLE tdo_elem_get_by_kind_c5.
|
||||
```
|
||||
|
||||
<p align="right"><a href="#top">⬆️ back to top</a></p>
|
||||
@@ -4573,51 +4713,128 @@ CREATE DATA dref_elem TYPE HANDLE tdo_elem_5.
|
||||
#### Creating Structured Types and Data Objects Dynamically
|
||||
|
||||
```abap
|
||||
DATA dref_struc TYPE REF TO data.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Creating a structured type and data object dynamically
|
||||
*& Flat structure
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"A structured type and data object such as the following shall be created
|
||||
"dynamically using a type description object.
|
||||
TYPES: BEGIN OF struc_type,
|
||||
a TYPE string, "Built-in ABAP types
|
||||
b TYPE i,
|
||||
c TYPE c LENGTH 5,
|
||||
d TYPE p LENGTH 4 DECIMALS 3,
|
||||
e TYPE land1, "DDIC data element
|
||||
f TYPE zdemo_abap_fli, "Structure based on the line type of a database table
|
||||
g TYPE string_table, "Table type
|
||||
END OF struc_type.
|
||||
DATA demo_struc_1 TYPE struc_type.
|
||||
TYPES: BEGIN OF flat_struc_type,
|
||||
num TYPE i, "Built-in ABAP types
|
||||
packed TYPE p LENGTH 16 DECIMALS 14,
|
||||
text TYPE c LENGTH 20,
|
||||
date TYPE d,
|
||||
land TYPE land1, "DDIC data elements
|
||||
ts TYPE timestampl,
|
||||
END OF flat_struc_type.
|
||||
DATA struc_1 TYPE flat_struc_type.
|
||||
|
||||
"Creating a type description object using RTTC method
|
||||
"Using the get method, you can create the type description object
|
||||
"Creating a reference type dynamically using a type description object
|
||||
"Using the 'get' method, you can create the type description object
|
||||
"dynamically based on a component table. The component table is
|
||||
"of type abap_component_tab. In this example, the component table
|
||||
"is created inline.
|
||||
DATA(tdo_struc_1) = cl_abap_structdescr=>get(
|
||||
VALUE #(
|
||||
( name = 'A' type = cl_abap_elemdescr=>get_string( ) )
|
||||
( name = 'B' type = cl_abap_elemdescr=>get_i( ) )
|
||||
( name = 'C' type = cl_abap_elemdescr=>get_c( 5 ) )
|
||||
( name = 'D' type = cl_abap_elemdescr=>get_p( p_length = 4 p_decimals = 3 ) )
|
||||
( name = 'E' type = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_name( 'LAND1' ) ) )
|
||||
( name = 'F' type = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_name( 'ZDEMO_ABAP_FLI' ) ) )
|
||||
( name = 'G' type = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_name( 'STRING_TABLE' ) ) ) ) ).
|
||||
( name = 'NUM' type = cl_abap_elemdescr=>get_i( ) )
|
||||
( name = 'PACKED' type = cl_abap_elemdescr=>get_p( p_length = 16 p_decimals = 14 ) )
|
||||
( name = 'TEXT' type = cl_abap_elemdescr=>get_c( 20 ) )
|
||||
( name = 'DATE' type = cl_abap_elemdescr=>get_d( ) )
|
||||
( name = 'LAND' type = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_name( 'LAND1' ) ) )
|
||||
( name = 'TS' type = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_name( 'TIMESTAMPL' ) ) )
|
||||
) ).
|
||||
|
||||
"Creating a structured data object dynamically using a type description object
|
||||
DATA dref_struc TYPE REF TO data.
|
||||
"Creating a data reference variable dynamically using a type description object
|
||||
CREATE DATA dref_struc TYPE HANDLE tdo_struc_1.
|
||||
|
||||
ASSERT demo_struc_1 = dref_struc->*.
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_for_dref_struc_1) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data( dref_struc->* ) ).
|
||||
DATA(applies_to_struc_1) = tdo_for_dref_struc_1->applies_to_data( struc_1 ).
|
||||
ASSERT applies_to_struc_1 = abap_true.
|
||||
|
||||
"Excursion
|
||||
"The previous example shows the use of cl_abap_structdescr=>get to create a
|
||||
"type description object. The following examples show the creation based on
|
||||
"other methods/different casts getting type description objects.
|
||||
TYPES ty_struc TYPE zdemo_abap_carr.
|
||||
DATA demo_struc_2 TYPE zdemo_abap_carr.
|
||||
DATA(tdo_struc_2) = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_data( demo_struc_2 ) ).
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Creating a structured type and data object dynamically
|
||||
*& Deep structure
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"A structured type and data object such as the following shall be created
|
||||
"dynamically using a type description object.
|
||||
TYPES: BEGIN OF deep_struc_type,
|
||||
num TYPE i, "Built-in ABAP types
|
||||
str TYPE string,
|
||||
flight_struc TYPE zdemo_abap_fli, "Structure based on the line type of a database table
|
||||
string_tab TYPE string_table, "Global table type
|
||||
local_tab TYPE TABLE OF flat_struc_type WITH EMPTY KEY, "Table type based on local structured type
|
||||
END OF deep_struc_type.
|
||||
DATA struc_2 TYPE deep_struc_type.
|
||||
|
||||
"Creating a reference type dynamically using a type description object
|
||||
DATA(tdo_struc_2) = cl_abap_structdescr=>get(
|
||||
VALUE #(
|
||||
( name = 'NUM' type = cl_abap_elemdescr=>get_i( ) )
|
||||
( name = 'STR' type = cl_abap_elemdescr=>get_string( ) )
|
||||
( name = 'FLIGHT_STRUC' type = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_name( 'ZDEMO_ABAP_FLI' ) ) )
|
||||
( name = 'STRING_TAB' type = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_name( 'STRING_TABLE' ) ) )
|
||||
( name = 'LOCAL_TAB' type = CAST cl_abap_datadescr( cl_abap_tabledescr=>get(
|
||||
p_line_type = CAST cl_abap_structdescr( cl_abap_tabledescr=>describe_by_name( 'FLAT_STRUC_TYPE' ) )
|
||||
p_table_kind = cl_abap_tabledescr=>tablekind_std
|
||||
p_unique = cl_abap_typedescr=>false
|
||||
p_key_kind = cl_abap_tabledescr=>keydefkind_empty ) ) ) ) ).
|
||||
|
||||
"Creating a data reference variable dynamically using a type description object
|
||||
CREATE DATA dref_struc TYPE HANDLE tdo_struc_2.
|
||||
ASSERT demo_struc_2 = dref_struc->*.
|
||||
DATA(tdo_struc_3) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( 'TY_STRUC' ) ).
|
||||
CREATE DATA dref_struc TYPE HANDLE tdo_struc_3.
|
||||
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_for_dref_struc_2) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data( dref_struc->* ) ).
|
||||
DATA(applies_to_struc_2) = tdo_for_dref_struc_2->applies_to_data( struc_2 ).
|
||||
ASSERT applies_to_struc_2 = abap_true.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Excursions: Further methods of class cl_abap_structdescr
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"The following examples cover a selection. For more information, refer
|
||||
"to the class documentation.
|
||||
|
||||
"---- 'describe_by_data' method ----
|
||||
"To get the underlying type's type description object.
|
||||
DATA some_struct TYPE zdemo_abap_carr.
|
||||
DATA(tdo_struc_descr_by_data) = cl_abap_structdescr=>describe_by_data( some_struct ).
|
||||
"Note: To use it with the CREATE DATA ... TYPE HANDLE ... statement, a cast is
|
||||
"required.
|
||||
DATA(cast_tdo_struc_descr_by_data) = CAST cl_abap_datadescr( tdo_struc_descr_by_data ).
|
||||
CREATE DATA dref_struc TYPE HANDLE cast_tdo_struc_descr_by_data.
|
||||
|
||||
"---- 'describe_by_name' method ----
|
||||
"To get the type description object based on a type passed by relative or absolute name
|
||||
DATA(tdo_struc_descr_by_name) = cl_abap_structdescr=>describe_by_name( 'ZDEMO_ABAP_CARR' ).
|
||||
DATA(cast_tdo_struc_descr_by_name) = CAST cl_abap_datadescr( tdo_struc_descr_by_name ).
|
||||
CREATE DATA dref_struc TYPE HANDLE cast_tdo_struc_descr_by_name.
|
||||
|
||||
"---- 'describe_by_data_ref' method ----
|
||||
"To get the underlying type's type description object, passed as reference.
|
||||
DATA data_ref TYPE REF TO data.
|
||||
data_ref = NEW zdemo_abap_flsch( carrid = 'LH' ).
|
||||
DATA(tdo_struc_descr_by_data_ref) = cl_abap_structdescr=>describe_by_data_ref( data_ref ).
|
||||
DATA(cast_tdo_struc_desc_by_dref) = CAST cl_abap_datadescr( tdo_struc_descr_by_data_ref ).
|
||||
CREATE DATA dref_struc TYPE HANDLE cast_tdo_struc_desc_by_dref.
|
||||
|
||||
"---- 'get_bdef_derived_type' method ----
|
||||
"To get a type description object for a BDEF derived type.
|
||||
DATA struc_der_type_create TYPE STRUCTURE FOR CREATE zdemo_abap_rap_ro_m.
|
||||
DATA(tdo_struc_bdef_derived_type) = cl_abap_structdescr=>get_bdef_derived_type(
|
||||
p_entity = 'ZDEMO_ABAP_RAP_RO_M'
|
||||
p_kind = abp_bdef_derived_type-create ).
|
||||
|
||||
CREATE DATA dref_struc TYPE HANDLE tdo_struc_bdef_derived_type.
|
||||
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_for_dref_struc_der_type) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data( dref_struc->* ) ).
|
||||
DATA(applies_to_struc_der_type) = tdo_for_dref_struc_der_type->applies_to_data( struc_der_type_create ).
|
||||
ASSERT applies_to_struc_der_type = abap_true.
|
||||
```
|
||||
|
||||
<p align="right"><a href="#top">⬆️ back to top</a></p>
|
||||
@@ -4625,14 +4842,11 @@ CREATE DATA dref_struc TYPE HANDLE tdo_struc_3.
|
||||
#### Creating Table Types and Internal Tables Dynamically
|
||||
|
||||
```abap
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Creating internal tables dynamically using type description objects
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
DATA dref_itab TYPE REF TO data.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Internal table with elementary line type and standard table key
|
||||
*& Creating table type and internal table with elementary line type and
|
||||
*& standard table key
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"An internal table type such as the following shall be created dynamically
|
||||
@@ -4652,17 +4866,13 @@ DATA(tdo_tab_1) = cl_abap_tabledescr=>get(
|
||||
CREATE DATA dref_itab TYPE HANDLE tdo_tab_1.
|
||||
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_1a) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( dref_itab->* ) ).
|
||||
DATA(tdo_1b) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( itab_1 ) ).
|
||||
|
||||
DATA(applies_1a) = tdo_1a->applies_to_data_descr( tdo_1b ).
|
||||
DATA(applies_1b) = tdo_1a->applies_to_data( itab_1 ).
|
||||
|
||||
ASSERT applies_1a = abap_true.
|
||||
ASSERT applies_1b = abap_true.
|
||||
DATA(tdo_1) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( dref_itab->* ) ).
|
||||
DATA(applies_1) = tdo_1->applies_to_data( itab_1 ).
|
||||
ASSERT applies_1 = abap_true.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Internal table with structured line type and custom table keys
|
||||
*& Creating table type and internal table with structured line type and
|
||||
*& custom table keys
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"Another internal table type for which more parameter specifications
|
||||
@@ -4686,17 +4896,12 @@ DATA(tdo_tab_2) = cl_abap_tabledescr=>get(
|
||||
CREATE DATA dref_itab TYPE HANDLE tdo_tab_2.
|
||||
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_2a) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( dref_itab->* ) ).
|
||||
DATA(tdo_2b) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( itab_2 ) ).
|
||||
|
||||
DATA(applies_2a) = tdo_2a->applies_to_data_descr( tdo_2b ).
|
||||
DATA(applies_2b) = tdo_2a->applies_to_data( itab_2 ).
|
||||
|
||||
ASSERT applies_2a = abap_true.
|
||||
ASSERT applies_2b = abap_true.
|
||||
DATA(tdo_2) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( dref_itab->* ) ).
|
||||
DATA(applies_2) = tdo_2->applies_to_data( itab_2 ).
|
||||
ASSERT applies_2 = abap_true.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Internal table with structured line type containing custom components
|
||||
*& Creating table type and internal table containing custom components
|
||||
*& and custom table key
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
@@ -4733,15 +4938,11 @@ DATA(tdo_3b) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( ita
|
||||
DATA(line_type_3b) = CAST cl_abap_structdescr( tdo_3b->get_table_line_type( ) ).
|
||||
DATA(keys_3b) = tdo_3b->get_keys( ).
|
||||
|
||||
|
||||
DATA(applies_3a) = tdo_3a->applies_to_data_descr( tdo_3b ).
|
||||
DATA(applies_3b) = tdo_3a->applies_to_data( itab_3 ).
|
||||
|
||||
ASSERT applies_3a = abap_true.
|
||||
ASSERT applies_3b = abap_true.
|
||||
DATA(applies_3) = tdo_3a->applies_to_data( itab_3 ).
|
||||
ASSERT applies_3 = abap_true.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Internal table with structured line type containing custom components
|
||||
*& Creating table type and internal table containing custom components
|
||||
*& and custom table key (primary and secondary table key)
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
@@ -4801,14 +5002,11 @@ DATA(tdo_4b) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( ita
|
||||
DATA(line_type_4b) = CAST cl_abap_structdescr( tdo_4b->get_table_line_type( ) ).
|
||||
DATA(keys_4b) = tdo_4b->get_keys( ).
|
||||
|
||||
DATA(applies_4a) = tdo_4a->applies_to_data_descr( tdo_4b ).
|
||||
DATA(applies_4b) = tdo_4a->applies_to_data( itab_4 ).
|
||||
|
||||
ASSERT applies_4a = abap_true.
|
||||
ASSERT applies_4b = abap_true.
|
||||
DATA(applies_4) = tdo_4a->applies_to_data( itab_4 ).
|
||||
ASSERT applies_4 = abap_true.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Internal table with structured line type containing custom components
|
||||
*& Creating table type and internal table containing custom components
|
||||
*& and custom table key (primary and secondary table key), including
|
||||
*& alias names
|
||||
*&---------------------------------------------------------------------*
|
||||
@@ -4851,31 +5049,53 @@ DATA(line_type_5b) = CAST cl_abap_structdescr( tdo_5b->get_table_line_type( ) ).
|
||||
DATA(keys_5b) = tdo_5b->get_keys( ).
|
||||
DATA(key_aliases_5b) = tdo_5b->get_key_aliases( ).
|
||||
|
||||
DATA(applies_5a) = tdo_5a->applies_to_data_descr( tdo_5b ).
|
||||
DATA(applies_5b) = tdo_5a->applies_to_data( itab_5 ).
|
||||
|
||||
ASSERT applies_5a = abap_true.
|
||||
ASSERT applies_5b = abap_true.
|
||||
DATA(applies_5) = tdo_5a->applies_to_data( itab_5 ).
|
||||
ASSERT applies_5 = abap_true.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Creating internal tables dynamically using type description objects
|
||||
*& based on existing table types and internal tables
|
||||
*& Excursions: Further methods of class cl_abap_tabledescr
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"The previous examples show the use of cl_abap_tabledescr=>get* methods
|
||||
"to create type description objects. The following examples show the
|
||||
"creation based on other methods/different casts getting type description
|
||||
"objects.
|
||||
TYPES ty_str_tab TYPE TABLE OF string WITH EMPTY KEY.
|
||||
DATA itab_6 TYPE string_table.
|
||||
"The following examples cover a selection. For more information, refer
|
||||
"to the class documentation.
|
||||
|
||||
"Creating a type description object based on an existing table type
|
||||
DATA(tdo_tab_6) = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_name( 'TY_STR_TAB' ) ).
|
||||
CREATE DATA dref_itab TYPE HANDLE tdo_tab_6.
|
||||
"---- 'describe_by_data' method ----
|
||||
"To get the underlying type's type description object.
|
||||
DATA some_table TYPE TABLE OF zdemo_abap_carr WITH EMPTY KEY.
|
||||
DATA(tdo_tab_descr_by_data) = cl_abap_typedescr=>describe_by_data( some_table ).
|
||||
"Note: To use it with the CREATE DATA ... TYPE HANDLE ... statement, a cast is
|
||||
"required.
|
||||
DATA(cast_tdo_tab_descr_by_data) = CAST cl_abap_datadescr( tdo_tab_descr_by_data ).
|
||||
CREATE DATA dref_itab TYPE HANDLE cast_tdo_tab_descr_by_data.
|
||||
|
||||
"Creating a type description object based on an existing internal table
|
||||
DATA(tdo_tab_7) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( itab_4 ) ).
|
||||
CREATE DATA dref_itab TYPE HANDLE tdo_tab_7.
|
||||
"---- 'describe_by_name' method ----
|
||||
"To get the type description object based on a type passed by relative or absolute name
|
||||
DATA(tdo_tab_descr_by_name) = cl_abap_tabledescr=>describe_by_name( 'ZDEMO_ABAP_CARR' ).
|
||||
DATA(cast_tdo_tab_descr_by_name) = CAST cl_abap_datadescr( tdo_tab_descr_by_name ).
|
||||
CREATE DATA dref_itab TYPE HANDLE cast_tdo_tab_descr_by_name.
|
||||
|
||||
"---- 'describe_by_data_ref' method ----
|
||||
"To get the underlying type's type description object, passed as reference.
|
||||
DATA data_ref TYPE REF TO data.
|
||||
TYPES ty_tab type table of zdemo_abap_carr WITH EMPTY KEY.
|
||||
data_ref = NEW ty_tab( ( carrid = 'LH' ) ( carrid = 'AA' ) ).
|
||||
DATA(tdo_tab_descr_by_data_ref) = cl_abap_tabledescr=>describe_by_data_ref( data_ref ).
|
||||
DATA(cast_tdo_tab_desc_by_dref) = CAST cl_abap_datadescr( tdo_tab_descr_by_data_ref ).
|
||||
CREATE DATA dref_itab TYPE HANDLE cast_tdo_tab_desc_by_dref.
|
||||
|
||||
"---- 'get_bdef_derived_type' method ----
|
||||
"To get a type description object for a BDEF derived type.
|
||||
DATA tab_der_type_create TYPE TABLE FOR CREATE zdemo_abap_rap_ro_m.
|
||||
DATA(tdo_tab_bdef_derived_type) = cl_abap_tabledescr=>get_bdef_derived_type(
|
||||
p_entity = 'ZDEMO_ABAP_RAP_RO_M'
|
||||
p_kind = abp_bdef_derived_type-create ).
|
||||
|
||||
CREATE DATA dref_itab TYPE HANDLE tdo_tab_bdef_derived_type.
|
||||
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_for_dref_tab_der_type) = CAST cl_abap_tabledescr( cl_abap_typedescr=>describe_by_data( dref_itab->* ) ).
|
||||
DATA(applies_to_tab_der_type) = tdo_for_dref_tab_der_type->applies_to_data( tab_der_type_create ).
|
||||
ASSERT applies_to_tab_der_type = abap_true.
|
||||
```
|
||||
|
||||
<p align="right"><a href="#top">⬆️ back to top</a></p>
|
||||
@@ -4883,37 +5103,174 @@ CREATE DATA dref_itab TYPE HANDLE tdo_tab_7.
|
||||
#### Creating Reference Types and Data Reference Variables Dynamically
|
||||
|
||||
```abap
|
||||
"A reference type and variable such as the following shall be created
|
||||
"using type description objects.
|
||||
TYPES ty_ref2string TYPE REF TO string.
|
||||
DATA dref_string TYPE REF TO string.
|
||||
|
||||
DATA dref_ref TYPE REF TO data.
|
||||
|
||||
"Creating the type dynamically (creating a type description object)
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Creating a data reference with elementary type (built-in ABAP type)
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"A reference type and variable such as the following shall be created
|
||||
"using a type description object.
|
||||
TYPES ty_ref_str TYPE REF TO string.
|
||||
DATA dref_1a TYPE ty_ref_str.
|
||||
DATA dref_1b TYPE REF TO string.
|
||||
|
||||
"Creating a reference type dynamically using a type description object
|
||||
DATA(tdo_ref_1) = cl_abap_refdescr=>get( cl_abap_elemdescr=>get_string( ) ).
|
||||
|
||||
"Creating a data reference variable dynamically using a type description object
|
||||
CREATE DATA dref_ref TYPE HANDLE tdo_ref_1.
|
||||
|
||||
dref_ref = REF string( `hi` ).
|
||||
dref_string = REF string( `hi` ).
|
||||
ASSERT dref_string = dref_ref.
|
||||
ASSERT dref_string->* = dref_ref->*.
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_for_dref_ref_1) = CAST cl_abap_refdescr( cl_abap_typedescr=>describe_by_data( dref_ref->* ) ).
|
||||
DATA(applies_to_1a) = tdo_for_dref_ref_1->applies_to_data( dref_1a ).
|
||||
DATA(applies_to_1b) = tdo_for_dref_ref_1->applies_to_data( dref_1b ).
|
||||
ASSERT applies_to_1a = abap_true.
|
||||
ASSERT applies_to_1b = abap_true.
|
||||
|
||||
"Excursion
|
||||
"The previous examples show the use of cl_abap_refdescr=>get to create
|
||||
"a type description object. The following examples show the creation based
|
||||
"on other methods/different casts getting type description objects.
|
||||
DATA(tdo_ref_2) = CAST cl_abap_datadescr( cl_abap_typedescr=>describe_by_name( 'TY_REF2STRING' ) ).
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Creating a data reference with elementary type (DDIC data element)
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"A reference type and variable such as the following shall be created
|
||||
"using a type description object.
|
||||
TYPES ty_ref_ts TYPE REF TO timestampl.
|
||||
DATA dref_2a TYPE ty_ref_ts.
|
||||
DATA dref_2b TYPE REF TO timestampl.
|
||||
|
||||
"Creating a reference type dynamically using a type description object
|
||||
DATA(tdo_ref_2) = cl_abap_refdescr=>get( cl_abap_typedescr=>describe_by_name( 'TIMESTAMPL' ) ).
|
||||
|
||||
"Creating a data reference variable dynamically using a type description object
|
||||
CREATE DATA dref_ref TYPE HANDLE tdo_ref_2.
|
||||
|
||||
DATA(tdo_ref_3) = CAST cl_abap_refdescr( cl_abap_typedescr=>describe_by_data( dref_string ) ).
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_for_dref_ref_2) = CAST cl_abap_refdescr( cl_abap_typedescr=>describe_by_data( dref_ref->* ) ).
|
||||
DATA(applies_to_2a) = tdo_for_dref_ref_2->applies_to_data( dref_2a ).
|
||||
DATA(applies_to_2b) = tdo_for_dref_ref_2->applies_to_data( dref_2b ).
|
||||
ASSERT applies_to_2a = abap_true.
|
||||
ASSERT applies_to_2b = abap_true.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Creating a data reference with structured type
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"A reference type and variable such as the following shall be created
|
||||
"using a type description object.
|
||||
TYPES ty_ref_db TYPE REF TO zdemo_abap_carr.
|
||||
DATA dref_3a TYPE ty_ref_db.
|
||||
DATA dref_3b TYPE REF TO zdemo_abap_carr.
|
||||
|
||||
"Creating a reference type dynamically using a type description object
|
||||
"The example uses the structured type of a demo database table.
|
||||
DATA(tdo_ref_3) = cl_abap_refdescr=>get( cl_abap_typedescr=>describe_by_name( 'ZDEMO_ABAP_CARR' ) ).
|
||||
|
||||
"Creating a data reference variable dynamically using a type description object
|
||||
CREATE DATA dref_ref TYPE HANDLE tdo_ref_3.
|
||||
|
||||
"get_by_name method
|
||||
DATA(tdo_ref_4) = cl_abap_refdescr=>get_by_name( 'STRING' ).
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_for_dref_ref_3) = CAST cl_abap_refdescr( cl_abap_typedescr=>describe_by_data( dref_ref->* ) ).
|
||||
DATA(applies_to_3a) = tdo_for_dref_ref_3->applies_to_data( dref_3a ).
|
||||
DATA(applies_to_3b) = tdo_for_dref_ref_3->applies_to_data( dref_3b ).
|
||||
ASSERT applies_to_3a = abap_true.
|
||||
ASSERT applies_to_3b = abap_true.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Creating a data reference with table type
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"A reference type and variable such as the following shall be created
|
||||
"using a type description object.
|
||||
"The example uses a table type based on a locally declared structured type.
|
||||
TYPES: BEGIN OF struc_type,
|
||||
comp1 TYPE i, "Built-in ABAP types
|
||||
comp2 TYPE c LENGTH 5,
|
||||
comp3 TYPE p LENGTH 16 DECIMALS 14,
|
||||
comp4 TYPE land1, "DDIC data element
|
||||
comp5 TYPE zdemo_abap_carr, "Structure based on the line type of a database table
|
||||
comp6 TYPE string_table, "Table type
|
||||
END OF struc_type,
|
||||
tab_type TYPE TABLE OF struc_type WITH EMPTY KEY.
|
||||
|
||||
TYPES ty_ref_tab TYPE REF TO tab_type.
|
||||
DATA dref_4a TYPE ty_ref_tab.
|
||||
DATA dref_4b TYPE REF TO tab_type.
|
||||
|
||||
"Creating a reference type dynamically using a type description object
|
||||
DATA(tdo_ref_4) = cl_abap_refdescr=>get( cl_abap_typedescr=>describe_by_name( 'TAB_TYPE' ) ).
|
||||
|
||||
"Creating a data reference variable dynamically using a type description object
|
||||
CREATE DATA dref_ref TYPE HANDLE tdo_ref_4.
|
||||
|
||||
"Getting type information and checking type compatibility
|
||||
DATA(tdo_for_dref_ref_4) = CAST cl_abap_refdescr( cl_abap_typedescr=>describe_by_data( dref_ref->* ) ).
|
||||
DATA(applies_to_4a) = tdo_for_dref_ref_4->applies_to_data( dref_4a ).
|
||||
DATA(applies_to_4b) = tdo_for_dref_ref_4->applies_to_data( dref_4b ).
|
||||
ASSERT applies_to_4a = abap_true.
|
||||
ASSERT applies_to_4b = abap_true.
|
||||
|
||||
*&---------------------------------------------------------------------*
|
||||
*& Excursions: Further methods of class cl_abap_refdescr
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
"The following examples cover a selection. For more information, refer
|
||||
"to the class documentation.
|
||||
|
||||
"---- 'get' method ----
|
||||
"To create or reuse reference types, which are passed as type
|
||||
"description objects.
|
||||
"Note: There is also the 'create' method. However, the 'get' method is
|
||||
"the recommended method.
|
||||
DATA(tdo_ref_int) = cl_abap_elemdescr=>get_i( ).
|
||||
DATA(tdo_ref_get_a) = cl_abap_refdescr=>get( tdo_ref_int ).
|
||||
CREATE DATA dref_ref TYPE HANDLE tdo_ref_get_a.
|
||||
|
||||
"Object references can also be used
|
||||
DATA(tdo_cl_abap_typedescr) = cl_abap_typedescr=>describe_by_name( 'CL_ABAP_TYPEDESCR' ).
|
||||
DATA(tdo_ref_get_b) = cl_abap_refdescr=>get( tdo_cl_abap_typedescr ).
|
||||
CREATE DATA dref_ref TYPE HANDLE tdo_ref_get_b.
|
||||
|
||||
"---- 'get_by_name' method ----
|
||||
"To create reference types, which are passed as name.
|
||||
"Note: There is also the 'create_by_name' method. However, the 'get_by_name'
|
||||
"method is the recommended method.
|
||||
DATA(tdo_ref_get_by_name) = cl_abap_refdescr=>get_by_name( 'TIMESTAMP' ).
|
||||
CREATE DATA dref_ref TYPE HANDLE tdo_ref_get_by_name.
|
||||
|
||||
"---- 'describe_by_data' method ----
|
||||
"To get a reference to the underlying type's type description object.
|
||||
DATA some_number TYPE int8.
|
||||
DATA(tdo_ref_descr_by_data) = cl_abap_refdescr=>describe_by_data( some_number ).
|
||||
DATA(cast_tdo_ref_descr_by_data) = CAST cl_abap_datadescr( tdo_ref_descr_by_data ).
|
||||
CREATE DATA dref_ref TYPE HANDLE cast_tdo_ref_descr_by_data.
|
||||
|
||||
"---- 'describe_by_data_ref' method ----
|
||||
"To get a reference to the underlying type's type description object, passed as
|
||||
"reference.
|
||||
DATA some_data TYPE REF TO data.
|
||||
some_data = NEW i( 123 ).
|
||||
DATA(tdo_ref_descr_by_data_ref) = cl_abap_refdescr=>describe_by_data_ref( some_data ).
|
||||
DATA(cast_tdo_ref_descr_by_data_ref) = CAST cl_abap_datadescr( tdo_ref_descr_by_data ).
|
||||
CREATE DATA dref_ref TYPE HANDLE cast_tdo_ref_descr_by_data_ref.
|
||||
|
||||
"---- 'describe_by_name' method ----
|
||||
"To get the type description object based on a type passed by relative or absolute name
|
||||
DATA(tdo_ref_descr_by_name) = cl_abap_refdescr=>describe_by_name( 'TIMESTAMPL' ).
|
||||
DATA(cast_tdo_ref_descr_by_name) = CAST cl_abap_datadescr( tdo_ref_descr_by_name ).
|
||||
CREATE DATA dref_ref TYPE HANDLE cast_tdo_ref_descr_by_name.
|
||||
|
||||
"---- 'describe_by_object_ref' method ----
|
||||
"To get the type description object based on an an object type
|
||||
DATA(oref) = NEW cl_system_uuid( ).
|
||||
DATA(tdo_ref_descr_by_ntame) = cl_abap_refdescr=>describe_by_object_ref( oref ).
|
||||
|
||||
"---- 'get_ref_to_data' method ----
|
||||
"To get the type description object for the type REF TO DATA
|
||||
DATA(tdo_ref_get_ref_to_data) = cl_abap_refdescr=>get_ref_to_data( ).
|
||||
|
||||
"---- 'get_data_type_kind' method ----
|
||||
"To get the type description object for the type REF TO OBJECT
|
||||
DATA(tdo_ref_get_ref_to_object) = cl_abap_refdescr=>get_ref_to_object( ).
|
||||
```
|
||||
|
||||
<p align="right"><a href="#top">⬆️ back to top</a></p>
|
||||
|
||||
Reference in New Issue
Block a user