From e50a7dcc3cdb73f4d56d8b061e86555246357798 Mon Sep 17 00:00:00 2001 From: yellappam Date: Wed, 27 Apr 2022 02:33:21 +1200 Subject: [PATCH] Clear metadata fields (#5464) * Add zcl_abapgit_rule and zif_abapgit_rule * Insert clear and fill logic * Pass rule to the generic serializer in IWSG class * Remove extra space * Remove inline declaration * Format the code * Replace CHECK with IF * Rename class/interface * Multiple changes Rename method name Change method signature Remove clear field * loop over all fields of given fields * Align method call parameters * Remove class reference for member * Use string template to convert to type Co-authored-by: Lars Hvam Co-authored-by: Marc Bernard <59966492+mbtools@users.noreply.github.com> --- src/objects/zcl_abapgit_field_rules.clas.abap | 108 ++++++++++++++++++ src/objects/zcl_abapgit_field_rules.clas.xml | 16 +++ src/objects/zcl_abapgit_object_iwsg.clas.abap | 31 ++++- .../zcl_abapgit_objects_generic.clas.abap | 39 ++++++- src/objects/zif_abapgit_field_rules.intf.abap | 30 +++++ src/objects/zif_abapgit_field_rules.intf.xml | 15 +++ 6 files changed, 235 insertions(+), 4 deletions(-) create mode 100644 src/objects/zcl_abapgit_field_rules.clas.abap create mode 100644 src/objects/zcl_abapgit_field_rules.clas.xml create mode 100644 src/objects/zif_abapgit_field_rules.intf.abap create mode 100644 src/objects/zif_abapgit_field_rules.intf.xml diff --git a/src/objects/zcl_abapgit_field_rules.clas.abap b/src/objects/zcl_abapgit_field_rules.clas.abap new file mode 100644 index 000000000..19d725ffd --- /dev/null +++ b/src/objects/zcl_abapgit_field_rules.clas.abap @@ -0,0 +1,108 @@ +CLASS zcl_abapgit_field_rules DEFINITION + PUBLIC + FINAL + CREATE PRIVATE . + + PUBLIC SECTION. + + INTERFACES zif_abapgit_field_rules. + CLASS-METHODS create + RETURNING + VALUE(ro_result) TYPE REF TO zif_abapgit_field_rules. + PROTECTED SECTION. + PRIVATE SECTION. + TYPES: + BEGIN OF ty_item, + tabname TYPE tabname, + fieldname TYPE fieldname, + fill_rule TYPE zif_abapgit_field_rules=>ty_fill_rule, + END OF ty_item, + ty_items TYPE SORTED TABLE OF ty_item WITH UNIQUE KEY tabname fieldname. + + DATA mt_item TYPE ty_items. + + METHODS fill_value + IMPORTING + iv_rule TYPE zif_abapgit_field_rules=>ty_fill_rule + CHANGING + cv_value TYPE any. +ENDCLASS. + + + +CLASS zcl_abapgit_field_rules IMPLEMENTATION. + + METHOD create. + CREATE OBJECT ro_result TYPE zcl_abapgit_field_rules. + ENDMETHOD. + + METHOD zif_abapgit_field_rules~add. + DATA ls_item TYPE ty_item. + + ls_item-tabname = iv_table. + ls_item-fieldname = iv_field. + ls_item-fill_rule = iv_fill_rule. + INSERT ls_item INTO TABLE mt_item. + + ro_self = me. + ENDMETHOD. + + + METHOD zif_abapgit_field_rules~apply_clear_logic. + DATA ls_item TYPE ty_item. + + FIELD-SYMBOLS TYPE any. + FIELD-SYMBOLS TYPE any. + + IF mt_item IS INITIAL. + RETURN. + ENDIF. + + LOOP AT ct_data ASSIGNING . + LOOP AT mt_item INTO ls_item WHERE tabname = iv_table. + ASSIGN COMPONENT ls_item-fieldname OF STRUCTURE TO . + IF sy-subrc = 0. + CLEAR . + ENDIF. + ENDLOOP. + ENDLOOP. + ENDMETHOD. + + METHOD zif_abapgit_field_rules~apply_fill_logic. + DATA ls_item TYPE ty_item. + + FIELD-SYMBOLS TYPE any. + FIELD-SYMBOLS TYPE any. + + IF mt_item IS INITIAL. + RETURN. + ENDIF. + + LOOP AT ct_data ASSIGNING . + LOOP AT mt_item INTO ls_item WHERE tabname = iv_table. + ASSIGN COMPONENT ls_item-fieldname OF STRUCTURE TO . + IF sy-subrc = 0. + fill_value( EXPORTING iv_rule = ls_item-fill_rule + CHANGING cv_value = ). + ENDIF. + ENDLOOP. + ENDLOOP. + ENDMETHOD. + + + METHOD fill_value. + CASE iv_rule. + WHEN zif_abapgit_field_rules=>c_fill_rule-date. + cv_value = sy-datum. + WHEN zif_abapgit_field_rules=>c_fill_rule-time. + cv_value = sy-uzeit. + WHEN zif_abapgit_field_rules=>c_fill_rule-timestamp. + GET TIME STAMP FIELD cv_value. + WHEN zif_abapgit_field_rules=>c_fill_rule-user. + cv_value = sy-uname. + WHEN zif_abapgit_field_rules=>c_fill_rule-client. + cv_value = sy-mandt. + ENDCASE. + ENDMETHOD. + +ENDCLASS. diff --git a/src/objects/zcl_abapgit_field_rules.clas.xml b/src/objects/zcl_abapgit_field_rules.clas.xml new file mode 100644 index 000000000..180a2f5e7 --- /dev/null +++ b/src/objects/zcl_abapgit_field_rules.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_FIELD_RULES + E + abapGit Rule + 1 + X + X + X + + + + diff --git a/src/objects/zcl_abapgit_object_iwsg.clas.abap b/src/objects/zcl_abapgit_object_iwsg.clas.abap index e7c3b6aa7..79d9b927d 100644 --- a/src/objects/zcl_abapgit_object_iwsg.clas.abap +++ b/src/objects/zcl_abapgit_object_iwsg.clas.abap @@ -14,6 +14,9 @@ CLASS zcl_abapgit_object_iwsg DEFINITION RAISING zcx_abapgit_exception . PRIVATE SECTION. + METHODS get_field_rules + RETURNING + VALUE(ro_result) TYPE REF TO zif_abapgit_field_rules. ENDCLASS. @@ -25,8 +28,9 @@ CLASS zcl_abapgit_object_iwsg IMPLEMENTATION. CREATE OBJECT ro_generic EXPORTING - is_item = ms_item - iv_language = mv_language. + io_field_rules = get_field_rules( ) + is_item = ms_item + iv_language = mv_language. ENDMETHOD. @@ -98,4 +102,27 @@ CLASS zcl_abapgit_object_iwsg IMPLEMENTATION. get_generic( )->serialize( io_xml ). ENDMETHOD. + + METHOD get_field_rules. + + ro_result = zcl_abapgit_field_rules=>create( ). + ro_result->add( + iv_table = '/IWFND/I_MED_SRH' + iv_field = 'CREATED_BY' + iv_fill_rule = zif_abapgit_field_rules=>c_fill_rule-user + )->add( + iv_table = '/IWFND/I_MED_SRH' + iv_field = 'CREATED_TIMESTMP' + iv_fill_rule = zif_abapgit_field_rules=>c_fill_rule-timestamp + )->add( + iv_table = '/IWFND/I_MED_SRH' + iv_field = 'CHANGED_BY' + iv_fill_rule = zif_abapgit_field_rules=>c_fill_rule-user + )->add( + iv_table = '/IWFND/I_MED_SRH' + iv_field = 'CHANGED_TIMESTMP' + iv_fill_rule = zif_abapgit_field_rules=>c_fill_rule-timestamp ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_objects_generic.clas.abap b/src/objects/zcl_abapgit_objects_generic.clas.abap index e63322ea9..5cb892d42 100644 --- a/src/objects/zcl_abapgit_objects_generic.clas.abap +++ b/src/objects/zcl_abapgit_objects_generic.clas.abap @@ -6,8 +6,9 @@ CLASS zcl_abapgit_objects_generic DEFINITION METHODS constructor IMPORTING - !is_item TYPE zif_abapgit_definitions=>ty_item - !iv_language TYPE spras DEFAULT sy-langu + !is_item TYPE zif_abapgit_definitions=>ty_item + !iv_language TYPE spras DEFAULT sy-langu + io_field_rules TYPE REF TO zif_abapgit_field_rules OPTIONAL RAISING zcx_abapgit_exception . METHODS delete @@ -105,6 +106,18 @@ CLASS zcl_abapgit_objects_generic DEFINITION RAISING zcx_abapgit_exception . PRIVATE SECTION. + DATA mo_field_rules TYPE REF TO zif_abapgit_field_rules. + + METHODS apply_clear_logic + IMPORTING + iv_table TYPE objsl-tobj_name + CHANGING + ct_data TYPE STANDARD TABLE. + METHODS apply_fill_logic + IMPORTING + iv_table TYPE objsl-tobj_name + CHANGING + ct_data TYPE STANDARD TABLE. ENDCLASS. @@ -213,6 +226,7 @@ CLASS zcl_abapgit_objects_generic IMPLEMENTATION. ms_item = is_item. mv_language = iv_language. + mo_field_rules = io_field_rules. ENDMETHOD. @@ -295,6 +309,8 @@ CLASS zcl_abapgit_objects_generic IMPLEMENTATION. CREATE DATA lr_ref TYPE STANDARD TABLE OF (-tobj_name). ASSIGN lr_ref->* TO . + apply_fill_logic( EXPORTING iv_table = -tobj_name + CHANGING ct_data = ). io_xml->read( EXPORTING iv_name = -tobj_name @@ -609,6 +625,9 @@ CLASS zcl_abapgit_objects_generic IMPLEMENTATION. WHERE (lv_where) ORDER BY PRIMARY KEY. + apply_clear_logic( EXPORTING iv_table = -tobj_name + CHANGING ct_data = ). + io_xml->add( iv_name = -tobj_name ig_data = ). @@ -691,4 +710,20 @@ CLASS zcl_abapgit_objects_generic IMPLEMENTATION. ENDIF. ENDMETHOD. + + METHOD apply_clear_logic. + IF mo_field_rules IS BOUND. + mo_field_rules->apply_clear_logic( EXPORTING iv_table = |{ iv_table }| + CHANGING ct_data = ct_data ). + ENDIF. + ENDMETHOD. + + + METHOD apply_fill_logic. + IF mo_field_rules IS BOUND. + mo_field_rules->apply_fill_logic( EXPORTING iv_table = |{ iv_table }| + CHANGING ct_data = ct_data ). + ENDIF. + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zif_abapgit_field_rules.intf.abap b/src/objects/zif_abapgit_field_rules.intf.abap new file mode 100644 index 000000000..553918aa9 --- /dev/null +++ b/src/objects/zif_abapgit_field_rules.intf.abap @@ -0,0 +1,30 @@ +INTERFACE zif_abapgit_field_rules + PUBLIC . + TYPES ty_fill_rule TYPE c LENGTH 2. + CONSTANTS: + BEGIN OF c_fill_rule, + date TYPE ty_fill_rule VALUE 'DT', + time TYPE ty_fill_rule VALUE 'TM', + timestamp TYPE ty_fill_rule VALUE 'TS', + user TYPE ty_fill_rule VALUE 'UR', + client TYPE ty_fill_rule VALUE 'CT', + END OF c_fill_rule. + + METHODS add + IMPORTING + iv_table TYPE tabname + iv_field TYPE fieldname + iv_fill_rule TYPE ty_fill_rule + RETURNING + VALUE(ro_self) TYPE REF TO zif_abapgit_field_rules. + METHODS apply_clear_logic + IMPORTING + iv_table TYPE tabname + CHANGING + ct_data TYPE STANDARD TABLE. + METHODS apply_fill_logic + IMPORTING + iv_table TYPE tabname + CHANGING + ct_data TYPE STANDARD TABLE. +ENDINTERFACE. diff --git a/src/objects/zif_abapgit_field_rules.intf.xml b/src/objects/zif_abapgit_field_rules.intf.xml new file mode 100644 index 000000000..efcc77a0b --- /dev/null +++ b/src/objects/zif_abapgit_field_rules.intf.xml @@ -0,0 +1,15 @@ + + + + + + ZIF_ABAPGIT_FIELD_RULES + E + abapGit Rule + 2 + 1 + X + + + +