abapGit/src/objects/sap/zcl_abapgit_sap_report.clas.abap
Marc Bernard a23c1d6d58
Fix extended check issues - Part 3 (#7088)
Co-authored-by: Lars Hvam <larshp@hotmail.com>
2024-12-05 17:35:53 +01:00

269 lines
7.5 KiB
ABAP

CLASS zcl_abapgit_sap_report DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES zif_abapgit_sap_report.
PROTECTED SECTION.
PRIVATE SECTION.
METHODS authorization_check
IMPORTING
iv_mode TYPE csequence
is_item TYPE zif_abapgit_definitions=>ty_item
RAISING
zcx_abapgit_exception.
ENDCLASS.
CLASS zcl_abapgit_sap_report IMPLEMENTATION.
METHOD authorization_check.
IF is_item IS NOT INITIAL.
TRY.
CALL FUNCTION 'RS_ACCESS_PERMISSION'
EXPORTING
mode = iv_mode
object = is_item-obj_name
object_class = is_item-obj_type
suppress_corr_check = abap_true
suppress_language_check = abap_true
suppress_extend_dialog = abap_true
abap_langu_version_upon_insert = is_item-abap_language_version " does not exist on lower releases
EXCEPTIONS
canceled_in_corr = 1
enqueued_by_user = 2
enqueue_system_failure = 3
illegal_parameter_values = 4
locked_by_author = 5
no_modify_permission = 6
no_show_permission = 7
permission_failure = 8
request_language_denied = 9
OTHERS = 10 ##FM_SUBRC_OK.
CATCH cx_sy_dyn_call_param_not_found.
CALL FUNCTION 'RS_ACCESS_PERMISSION'
EXPORTING
mode = iv_mode
object = is_item-obj_name
object_class = is_item-obj_type
suppress_corr_check = abap_true
suppress_language_check = abap_true
suppress_extend_dialog = abap_true
EXCEPTIONS
canceled_in_corr = 1
enqueued_by_user = 2
enqueue_system_failure = 3
illegal_parameter_values = 4
locked_by_author = 5
no_modify_permission = 6
no_show_permission = 7
permission_failure = 8
request_language_denied = 9
OTHERS = 10 ##FM_SUBRC_OK.
ENDTRY.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_sap_report~delete_report.
authorization_check(
iv_mode = 'DELETE'
is_item = is_item ).
DELETE REPORT iv_name.
IF sy-subrc <> 0 AND iv_raise_error = abap_true.
zcx_abapgit_exception=>raise( |Error deleting report { iv_name }| ).
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_sap_report~insert_report.
ASSERT iv_state CA ' AI'.
ASSERT iv_program_type CA ' 1FIJKMST'.
authorization_check(
iv_mode = 'MODIFY'
is_item = is_item ).
IF iv_state IS INITIAL.
INSERT REPORT iv_name FROM it_source.
ELSEIF iv_program_type IS INITIAL AND iv_extension_type IS INITIAL.
INSERT REPORT iv_name FROM it_source
STATE iv_state.
ELSEIF iv_extension_type IS INITIAL.
INSERT REPORT iv_name FROM it_source
STATE iv_state
PROGRAM TYPE iv_program_type.
ELSE.
INSERT REPORT iv_name FROM it_source
STATE iv_state
EXTENSION TYPE iv_extension_type
PROGRAM TYPE iv_program_type.
ENDIF.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Error inserting report { iv_name }| ).
ENDIF.
" In lower releases, INSERT REPORT does not support setting ABAP Language version (VERSION)
" Therefore, update the flag directly
UPDATE progdir SET uccheck = iv_version WHERE name = iv_name AND state = iv_state.
ENDMETHOD.
METHOD zif_abapgit_sap_report~read_progdir.
DATA ls_sapdir TYPE progdir.
CALL FUNCTION 'READ_PROGDIR'
EXPORTING
i_progname = iv_name
i_state = iv_state
IMPORTING
e_progdir = ls_sapdir
EXCEPTIONS
not_exists = 1
OTHERS = 2.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
MOVE-CORRESPONDING ls_sapdir TO rs_progdir.
CLEAR: rs_progdir-edtx,
rs_progdir-cnam,
rs_progdir-cdat,
rs_progdir-unam,
rs_progdir-udat,
rs_progdir-levl,
rs_progdir-vern,
rs_progdir-rmand,
rs_progdir-sdate,
rs_progdir-stime,
rs_progdir-idate,
rs_progdir-itime,
rs_progdir-varcl,
rs_progdir-state.
ENDMETHOD.
METHOD zif_abapgit_sap_report~read_report.
ASSERT iv_state CA ' AI'.
authorization_check(
iv_mode = 'SHOW'
is_item = is_item ).
IF iv_state IS INITIAL.
READ REPORT iv_name INTO rt_source.
ELSE.
READ REPORT iv_name INTO rt_source STATE iv_state.
ENDIF.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Error reading report { iv_name }| ).
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_sap_report~update_progdir.
DATA ls_progdir_new TYPE progdir.
CALL FUNCTION 'READ_PROGDIR'
EXPORTING
i_progname = is_progdir-name
i_state = iv_state
IMPORTING
e_progdir = ls_progdir_new
EXCEPTIONS
not_exists = 1
OTHERS = 2.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'Error reading program directory' ).
ENDIF.
ls_progdir_new-ldbname = is_progdir-ldbname.
ls_progdir_new-dbna = is_progdir-dbna.
ls_progdir_new-dbapl = is_progdir-dbapl.
ls_progdir_new-rload = is_progdir-rload.
ls_progdir_new-fixpt = is_progdir-fixpt.
ls_progdir_new-appl = is_progdir-appl.
ls_progdir_new-rstat = is_progdir-rstat.
ls_progdir_new-uccheck = is_progdir-uccheck.
ls_progdir_new-sqlx = is_progdir-sqlx.
ls_progdir_new-clas = is_progdir-clas.
ls_progdir_new-secu = is_progdir-secu.
CALL FUNCTION 'UPDATE_PROGDIR'
EXPORTING
i_progdir = ls_progdir_new
i_progname = ls_progdir_new-name
i_state = ls_progdir_new-state
EXCEPTIONS
not_executed = 1
OTHERS = 2.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'Error updating program directory' ).
ENDIF.
" Function UPDATE_PROGDIR does not update VARCL, so we do it here
SELECT SINGLE * FROM progdir INTO ls_progdir_new
WHERE name = ls_progdir_new-name
AND state = ls_progdir_new-state.
IF sy-subrc = 0 AND is_progdir-varcl <> ls_progdir_new-varcl.
UPDATE progdir SET varcl = is_progdir-varcl
WHERE name = ls_progdir_new-name
AND state = ls_progdir_new-state. "#EC CI_SUBRC
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_sap_report~update_report.
DATA lt_new TYPE string_table.
DATA lt_old TYPE string_table.
lt_new = it_source.
lt_old = zif_abapgit_sap_report~read_report( iv_name ).
IF lt_old <> lt_new.
zif_abapgit_sap_report~insert_report(
iv_name = iv_name
it_source = it_source
iv_state = iv_state
iv_program_type = iv_program_type
iv_extension_type = iv_extension_type
iv_package = iv_package
iv_version = iv_version
is_item = is_item ).
rv_updated = abap_true.
ELSE.
rv_updated = abap_false.
ENDIF.
ENDMETHOD.
ENDCLASS.