mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 12:20:51 +08:00

Serialize data to internal table with unique key corresponding to the database table Co-authored-by: Lars Hvam <larshp@hotmail.com>
95 lines
2.6 KiB
ABAP
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.
|