move contents of ZCL_ABAPGIT_OBJECT_TABL_VALID to

move contents of ZCL_ABAPGIT_OBJECT_TABL_VALID to ZCL_ABAPGIT_OBJECT_TABL_COMPAR

#2436
This commit is contained in:
larshp 2019-02-21 14:01:19 +00:00 committed by Lars Hvam
parent 7ff994dd03
commit 452c72d6ce
3 changed files with 167 additions and 200 deletions

View File

@ -10,9 +10,43 @@ CLASS zcl_abapgit_object_tabl_compar DEFINITION
IMPORTING IMPORTING
!io_local TYPE REF TO zcl_abapgit_xml_input . !io_local TYPE REF TO zcl_abapgit_xml_input .
PROTECTED SECTION. PROTECTED SECTION.
PRIVATE SECTION.
TYPES:
tty_founds TYPE STANDARD TABLE OF rsfindlst
WITH NON-UNIQUE DEFAULT KEY .
TYPES:
tty_seu_obj TYPE STANDARD TABLE OF seu_obj
WITH NON-UNIQUE DEFAULT KEY .
DATA mo_local TYPE REF TO zcl_abapgit_xml_input . DATA mo_local TYPE REF TO zcl_abapgit_xml_input .
METHODS get_where_used_recursive
IMPORTING
!iv_object_name TYPE csequence
!iv_depth TYPE i
!iv_object_type TYPE euobj-id
!it_scope TYPE tty_seu_obj
RETURNING
VALUE(rt_founds_all) TYPE tty_founds
RAISING
zcx_abapgit_exception .
METHODS is_structure_used_in_db_table
IMPORTING
!iv_object_name TYPE dd02v-tabname
RETURNING
VALUE(rv_is_structure_used_in_db_tab) TYPE abap_bool
RAISING
zcx_abapgit_exception .
METHODS validate
IMPORTING
!io_remote_version TYPE REF TO zcl_abapgit_xml_input
!io_local_version TYPE REF TO zcl_abapgit_xml_input
RETURNING
VALUE(rv_message) TYPE string
RAISING
zcx_abapgit_exception .
PRIVATE SECTION.
ENDCLASS. ENDCLASS.
@ -27,14 +61,140 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL_COMPAR IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD get_where_used_recursive.
DATA: lt_findstrings TYPE stringtab,
lt_founds TYPE STANDARD TABLE OF rsfindlst,
lt_scope TYPE tty_seu_obj,
lv_findstring LIKE LINE OF lt_findstrings.
FIELD-SYMBOLS: <ls_found> TYPE rsfindlst.
lt_scope = it_scope.
lv_findstring = iv_object_name.
INSERT lv_findstring INTO TABLE lt_findstrings.
DO iv_depth TIMES.
CLEAR: lt_founds.
CALL FUNCTION 'RS_EU_CROSSREF'
EXPORTING
i_find_obj_cls = iv_object_type
no_dialog = 'X'
TABLES
i_findstrings = lt_findstrings
o_founds = lt_founds
i_scope_object_cls = lt_scope
EXCEPTIONS
not_executed = 1
not_found = 2
illegal_object = 3
no_cross_for_this_object = 4
batch = 5
batchjob_error = 6
wrong_type = 7
object_not_exist = 8
OTHERS = 9.
IF sy-subrc = 1
OR sy-subrc = 2
OR lines( lt_founds ) = 0.
EXIT.
ELSEIF sy-subrc > 2.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
INSERT LINES OF lt_founds INTO TABLE rt_founds_all.
CLEAR: lt_findstrings.
LOOP AT lt_founds ASSIGNING <ls_found>.
lv_findstring = <ls_found>-object.
INSERT lv_findstring INTO TABLE lt_findstrings.
ENDLOOP.
ENDDO.
ENDMETHOD.
METHOD is_structure_used_in_db_table.
DATA: lt_scope TYPE tty_seu_obj,
lt_founds TYPE tty_founds.
APPEND 'TABL' TO lt_scope.
APPEND 'STRU' TO lt_scope.
lt_founds = get_where_used_recursive( iv_object_name = iv_object_name
iv_object_type = 'STRU'
it_scope = lt_scope
iv_depth = 5 ).
DELETE lt_founds WHERE object_cls <> 'DT'.
rv_is_structure_used_in_db_tab = boolc( lines( lt_founds ) > 0 ).
ENDMETHOD.
METHOD validate.
DATA: lt_previous_table_fields TYPE TABLE OF dd03p,
ls_previous_table_field LIKE LINE OF lt_previous_table_fields,
lt_current_table_fields TYPE TABLE OF dd03p,
ls_current_table_field LIKE LINE OF lt_current_table_fields,
ls_dd02v TYPE dd02v.
io_remote_version->read(
EXPORTING
iv_name = 'DD02V'
CHANGING
cg_data = ls_dd02v ).
" We only want to compare transparent tables, or structures used in transparent tables
IF ls_dd02v-tabclass <> 'TRANSP' AND is_structure_used_in_db_table( ls_dd02v-tabname ) = abap_false.
RETURN.
ENDIF.
io_remote_version->read(
EXPORTING
iv_name = 'DD03P_TABLE'
CHANGING
cg_data = lt_previous_table_fields ).
io_local_version->read(
EXPORTING
iv_name = 'DD03P_TABLE'
CHANGING
cg_data = lt_current_table_fields ).
LOOP AT lt_previous_table_fields INTO ls_previous_table_field.
READ TABLE lt_current_table_fields WITH KEY fieldname = ls_previous_table_field-fieldname
INTO ls_current_table_field.
IF sy-subrc = 0.
IF ls_current_table_field-rollname <> ls_previous_table_field-rollname.
rv_message = 'Fields were changed. This may lead to inconsistencies.'.
ENDIF.
ELSE.
rv_message = 'Fields were changed. This may lead to inconsistencies.'.
ENDIF.
ENDLOOP.
IF NOT rv_message IS INITIAL.
rv_message = |Database Table { ls_dd02v-tabname }: { rv_message }|.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_comparator~compare. METHOD zif_abapgit_comparator~compare.
DATA: lo_table_validation TYPE REF TO zcl_abapgit_object_tabl_valid. rs_result-text = validate(
CREATE OBJECT lo_table_validation.
rs_result-text = lo_table_validation->validate(
io_remote_version = io_remote io_remote_version = io_remote
io_local_version = mo_local ). io_local_version = mo_local ).

View File

@ -1,176 +0,0 @@
CLASS zcl_abapgit_object_tabl_valid DEFINITION PUBLIC FINAL.
PUBLIC SECTION.
METHODS validate
IMPORTING
io_remote_version TYPE REF TO zcl_abapgit_xml_input
io_local_version TYPE REF TO zcl_abapgit_xml_input
RETURNING
VALUE(rv_message) TYPE string
RAISING
zcx_abapgit_exception.
PROTECTED SECTION.
PRIVATE SECTION.
TYPES:
tty_founds TYPE STANDARD TABLE OF rsfindlst
WITH NON-UNIQUE DEFAULT KEY,
tty_seu_obj TYPE STANDARD TABLE OF seu_obj
WITH NON-UNIQUE DEFAULT KEY.
METHODS:
get_where_used_recursive
IMPORTING
iv_object_name TYPE csequence
iv_depth TYPE i
iv_object_type TYPE euobj-id
it_scope TYPE tty_seu_obj
RETURNING
VALUE(rt_founds_all) TYPE tty_founds
RAISING
zcx_abapgit_exception,
is_structure_used_in_db_table
IMPORTING
iv_object_name TYPE dd02v-tabname
RETURNING
VALUE(rv_is_structure_used_in_db_tab) TYPE abap_bool
RAISING
zcx_abapgit_exception.
ENDCLASS.
CLASS ZCL_ABAPGIT_OBJECT_TABL_VALID IMPLEMENTATION.
METHOD get_where_used_recursive.
DATA: lt_findstrings TYPE stringtab,
lt_founds TYPE STANDARD TABLE OF rsfindlst,
lt_scope TYPE tty_seu_obj,
lv_findstring LIKE LINE OF lt_findstrings.
FIELD-SYMBOLS: <ls_found> TYPE rsfindlst.
lt_scope = it_scope.
lv_findstring = iv_object_name.
INSERT lv_findstring INTO TABLE lt_findstrings.
DO iv_depth TIMES.
CLEAR: lt_founds.
CALL FUNCTION 'RS_EU_CROSSREF'
EXPORTING
i_find_obj_cls = iv_object_type
no_dialog = 'X'
TABLES
i_findstrings = lt_findstrings
o_founds = lt_founds
i_scope_object_cls = lt_scope
EXCEPTIONS
not_executed = 1
not_found = 2
illegal_object = 3
no_cross_for_this_object = 4
batch = 5
batchjob_error = 6
wrong_type = 7
object_not_exist = 8
OTHERS = 9.
IF sy-subrc = 1
OR sy-subrc = 2
OR lines( lt_founds ) = 0.
EXIT.
ELSEIF sy-subrc > 2.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
INSERT LINES OF lt_founds INTO TABLE rt_founds_all.
CLEAR: lt_findstrings.
LOOP AT lt_founds ASSIGNING <ls_found>.
lv_findstring = <ls_found>-object.
INSERT lv_findstring INTO TABLE lt_findstrings.
ENDLOOP.
ENDDO.
ENDMETHOD.
METHOD is_structure_used_in_db_table.
DATA: lt_scope TYPE tty_seu_obj,
lt_founds TYPE tty_founds.
APPEND 'TABL' TO lt_scope.
APPEND 'STRU' TO lt_scope.
lt_founds = get_where_used_recursive( iv_object_name = iv_object_name
iv_object_type = 'STRU'
it_scope = lt_scope
iv_depth = 5 ).
DELETE lt_founds WHERE object_cls <> 'DT'.
rv_is_structure_used_in_db_tab = boolc( lines( lt_founds ) > 0 ).
ENDMETHOD.
METHOD validate.
DATA: lt_previous_table_fields TYPE TABLE OF dd03p,
ls_previous_table_field LIKE LINE OF lt_previous_table_fields,
lt_current_table_fields TYPE TABLE OF dd03p,
ls_current_table_field LIKE LINE OF lt_current_table_fields,
ls_dd02v TYPE dd02v.
io_remote_version->read(
EXPORTING
iv_name = 'DD02V'
CHANGING
cg_data = ls_dd02v ).
" We only want to compare transparent tables, or structures used in transparent tables
IF ls_dd02v-tabclass <> 'TRANSP' AND is_structure_used_in_db_table( ls_dd02v-tabname ) = abap_false.
RETURN.
ENDIF.
io_remote_version->read(
EXPORTING
iv_name = 'DD03P_TABLE'
CHANGING
cg_data = lt_previous_table_fields ).
io_local_version->read(
EXPORTING
iv_name = 'DD03P_TABLE'
CHANGING
cg_data = lt_current_table_fields ).
LOOP AT lt_previous_table_fields INTO ls_previous_table_field.
READ TABLE lt_current_table_fields WITH KEY fieldname = ls_previous_table_field-fieldname
INTO ls_current_table_field.
IF sy-subrc = 0.
IF ls_current_table_field-rollname <> ls_previous_table_field-rollname.
rv_message = 'Fields were changed. This may lead to inconsistencies.'.
ENDIF.
ELSE.
rv_message = 'Fields were changed. This may lead to inconsistencies.'.
ENDIF.
ENDLOOP.
IF NOT rv_message IS INITIAL.
rv_message = |Database Table { ls_dd02v-tabname }: { rv_message }|.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@ -1,17 +0,0 @@
<?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_TABL_VALID</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>TABL valid</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>