mirror of
https://github.com/abapGit/abapGit.git
synced 2025-04-30 11:46:38 +08:00
parent
7cbd986757
commit
7d7def95a5
109
src/objects/zcl_abapgit_object_asfc.clas.abap
Normal file
109
src/objects/zcl_abapgit_object_asfc.clas.abap
Normal file
|
@ -0,0 +1,109 @@
|
|||
CLASS zcl_abapgit_object_asfc DEFINITION
|
||||
PUBLIC
|
||||
INHERITING FROM zcl_abapgit_objects_super
|
||||
CREATE PUBLIC .
|
||||
|
||||
PUBLIC SECTION.
|
||||
|
||||
INTERFACES zif_abapgit_object .
|
||||
PROTECTED SECTION.
|
||||
PRIVATE SECTION.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
|
||||
CLASS ZCL_ABAPGIT_OBJECT_ASFC IMPLEMENTATION.
|
||||
|
||||
|
||||
METHOD zif_abapgit_object~changed_by.
|
||||
rv_user = zcl_abapgit_objects_super=>c_user_unknown.
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_object~compare_to_remote_version.
|
||||
CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null.
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_object~delete.
|
||||
|
||||
DATA: lo_generic TYPE REF TO zcl_abapgit_objects_generic.
|
||||
|
||||
CREATE OBJECT lo_generic
|
||||
EXPORTING
|
||||
is_item = ms_item.
|
||||
|
||||
lo_generic->delete( ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_object~deserialize.
|
||||
|
||||
DATA: lo_generic TYPE REF TO zcl_abapgit_objects_generic.
|
||||
|
||||
CREATE OBJECT lo_generic
|
||||
EXPORTING
|
||||
is_item = ms_item.
|
||||
|
||||
lo_generic->deserialize(
|
||||
iv_package = iv_package
|
||||
io_xml = io_xml ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_object~exists.
|
||||
|
||||
DATA: lo_generic TYPE REF TO zcl_abapgit_objects_generic.
|
||||
|
||||
CREATE OBJECT lo_generic
|
||||
EXPORTING
|
||||
is_item = ms_item.
|
||||
|
||||
rv_bool = lo_generic->exists( ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_object~get_metadata.
|
||||
|
||||
rs_metadata = get_metadata( ).
|
||||
rs_metadata-delete_tadir = abap_true.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_object~has_changed_since.
|
||||
|
||||
rv_changed = abap_true.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_object~is_locked.
|
||||
|
||||
rv_is_locked = abap_false.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_object~jump.
|
||||
|
||||
zcx_abapgit_exception=>raise( |TODO: Jump| ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_object~serialize.
|
||||
|
||||
DATA: lo_generic TYPE REF TO zcl_abapgit_objects_generic.
|
||||
|
||||
CREATE OBJECT lo_generic
|
||||
EXPORTING
|
||||
is_item = ms_item.
|
||||
|
||||
lo_generic->serialize( io_xml ).
|
||||
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
18
src/objects/zcl_abapgit_object_asfc.clas.xml
Normal file
18
src/objects/zcl_abapgit_object_asfc.clas.xml
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<VSEOCLASS>
|
||||
<CLSNAME>ZCL_ABAPGIT_OBJECT_ASFC</CLSNAME>
|
||||
<VERSION>1</VERSION>
|
||||
<LANGU>E</LANGU>
|
||||
<DESCRIPT>ASFC</DESCRIPT>
|
||||
<EXPOSURE>2</EXPOSURE>
|
||||
<STATE>1</STATE>
|
||||
<CLSCCINCL>X</CLSCCINCL>
|
||||
<FIXPT>X</FIXPT>
|
||||
<UNICODE>X</UNICODE>
|
||||
</VSEOCLASS>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
682
src/objects/zcl_abapgit_objects_generic.clas.abap
Normal file
682
src/objects/zcl_abapgit_objects_generic.clas.abap
Normal file
|
@ -0,0 +1,682 @@
|
|||
CLASS zcl_abapgit_objects_generic DEFINITION
|
||||
PUBLIC
|
||||
CREATE PUBLIC .
|
||||
|
||||
PUBLIC SECTION.
|
||||
|
||||
METHODS constructor
|
||||
IMPORTING
|
||||
!is_item TYPE zif_abapgit_definitions=>ty_item
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS delete
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS deserialize
|
||||
IMPORTING
|
||||
!iv_package TYPE devclass
|
||||
!io_xml TYPE REF TO zcl_abapgit_xml_input
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS exists
|
||||
RETURNING
|
||||
VALUE(rv_bool) TYPE abap_bool
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS serialize
|
||||
IMPORTING
|
||||
!io_xml TYPE REF TO zcl_abapgit_xml_output
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
PROTECTED SECTION.
|
||||
|
||||
TYPES:
|
||||
BEGIN OF ty_s_objkey,
|
||||
num TYPE numc3,
|
||||
value TYPE char128,
|
||||
END OF ty_s_objkey .
|
||||
TYPES:
|
||||
ty_t_objkey TYPE SORTED TABLE OF ty_s_objkey WITH UNIQUE KEY num .
|
||||
|
||||
DATA ms_object_header TYPE objh .
|
||||
DATA:
|
||||
mt_object_table TYPE STANDARD TABLE OF objsl WITH DEFAULT KEY .
|
||||
DATA:
|
||||
mt_object_method TYPE STANDARD TABLE OF objm WITH DEFAULT KEY .
|
||||
DATA ms_item TYPE zif_abapgit_definitions=>ty_item .
|
||||
|
||||
METHODS after_import .
|
||||
METHODS before_export .
|
||||
METHODS corr_insert
|
||||
IMPORTING
|
||||
!iv_package TYPE devclass
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS deserialize_data
|
||||
IMPORTING
|
||||
!io_xml TYPE REF TO zcl_abapgit_xml_input
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS distribute_name_to_components
|
||||
IMPORTING
|
||||
!it_key_component TYPE ddfields
|
||||
CHANGING
|
||||
!ct_objkey TYPE ty_t_objkey
|
||||
!cs_objkey TYPE ty_s_objkey
|
||||
!cv_non_value_pos TYPE numc3 .
|
||||
METHODS get_key_fields
|
||||
IMPORTING
|
||||
!iv_table TYPE objsl-tobj_name
|
||||
RETURNING
|
||||
VALUE(rt_keys) TYPE ddfields
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS get_primary_table
|
||||
RETURNING
|
||||
VALUE(rv_table) TYPE objsl-tobj_name
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS get_where_clause
|
||||
IMPORTING
|
||||
!iv_tobj_name TYPE objsl-tobj_name
|
||||
RETURNING
|
||||
VALUE(rv_where) TYPE string
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS serialize_data
|
||||
IMPORTING
|
||||
!io_xml TYPE REF TO zcl_abapgit_xml_output
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS split_value_to_keys
|
||||
IMPORTING
|
||||
!it_key_component TYPE ddfields
|
||||
CHANGING
|
||||
!ct_objkey TYPE ty_t_objkey
|
||||
!cs_objkey TYPE ty_s_objkey
|
||||
!cv_non_value_pos TYPE numc3 .
|
||||
METHODS validate
|
||||
IMPORTING
|
||||
!io_xml TYPE REF TO zcl_abapgit_xml_input
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
PRIVATE SECTION.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
|
||||
CLASS ZCL_ABAPGIT_OBJECTS_GENERIC IMPLEMENTATION.
|
||||
|
||||
|
||||
METHOD after_import.
|
||||
|
||||
DATA: lt_cts_object_entry TYPE STANDARD TABLE OF e071 WITH DEFAULT KEY,
|
||||
ls_cts_object_entry LIKE LINE OF lt_cts_object_entry,
|
||||
lt_cts_key TYPE STANDARD TABLE OF e071k WITH DEFAULT KEY.
|
||||
|
||||
FIELD-SYMBOLS <ls_object_method> LIKE LINE OF mt_object_method.
|
||||
|
||||
|
||||
ls_cts_object_entry-pgmid = rs_c_pgmid_r3tr.
|
||||
ls_cts_object_entry-object = ms_item-obj_type.
|
||||
ls_cts_object_entry-obj_name = ms_item-obj_name.
|
||||
INSERT ls_cts_object_entry INTO TABLE lt_cts_object_entry.
|
||||
|
||||
READ TABLE mt_object_method ASSIGNING <ls_object_method>
|
||||
WITH KEY
|
||||
objectname = ms_item-obj_type
|
||||
objecttype = 'L'
|
||||
method = 'AFTER_IMP'.
|
||||
IF sy-subrc = 0.
|
||||
* client is actually optional for most AIM, but let's supply it and hope
|
||||
* that those client-independent-ones just ignore it
|
||||
CALL FUNCTION <ls_object_method>-methodname
|
||||
EXPORTING
|
||||
iv_tarclient = sy-mandt
|
||||
iv_is_upgrade = abap_false
|
||||
TABLES
|
||||
tt_e071 = lt_cts_object_entry
|
||||
tt_e071k = lt_cts_key.
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD before_export.
|
||||
|
||||
DATA: lt_cts_object_entry TYPE STANDARD TABLE OF e071 WITH DEFAULT KEY,
|
||||
ls_cts_object_entry LIKE LINE OF lt_cts_object_entry,
|
||||
lt_cts_key TYPE STANDARD TABLE OF e071k WITH DEFAULT KEY,
|
||||
lv_client TYPE trclient.
|
||||
|
||||
FIELD-SYMBOLS <ls_object_method> LIKE LINE OF mt_object_method.
|
||||
|
||||
|
||||
READ TABLE mt_object_method ASSIGNING <ls_object_method>
|
||||
WITH KEY
|
||||
objectname = ms_item-obj_type
|
||||
objecttype = 'L'
|
||||
method = 'BEFORE_EXP' ##no_text.
|
||||
IF sy-subrc = 0.
|
||||
lv_client = sy-mandt.
|
||||
|
||||
ls_cts_object_entry-pgmid = rs_c_pgmid_r3tr.
|
||||
ls_cts_object_entry-object = ms_item-obj_type.
|
||||
ls_cts_object_entry-obj_name = ms_item-obj_name.
|
||||
INSERT ls_cts_object_entry INTO TABLE lt_cts_object_entry.
|
||||
|
||||
CALL FUNCTION <ls_object_method>-methodname
|
||||
EXPORTING
|
||||
iv_client = lv_client
|
||||
TABLES
|
||||
tt_e071 = lt_cts_object_entry
|
||||
tt_e071k = lt_cts_key.
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD constructor.
|
||||
|
||||
CONSTANTS lc_logical_transport_object TYPE c LENGTH 1 VALUE 'L'.
|
||||
|
||||
|
||||
SELECT SINGLE * FROM objh INTO ms_object_header
|
||||
WHERE objectname = is_item-obj_type
|
||||
AND objecttype = lc_logical_transport_object.
|
||||
IF sy-subrc <> 0.
|
||||
zcx_abapgit_exception=>raise( 'Not found in OBJH, or not supported' ).
|
||||
ENDIF.
|
||||
|
||||
* object tables
|
||||
SELECT * FROM objsl INTO CORRESPONDING FIELDS OF TABLE mt_object_table
|
||||
WHERE objectname = is_item-obj_type
|
||||
AND objecttype = lc_logical_transport_object
|
||||
AND tobject = 'TABU'.
|
||||
IF mt_object_table IS INITIAL.
|
||||
zcx_abapgit_exception=>raise( |Obviously corrupted object-type {
|
||||
is_item-obj_type }: No tables defined| ).
|
||||
ENDIF.
|
||||
|
||||
* object methods
|
||||
SELECT * FROM objm INTO TABLE mt_object_method
|
||||
WHERE objectname = is_item-obj_type
|
||||
AND objecttype = lc_logical_transport_object.
|
||||
|
||||
ms_item = is_item.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD corr_insert.
|
||||
|
||||
* this will also insert into TADIR
|
||||
CALL FUNCTION 'RS_CORR_INSERT'
|
||||
EXPORTING
|
||||
object = ms_item-obj_name
|
||||
object_class = ms_item-obj_type
|
||||
mode = 'I'
|
||||
global_lock = abap_true
|
||||
devclass = iv_package
|
||||
master_language = sy-langu
|
||||
EXCEPTIONS
|
||||
cancelled = 1
|
||||
permission_failure = 2
|
||||
unknown_objectclass = 3
|
||||
OTHERS = 4.
|
||||
IF sy-subrc <> 0.
|
||||
zcx_abapgit_exception=>raise( 'error from RS_CORR_INSERT, CMPT' ).
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD delete.
|
||||
|
||||
DATA: lv_where TYPE string,
|
||||
lv_primary TYPE objsl-tobj_name.
|
||||
|
||||
FIELD-SYMBOLS <ls_table> LIKE LINE OF mt_object_table.
|
||||
|
||||
|
||||
lv_primary = get_primary_table( ).
|
||||
|
||||
LOOP AT mt_object_table ASSIGNING <ls_table>.
|
||||
lv_where = get_where_clause( <ls_table>-tobj_name ).
|
||||
ASSERT NOT lv_where IS INITIAL.
|
||||
|
||||
DELETE FROM (<ls_table>-tobj_name) WHERE (lv_where).
|
||||
|
||||
IF <ls_table>-tobj_name = lv_primary.
|
||||
ASSERT sy-dbcnt <= 1. "Just to be on the very safe side
|
||||
ENDIF.
|
||||
ENDLOOP.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD deserialize.
|
||||
|
||||
validate( io_xml ).
|
||||
|
||||
delete( ).
|
||||
|
||||
deserialize_data( io_xml ).
|
||||
|
||||
after_import( ).
|
||||
|
||||
corr_insert( iv_package ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD deserialize_data.
|
||||
|
||||
DATA: lr_ref TYPE REF TO data.
|
||||
|
||||
FIELD-SYMBOLS: <lt_data> TYPE STANDARD TABLE,
|
||||
<ls_table> LIKE LINE OF mt_object_table.
|
||||
|
||||
|
||||
LOOP AT mt_object_table ASSIGNING <ls_table>.
|
||||
|
||||
CREATE DATA lr_ref TYPE STANDARD TABLE OF (<ls_table>-tobj_name).
|
||||
ASSIGN lr_ref->* TO <lt_data>.
|
||||
|
||||
io_xml->read(
|
||||
EXPORTING
|
||||
iv_name = <ls_table>-tobj_name
|
||||
CHANGING
|
||||
cg_data = <lt_data> ).
|
||||
|
||||
INSERT (<ls_table>-tobj_name) FROM TABLE <lt_data>.
|
||||
IF sy-subrc <> 0.
|
||||
zcx_abapgit_exception=>raise( |Error inserting data, {
|
||||
<ls_table>-tobj_name }| ).
|
||||
ENDIF.
|
||||
|
||||
ENDLOOP.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD distribute_name_to_components.
|
||||
|
||||
DATA: lt_key_component_uncovered LIKE it_key_component,
|
||||
ls_key_component_uncovered LIKE LINE OF lt_key_component_uncovered,
|
||||
ls_objkey_sub LIKE cs_objkey,
|
||||
lv_objkey_sub_pos TYPE i,
|
||||
lv_remaining_length TYPE i,
|
||||
lv_count_components_covered LIKE ls_objkey_sub-num.
|
||||
|
||||
DATA lv_len LIKE ls_key_component_uncovered-leng.
|
||||
|
||||
|
||||
lt_key_component_uncovered = it_key_component.
|
||||
ls_objkey_sub-num = cs_objkey-num.
|
||||
lv_objkey_sub_pos = 0.
|
||||
|
||||
* we want to fill the atribute values which are not covered by explicit key components yet
|
||||
lv_count_components_covered = ls_objkey_sub-num - 1.
|
||||
DO lv_count_components_covered TIMES.
|
||||
DELETE lt_key_component_uncovered INDEX 1.
|
||||
ENDDO.
|
||||
|
||||
LOOP AT lt_key_component_uncovered INTO ls_key_component_uncovered.
|
||||
CLEAR ls_objkey_sub-value.
|
||||
|
||||
* Some datatype used in the key might exceed the total remaining characters length (e. g. SICF)
|
||||
TRY.
|
||||
lv_remaining_length = strlen( |{ substring( val = cs_objkey-value off = lv_objkey_sub_pos ) }| ).
|
||||
CATCH cx_sy_range_out_of_bounds.
|
||||
lv_remaining_length = 0.
|
||||
RETURN. ">>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
ENDTRY.
|
||||
IF ls_key_component_uncovered-leng <= lv_remaining_length.
|
||||
lv_len = ls_key_component_uncovered-leng.
|
||||
ELSE.
|
||||
lv_len = lv_remaining_length.
|
||||
ENDIF.
|
||||
|
||||
ls_objkey_sub-value = |{ substring( val = cs_objkey-value off = lv_objkey_sub_pos len = lv_len ) }|.
|
||||
ls_objkey_sub-num = cv_non_value_pos.
|
||||
|
||||
INSERT ls_objkey_sub INTO TABLE ct_objkey.
|
||||
|
||||
lv_objkey_sub_pos = lv_objkey_sub_pos + ls_key_component_uncovered-leng.
|
||||
cv_non_value_pos = cv_non_value_pos + 1.
|
||||
CLEAR ls_objkey_sub.
|
||||
|
||||
IF lv_objkey_sub_pos = strlen( cs_objkey-value ).
|
||||
cs_objkey-num = cv_non_value_pos.
|
||||
EXIT. "end splitting - all characters captured
|
||||
ENDIF.
|
||||
ENDLOOP.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD exists.
|
||||
|
||||
DATA: lv_where_clause TYPE string,
|
||||
lv_primary TYPE objsl-tobj_name,
|
||||
lr_table_line TYPE REF TO data.
|
||||
|
||||
FIELD-SYMBOLS: <lg_table_line> TYPE any.
|
||||
|
||||
|
||||
lv_primary = get_primary_table( ).
|
||||
|
||||
lv_where_clause = get_where_clause( lv_primary ).
|
||||
|
||||
CREATE DATA lr_table_line TYPE (lv_primary).
|
||||
ASSIGN lr_table_line->* TO <lg_table_line>.
|
||||
|
||||
SELECT SINGLE * FROM (lv_primary) INTO <lg_table_line> WHERE (lv_where_clause).
|
||||
rv_bool = boolc( sy-dbcnt > 0 ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD get_key_fields.
|
||||
|
||||
DATA: lv_table TYPE ddobjname.
|
||||
|
||||
|
||||
lv_table = iv_table.
|
||||
|
||||
CALL FUNCTION 'DDIF_NAMETAB_GET'
|
||||
EXPORTING
|
||||
tabname = lv_table
|
||||
TABLES
|
||||
dfies_tab = rt_keys
|
||||
EXCEPTIONS
|
||||
not_found = 1
|
||||
OTHERS = 2.
|
||||
IF sy-subrc <> 0.
|
||||
zcx_abapgit_exception=>raise_t100( ).
|
||||
ENDIF.
|
||||
|
||||
DELETE rt_keys WHERE keyflag = abap_false.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD get_primary_table.
|
||||
|
||||
DATA: ls_object_table LIKE LINE OF mt_object_table.
|
||||
|
||||
|
||||
READ TABLE mt_object_table INTO ls_object_table WITH KEY prim_table = abap_true.
|
||||
IF sy-subrc <> 0.
|
||||
* Fallback. For some objects, no primary table is explicitly flagged
|
||||
* The, the one with only one key field shall be chosen
|
||||
READ TABLE mt_object_table INTO ls_object_table WITH KEY tobjkey = '/&'. "#EC CI_SUBRC
|
||||
ENDIF.
|
||||
IF ls_object_table IS INITIAL.
|
||||
zcx_abapgit_exception=>raise( |Object { ms_item-obj_type } has got no defined primary table| ).
|
||||
ENDIF.
|
||||
|
||||
rv_table = ls_object_table-tobj_name.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD get_where_clause.
|
||||
|
||||
DATA: lv_objkey_pos TYPE i,
|
||||
lv_next_objkey_pos TYPE i,
|
||||
lv_value_pos TYPE i,
|
||||
lv_objkey_length TYPE i,
|
||||
lt_objkey TYPE ty_t_objkey,
|
||||
ls_objkey LIKE LINE OF lt_objkey,
|
||||
lv_non_value_pos TYPE numc3,
|
||||
lt_key_fields TYPE ddfields.
|
||||
|
||||
DATA: lv_is_asterix TYPE abap_bool,
|
||||
lv_where_statement TYPE string,
|
||||
lv_key_pos TYPE i,
|
||||
lv_value128 TYPE string.
|
||||
|
||||
FIELD-SYMBOLS <ls_object_table> LIKE LINE OF mt_object_table.
|
||||
|
||||
FIELD-SYMBOLS <ls_table_field> LIKE LINE OF lt_key_fields.
|
||||
|
||||
|
||||
READ TABLE mt_object_table ASSIGNING <ls_object_table> WITH KEY tobj_name = iv_tobj_name.
|
||||
ASSERT sy-subrc = 0.
|
||||
|
||||
lt_key_fields = get_key_fields( iv_tobj_name ).
|
||||
|
||||
* analyze the object key and compose the key (table)
|
||||
CLEAR lt_objkey.
|
||||
CLEAR ls_objkey.
|
||||
lv_objkey_pos = 0.
|
||||
lv_non_value_pos = 1.
|
||||
lv_value_pos = 0.
|
||||
lv_objkey_length = strlen( <ls_object_table>-tobjkey ).
|
||||
|
||||
WHILE lv_objkey_pos <= lv_objkey_length.
|
||||
ls_objkey-num = lv_non_value_pos.
|
||||
* command
|
||||
IF <ls_object_table>-tobjkey+lv_objkey_pos(1) = '/'.
|
||||
IF NOT ls_objkey-value IS INITIAL.
|
||||
* We reached the end of a key-definition.
|
||||
* this key part may address multiple fields.
|
||||
* E. g. six characters may address one boolean field and a five-digit version field.
|
||||
* Thus, we need to analyze the remaining key components which have not been covered yet.
|
||||
split_value_to_keys(
|
||||
EXPORTING
|
||||
it_key_component = lt_key_fields
|
||||
CHANGING
|
||||
ct_objkey = lt_objkey
|
||||
cs_objkey = ls_objkey
|
||||
cv_non_value_pos = lv_non_value_pos ).
|
||||
ENDIF.
|
||||
lv_next_objkey_pos = lv_objkey_pos + 1.
|
||||
* '*' means all further key values
|
||||
IF <ls_object_table>-tobjkey+lv_next_objkey_pos(1) = '*'.
|
||||
ls_objkey-value = '*'.
|
||||
INSERT ls_objkey INTO TABLE lt_objkey.
|
||||
CLEAR ls_objkey.
|
||||
lv_non_value_pos = lv_non_value_pos + 1.
|
||||
lv_objkey_pos = lv_objkey_pos + 1.
|
||||
* object name
|
||||
ELSEIF <ls_object_table>-tobjkey+lv_next_objkey_pos(1) = '&'.
|
||||
"TODO
|
||||
ls_objkey-value = ms_item-obj_name.
|
||||
* The object name might comprise multiple key components (e. g. WDCC)
|
||||
* This string needs to be split
|
||||
distribute_name_to_components(
|
||||
EXPORTING
|
||||
it_key_component = lt_key_fields
|
||||
CHANGING
|
||||
ct_objkey = lt_objkey
|
||||
cs_objkey = ls_objkey
|
||||
cv_non_value_pos = lv_non_value_pos ).
|
||||
CLEAR ls_objkey.
|
||||
lv_objkey_pos = lv_objkey_pos + 1.
|
||||
* language
|
||||
ELSEIF <ls_object_table>-tobjkey+lv_next_objkey_pos(1) = 'L'.
|
||||
ls_objkey-value = sy-langu.
|
||||
INSERT ls_objkey INTO TABLE lt_objkey.
|
||||
CLEAR ls_objkey.
|
||||
lv_non_value_pos = lv_non_value_pos + 1.
|
||||
lv_objkey_pos = lv_objkey_pos + 1.
|
||||
* Client
|
||||
ELSEIF <ls_object_table>-tobjkey+lv_next_objkey_pos(1) = 'C'.
|
||||
ls_objkey-value = sy-mandt.
|
||||
INSERT ls_objkey INTO TABLE lt_objkey.
|
||||
CLEAR ls_objkey.
|
||||
lv_non_value_pos = lv_non_value_pos + 1.
|
||||
lv_objkey_pos = lv_objkey_pos + 1.
|
||||
ENDIF.
|
||||
lv_value_pos = 0.
|
||||
* value
|
||||
ELSE.
|
||||
ls_objkey-value+lv_value_pos(1) = <ls_object_table>-tobjkey+lv_objkey_pos(1).
|
||||
lv_value_pos = lv_value_pos + 1.
|
||||
ENDIF.
|
||||
|
||||
lv_objkey_pos = lv_objkey_pos + 1.
|
||||
ENDWHILE.
|
||||
|
||||
* Similarly to that, fixed values might be supplied in the object key which actually make up key components
|
||||
IF NOT ls_objkey-value IS INITIAL.
|
||||
split_value_to_keys(
|
||||
EXPORTING
|
||||
it_key_component = lt_key_fields
|
||||
CHANGING
|
||||
ct_objkey = lt_objkey
|
||||
cs_objkey = ls_objkey
|
||||
cv_non_value_pos = lv_non_value_pos ).
|
||||
ENDIF.
|
||||
|
||||
* compose the where clause
|
||||
lv_is_asterix = abap_false.
|
||||
lv_key_pos = 1.
|
||||
|
||||
LOOP AT lt_key_fields ASSIGNING <ls_table_field>.
|
||||
READ TABLE lt_objkey INTO ls_objkey
|
||||
WITH TABLE KEY num = lv_key_pos.
|
||||
IF sy-subrc <> 0 OR <ls_table_field>-fieldname = 'LANGU'.
|
||||
CLEAR ls_objkey.
|
||||
lv_key_pos = lv_key_pos + 1.
|
||||
CONTINUE.
|
||||
ENDIF.
|
||||
IF ls_objkey-value = '*'.
|
||||
lv_is_asterix = rs_c_true.
|
||||
ENDIF.
|
||||
IF lv_is_asterix = rs_c_true.
|
||||
CONTINUE.
|
||||
ENDIF.
|
||||
IF NOT lv_where_statement IS INITIAL.
|
||||
CONCATENATE lv_where_statement 'AND' INTO lv_where_statement
|
||||
SEPARATED BY space.
|
||||
ENDIF.
|
||||
CONCATENATE '''' ls_objkey-value '''' INTO lv_value128.
|
||||
CONCATENATE lv_where_statement <ls_table_field>-fieldname '='
|
||||
lv_value128 INTO lv_where_statement SEPARATED BY space.
|
||||
lv_key_pos = lv_key_pos + 1.
|
||||
ENDLOOP.
|
||||
|
||||
rv_where = condense( lv_where_statement ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD serialize.
|
||||
|
||||
before_export( ).
|
||||
|
||||
serialize_data( io_xml ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD serialize_data.
|
||||
|
||||
DATA: lr_ref TYPE REF TO data,
|
||||
lv_where TYPE string.
|
||||
|
||||
FIELD-SYMBOLS: <lt_data> TYPE STANDARD TABLE,
|
||||
<ls_object_table> LIKE LINE OF mt_object_table.
|
||||
|
||||
|
||||
LOOP AT mt_object_table ASSIGNING <ls_object_table>.
|
||||
|
||||
CREATE DATA lr_ref TYPE STANDARD TABLE OF (<ls_object_table>-tobj_name).
|
||||
ASSIGN lr_ref->* TO <lt_data>.
|
||||
|
||||
lv_where = get_where_clause( <ls_object_table>-tobj_name ).
|
||||
|
||||
SELECT * FROM (<ls_object_table>-tobj_name)
|
||||
INTO TABLE <lt_data>
|
||||
WHERE (lv_where).
|
||||
|
||||
io_xml->add(
|
||||
iv_name = <ls_object_table>-tobj_name
|
||||
ig_data = <lt_data> ).
|
||||
|
||||
ENDLOOP.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD split_value_to_keys.
|
||||
|
||||
DATA: lt_key_component_uncovered LIKE it_key_component,
|
||||
ls_dummy LIKE LINE OF ct_objkey,
|
||||
ls_key_component_uncovered LIKE LINE OF lt_key_component_uncovered,
|
||||
ls_objkey_sub LIKE cs_objkey,
|
||||
lv_objkey_sub_pos TYPE i.
|
||||
|
||||
|
||||
lt_key_component_uncovered = it_key_component.
|
||||
|
||||
* we want to fill the atribute values which are not covered by explicit key components yet
|
||||
LOOP AT ct_objkey INTO ls_dummy.
|
||||
DELETE lt_key_component_uncovered INDEX 1.
|
||||
ENDLOOP.
|
||||
|
||||
ls_objkey_sub-num = cs_objkey-num.
|
||||
lv_objkey_sub_pos = 0.
|
||||
LOOP AT lt_key_component_uncovered INTO ls_key_component_uncovered.
|
||||
CLEAR ls_objkey_sub-value.
|
||||
ls_objkey_sub-value = cs_objkey-value+lv_objkey_sub_pos(ls_key_component_uncovered-leng).
|
||||
ls_objkey_sub-num = cv_non_value_pos.
|
||||
|
||||
INSERT ls_objkey_sub INTO TABLE ct_objkey.
|
||||
|
||||
lv_objkey_sub_pos = lv_objkey_sub_pos + ls_key_component_uncovered-leng.
|
||||
cv_non_value_pos = cv_non_value_pos + 1.
|
||||
CLEAR ls_objkey_sub.
|
||||
|
||||
IF lv_objkey_sub_pos = strlen( cs_objkey-value ).
|
||||
cs_objkey-num = cv_non_value_pos.
|
||||
EXIT. "end splitting - all characters captured
|
||||
ENDIF.
|
||||
ENDLOOP.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD validate.
|
||||
|
||||
DATA: lv_where TYPE string,
|
||||
lv_primary TYPE objsl-tobj_name,
|
||||
lr_ref TYPE REF TO data.
|
||||
|
||||
FIELD-SYMBOLS: <lt_data> TYPE STANDARD TABLE.
|
||||
|
||||
|
||||
lv_primary = get_primary_table( ).
|
||||
|
||||
CREATE DATA lr_ref TYPE STANDARD TABLE OF (lv_primary).
|
||||
ASSIGN lr_ref->* TO <lt_data>.
|
||||
|
||||
io_xml->read(
|
||||
EXPORTING
|
||||
iv_name = lv_primary
|
||||
CHANGING
|
||||
cg_data = <lt_data> ).
|
||||
|
||||
IF lines( <lt_data> ) = 0.
|
||||
zcx_abapgit_exception=>raise( |Primary table { lv_primary
|
||||
} not found in imported container | ).
|
||||
ELSEIF lines( <lt_data> ) <> 1.
|
||||
zcx_abapgit_exception=>raise( |Primary table { lv_primary
|
||||
} contains more than one instance! | ).
|
||||
ENDIF.
|
||||
|
||||
lv_where = get_where_clause( lv_primary ).
|
||||
|
||||
* validate that max one local instance was affected by the import
|
||||
SELECT COUNT(*) FROM (lv_primary) WHERE (lv_where).
|
||||
IF sy-dbcnt > 1.
|
||||
zcx_abapgit_exception=>raise( |More than one instance exists locally in primary table {
|
||||
lv_primary }| ).
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
|
@ -0,0 +1,41 @@
|
|||
CLASS ltcl_test DEFINITION FOR TESTING
|
||||
DURATION SHORT
|
||||
RISK LEVEL HARMLESS FINAL.
|
||||
|
||||
PRIVATE SECTION.
|
||||
METHODS: serialize FOR TESTING RAISING zcx_abapgit_exception.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS ltcl_test IMPLEMENTATION.
|
||||
|
||||
METHOD serialize.
|
||||
|
||||
DATA: lo_cut TYPE REF TO zcl_abapgit_objects_generic,
|
||||
lo_xml TYPE REF TO zcl_abapgit_xml_output,
|
||||
ls_item TYPE zif_abapgit_definitions=>ty_item.
|
||||
|
||||
* assumption: this object exists in all SAP systems
|
||||
ls_item-obj_type = 'ASFC'.
|
||||
ls_item-obj_name = 'SAP_AS_TEST_001'.
|
||||
|
||||
CREATE OBJECT lo_cut
|
||||
EXPORTING
|
||||
is_item = ls_item.
|
||||
|
||||
CREATE OBJECT lo_xml.
|
||||
|
||||
lo_cut->serialize( lo_xml ).
|
||||
* checks that it does not dump
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
* todo, implement tests for methods:
|
||||
* DISTRIBUTE_NAME_TO_COMPONENTS
|
||||
* GET_KEY_FIELDS
|
||||
* GET_PRIMARY_TABLE
|
||||
* GET_WHERE_CLAUSE
|
||||
* SPLIT_VALUE_TO_KEYS
|
||||
|
||||
ENDCLASS.
|
19
src/objects/zcl_abapgit_objects_generic.clas.xml
Normal file
19
src/objects/zcl_abapgit_objects_generic.clas.xml
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<VSEOCLASS>
|
||||
<CLSNAME>ZCL_ABAPGIT_OBJECTS_GENERIC</CLSNAME>
|
||||
<VERSION>1</VERSION>
|
||||
<LANGU>E</LANGU>
|
||||
<DESCRIPT>Generic object helper</DESCRIPT>
|
||||
<EXPOSURE>2</EXPOSURE>
|
||||
<STATE>1</STATE>
|
||||
<CLSCCINCL>X</CLSCCINCL>
|
||||
<FIXPT>X</FIXPT>
|
||||
<UNICODE>X</UNICODE>
|
||||
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
|
||||
</VSEOCLASS>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
Loading…
Reference in New Issue
Block a user