abapGit/src/data/zcl_abapgit_data_utils.clas.abap
Marc Bernard 71006ab149
Avoid duplicates in data serialize (#4763)
Serialize data to internal table with unique key corresponding to the database table

Co-authored-by: Lars Hvam <larshp@hotmail.com>
2021-05-14 11:12:25 +02:00

95 lines
2.6 KiB
ABAP

CLASS zcl_abapgit_data_utils DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS build_table_itab
IMPORTING
!iv_name TYPE tadir-obj_name
RETURNING
VALUE(rr_data) TYPE REF TO data
RAISING
zcx_abapgit_exception .
CLASS-METHODS build_filename
IMPORTING
!is_config TYPE zif_abapgit_data_config=>ty_config
RETURNING
VALUE(rv_filename) TYPE string .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_abapgit_data_utils IMPLEMENTATION.
METHOD build_filename.
rv_filename = to_lower( |{ is_config-name }.{ is_config-type }.{ zif_abapgit_data_config=>c_default_format }| ).
REPLACE ALL OCCURRENCES OF '/' IN rv_filename WITH '#'.
ENDMETHOD.
METHOD build_table_itab.
DATA lo_type TYPE REF TO cl_abap_typedescr.
DATA lo_data TYPE REF TO cl_abap_structdescr.
DATA lo_table TYPE REF TO cl_abap_tabledescr.
DATA lt_fields TYPE ddfields.
DATA lt_keys TYPE abap_table_keydescr_tab.
FIELD-SYMBOLS <ls_field> LIKE LINE OF lt_fields.
FIELD-SYMBOLS <ls_key> LIKE LINE OF lt_keys.
FIELD-SYMBOLS <ls_component> LIKE LINE OF <ls_key>-components.
cl_abap_structdescr=>describe_by_name(
EXPORTING
p_name = iv_name
RECEIVING
p_descr_ref = lo_type
EXCEPTIONS
type_not_found = 1 ).
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Table { iv_name } not found for data serialization| ).
ENDIF.
TRY.
lo_data ?= lo_type.
" Get primary key to ensure unique entries
IF lo_data->is_ddic_type( ) = abap_true.
lt_fields = lo_data->get_ddic_field_list( ).
APPEND INITIAL LINE TO lt_keys ASSIGNING <ls_key>.
<ls_key>-access_kind = cl_abap_tabledescr=>tablekind_sorted.
<ls_key>-key_kind = cl_abap_tabledescr=>keydefkind_user.
<ls_key>-is_primary = abap_true.
<ls_key>-is_unique = abap_true.
LOOP AT lt_fields ASSIGNING <ls_field> WHERE keyflag = abap_true.
APPEND INITIAL LINE TO <ls_key>-components ASSIGNING <ls_component>.
<ls_component>-name = <ls_field>-fieldname.
ENDLOOP.
ENDIF.
IF lt_fields IS INITIAL.
lo_table = cl_abap_tabledescr=>get( lo_data ).
ELSE.
lo_table = cl_abap_tabledescr=>get_with_keys(
p_line_type = lo_data
p_keys = lt_keys ).
ENDIF.
CREATE DATA rr_data TYPE HANDLE lo_table.
CATCH cx_root.
zcx_abapgit_exception=>raise( |Error creating internal table for data serialization| ).
ENDTRY.
ENDMETHOD.
ENDCLASS.