├── .abapgit.xml ├── ABApTestinator └── TestDeserialize │ ├── Z8M_COMPARE_BIN_JSON.report.abap │ ├── Z_CALLFUNC_UPD_BIN.func.abap │ └── Z_CALLFUNC_UPD_JSON.func.abap ├── LICENSE ├── README.md ├── src ├── package.devc.xml ├── zc8a005_control.acid.xml ├── zc8a_005_demo │ ├── README.md │ ├── package.devc.xml │ ├── zc8a_005_demo_rep.prog.abap │ ├── zc8a_005_demo_rep.prog.xml │ ├── zc8a_005_demo_rep_cls10.prog.abap │ ├── zc8a_005_demo_rep_cls10.prog.xml │ ├── zc8a_005_demo_rep_cls11.prog.abap │ ├── zc8a_005_demo_rep_cls11.prog.xml │ ├── zc8a_005_demo_rep_cls99.prog.abap │ ├── zc8a_005_demo_rep_cls99.prog.xml │ ├── zc8a_005_demo_rep_data.prog.abap │ ├── zc8a_005_demo_rep_data.prog.xml │ ├── zc8a_005_demo_rep_evnt.prog.abap │ ├── zc8a_005_demo_rep_evnt.prog.xml │ ├── zc8a_005_demo_rep_scrn.prog.abap │ ├── zc8a_005_demo_rep_scrn.prog.xml │ ├── zfg_c8a_005_demo_upd.fugr.lzfg_c8a_005_demo_updtop.abap │ ├── zfg_c8a_005_demo_upd.fugr.lzfg_c8a_005_demo_updtop.xml │ ├── zfg_c8a_005_demo_upd.fugr.saplzfg_c8a_005_demo_upd.abap │ ├── zfg_c8a_005_demo_upd.fugr.saplzfg_c8a_005_demo_upd.xml │ ├── zfg_c8a_005_demo_upd.fugr.xml │ ├── zfg_c8a_005_demo_upd.fugr.z_c8a_005_demo_upd_head_item.abap │ ├── zfg_c8a_005_demo_upd.fugr.z_c8a_005_demo_upd_sample.abap │ ├── ztc8a005_head.tabl.xml │ ├── ztc8a005_head_tab_type.ttyp.xml │ ├── ztc8a005_item.tabl.xml │ ├── ztc8a005_item_tab_type.ttyp.xml │ ├── ztc8a005_sample.tabl.xml │ └── ztc8a005_sample_tab_type.ttyp.xml ├── zcl_c8a005_group_tab.clas.abap ├── zcl_c8a005_group_tab.clas.testclasses.abap ├── zcl_c8a005_group_tab.clas.xml ├── zcl_c8a005_save2db.clas.abap ├── zcl_c8a005_save2db.clas.testclasses.abap ├── zcl_c8a005_save2db.clas.xml ├── zcl_c8a005_tab_json.clas.abap ├── zcl_c8a005_tab_json.clas.xml ├── zcl_c8a005_tabtype.clas.abap ├── zcl_c8a005_tabtype.clas.testclasses.abap ├── zcl_c8a005_tabtype.clas.xml ├── zcx_c8a005_error.clas.abap ├── zcx_c8a005_error.clas.xml ├── zfg_c8a005_upd.fugr.lzfg_c8a005_updd01.abap ├── zfg_c8a005_upd.fugr.lzfg_c8a005_updd01.xml ├── zfg_c8a005_upd.fugr.lzfg_c8a005_updp01.abap ├── zfg_c8a005_upd.fugr.lzfg_c8a005_updp01.xml ├── zfg_c8a005_upd.fugr.lzfg_c8a005_updtop.abap ├── zfg_c8a005_upd.fugr.lzfg_c8a005_updtop.xml ├── zfg_c8a005_upd.fugr.saplzfg_c8a005_upd.abap ├── zfg_c8a005_upd.fugr.saplzfg_c8a005_upd.xml ├── zfg_c8a005_upd.fugr.xml ├── zfg_c8a005_upd.fugr.z_c8a005_dest_byjson.abap ├── zfg_c8a005_upd.fugr.z_c8a005_upd_anytab.abap └── zfg_c8a005_upd.fugr.z_c8a005_upd_byjson.abap └── version_label.svg /.abapgit.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | E 6 | /src/ 7 | PREFIX 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ABApTestinator/TestDeserialize/Z8M_COMPARE_BIN_JSON.report.abap: -------------------------------------------------------------------------------- 1 | REPORT z8m_compare_bin_json. 2 | PARAMETERS: p_mode TYPE char2 DEFAULT '10'. 3 | PARAMETERS: likebopf RADIOBUTTON GROUP rad1, 4 | imp_opt RADIOBUTTON GROUP rad1, 5 | json RADIOBUTTON GROUP rad1 DEFAULT 'X'. 6 | 7 | CLASS lcl_app_main DEFINITION. 8 | PUBLIC SECTION. 9 | METHODS start_of_sel. 10 | PROTECTED SECTION. 11 | 12 | PRIVATE SECTION. 13 | DATA mt_tab_change TYPE STANDARD TABLE OF ztab_changable. 14 | 15 | METHODS check_xstring IMPORTING no_handling TYPE abap_bool DEFAULT abap_false. 16 | METHODS check_string_json. 17 | METHODS commit_to_start_update_task. 18 | METHODS fill_itab. 19 | ENDCLASS. 20 | 21 | CLASS lcl_app_main IMPLEMENTATION. 22 | METHOD start_of_sel. 23 | fill_itab( ). 24 | CASE abap_true. 25 | WHEN likebopf. 26 | check_xstring( no_handling = abap_true ). 27 | WHEN imp_opt. 28 | check_xstring( ). 29 | WHEN OTHERS. 30 | check_string_json( ). 31 | ENDCASE. 32 | ENDMETHOD. 33 | 34 | METHOD check_xstring. 35 | DATA lv_tabx TYPE xstring. 36 | DATA lv_mode TYPE char2. 37 | 38 | EXPORT data = mt_tab_change TO DATA BUFFER lv_tabx. 39 | 40 | IF no_handling EQ abap_true. 41 | lv_mode = '99'. " magical for likeBOPF 42 | ELSE. 43 | lv_mode = p_mode. 44 | ENDIF. 45 | 46 | CALL FUNCTION 'Z_CALLFUNC_UPD_BIN' 47 | IN UPDATE TASK 48 | EXPORTING 49 | iv_tabname = 'ZTAB_CHANGABLE' " Имя таблицы 50 | iv_tabcontent = lv_tabx 51 | iv_structure_change = lv_mode. 52 | 53 | commit_to_start_update_task( ). 54 | ENDMETHOD. 55 | 56 | METHOD check_string_json. 57 | DATA lv_tab_string TYPE string. 58 | NEW zcl_c8a005_tab_json( )->get_json_string( EXPORTING it_tab_data = mt_tab_change 59 | IMPORTING ev_json_str = lv_tab_string ). 60 | CALL FUNCTION 'Z_CALLFUNC_UPD_JSON' 61 | IN UPDATE TASK 62 | EXPORTING 63 | iv_tabname = 'ZTAB_CHANGABLE' " Имя таблицы 64 | iv_tabcontent = lv_tab_string. 65 | 66 | commit_to_start_update_task( ). 67 | ENDMETHOD. 68 | 69 | METHOD fill_itab. 70 | mt_tab_change = VALUE #( 71 | ( field_key1 = 'KEY_102030401' field2 = '1' field3 = 'ANY_CHAR30_12345VAL1' field4 = 'CHAR10_01' ) 72 | ( field_key1 = 'KEY_102030402' field2 = '2' field3 = 'ANY_CHAR30_12345VAL2' field4 = 'CHAR10_02' ) 73 | ( field_key1 = 'KEY_102030403' field2 = '3' field3 = 'ANY_CHAR30_12345VAL3' field4 = 'CHAR10_03' ) ). 74 | ENDMETHOD. 75 | 76 | METHOD commit_to_start_update_task. 77 | BREAK-POINT. 78 | " before commit - start SE11 and do the changes from testCase with ZTAB_CHANGABLE 79 | " then GO via path (in Debugger User Interface) 80 | " Settings -> Change Debugger Profile/Settins (or SHIFT+F1) 81 | " ->>>>>>> mark option Update Debugging 82 | CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 83 | EXPORTING 84 | wait = abap_true. 85 | ENDMETHOD. 86 | ENDCLASS. 87 | 88 | START-OF-SELECTION. 89 | NEW lcl_app_main( )->start_of_sel( ). 90 | -------------------------------------------------------------------------------- /ABApTestinator/TestDeserialize/Z_CALLFUNC_UPD_BIN.func.abap: -------------------------------------------------------------------------------- 1 | FUNCTION z_callfunc_upd_bin. 2 | *"---------------------------------------------------------------------- 3 | *"*"Update Function Module: 4 | *" 5 | *"*"Local Interface: 6 | *" IMPORTING 7 | *" VALUE(IV_TABNAME) TYPE TABNAME OPTIONAL 8 | *" VALUE(IV_TABCONTENT) TYPE XSTRING OPTIONAL 9 | *" VALUE(IV_STRUCTURE_CHANGE) TYPE CHAR2 DEFAULT '10' 10 | *"---------------------------------------------------------------------- 11 | 12 | DATA lc_tab_change_increase_f3 TYPE char2 VALUE '10'. 13 | DATA lc_tab_change_decrease_f3 TYPE char2 VALUE '20'. 14 | DATA lc_tab_change_add_new_f5 TYPE char2 VALUE '30'. 15 | DATA lc_tab_change_delete_f4 TYPE char2 VALUE '40'. 16 | DATA lc_tab_change_f2_to_char3 TYPE char2 VALUE '50'. 17 | DATA lc_deserialize_like_a_bopf TYPE char2 VALUE '99'. 18 | 19 | DATA lt_tab_in TYPE REF TO data. 20 | FIELD-SYMBOLS TYPE STANDARD TABLE. 21 | 22 | CREATE DATA lt_tab_in TYPE STANDARD TABLE OF (iv_tabname). 23 | 24 | ASSIGN lt_tab_in->* TO . 25 | IF sy-subrc EQ 0. 26 | CASE iv_structure_change. 27 | WHEN lc_tab_change_f2_to_char3. 28 | TRY . 29 | IMPORT data = FROM DATA BUFFER 30 | iv_tabcontent IGNORING STRUCTURE BOUNDARIES 31 | . 32 | CATCH cx_sy_import_mismatch_error. 33 | " write log ?=> just no runtime error 34 | ENDTRY. 35 | 36 | WHEN lc_deserialize_like_a_bopf. 37 | " no option - no exception handling 38 | IMPORT data TO FROM DATA BUFFER iv_tabcontent . 39 | 40 | WHEN OTHERS. 41 | TRY . 42 | IMPORT data = FROM DATA BUFFER 43 | iv_tabcontent ACCEPTING PADDING " if structure was changed 44 | ACCEPTING TRUNCATION 45 | . 46 | CATCH cx_sy_import_mismatch_error. 47 | " write log ?=> just no runtime error 48 | ENDTRY. 49 | ENDCASE. 50 | ENDIF. 51 | ENDFUNCTION. 52 | -------------------------------------------------------------------------------- /ABApTestinator/TestDeserialize/Z_CALLFUNC_UPD_JSON.func.abap: -------------------------------------------------------------------------------- 1 | FUNCTION z_callfunc_upd_json. 2 | *"---------------------------------------------------------------------- 3 | *" IMPORTING 4 | *" VALUE(IV_TABNAME) TYPE TABNAME OPTIONAL 5 | *" VALUE(IV_TABCONTENT) TYPE STRING OPTIONAL 6 | *"---------------------------------------------------------------------- 7 | DATA lv_json_str TYPE string. 8 | 9 | DATA lt_tab_in TYPE REF TO data. 10 | FIELD-SYMBOLS TYPE STANDARD TABLE. 11 | 12 | CREATE DATA lt_tab_in TYPE STANDARD TABLE OF (iv_tabname). 13 | 14 | ASSIGN lt_tab_in->* TO . 15 | IF sy-subrc EQ 0. 16 | TRY. 17 | lv_json_str = '{"JSON":' && iv_tabcontent && '}'. 18 | 19 | CALL TRANSFORMATION id 20 | SOURCE XML lv_json_str 21 | RESULT json = 22 | OPTIONS value_handling = 'accept_data_loss'. 23 | 24 | CATCH cx_root. 25 | MESSAGE e000(cl). 26 | ENDTRY. 27 | 28 | ENDIF. 29 | ENDFUNCTION. 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 OlegBash599 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AnyTabUpdateTask 2 |

Utility for DataBase Changes in Update Task and OOP&Functional working with internal tables

3 | 4 | 5 | 6 | 7 |

Utility is for avoiding creation additional function modules and table types for stable and fast code-writing. 8 | Utility is for object-oriented and functional approach of internal-table processing. 9 | 10 | Main functionality is in package ZC8A_005.
11 | Demo-report is in addtional sub-package [ZC8A_005_DEMO](https://github.com/OlegBash599/AnyTabUpdateTask/tree/main/src/zc8a_005_demo) which is in separate folder(https://github.com/OlegBash599/AnyTabUpdateTask/tree/main/src/zc8a_005_demo) in this repository. 12 |

13 | 14 | ____ 15 | 16 | Simple Example for MODIFY table using this utility: 17 | ```ABAP 18 | DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'. 19 | DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample. 20 | 21 | lt_sample_tab = VALUE #( 22 | ( entity_guid = 'ANY_SIMPL_GUID_MOD' entity_param1 = 'CHAR10' entity_param2 = '0504030201' ) 23 | ( entity_guid = 'ANY_SIMPL_GUID2_MOD' entity_param1 = '2CHAR10' entity_param2 = '0102030405' ) 24 | ( entity_guid = 'ANY_SIMPL_GUID2_DEL' entity_param1 = '2CHAR10' entity_param2 = '777909034' ) 25 | ). 26 | 27 | NEW zcl_c8a005_save2db( 28 | )->save2db( iv_tabname = lc_db_tab_sample 29 | it_tab_content = lt_sample_tab )->do_commit_if_any( ). 30 | ``` 31 | 32 | Without this utlity it could be like that (with creation of additional objects) 33 |
34 | 35 | Show update by function (without the utility AnyTabUpdateTask) 36 | 37 | ```ABAP 38 | DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample. 39 | 40 | lt_sample_tab = VALUE #( 41 | ( entity_guid = 'ANY_SIMPL_GUID_MOD' entity_param1 = 'CHAR10' entity_param2 = '0504030201' ) 42 | ( entity_guid = 'ANY_SIMPL_GUID2_MOD' entity_param1 = '2CHAR10' entity_param2 = '0102030405' ) 43 | ( entity_guid = 'ANY_SIMPL_GUID2_DEL' entity_param1 = '2CHAR10' entity_param2 = '777909034' ) 44 | ). 45 | 46 | CALL FUNCTION 'Z_C8A_005_DEMO_UPD_SAMPLE' 47 | IN UPDATE TASK 48 | EXPORTING 49 | it_sample = lt_sample_tab. 50 | 51 | CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 52 | EXPORTING 53 | wait = abap_true. 54 | 55 | ``` 56 |
57 | 58 | 59 | Example for several tables 60 |
61 | 62 | Utility AnyTabUpdateTask for several Tables 63 | 64 | ```ABAP 65 | DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'. 66 | DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample. 67 | DATA lt_sample_empty_tab TYPE STANDARD TABLE OF ztc8a005_sample. 68 | DATA lt_head_tab TYPE STANDARD TABLE OF ztc8a005_head. 69 | DATA lt_item_tab TYPE STANDARD TABLE OF ztc8a005_item. 70 | DATA lv_ts TYPE timestamp. 71 | DATA lo_saver_anytab TYPE REF TO zcl_c8a005_save2db. 72 | 73 | GET TIME STAMP FIELD lv_ts. 74 | 75 | lt_sample_tab = VALUE #( 76 | ( entity_guid = 'ANY_GUID_MOD' entity_param1 = 'CHAR10' entity_param2 = '0504030201' 77 | entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts ) 78 | ( entity_guid = 'ANY_GUID2_MOD' entity_param1 = '2CHAR10' entity_param2 = '0102030405' 79 | entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts ) 80 | ( entity_guid = 'ANY_GUID2_DEL' entity_param1 = '2CHAR10' entity_param2 = '777909034' 81 | entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts ) 82 | ). 83 | 84 | lt_head_tab = VALUE #( 85 | ( head_guid = 'ANY_GUID_UPD' head_param1 = 'ANY_GUID_ADD' head_param2 = '9988776655' 86 | head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts ) 87 | ( head_guid = 'ANY_GUID2_UPD' head_param1 = 'ANY_GUID2_ADD' head_param2 = '9988776655' 88 | head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts ) 89 | ( head_guid = 'ANY_GUID_DEL' head_param1 = 'ANY_GUID_ADD' head_param2 = '9988774444' 90 | head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts ) 91 | ( head_guid = 'ANY_GUID2_DEL' head_param1 = 'ANY_GUID2_ADD' head_param2 = '9988774444' 92 | head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts ) 93 | ). 94 | 95 | lt_item_tab = VALUE #( 96 | ( head_guid = 'ANY_GUID_UPD' item_guid = 'ANY_ITEM_GUID_ADD' item_param1 = '2CHAR10' item_param2 = '9988776655' 97 | item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts ) 98 | ( head_guid = 'ANY_GUID2_UPD' item_guid = 'ANY_ITEM_GUID2_ADD' item_param1 = '2CHAR10' 99 | item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts ) 100 | ( head_guid = 'ANY_GUID_DEL' item_guid = 'ANY_ITEM_GUID_ADD' item_param2 = '9988776655' 101 | item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts ) 102 | ( head_guid = 'ANY_GUID2_DEL' item_guid = 'ANY_ITEM_GUID2_ADD' item_param1 = '2CHAR10' 103 | item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts ) 104 | ). 105 | 106 | 107 | CREATE OBJECT lo_saver_anytab. 108 | lo_saver_anytab->save2db( EXPORTING iv_tabname = lc_db_tab_sample 109 | it_tab_content = lt_sample_tab ). 110 | 111 | lo_saver_anytab->save2db( EXPORTING iv_tabname = 'ZTC8A005_HEAD' 112 | it_tab_content = lt_head_tab ). 113 | 114 | lo_saver_anytab->save2db( EXPORTING iv_tabname = 'ZTC8A005_ITEM' 115 | it_tab_content = lt_item_tab ). 116 | 117 | CLEAR lt_sample_empty_tab. 118 | lo_saver_anytab->save2db( EXPORTING iv_tabname = lc_db_tab_sample 119 | it_tab_content = lt_sample_empty_tab ). 120 | 121 | 122 | " #RU:обновление всех таблиц будет одномоментно после commit 123 | " #EN:database changes are to be after commit-command 124 | " #RU:а по пустой таблицы ничего происходить не будет (не будет поставлен Update Task) 125 | " #EN: empty table does not take into account while commit command 126 | lo_saver_anytab->do_commit_if_any( ). 127 | 128 | ``` 129 |
130 | 131 | ____ 132 | 133 |
134 | 135 | Option not to pass table name 136 | 137 | ```ABAP 138 | DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample. 139 | 140 | lt_sample_tab = VALUE #( 141 | ( entity_guid = 'ANY_SIMPL_GUID_MOD' entity_param1 = 'CHAR10' entity_param2 = '0504030201' ) 142 | ( entity_guid = 'ANY_SIMPL_GUID2_MOD' entity_param1 = '2CHAR10' entity_param2 = '0102030405' ) 143 | ( entity_guid = 'ANY_SIMPL_GUID2_DEL' entity_param1 = '2CHAR10' entity_param2 = '777909034' ) 144 | ). 145 | 146 | CREATE OBJECT lo_saver_anytab. 147 | lo_saver_anytab->save2db( EXPORTING it_tab_content = lt_sample_tab )->do_commit_if_any( ). 148 | ``` 149 |
150 | 151 | ____ 152 | for the sake of fast debugging and tracing ControlGorup is added ZC8A005_CONTROL. 153 | So it is possible to switch on and off ControlGroup via tcode SAAB. 154 | 155 | ____ 156 | Additional examples and descriptions are on https://olegbash.ru/anytabupdatetask 157 | ____ 158 | 159 | 160 | The blog about the utility with commens is on https://blogs.sap.com/2022/08/21/database-update-with-utility-anytab-updatetask/ 161 | 162 | ____ 163 | The well-structured educational and library source SAPLAND.ru: 164 | https://sappro.sapland.ru/kb/articles/stats/konsistentnoe-obnovlenie-bazi-dannih-pri-pomoschi-phunktsionala-any-tab-update-t.html 165 | 166 | ____ 167 | 168 | In Russian you can add your comments here: 169 | The Old-Merry **SAPFORUM**: https://sapboard.ru/forum/viewtopic.php?f=13&t=100324 170 | 171 | ____ 172 | HABR-blog 173 | https://habr.com/ru/articles/787282/ 174 | 175 | 176 | ## Object-Oriented grouping 177 | details are in [unit test](https://github.com/OlegBash599/AnyTabUpdateTask/blob/main/src/zcl_c8a005_group_tab.clas.testclasses.abap) and in demo-report 178 | ```ABAP 179 | DATA lt_fi_doc TYPE tt_fi_doc. 180 | 181 | DATA lt_fi_doc_sum_by_kunnr TYPE tt_fi_doc. 182 | 183 | _fill_mock( IMPORTING et_fi_doc = lt_fi_doc ). 184 | 185 | mo_cut->set_in( it = lt_fi_doc )->group_by( 186 | EXPORTING iv_f1 = 'KUNNR' ). 187 | 188 | CLEAR lt_fi_doc_sum_by_kunnr. 189 | WHILE mo_cut->has_next_grp( ) EQ abap_true. 190 | mo_cut->get_next_grp( ). 191 | _calc_sum_in_group( EXPORTING io_tab_group = mo_cut 192 | CHANGING ct_fi_doc_sum = lt_fi_doc_sum_by_kunnr ). 193 | ENDWHILE. 194 | ``` 195 | 196 | ### TODO list 197 | - [ ] CheckValues 198 | - [ ] GTT-sampless like here(https://github.com/OlegBash599/ZC8A016/tree/main) 199 | - [ ] External Call to Save in External HTTP-service 200 | - [ ] Add Data Driven Testing Functions 201 | 202 | -------------------------------------------------------------------------------- /src/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Any DbTab In Update Task 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/zc8a005_control.acid.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | AnyTab UpdateTask ControlGroup 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/README.md: -------------------------------------------------------------------------------- 1 | Core-functionality and Demo-report of AnyTabUpdateTask are in different packages. 2 | 3 | This is a separate ZIP-abapGit file for *Demo-functionality* **AnyTabUpdateTask**. 4 | 5 | If you want to check options in Debug mode, you can upload this package, but for core-functionality it is not necessary. 6 | 7 | v2208: 8 | 1) Added updation of empty fields (UPDATE-operator) 9 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Demo programs to ZC8A_005 (Any Tab Update Task) 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep.prog.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZC8A_005_DEMO_REP 3 | *&---------------------------------------------------------------------* 4 | *& 5 | *&---------------------------------------------------------------------* 6 | REPORT zc8a_005_demo_rep. 7 | 8 | 9 | INCLUDE zc8a_005_demo_rep_data if FOUND. " types/data 10 | INCLUDE zc8a_005_demo_rep_cls10 if FOUND. " base demo 11 | INCLUDE zc8a_005_demo_rep_cls11 if FOUND. " add01 demo 12 | 13 | INCLUDE zc8a_005_demo_rep_scrn if FOUND. " selection screen 14 | INCLUDE zc8a_005_demo_rep_cls99 if FOUND. " all application 15 | INCLUDE zc8a_005_demo_rep_evnt if FOUND. " Executable report - events 16 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep.prog.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZC8A_005_DEMO_REP 7 | 1 8 | R 9 | X 10 | X 11 | 12 | 13 | 14 | I 15 | F21 16 | MODIFY 17 | 22 18 | 19 | 20 | I 21 | F22 22 | UPDATE (не пустых полей) 23 | 52 24 | 25 | 26 | I 27 | F23 28 | DELETE(по ключу) 29 | 16 30 | 31 | 32 | I 33 | F24 34 | UPDATE(пустых полей) 35 | 20 36 | 37 | 38 | I 39 | M01 40 | Показательный прогон завершен. 41 | 60 42 | 43 | 44 | R 45 | Прогр. ZC8A_005_DEMO_REP 46 | 24 47 | 48 | 49 | S 50 | ANYTAB 51 | Через Class AnyTab 52 | 26 53 | 54 | 55 | S 56 | BCKG 57 | В отдельном процессе 58 | 31 59 | 60 | 61 | S 62 | DO_BREAK 63 | ВклОтладку (Debug Mode) 64 | 31 65 | 66 | 67 | S 68 | FUNCWAY 69 | Через ФМы обновления 70 | 28 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_cls10.prog.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Include ZC8A_005_DEMO_REP_CLS10 3 | *&---------------------------------------------------------------------* 4 | 5 | CLASS lcl_base_demo_anytab DEFINITION. 6 | 7 | PUBLIC SECTION. 8 | METHODS constructor 9 | IMPORTING is_screen_in TYPE ts_screen_in. 10 | 11 | METHODS sh. 12 | 13 | PRIVATE SECTION. 14 | 15 | DATA msr_screen_in TYPE REF TO ts_screen_in. 16 | 17 | METHODS demo_modify_if_need. 18 | METHODS demo_simple_modify. 19 | METHODS demo_few_tabs_modify. 20 | METHODS demo_upd_v1_non_emp_if_need. 21 | METHODS demo_upd_v2_empty. 22 | METHODS demo_upd_v1_full_key. 23 | METHODS demo_upd_v1_non_full_key. 24 | METHODS demo_delete_by_key. 25 | 26 | METHODS demo_function4modify. 27 | 28 | ENDCLASS. 29 | 30 | 31 | CLASS lcl_base_demo_anytab IMPLEMENTATION. 32 | METHOD constructor. 33 | msr_screen_in = REF #( is_screen_in ). 34 | ENDMETHOD. 35 | 36 | METHOD sh. 37 | 38 | IF msr_screen_in->do_break EQ abap_true. 39 | BREAK-POINT. 40 | ENDIF. 41 | 42 | 43 | IF msr_screen_in->use_anytab_upd_class EQ abap_true. 44 | demo_modify_if_need( ). 45 | ENDIF. 46 | 47 | IF msr_screen_in->update_by_non_empty EQ abap_true. 48 | demo_upd_v1_non_emp_if_need( ). 49 | ENDIF. 50 | 51 | IF msr_screen_in->update_empty_fields EQ abap_true. 52 | demo_upd_v2_empty( ). 53 | ENDIF. 54 | 55 | IF msr_screen_in->delete_by_tab_key EQ abap_true. 56 | demo_delete_by_key( ). 57 | ENDIF. 58 | 59 | IF msr_screen_in->use_function_module EQ abap_true. 60 | demo_function4modify( ). 61 | ENDIF. 62 | 63 | ENDMETHOD. 64 | 65 | METHOD demo_modify_if_need. 66 | 67 | IF msr_screen_in->modify_demo EQ abap_false. 68 | EXIT. 69 | ENDIF. 70 | 71 | demo_simple_modify( ). 72 | demo_few_tabs_modify( ). 73 | 74 | ENDMETHOD. 75 | 76 | METHOD demo_simple_modify. 77 | DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'. 78 | DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample. 79 | 80 | lt_sample_tab = VALUE #( 81 | ( entity_guid = 'ANY_SIMPL_GUID_MOD' entity_param1 = 'CHAR10' entity_param2 = '0504030201' ) 82 | ( entity_guid = 'ANY_SIMPL_GUID2_MOD' entity_param1 = '2CHAR10' entity_param2 = '0102030405' ) 83 | ( entity_guid = 'ANY_SIMPL_GUID2_DEL' entity_param1 = '2CHAR10' entity_param2 = '777909034' ) 84 | ( entity_guid = 'ANY_SIMPL_GUID2_UPD2' entity_param1 = '2CHAR10' entity_param2 = '777909034' ) 85 | ). 86 | 87 | NEW zcl_c8a005_save2db( 88 | )->save2db( iv_tabname = lc_db_tab_sample 89 | it_tab_content = lt_sample_tab )->do_commit_if_any( ). 90 | 91 | ENDMETHOD. 92 | 93 | METHOD demo_few_tabs_modify. 94 | DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'. 95 | DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample. 96 | DATA lt_sample_empty_tab TYPE STANDARD TABLE OF ztc8a005_sample. 97 | DATA lt_head_tab TYPE STANDARD TABLE OF ztc8a005_head. 98 | DATA lt_item_tab TYPE STANDARD TABLE OF ztc8a005_item. 99 | DATA lv_ts TYPE timestamp. 100 | DATA lo_saver_anytab TYPE REF TO zcl_c8a005_save2db. 101 | 102 | GET TIME STAMP FIELD lv_ts. 103 | 104 | lt_sample_tab = VALUE #( 105 | ( entity_guid = 'ANY_GUID_MOD' entity_param1 = 'CHAR10' entity_param2 = '0504030201' 106 | entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts ) 107 | ( entity_guid = 'ANY_GUID2_MOD' entity_param1 = '2CHAR10' entity_param2 = '0102030405' 108 | entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts ) 109 | ( entity_guid = 'ANY_GUID2_DEL' entity_param1 = '2CHAR10' entity_param2 = '777909034' 110 | entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts ) 111 | ). 112 | 113 | lt_head_tab = VALUE #( 114 | ( head_guid = 'ANY_GUID_UPD' head_param1 = 'ANY_GUID_ADD' head_param2 = '9988776655' 115 | head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts ) 116 | ( head_guid = 'ANY_GUID2_UPD' head_param1 = 'ANY_GUID2_ADD' head_param2 = '9988776655' 117 | head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts ) 118 | ( head_guid = 'ANY_GUID_DEL' head_param1 = 'ANY_GUID_ADD' head_param2 = '9988774444' 119 | head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts ) 120 | ( head_guid = 'ANY_GUID2_DEL' head_param1 = 'ANY_GUID2_ADD' head_param2 = '9988774444' 121 | head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts ) 122 | ). 123 | 124 | lt_item_tab = VALUE #( 125 | ( head_guid = 'ANY_GUID_UPD' item_guid = 'ANY_ITEM_GUID_ADD' 126 | item_param1 = '2CHAR10' item_param2 = '9988776655' 127 | item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts ) 128 | ( head_guid = 'ANY_GUID2_UPD' item_guid = 'ANY_ITEM_GUID2_ADD' item_param1 = '2CHAR10' 129 | item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts ) 130 | ( head_guid = 'ANY_GUID_DEL' item_guid = 'ANY_ITEM_GUID_ADD' item_param2 = '9988776655' 131 | item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts ) 132 | ( head_guid = 'ANY_GUID2_DEL' item_guid = 'ANY_ITEM_GUID2_ADD' item_param1 = '2CHAR10' 133 | item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts ) 134 | ). 135 | 136 | 137 | CREATE OBJECT lo_saver_anytab. 138 | lo_saver_anytab->save2db( EXPORTING iv_tabname = lc_db_tab_sample 139 | it_tab_content = lt_sample_tab ). 140 | 141 | lo_saver_anytab->save2db( EXPORTING iv_tabname = 'ZTC8A005_HEAD' 142 | it_tab_content = lt_head_tab ). 143 | 144 | lo_saver_anytab->save2db( EXPORTING iv_tabname = 'ZTC8A005_ITEM' 145 | it_tab_content = lt_item_tab ). 146 | 147 | CLEAR lt_sample_empty_tab. 148 | lo_saver_anytab->save2db( EXPORTING iv_tabname = lc_db_tab_sample 149 | it_tab_content = lt_sample_empty_tab ). 150 | 151 | 152 | " обновление всех таблиц будет одномоментно после commit 153 | " а по пустой таблицы ничего происходить не будет (не будет поставлен Update Task) 154 | lo_saver_anytab->do_commit_if_any( ). 155 | ENDMETHOD. 156 | 157 | METHOD demo_upd_v1_non_emp_if_need. 158 | 159 | IF msr_screen_in->update_by_non_empty EQ abap_false. 160 | EXIT. 161 | ENDIF. 162 | 163 | demo_upd_v1_full_key( ). 164 | demo_upd_v1_non_full_key( ). 165 | 166 | ENDMETHOD. 167 | 168 | METHOD demo_upd_v2_empty. 169 | DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'. 170 | DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample. 171 | 172 | " поля ENTITY_PARAM2 ENTITY_PARAM5 ENTITY_PARAM6 173 | " будут начальное (initial) значение 174 | " для их обновления явно указываем поля в параметре iv_empty_fields 175 | lt_sample_tab = VALUE #( 176 | ( entity_guid = 'ANY_SIMPL_GUID2_UPD2' entity_param1 = '2CHAR10' ) " 177 | ). 178 | 179 | NEW zcl_c8a005_save2db( )->save2db( 180 | EXPORTING 181 | iv_tabname = lc_db_tab_sample 182 | it_tab_content = lt_sample_tab 183 | iv_kz = 'U' 184 | iv_empty_fields = `ENTITY_PARAM2;ENTITY_PARAM5;ENTITY_PARAM6` " указываем поля через ; 185 | )->do_commit_if_any( ). 186 | 187 | 188 | 189 | ENDMETHOD. 190 | 191 | METHOD demo_upd_v1_full_key. 192 | 193 | DATA lt_tab_with_key_2fields TYPE STANDARD TABLE OF ztc8a005_item. "в таблице в ключе 2 поля 194 | DATA lc_tab_trg TYPE tabname VALUE 'ZTC8A005_ITEM'. 195 | 196 | lt_tab_with_key_2fields = VALUE #( 197 | ( head_guid = 'ANY_GUID_UPD' item_guid = 'ANY_ITEM_GUID_ADD' item_param2 = '1234563214' ) 198 | ( head_guid = 'ANY_GUID2_UPD' item_guid = 'ANY_ITEM_GUID2_ADD' item_param1 = '2UPDCHAR' ) 199 | ). 200 | 201 | 202 | " обновление по ключу, но в обновляемых параметрах непустые поля 203 | NEW zcl_c8a005_save2db( )->save2db( 204 | EXPORTING 205 | iv_tabname = lc_tab_trg 206 | it_tab_content = lt_tab_with_key_2fields 207 | iv_do_commit = ABAP_true " можно включать COMMIT сразу 208 | iv_kz = 'U' 209 | ). 210 | 211 | 212 | ENDMETHOD. 213 | 214 | METHOD demo_upd_v1_non_full_key. 215 | 216 | TYPES: BEGIN OF ts_field_tab 217 | , f TYPE fieldname 218 | , u TYPE abap_bool 219 | , w TYPE abap_bool 220 | , w_dyn TYPE string 221 | , END OF ts_field_tab 222 | , tt_field_tab TYPE STANDARD TABLE OF ts_field_tab WITH NON-UNIQUE KEY primary_key COMPONENTS f 223 | . 224 | 225 | DATA lt_tab_with_key_2fields TYPE STANDARD TABLE OF ztc8a005_item. 226 | DATA lc_tab_trg TYPE tabname VALUE 'ZTC8A005_ITEM'. 227 | 228 | DATA lv_ts TYPE timestamp. 229 | GET TIME STAMP FIELD lv_ts. 230 | 231 | DATA lt_field_tab TYPE tt_field_tab. 232 | 233 | 234 | lt_tab_with_key_2fields = VALUE #( 235 | ( head_guid = 'ANY_GUID_UPD' item_param1 = 'UPD10' item_param2 = '0504030201' 236 | item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts ) 237 | ( head_guid = 'ANY_GUID2_UPD' item_param1 = '2UPD10' item_param2 = '0102030405' 238 | item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts ) 239 | ). 240 | 241 | " обновление по не-ключевому параметру 242 | NEW zcl_c8a005_save2db( )->save2db( 243 | EXPORTING 244 | iv_tabname = lc_tab_trg 245 | it_tab_content = lt_tab_with_key_2fields 246 | iv_kz = 'U' 247 | )->do_commit_if_any( ). 248 | 249 | 250 | ENDMETHOD. 251 | 252 | METHOD demo_delete_by_key. 253 | DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample. 254 | 255 | IF msr_screen_in->delete_by_tab_key EQ abap_false. 256 | EXIT. 257 | ENDIF. 258 | 259 | lt_sample_tab = VALUE #( 260 | ( entity_guid = 'ANY_GUID2_DEL' ) 261 | ). 262 | 263 | NEW zcl_c8a005_save2db( )->save2db( 264 | EXPORTING 265 | iv_tabname = 'ZTC8A005_SAMPLE' 266 | it_tab_content = lt_sample_tab 267 | iv_kz = 'D' 268 | )->do_commit_if_any( ). 269 | 270 | ENDMETHOD. 271 | 272 | METHOD demo_function4modify. 273 | DATA if_do_commit TYPE xfeld VALUE abap_true. 274 | DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample. 275 | DATA lt_head_tab TYPE STANDARD TABLE OF ztc8a005_head. 276 | DATA lt_item_tab TYPE STANDARD TABLE OF ztc8a005_item. 277 | 278 | lt_sample_tab = VALUE #( 279 | ( entity_guid = 'FUNC_GUID_MOD' entity_param1 = 'CHAR10' entity_param2 = '0504030201' ) 280 | ( entity_guid = 'FUNC_GUID2_MOD' entity_param1 = '2CHAR10' entity_param2 = '0102030405' ) 281 | ( entity_guid = 'FUNC_GUID2_DEL' entity_param1 = '2CHAR10' entity_param2 = '777909034' ) ). 282 | 283 | lt_head_tab = VALUE #( 284 | ( head_guid = 'FUNC_GUID_UPD' head_param1 = 'ANY_GUID_ADD' head_param2 = '9988776655' ) 285 | ( head_guid = 'FUNC_GUID2_UPD' head_param1 = 'ANY_GUID2_ADD' head_param2 = '9988776655' ) 286 | ( head_guid = 'FUNC_GUID_DEL' head_param1 = 'ANY_GUID_ADD' head_param2 = '9988774444' ) 287 | ( head_guid = 'FUNC_GUID2_DEL' head_param1 = 'ANY_GUID2_ADD' head_param2 = '9988774444' ) ). 288 | 289 | lt_item_tab = VALUE #( 290 | ( head_guid = 'FUNC_GUID_UPD' item_guid = 'FUNC_ITEM_GUID_ADD' item_param1 = '2CHAR10' item_param2 = '9988776655' ) 291 | ( head_guid = 'FUNC_GUID2_UPD' item_guid = 'FUNC_ITEM_GUID2_ADD' item_param1 = '2CHAR10' ) 292 | ( head_guid = 'FUNC_GUID_DEL' item_guid = 'FUNC_ITEM_GUID_ADD' item_param2 = '9988776655' ) 293 | ( head_guid = 'FUNC_GUID2_DEL' item_guid = 'FUNC_ITEM_GUID2_ADD' item_param1 = '2CHAR10' ) ). 294 | 295 | CALL FUNCTION 'Z_C8A_005_DEMO_UPD_SAMPLE' 296 | IN UPDATE TASK 297 | EXPORTING 298 | it_sample = lt_sample_tab. 299 | 300 | CALL FUNCTION 'Z_C8A_005_DEMO_UPD_HEAD_ITEM' 301 | IN UPDATE TASK 302 | EXPORTING 303 | it_head = lt_head_tab 304 | it_item = lt_item_tab. 305 | 306 | IF if_do_commit EQ abap_true. 307 | CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 308 | EXPORTING 309 | wait = abap_true. 310 | ENDIF. 311 | ENDMETHOD. 312 | 313 | ENDCLASS. 314 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_cls10.prog.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZC8A_005_DEMO_REP_CLS10 7 | I 8 | R 9 | X 10 | 11 | 12 | 13 | R 14 | Include ZC8A_005_DEMO_REP_CLS10 15 | 31 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_cls11.prog.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Include ZC8A_005_DEMO_REP_CLS11 3 | *&---------------------------------------------------------------------* 4 | 5 | CLASS lcl_add01_demo_anytab DEFINITION. 6 | 7 | PUBLIC SECTION. 8 | METHODS constructor 9 | IMPORTING is_screen_in TYPE ts_screen_in. 10 | 11 | METHODS sh. 12 | 13 | PRIVATE SECTION. 14 | 15 | DATA msr_screen_in TYPE REF TO ts_screen_in. 16 | 17 | METHODS avoid_commit_in_current_proc . 18 | ENDCLASS. 19 | 20 | 21 | CLASS lcl_add01_demo_anytab IMPLEMENTATION. 22 | METHOD constructor. 23 | msr_screen_in = REF #( is_screen_in ). 24 | ENDMETHOD. 25 | 26 | METHOD sh. 27 | 28 | IF msr_screen_in->do_break EQ abap_true. 29 | BREAK-POINT. 30 | ENDIF. 31 | 32 | avoid_commit_in_current_proc( ). 33 | 34 | ENDMETHOD. 35 | 36 | METHOD avoid_commit_in_current_proc. 37 | DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'. 38 | DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample. 39 | 40 | 41 | IF msr_screen_in->background_mode EQ abap_false. 42 | EXIT. 43 | ENDIF. 44 | 45 | lt_sample_tab = VALUE #( 46 | ( entity_guid = 'AVOID_CUR_COMMIT1_MOD' entity_param1 = 'DEST1NONE' entity_param2 = '1234512121' entity_param3 = sy-uzeit entity_param4 = sy-datum ) 47 | ( entity_guid = 'AVOID_CUR_COMMIT2_MOD' entity_param1 = 'DEST2NONE' entity_param2 = '0102030405' entity_param3 = sy-uzeit entity_param4 = sy-datum ) 48 | ( entity_guid = 'AVOID_CUR_COMMIT3_MOD' entity_param1 = 'DEST3NONE' entity_param2 = '220629909' entity_param3 = sy-uzeit entity_param4 = sy-datum ) 49 | ). 50 | 51 | " обновление происходит не в текущем процессе, а параллельном через DESTINATION 'NONE' 52 | " нужно для случаев, когда в текущем процессе необходимость COMMIT пока не определена, 53 | " или он будет позже 54 | NEW zcl_c8a005_save2db( 55 | )->save2db( iv_tabname = lc_db_tab_sample 56 | it_tab_content = lt_sample_tab 57 | iv_dest_none = abap_true ). 58 | ENDMETHOD. 59 | 60 | ENDCLASS. 61 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_cls11.prog.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZC8A_005_DEMO_REP_CLS11 7 | I 8 | R 9 | X 10 | 11 | 12 | 13 | R 14 | Include ZC8A_005_DEMO_REP_CLS11 15 | 31 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_cls99.prog.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Include ZC8A_005_DEMO_REP_CLS99 3 | *&---------------------------------------------------------------------* 4 | 5 | CLASS lcl_app DEFINITION. 6 | 7 | PUBLIC SECTION. 8 | METHODS start_of_sel. 9 | METHODS end_of_sel. 10 | 11 | PRIVATE SECTION. 12 | DATA ms_screen_in TYPE ts_screen_in. 13 | 14 | METHODS fill_from_screen. 15 | METHODS demo_base_options. 16 | METHODS demo_add_options. 17 | 18 | 19 | ENDCLASS. 20 | 21 | 22 | CLASS lcl_app IMPLEMENTATION. 23 | METHOD start_of_sel. 24 | fill_from_screen( ). 25 | 26 | demo_base_options( ). 27 | 28 | demo_add_options( ). 29 | 30 | ENDMETHOD. 31 | 32 | METHOD end_of_sel. 33 | 34 | MESSAGE s000(cl) WITH 'Показательный прогон завершен.'(m01). 35 | 36 | ENDMETHOD. 37 | 38 | METHOD fill_from_screen. 39 | ms_screen_in-do_break = do_break. 40 | ms_screen_in-use_function_module = funcway. 41 | ms_screen_in-use_anytab_upd_class = anytab. 42 | ms_screen_in-modify_demo = modify. 43 | ms_screen_in-update_by_non_empty = upd_v1. 44 | ms_screen_in-update_empty_fields = upd_v2. 45 | ms_screen_in-delete_by_tab_key = del_key. 46 | ms_screen_in-background_mode = bckg. 47 | ENDMETHOD. 48 | 49 | METHOD demo_base_options. 50 | 51 | NEW lcl_base_demo_anytab( ms_screen_in )->sh( ). 52 | 53 | ENDMETHOD. 54 | 55 | METHOD demo_add_options. 56 | 57 | NEW lcl_add01_demo_anytab( ms_screen_in )->sh( ). 58 | 59 | ENDMETHOD. 60 | 61 | ENDCLASS. 62 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_cls99.prog.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZC8A_005_DEMO_REP_CLS99 7 | I 8 | R 9 | X 10 | 11 | 12 | 13 | R 14 | Include ZC8A_005_DEMO_REP_CLS99 15 | 31 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_data.prog.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Include ZC8A_005_DEMO_REP_DATA 3 | *&---------------------------------------------------------------------* 4 | 5 | TYPES: BEGIN OF ts_screen_in 6 | , do_break TYPE char1 7 | , use_function_module TYPE char1 8 | , use_anytab_upd_class TYPE char1 9 | , modify_demo TYPE char1 10 | , update_by_non_empty TYPE char1 11 | , update_empty_fields TYPE char1 12 | , delete_by_tab_key TYPE char1 13 | , background_mode TYPE char1 14 | , END OF ts_screen_in 15 | . 16 | 17 | CLASS lcl_app DEFINITION DEFERRED. 18 | DATA go_app TYPE REF TO lcl_app. 19 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_data.prog.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZC8A_005_DEMO_REP_DATA 7 | I 8 | R 9 | X 10 | 11 | 12 | 13 | R 14 | Include ZC8A_005_DEMO_REP_DATA 15 | 30 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_evnt.prog.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Include ZC8A_005_DEMO_REP_EVNT 3 | *&---------------------------------------------------------------------* 4 | 5 | INITIALIZATION. 6 | CREATE OBJECT go_app. 7 | 8 | START-OF-SELECTION. 9 | go_app->start_of_sel( ). 10 | 11 | end-of-SELECTION. 12 | go_app->end_of_sel( ). 13 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_evnt.prog.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZC8A_005_DEMO_REP_EVNT 7 | I 8 | R 9 | X 10 | 11 | 12 | 13 | R 14 | Include ZC8A_005_DEMO_REP_EVNT 15 | 30 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_scrn.prog.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Include ZC8A_005_DEMO_REP_SCRN 3 | *&---------------------------------------------------------------------* 4 | 5 | SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-b01. 6 | 7 | PARAMETERS: do_break AS CHECKBOX DEFAULT 'X' 8 | , funcway AS CHECKBOX DEFAULT ' ' 9 | , anytab AS CHECKBOX DEFAULT 'X' 10 | . 11 | 12 | SELECTION-SCREEN END OF BLOCK b01. 13 | 14 | 15 | SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-b02. 16 | 17 | 18 | SELECTION-SCREEN BEGIN OF LINE. 19 | PARAMETERS: modify AS CHECKBOX DEFAULT 'X'. 20 | SELECTION-SCREEN COMMENT 2(10) TEXT-f21 FOR FIELD modify. 21 | 22 | PARAMETERS: upd_v1 AS CHECKBOX DEFAULT 'X'. 23 | SELECTION-SCREEN COMMENT 14(24) TEXT-f22 FOR FIELD upd_v1. 24 | 25 | PARAMETERS: upd_v2 AS CHECKBOX DEFAULT 'X'. 26 | SELECTION-SCREEN COMMENT 40(20) TEXT-f24 FOR FIELD upd_v2. 27 | 28 | PARAMETERS: del_key AS CHECKBOX DEFAULT 'X'. 29 | SELECTION-SCREEN COMMENT 64(20) TEXT-f23 FOR FIELD del_key. 30 | 31 | 32 | SELECTION-SCREEN END OF LINE. 33 | 34 | PARAMETERS: bckg AS CHECKBOX DEFAULT '' 35 | . 36 | 37 | SELECTION-SCREEN END OF BLOCK b02. 38 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zc8a_005_demo_rep_scrn.prog.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZC8A_005_DEMO_REP_SCRN 7 | I 8 | R 9 | X 10 | 11 | 12 | 13 | R 14 | Include ZC8A_005_DEMO_REP_SCRN 15 | 30 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zfg_c8a_005_demo_upd.fugr.lzfg_c8a_005_demo_updtop.abap: -------------------------------------------------------------------------------- 1 | FUNCTION-POOL ZFG_C8A_005_DEMO_UPD. "MESSAGE-ID .. 2 | 3 | * INCLUDE LZFG_C8A_005_DEMO_UPDD... " Local class definition 4 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zfg_c8a_005_demo_upd.fugr.lzfg_c8a_005_demo_updtop.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | LZFG_C8A_005_DEMO_UPDTOP 7 | S 8 | D$ 9 | I 10 | S 11 | X 12 | D$S 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zfg_c8a_005_demo_upd.fugr.saplzfg_c8a_005_demo_upd.abap: -------------------------------------------------------------------------------- 1 | ******************************************************************* 2 | * System-defined Include-files. * 3 | ******************************************************************* 4 | INCLUDE LZFG_C8A_005_DEMO_UPDTOP. " Global Declarations 5 | INCLUDE LZFG_C8A_005_DEMO_UPDUXX. " Function Modules 6 | 7 | ******************************************************************* 8 | * User-defined Include-files (if necessary). * 9 | ******************************************************************* 10 | * INCLUDE LZFG_C8A_005_DEMO_UPDF... " Subroutines 11 | * INCLUDE LZFG_C8A_005_DEMO_UPDO... " PBO-Modules 12 | * INCLUDE LZFG_C8A_005_DEMO_UPDI... " PAI-Modules 13 | * INCLUDE LZFG_C8A_005_DEMO_UPDE... " Events 14 | * INCLUDE LZFG_C8A_005_DEMO_UPDP... " Local class implement. 15 | * INCLUDE LZFG_C8A_005_DEMO_UPDT99. " ABAP Unit tests 16 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zfg_c8a_005_demo_upd.fugr.saplzfg_c8a_005_demo_upd.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | SAPLZFG_C8A_005_DEMO_UPD 7 | S 8 | D$ 9 | F 10 | S 11 | R 12 | X 13 | D$S 14 | X 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zfg_c8a_005_demo_upd.fugr.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Function Group for Update Task 6 | 7 | LZFG_C8A_005_DEMO_UPDTOP 8 | SAPLZFG_C8A_005_DEMO_UPD 9 | 10 | 11 | 12 | Z_C8A_005_DEMO_UPD_HEAD_ITEM 13 | 1 14 | Update Task for Table ZTC8A005_SAMPLE 15 | 16 | 17 | IV_UPDKZ 18 | 'M' 19 | X 20 | UPDKZ 21 | 22 | 23 | IT_HEAD 24 | ZTC8A005_HEAD_TAB_TYPE 25 | 26 | 27 | IT_ITEM 28 | ZTC8A005_ITEM_TAB_TYPE 29 | 30 | 31 | 32 | 33 | IV_UPDKZ 34 | P 35 | Таблица для индикаторов обновления 36 | 37 | 38 | IT_HEAD 39 | P 40 | ZTC8A005_HEAD -> tab type 41 | 42 | 43 | IT_ITEM 44 | P 45 | ZTC8A005_ITEM -> tab type 46 | 47 | 48 | 49 | 50 | Z_C8A_005_DEMO_UPD_SAMPLE 51 | 1 52 | Update Task for Table ZTC8A005_SAMPLE 53 | 54 | 55 | IV_UPDKZ 56 | 'M' 57 | X 58 | UPDKZ 59 | 60 | 61 | IT_SAMPLE 62 | ZTC8A005_SAMPLE_TAB_TYPE 63 | 64 | 65 | 66 | 67 | IV_UPDKZ 68 | P 69 | Таблица для индикаторов обновления 70 | 71 | 72 | IT_SAMPLE 73 | P 74 | ZTC8A005_SAMPLE -> tab type 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zfg_c8a_005_demo_upd.fugr.z_c8a_005_demo_upd_head_item.abap: -------------------------------------------------------------------------------- 1 | FUNCTION z_c8a_005_demo_upd_head_item. 2 | *"---------------------------------------------------------------------- 3 | *"*"Функциональный модуль обновления: 4 | *" 5 | *"*"Локальный интерфейс: 6 | *" IMPORTING 7 | *" VALUE(IV_UPDKZ) TYPE UPDKZ DEFAULT 'M' 8 | *" VALUE(IT_HEAD) TYPE ZTC8A005_HEAD_TAB_TYPE 9 | *" VALUE(IT_ITEM) TYPE ZTC8A005_ITEM_TAB_TYPE 10 | *"---------------------------------------------------------------------- 11 | DATA lc_modify_tab TYPE updkz VALUE 'M'. 12 | DATA lc_upd_tab TYPE updkz VALUE 'U'. 13 | DATA lc_del_tab TYPE updkz VALUE 'D'. 14 | 15 | IF it_head IS NOT INITIAL. 16 | CASE iv_updkz. 17 | WHEN lc_modify_tab. 18 | MODIFY ztc8a005_head FROM TABLE it_head. 19 | WHEN lc_upd_tab. 20 | UPDATE ztc8a005_head FROM TABLE it_head. 21 | WHEN lc_del_tab. 22 | DELETE ztc8a005_head FROM TABLE it_head. 23 | WHEN OTHERS. 24 | ENDCASE. 25 | ENDIF. 26 | 27 | IF it_item IS NOT INITIAL. 28 | CASE iv_updkz. 29 | WHEN lc_modify_tab. 30 | MODIFY ztc8a005_item FROM TABLE it_item. 31 | WHEN lc_upd_tab. 32 | UPDATE ztc8a005_item FROM TABLE it_item. 33 | WHEN lc_del_tab. 34 | DELETE ztc8a005_item FROM TABLE it_item. 35 | WHEN OTHERS. 36 | ENDCASE. 37 | ENDIF. 38 | 39 | ENDFUNCTION. 40 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/zfg_c8a_005_demo_upd.fugr.z_c8a_005_demo_upd_sample.abap: -------------------------------------------------------------------------------- 1 | FUNCTION z_c8a_005_demo_upd_sample. 2 | *"---------------------------------------------------------------------- 3 | *"*"Функциональный модуль обновления: 4 | *" 5 | *"*"Локальный интерфейс: 6 | *" IMPORTING 7 | *" VALUE(IV_UPDKZ) TYPE UPDKZ DEFAULT 'M' 8 | *" VALUE(IT_SAMPLE) TYPE ZTC8A005_SAMPLE_TAB_TYPE 9 | *"---------------------------------------------------------------------- 10 | DATA lc_modify_tab TYPE updkz VALUE 'M'. 11 | DATA lc_upd_tab TYPE updkz VALUE 'U'. 12 | DATA lc_del_tab TYPE updkz VALUE 'D'. 13 | 14 | IF it_sample IS INITIAL. 15 | EXIT. 16 | ENDIF. 17 | 18 | CASE iv_updkz. 19 | WHEN lc_modify_tab. 20 | MODIFY ztc8a005_sample FROM TABLE it_sample. 21 | WHEN lc_upd_tab. 22 | UPDATE ztc8a005_sample FROM TABLE it_sample. 23 | WHEN lc_del_tab. 24 | DELETE ztc8a005_sample FROM TABLE it_sample. 25 | WHEN OTHERS. 26 | ENDCASE. 27 | ENDFUNCTION. 28 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/ztc8a005_head.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZTC8A005_HEAD 7 | TRANSP 8 | X 9 | X 10 | A 11 | 1 12 | 13 | 14 | ZTC8A005_HEAD 15 | A 16 | 0 17 | APPL1 18 | N 19 | 20 | 21 | 22 | MANDT 23 | X 24 | MANDT 25 | 0 26 | X 27 | E 28 | 29 | 30 | HEAD_GUID 31 | X 32 | CHAR32 33 | 0 34 | X 35 | E 36 | 37 | 38 | HEAD_PARAM1 39 | CHAR10 40 | 0 41 | E 42 | 43 | 44 | HEAD_PARAM2 45 | NUMC10 46 | 0 47 | E 48 | 49 | 50 | HEAD_PARAM3 51 | SYUZEIT 52 | 0 53 | T 54 | E 55 | 56 | 57 | HEAD_PARAM4 58 | SYDATUM 59 | 0 60 | T 61 | E 62 | 63 | 64 | HEAD_PARAM5 65 | TIMESTAMP 66 | 0 67 | E 68 | 69 | 70 | HEAD_PARAM6 71 | INT4 72 | 0 73 | E 74 | 75 | 76 | 77 | R 78 | 79 | 80 | 81 | R 82 | Демо Пример таблицы (заголовочная таблица) 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/ztc8a005_head_tab_type.ttyp.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZTC8A005_HEAD_TAB_TYPE 7 | ZTC8A005_HEAD 8 | S 9 | STRU 10 | T 11 | D 12 | N 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/ztc8a005_item.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZTC8A005_ITEM 7 | TRANSP 8 | X 9 | X 10 | A 11 | 1 12 | 13 | 14 | ZTC8A005_ITEM 15 | A 16 | 0 17 | APPL1 18 | N 19 | 20 | 21 | 22 | MANDT 23 | X 24 | MANDT 25 | 0 26 | X 27 | E 28 | 29 | 30 | HEAD_GUID 31 | X 32 | CHAR32 33 | 0 34 | X 35 | E 36 | 37 | 38 | ITEM_GUID 39 | X 40 | CHAR32 41 | 0 42 | X 43 | E 44 | 45 | 46 | ITEM_PARAM1 47 | CHAR10 48 | 0 49 | E 50 | 51 | 52 | ITEM_PARAM2 53 | NUMC10 54 | 0 55 | E 56 | 57 | 58 | ITEM_PARAM3 59 | SYUZEIT 60 | 0 61 | T 62 | E 63 | 64 | 65 | ITEM_PARAM4 66 | SYDATUM 67 | 0 68 | T 69 | E 70 | 71 | 72 | ITEM_PARAM5 73 | TIMESTAMP 74 | 0 75 | E 76 | 77 | 78 | ITEM_PARAM6 79 | INT4 80 | 0 81 | E 82 | 83 | 84 | 85 | R 86 | 87 | 88 | 89 | R 90 | Демо Пример таблицы (позиции) 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/ztc8a005_item_tab_type.ttyp.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZTC8A005_ITEM_TAB_TYPE 7 | ZTC8A005_ITEM 8 | S 9 | STRU 10 | T 11 | D 12 | N 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/ztc8a005_sample.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZTC8A005_SAMPLE 7 | TRANSP 8 | X 9 | X 10 | A 11 | 1 12 | 13 | 14 | ZTC8A005_SAMPLE 15 | A 16 | 0 17 | APPL1 18 | N 19 | 20 | 21 | 22 | MANDT 23 | X 24 | MANDT 25 | 0 26 | X 27 | E 28 | 29 | 30 | ENTITY_GUID 31 | X 32 | CHAR32 33 | 0 34 | X 35 | E 36 | 37 | 38 | ENTITY_PARAM1 39 | CHAR10 40 | 0 41 | E 42 | 43 | 44 | ENTITY_PARAM2 45 | NUMC10 46 | 0 47 | E 48 | 49 | 50 | ENTITY_PARAM3 51 | SYUZEIT 52 | 0 53 | T 54 | E 55 | 56 | 57 | ENTITY_PARAM4 58 | SYDATUM 59 | 0 60 | T 61 | E 62 | 63 | 64 | ENTITY_PARAM5 65 | TIMESTAMP 66 | 0 67 | E 68 | 69 | 70 | ENTITY_PARAM6 71 | INT4 72 | 0 73 | E 74 | 75 | 76 | 77 | R 78 | 79 | 80 | 81 | R 82 | Демо Пример таблицы (одиночной) 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /src/zc8a_005_demo/ztc8a005_sample_tab_type.ttyp.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZTC8A005_SAMPLE_TAB_TYPE 7 | ZTC8A005_SAMPLE 8 | S 9 | STRU 10 | T 11 | D 12 | N 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_c8a005_group_tab.clas.abap: -------------------------------------------------------------------------------- 1 | class zcl_c8a005_group_tab definition 2 | public 3 | final 4 | create public . 5 | 6 | public section. 7 | 8 | methods SET_IN 9 | importing 10 | !IV_WH type STRING optional 11 | !IT type TABLE optional 12 | changing 13 | !CT type TABLE optional 14 | returning 15 | value(RO) type ref to zcl_c8a005_group_tab . 16 | methods GROUP_BY 17 | importing 18 | !IV_F1 type FIELDNAME optional 19 | !IV_F2 type FIELDNAME optional 20 | !IV_F3 type FIELDNAME optional 21 | !IV_F4 type FIELDNAME optional 22 | !IV_F5 type FIELDNAME optional 23 | returning 24 | value(RO) type ref to zcl_c8a005_group_tab . 25 | methods GET_INDEX_GRP 26 | returning 27 | value(RV) type SYINDEX . 28 | methods HAS_NEXT_GRP 29 | returning 30 | value(RV) type ABAP_BOOL . 31 | methods GET_NEXT_GRP 32 | returning 33 | value(RO) type ref to zcl_c8a005_group_tab . 34 | methods GET_INDEX_ROW 35 | returning 36 | value(RV) type SYINDEX . 37 | methods HAS_NEXT_ROW 38 | returning 39 | value(RV) type ABAP_BOOL . 40 | " returning value(rs) type ref to data 41 | " changing cr type any 42 | methods GET_NEXT_LINE_AS_DATA_REF 43 | exporting 44 | !ER type ref to DATA . 45 | methods READ_GROUP_KEY 46 | exporting 47 | !ER type ref to DATA . 48 | protected section. 49 | private section. 50 | types: begin of ts_grp_each 51 | , indx_in_grp type syindex 52 | , vec_r type ref to data 53 | , end of ts_grp_each 54 | , tt_grp_each_tab type standard table of ts_grp_each with default key 55 | . 56 | 57 | types: begin of ts_group_key 58 | , key1_val type string 59 | , key2_val type string 60 | , key3_val type string 61 | , grp_tab type tt_grp_each_tab 62 | , end of ts_group_key 63 | , tt_group_key type sorted table of ts_group_key with unique key 64 | key1_val key2_val key3_val 65 | . 66 | 67 | types: begin of ts_keys_in 68 | , f1 type fieldname 69 | , fv1 type ref to data 70 | , f2 type fieldname 71 | , fv2 type ref to data 72 | , f3 type fieldname 73 | , fv3 type ref to data 74 | , end of ts_keys_in 75 | . 76 | 77 | types: tt_indx type standard table of syindex with default key. 78 | 79 | data mtr_tab type ref to data. 80 | data mt_tab_grp type tt_group_key. 81 | data mv_add_where type string. 82 | 83 | 84 | data mv_current_grp type syindex. 85 | data mv_cur_row_in_grp type syindex. 86 | data msr_cur_grp type ref to ts_group_key. 87 | data msr_cur_row type ref to ts_grp_each. 88 | 89 | methods _proc_line_init 90 | importing is_line_init type any 91 | iv_tabix_init type sytabix 92 | changing ct_indx type tt_indx 93 | cs_keys_in type ts_keys_in. 94 | 95 | 96 | ENDCLASS. 97 | 98 | 99 | 100 | CLASS ZCL_C8A005_GROUP_TAB IMPLEMENTATION. 101 | 102 | 103 | method GET_INDEX_GRP. 104 | "returning value(rv) type syindex. 105 | rv = mv_current_grp. 106 | endmethod. 107 | 108 | 109 | method GET_INDEX_ROW. 110 | "returning value(rv) type syindex. 111 | rv = mv_cur_row_in_grp. 112 | endmethod. 113 | 114 | 115 | method GET_NEXT_GRP. 116 | "returning value(ro) type ref to zcl_fi0034_group_tab. 117 | mv_current_grp = mv_current_grp + 1. 118 | 119 | read table mt_tab_grp reference into msr_cur_grp index mv_current_grp. 120 | mv_cur_row_in_grp = 0. 121 | 122 | ro = me. 123 | endmethod. 124 | 125 | 126 | method GET_NEXT_LINE_AS_DATA_REF. 127 | "exporting es type any 128 | 129 | field-symbols type any. 130 | 131 | mv_cur_row_in_grp = mv_cur_row_in_grp + 1. 132 | read table msr_cur_grp->grp_tab reference into msr_cur_row index mv_cur_row_in_grp. 133 | 134 | " cr = msr_cur_row->vec_r . 135 | er = msr_cur_row->vec_r . 136 | 137 | " assign msr_cur_row->vec_r->* to . 138 | " if sy-subrc eq 0. 139 | " es = . 140 | " endif. 141 | 142 | endmethod. 143 | 144 | 145 | method GROUP_BY. 146 | 147 | data lt_sytabix_done type tt_indx. 148 | 149 | field-symbols type table. 150 | 151 | data ls_keys_in type ts_keys_in. 152 | 153 | ls_keys_in-f1 = iv_f1. 154 | ls_keys_in-f2 = iv_f2. 155 | ls_keys_in-f3 = iv_f3. 156 | 157 | assign mtr_tab->* to . 158 | 159 | if mv_add_where is initial. 160 | loop at assigning field-symbol(). 161 | 162 | _proc_line_init( exporting is_line_init = 163 | iv_tabix_init = sy-tabix 164 | changing ct_indx = lt_sytabix_done 165 | cs_keys_in = ls_keys_in ). 166 | endloop. 167 | else. 168 | loop at assigning field-symbol() where (mv_add_where). 169 | 170 | _proc_line_init( exporting is_line_init = 171 | iv_tabix_init = sy-tabix 172 | changing ct_indx = lt_sytabix_done 173 | cs_keys_in = ls_keys_in ). 174 | endloop. 175 | endif. 176 | 177 | ro = me. 178 | endmethod. 179 | 180 | 181 | method HAS_NEXT_GRP. 182 | "returning value(rv) type abap_bool. 183 | rv = abap_true. 184 | 185 | if mv_current_grp >= lines( mt_tab_grp ). 186 | rv = abap_false. 187 | endif. 188 | 189 | endmethod. 190 | 191 | 192 | method HAS_NEXT_ROW. 193 | "returning value(rv) type abap_bool. 194 | rv = abap_true. 195 | 196 | if mv_cur_row_in_grp >= lines( msr_cur_grp->grp_tab ). 197 | rv = abap_false. 198 | endif. 199 | endmethod. 200 | 201 | 202 | method READ_GROUP_KEY. 203 | "exporting er type ref to data. 204 | 205 | field-symbols type any. 206 | 207 | read table msr_cur_grp->grp_tab reference into msr_cur_row index 1. 208 | 209 | " cr = msr_cur_row->vec_r . 210 | er = msr_cur_row->vec_r . 211 | endmethod. 212 | 213 | 214 | method SET_IN. 215 | "importing it_tab type table. 216 | if ct is not initial. 217 | mtr_tab = ref #( ct ). 218 | else. 219 | if it is not initial. 220 | mtr_tab = ref #( it ). 221 | else. 222 | message x000(cl) with 'Один из параметров должен быть заполнен'. 223 | endif. 224 | endif. 225 | 226 | mv_add_where = iv_wh. 227 | 228 | ro = me. 229 | endmethod. 230 | 231 | 232 | method _PROC_LINE_INIT. 233 | "importing is_line_init type any 234 | "changing ct_indx type tt_indx. 235 | 236 | data lv_where4group type string. 237 | 238 | data ls_group_key type ts_group_key. 239 | data ls_grp_each_tab type ts_grp_each. 240 | 241 | field-symbols type table. 242 | 243 | field-symbols type any. 244 | 245 | read table ct_indx transporting no fields 246 | with key table_line = sy-tabix binary search. 247 | if sy-subrc eq 0. 248 | exit. 249 | endif. 250 | 251 | clear lv_where4group. 252 | assign component cs_keys_in-f1 of structure is_line_init to . 253 | if sy-subrc eq 0. 254 | ls_group_key-key1_val = . 255 | lv_where4group = |{ cs_keys_in-f1 } = '{ }' |. 256 | endif. 257 | 258 | assign component cs_keys_in-f2 of structure is_line_init to . 259 | if sy-subrc eq 0. 260 | ls_group_key-key2_val = . 261 | lv_where4group = lv_where4group && | AND { cs_keys_in-f2 } = '{ }' |. 262 | endif. 263 | 264 | 265 | if mv_add_where is not initial. 266 | lv_where4group = |{ lv_where4group } AND { mv_add_where } |. 267 | endif. 268 | 269 | clear ls_grp_each_tab. 270 | assign mtr_tab->* to . 271 | 272 | loop at reference into ls_grp_each_tab-vec_r 273 | where (lv_where4group) 274 | . 275 | append sy-tabix to ct_indx. 276 | 277 | ls_grp_each_tab-indx_in_grp = ls_grp_each_tab-indx_in_grp + 1. 278 | append ls_grp_each_tab to ls_group_key-grp_tab. 279 | endloop. 280 | 281 | insert ls_group_key into table mt_tab_grp. 282 | 283 | clear ls_group_key. 284 | 285 | endmethod. 286 | ENDCLASS. 287 | -------------------------------------------------------------------------------- /src/zcl_c8a005_group_tab.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | *"* use this source file for your ABAP unit test classes 2 | CLASS ltc_terun DEFINITION DEFERRED. 3 | CLASS zcl_c8a005_group_tab DEFINITION LOCAL FRIENDS ltc_terun. 4 | 5 | CLASS ltc_terun DEFINITION FOR TESTING 6 | RISK LEVEL HARMLESS 7 | DURATION SHORT INHERITING FROM cl_aunit_assert 8 | . 9 | 10 | PUBLIC SECTION. 11 | METHODS ut_run_01 FOR TESTING. 12 | 13 | PROTECTED SECTION. 14 | 15 | PRIVATE SECTION. 16 | TYPES: BEGIN OF ts_fi_doc 17 | , bukrs TYPE bukrs 18 | , belnr TYPE belnr_d 19 | , gjahr TYPE gjahr 20 | , koart TYPE koart 21 | , kunnr TYPE kunnr 22 | , waers TYPE waers 23 | , dmbtr TYPE dmbtr 24 | , matnr TYPE matnr18 25 | , qty TYPE mengv13 26 | , END OF ts_fi_doc 27 | , tt_fi_doc TYPE STANDARD TABLE OF ts_fi_doc WITH DEFAULT KEY 28 | . 29 | 30 | DATA mo_cut TYPE REF TO zcl_c8a005_group_tab. 31 | 32 | METHODS setup. 33 | METHODS teardown. 34 | 35 | 36 | METHODS _fill_mock 37 | EXPORTING et_fi_doc TYPE tt_fi_doc. 38 | 39 | METHODS _calc_sum_in_group 40 | IMPORTING io_tab_group TYPE REF TO zcl_c8a005_group_tab 41 | CHANGING ct_fi_doc_sum TYPE tt_fi_doc. 42 | 43 | ENDCLASS. 44 | 45 | 46 | CLASS ltc_terun IMPLEMENTATION. 47 | 48 | METHOD setup. 49 | mo_cut = NEW #( ). 50 | 51 | ENDMETHOD. 52 | 53 | METHOD teardown. 54 | CLEAR mo_cut . 55 | ENDMETHOD. 56 | 57 | METHOD ut_run_01. 58 | 59 | DATA lt_fi_doc TYPE tt_fi_doc. 60 | 61 | DATA lt_fi_doc_sum_by_kunnr TYPE tt_fi_doc. 62 | 63 | _fill_mock( IMPORTING et_fi_doc = lt_fi_doc ). 64 | 65 | mo_cut->set_in( it = lt_fi_doc )->group_by( 66 | EXPORTING iv_f1 = 'KUNNR' ). 67 | 68 | CLEAR lt_fi_doc_sum_by_kunnr. 69 | WHILE mo_cut->has_next_grp( ) EQ abap_true. 70 | mo_cut->get_next_grp( ). 71 | _calc_sum_in_group( EXPORTING io_tab_group = mo_cut 72 | CHANGING ct_fi_doc_sum = lt_fi_doc_sum_by_kunnr ). 73 | ENDWHILE. 74 | 75 | ENDMETHOD. 76 | 77 | METHOD _calc_sum_in_group. 78 | * IMPORTING io_tab_group TYPE REF TO zcl_c8a005_group_tab 79 | * CHANGING ct_fi_doc_sum TYPE tt_fi_doc. 80 | DATA ls_fi_doc_kunnr TYPE ts_fi_doc. 81 | FIELD-SYMBOLS TYPE ts_fi_doc. 82 | FIELD-SYMBOLS TYPE ts_fi_doc. 83 | 84 | io_tab_group->read_group_key( IMPORTING er = DATA(lrs_group_key) ). 85 | ASSIGN lrs_group_key->* TO . 86 | 87 | MOVE-CORRESPONDING to ls_fi_doc_kunnr. 88 | CLEAR ls_fi_doc_kunnr-dmbtr. 89 | WHILE mo_cut->has_next_row( ) EQ abap_true. 90 | mo_cut->get_next_line_as_data_ref( 91 | IMPORTING er = DATA(lrs_line_in_group) ). 92 | ASSIGN lrs_line_in_group->* TO . 93 | ls_fi_doc_kunnr-dmbtr += -dmbtr. 94 | ENDWHILE. 95 | 96 | APPEND ls_fi_doc_kunnr TO ct_fi_doc_sum. 97 | 98 | ENDMETHOD. 99 | 100 | METHOD _fill_mock. 101 | "EXPORTING et_fi_doc TYPE tt_fi_doc. 102 | et_fi_doc = VALUE #( 103 | ( bukrs = '1010' belnr = '1010201' gjahr = sy-datum koart = 'D' kunnr = '31010' waers = 'RUB' dmbtr = '5050.20' matnr = '2399' qty = '10' ) 104 | ( bukrs = '1010' belnr = '1010202' gjahr = sy-datum koart = 'D' kunnr = '31010' waers = 'RUB' dmbtr = '5050.20' matnr = '2377' qty = '10' ) 105 | ( bukrs = '1010' belnr = '1010203' gjahr = sy-datum koart = 'D' kunnr = '31012' waers = 'RUB' dmbtr = '5050.20' matnr = '2399' qty = '10' ) 106 | ( bukrs = '1010' belnr = '1010204' gjahr = sy-datum koart = 'D' kunnr = '31012' waers = 'RUB' dmbtr = '5050.20' matnr = '2388' qty = '10' ) 107 | ( bukrs = '1010' belnr = '1010205' gjahr = sy-datum koart = 'D' kunnr = '31015' waers = 'RUB' dmbtr = '5050.20' matnr = '2301' qty = '10' ) 108 | ). 109 | ENDMETHOD. 110 | 111 | ENDCLASS. 112 | -------------------------------------------------------------------------------- /src/zcl_c8a005_group_tab.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_C8A005_GROUP_TAB 7 | E 8 | Iterator - Grouping Tab 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_c8a005_save2db.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_c8a005_save2db DEFINITION 2 | PUBLIC 3 | CREATE PUBLIC . 4 | 5 | PUBLIC SECTION. 6 | 7 | METHODS constructor . 8 | METHODS save2db 9 | IMPORTING 10 | !iv_tabname TYPE tabname OPTIONAL 11 | !it_tab_content TYPE any 12 | !iv_do_commit TYPE char1 DEFAULT abap_false 13 | !iv_kz TYPE updkz_d OPTIONAL 14 | !iv_dest_none TYPE abap_bool DEFAULT abap_false 15 | !iv_empty_fields TYPE string OPTIONAL 16 | !iv_strict TYPE abap_bool DEFAULT abap_false 17 | RETURNING 18 | VALUE(ro_obj) TYPE REF TO zcl_c8a005_save2db . 19 | METHODS save2db_line 20 | IMPORTING 21 | !iv_tabname TYPE tabname 22 | !is_tab_content TYPE any 23 | !iv_do_commit TYPE char1 DEFAULT abap_false 24 | !iv_dest_none TYPE abap_bool DEFAULT abap_false 25 | RETURNING 26 | VALUE(ro_obj) TYPE REF TO zcl_c8a005_save2db . 27 | METHODS do_commit_if_any 28 | IMPORTING 29 | !iv_do_commit TYPE abap_bool DEFAULT abap_false . 30 | METHODS do_rollback 31 | IMPORTING 32 | !iv_do_rollback TYPE abap_bool DEFAULT abap_false . 33 | PROTECTED SECTION. 34 | PRIVATE SECTION. 35 | 36 | DATA mv_data_was_sent2db TYPE abap_bool. 37 | 38 | METHODS get_absolute_tab_name_by_data 39 | IMPORTING it_tab_content TYPE any 40 | RETURNING VALUE(rv_val) TYPE tabname 41 | RAISING zcx_c8a005_error. 42 | 43 | METHODS validate_tabcontent 44 | IMPORTING iv_tabname TYPE tabname 45 | it_tab_content TYPE any 46 | RAISING zcx_c8a005_error. 47 | 48 | ENDCLASS. 49 | 50 | 51 | 52 | CLASS zcl_c8a005_save2db IMPLEMENTATION. 53 | 54 | 55 | METHOD constructor. 56 | 57 | ENDMETHOD. "CONSTRUCTOR 58 | 59 | 60 | METHOD do_commit_if_any. 61 | IF mv_data_was_sent2db EQ abap_false 62 | AND iv_do_commit EQ abap_false. 63 | RETURN. 64 | ENDIF. 65 | 66 | CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 67 | EXPORTING 68 | wait = abap_true 69 | * IMPORTING 70 | * return = 71 | . 72 | 73 | CLEAR mv_data_was_sent2db. 74 | ENDMETHOD. 75 | 76 | 77 | METHOD do_rollback. 78 | IF mv_data_was_sent2db EQ abap_false 79 | AND iv_do_rollback EQ abap_false. 80 | RETURN. 81 | ENDIF. 82 | 83 | CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' 84 | EXPORTING 85 | wait = abap_true 86 | * IMPORTING 87 | * return = 88 | . 89 | 90 | CLEAR mv_data_was_sent2db. 91 | 92 | ENDMETHOD. 93 | 94 | 95 | METHOD save2db. 96 | 97 | DATA lv_tabname TYPE tabname. 98 | 99 | ro_obj = me. 100 | 101 | IF it_tab_content IS INITIAL. 102 | RETURN. 103 | ENDIF. 104 | 105 | 106 | IF iv_tabname IS INITIAL. 107 | TRY. 108 | lv_tabname = get_absolute_tab_name_by_data( it_tab_content ). 109 | CATCH zcx_c8a005_error. 110 | RETURN. 111 | ENDTRY. 112 | ELSE. 113 | lv_tabname = iv_tabname. 114 | ENDIF. 115 | 116 | 117 | IF lv_tabname IS INITIAL. 118 | RETURN. 119 | ELSE. 120 | BREAK-POINT ID zc8a005_control. 121 | ENDIF. 122 | 123 | IF iv_strict EQ abap_true. 124 | TRY. 125 | validate_tabcontent( EXPORTING iv_tabname = lv_tabname 126 | it_tab_content = it_tab_content ). 127 | CATCH zcx_c8a005_error. 128 | RETURN. 129 | ENDTRY. 130 | ENDIF. 131 | 132 | CALL FUNCTION 'Z_C8A005_UPD_ANYTAB' 133 | EXPORTING 134 | iv_tabname = lv_tabname 135 | it_tab_data = it_tab_content 136 | iv_do_commit = iv_do_commit 137 | iv_kz = iv_kz 138 | iv_dest_none = iv_dest_none 139 | iv_empty_fields = iv_empty_fields. 140 | 141 | IF iv_dest_none EQ abap_false. 142 | mv_data_was_sent2db = abap_true. 143 | ENDIF. 144 | 145 | ENDMETHOD. "SAVE2DB 146 | 147 | 148 | METHOD save2db_line. 149 | * IMPORTING 150 | * !iv_tabname TYPE tabname 151 | * !is_tab_content TYPE any 152 | * !iv_do_commit TYPE char1 DEFAULT abap_false . 153 | DATA lr_tab TYPE REF TO data. 154 | FIELD-SYMBOLS TYPE STANDARD TABLE. 155 | 156 | ro_obj = me. 157 | 158 | IF is_tab_content IS INITIAL. 159 | RETURN. 160 | ENDIF. 161 | 162 | CREATE DATA lr_tab TYPE STANDARD TABLE OF (iv_tabname). 163 | 164 | ASSIGN lr_tab->* TO . 165 | IF sy-subrc EQ 0. 166 | APPEND is_tab_content TO . 167 | CALL FUNCTION 'Z_C8A005_UPD_ANYTAB' 168 | EXPORTING 169 | iv_tabname = iv_tabname 170 | it_tab_data = 171 | iv_do_commit = iv_do_commit 172 | iv_dest_none = iv_dest_none. 173 | IF iv_dest_none EQ abap_false. 174 | mv_data_was_sent2db = abap_true. 175 | ENDIF. 176 | ENDIF. 177 | 178 | ENDMETHOD. "save2db_line 179 | 180 | METHOD get_absolute_tab_name_by_data. 181 | * IMPORTING it_tab_content TYPE any 182 | * RETURNING VALUE(rv_val) TYPE tabname. 183 | DATA lo_tabtype TYPE REF TO zcl_c8a005_tabtype. 184 | CREATE OBJECT lo_tabtype. 185 | rv_val = 186 | lo_tabtype->get_by_data( it_tab_content ). 187 | 188 | IF rv_val IS INITIAL. 189 | RAISE EXCEPTION TYPE zcx_c8a005_error. 190 | ENDIF. 191 | 192 | 193 | ENDMETHOD. 194 | 195 | METHOD validate_tabcontent. 196 | * IMPORTING iv_tabname TYPE tabname 197 | * it_tab_content TYPE any 198 | * RAISING zcx_c8a005_error. 199 | 200 | ENDMETHOD. 201 | ENDCLASS. 202 | -------------------------------------------------------------------------------- /src/zcl_c8a005_save2db.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | *"* use this source file for your ABAP unit test classes 2 | CLASS ltc_event_run DEFINITION DEFERRED. 3 | CLASS zcl_c8a005_save2db DEFINITION LOCAL FRIENDS ltc_event_run. 4 | 5 | CLASS ltc_event_run DEFINITION FOR TESTING 6 | RISK LEVEL HARMLESS 7 | DURATION SHORT 8 | INHERITING FROM cl_aunit_assert. 9 | 10 | PUBLIC SECTION. 11 | 12 | METHODS run_insert_simple FOR TESTING. 13 | METHODS upd_by_key_non_initial FOR TESTING. 14 | METHODS run_update_no_key FOR TESTING. 15 | METHODS run_update_empty FOR TESTING. 16 | PROTECTED SECTION. 17 | 18 | 19 | PRIVATE SECTION. 20 | 21 | 22 | ENDCLASS. 23 | 24 | 25 | CLASS ltc_event_run IMPLEMENTATION. 26 | METHOD run_insert_simple. 27 | " moved to separate package ZC8A_005_DEMO 28 | " include ZC8A_005_DEMO_REP_CLS10 29 | ENDMETHOD. 30 | 31 | METHOD upd_by_key_non_initial. 32 | " moved to separate package ZC8A_005_DEMO 33 | " include ZC8A_005_DEMO_REP_CLS10 34 | ENDMETHOD. 35 | 36 | METHOD run_update_no_key. 37 | " moved to separate package ZC8A_005_DEMO 38 | " include ZC8A_005_DEMO_REP_CLS10 39 | ENDMETHOD. 40 | 41 | METHOD run_update_empty. 42 | " moved to separate package ZC8A_005_DEMO 43 | " include ZC8A_005_DEMO_REP_CLS10 44 | ENDMETHOD. 45 | 46 | ENDCLASS. 47 | -------------------------------------------------------------------------------- /src/zcl_c8a005_save2db.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_C8A005_SAVE2DB 7 | E 8 | zcl_C8A005_save2db 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_c8a005_tab_json.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_c8a005_tab_json DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | 8 | METHODS constructor . 9 | METHODS get_json_string 10 | IMPORTING 11 | !it_tab_data TYPE any 12 | EXPORTING 13 | !ev_json_str TYPE string . 14 | METHODS put_json2update 15 | IMPORTING 16 | !iv_tabname TYPE tabname 17 | !iv_json_str TYPE string 18 | !iv_kz TYPE updkz_d OPTIONAL 19 | !iv_empty_fields TYPE string OPTIONAL . 20 | METHODS do_commit . 21 | METHODS get_from_json2tab 22 | IMPORTING 23 | !iv_tabname TYPE tabname 24 | !iv_json_str TYPE string 25 | !iv_kz TYPE updkz_d OPTIONAL 26 | !iv_empty_fields TYPE string OPTIONAL. 27 | METHODS put_json2dest_none 28 | IMPORTING 29 | !iv_tabname TYPE tabname 30 | !iv_json_str TYPE string 31 | !iv_kz TYPE updkz_d OPTIONAL 32 | !iv_empty_fields TYPE string OPTIONAL . 33 | PROTECTED SECTION. 34 | 35 | PRIVATE SECTION. 36 | CONSTANTS: BEGIN OF mc 37 | , json_open TYPE string VALUE '{"JSON":' 38 | , json_close TYPE string VALUE '}' 39 | , END OF mc. 40 | 41 | METHODS create_tab_n_line 42 | IMPORTING 43 | !iv_tabname TYPE tabname 44 | EXPORTING 45 | !ert_ref TYPE REF TO data 46 | !ers_ref TYPE REF TO data 47 | . 48 | 49 | METHODS get_tab_n_line_type 50 | IMPORTING 51 | !iv_tabname TYPE tabname 52 | EXPORTING 53 | !eo_line_type TYPE REF TO cl_abap_structdescr 54 | !eo_tab_type TYPE REF TO cl_abap_tabledescr. 55 | 56 | METHODS prepare_upd_lines 57 | IMPORTING !iv_tabname TYPE tabname 58 | !it_dyn_tab TYPE STANDARD TABLE 59 | !iv_empty_fields TYPE string OPTIONAL. 60 | 61 | METHODS prep_upd_lines_key_non_empty 62 | IMPORTING !iv_tabname TYPE tabname 63 | !it_dyn_tab TYPE STANDARD TABLE 64 | !iv_empty_fields TYPE string OPTIONAL. 65 | 66 | ENDCLASS. 67 | 68 | 69 | 70 | CLASS zcl_c8a005_tab_json IMPLEMENTATION. 71 | 72 | 73 | METHOD constructor. 74 | 75 | ENDMETHOD. "constructor 76 | 77 | 78 | METHOD create_tab_n_line. 79 | * IMPORTING 80 | * !iv_tabname TYPE tabname 81 | * EXPORTING 82 | * !ert_ref TYPE REF TO data 83 | * !ers_ref TYPE REF TO data 84 | * . 85 | 86 | DATA lv_tabname TYPE tabname. 87 | 88 | DATA lo_line_type TYPE REF TO cl_abap_structdescr. 89 | DATA lo_tab_type TYPE REF TO cl_abap_tabledescr. 90 | 91 | DATA lt_tab_ref TYPE REF TO data. 92 | DATA ls_line_ref TYPE REF TO data. 93 | 94 | lv_tabname = iv_tabname. 95 | 96 | TRY. 97 | me->get_tab_n_line_type( 98 | EXPORTING 99 | iv_tabname = lv_tabname " Имя таблицы 100 | IMPORTING 101 | eo_line_type = lo_line_type " Runtime Type Services 102 | eo_tab_type = lo_tab_type " Runtime Type Services 103 | ). 104 | " CATCH zcx_nm0002_templ. " Exceptions while template 105 | 106 | CREATE DATA lt_tab_ref TYPE HANDLE lo_tab_type. 107 | CREATE DATA ls_line_ref TYPE HANDLE lo_line_type. 108 | 109 | ert_ref ?= lt_tab_ref. 110 | ers_ref ?= ls_line_ref. 111 | 112 | CATCH cx_root. 113 | MESSAGE x000(cl). 114 | 115 | ENDTRY. 116 | 117 | ENDMETHOD. "create_tab_n_line 118 | 119 | 120 | METHOD do_commit . 121 | CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 122 | EXPORTING 123 | wait = abap_true " Use of Command `COMMIT AND WAIT` 124 | * IMPORTING 125 | * return = " Return Messages 126 | . 127 | ENDMETHOD. "do_commit 128 | 129 | 130 | METHOD get_from_json2tab. 131 | * IMPORTING 132 | * !iv_tabname TYPE tabname 133 | * !iv_json_str TYPE string 134 | * !iv_kz TYPE updkz_d OPTIONAL 135 | * !iv_empty_fields TYPE string OPTIONAL. 136 | 137 | DATA lv_json_str TYPE string. 138 | DATA lr_db_content TYPE REF TO data. 139 | DATA lr_reader TYPE REF TO if_sxml_reader. 140 | 141 | DATA lo_tab_type TYPE REF TO cl_abap_tabledescr. 142 | 143 | FIELD-SYMBOLS TYPE STANDARD TABLE. 144 | 145 | 146 | TRY . 147 | create_tab_n_line( 148 | EXPORTING 149 | iv_tabname = iv_tabname " Имя таблицы 150 | IMPORTING 151 | ert_ref = lr_db_content ). 152 | 153 | CATCH cx_root. 154 | MESSAGE e000(cl). 155 | RETURN. 156 | ENDTRY. 157 | 158 | 159 | ASSIGN lr_db_content->* TO . 160 | lv_json_str = mc-json_open && iv_json_str && mc-json_close. 161 | 162 | 163 | TRY. 164 | 165 | CLEAR . 166 | 167 | CALL TRANSFORMATION id 168 | SOURCE XML lv_json_str 169 | RESULT json = . 170 | 171 | CATCH cx_root. 172 | MESSAGE e000(cl). 173 | ENDTRY. 174 | 175 | 176 | TRY. 177 | CASE iv_kz. 178 | WHEN 'D'. 179 | DELETE (iv_tabname) FROM TABLE . 180 | 181 | WHEN 'U'. 182 | prepare_upd_lines( iv_tabname = iv_tabname 183 | it_dyn_tab = 184 | iv_empty_fields = iv_empty_fields ). 185 | 186 | WHEN OTHERS. 187 | MODIFY (iv_tabname) FROM TABLE . 188 | ENDCASE. 189 | " OK 190 | CATCH cx_sy_open_sql_db. 191 | MESSAGE e000(cl). 192 | RETURN. 193 | ENDTRY. 194 | 195 | 196 | ENDMETHOD. "get_from_json2tab 197 | 198 | METHOD prepare_upd_lines. 199 | * IMPORTING !iv_tabname TYPE tabname 200 | * !it_dyn_tab TYPE STANDARD TABLE 201 | * !iv_empty_fields TYPE string OPTIONAL. 202 | 203 | prep_upd_lines_key_non_empty( 204 | EXPORTING 205 | iv_tabname = iv_tabname 206 | it_dyn_tab = it_dyn_tab 207 | iv_empty_fields = iv_empty_fields 208 | ). 209 | 210 | ENDMETHOD. 211 | 212 | METHOD prep_upd_lines_key_non_empty. 213 | TYPES: BEGIN OF ts_dd03l_loc 214 | , tabname TYPE tabname 215 | , fieldname TYPE fieldname 216 | , as4local TYPE as4local 217 | , as4vers TYPE as4vers 218 | , position TYPE tabfdpos 219 | , keyflag TYPE keyflag 220 | , comptype TYPE dd03l-comptype 221 | , END OF ts_dd03l_loc 222 | , tt_dd03l_loc TYPE STANDARD TABLE OF ts_dd03l_loc 223 | . 224 | DATA lt_dd03l_loc TYPE tt_dd03l_loc. 225 | 226 | DATA lv_upd_where_line TYPE string. 227 | DATA lv_upd_set_line TYPE string. 228 | DATA lt_upd_set TYPE STANDARD TABLE OF string. 229 | DATA lt_upd_where TYPE STANDARD TABLE OF string. 230 | DATA lv_do_skip_line TYPE abap_bool. 231 | 232 | DATA lv_empty_fields2update TYPE string. 233 | DATA lt_list_of_empty_fields TYPE STANDARD TABLE OF string. 234 | 235 | 236 | FIELD-SYMBOLS TYPE any. 237 | FIELD-SYMBOLS TYPE ts_dd03l_loc. 238 | FIELD-SYMBOLS TYPE any. 239 | 240 | lv_empty_fields2update = iv_empty_fields. 241 | TRANSLATE lv_empty_fields2update TO UPPER CASE. 242 | REPLACE ALL OCCURRENCES OF ` ` IN lv_empty_fields2update WITH `` . 243 | SPLIT lv_empty_fields2update AT ';' INTO TABLE lt_list_of_empty_fields. 244 | DELETE lt_list_of_empty_fields WHERE table_line IS INITIAL. 245 | SORT lt_list_of_empty_fields. 246 | DELETE ADJACENT DUPLICATES FROM lt_list_of_empty_fields. 247 | 248 | 249 | SELECT tabname fieldname as4local as4vers position keyflag 250 | comptype 251 | FROM dd03l 252 | INTO TABLE lt_dd03l_loc 253 | WHERE tabname = iv_tabname 254 | AND as4local = 'A' 255 | ORDER BY position ASCENDING 256 | . 257 | 258 | " каждая запись - update line 259 | LOOP AT it_dyn_tab ASSIGNING . 260 | CLEAR lv_do_skip_line. 261 | 262 | 263 | """""""""""""" 264 | " ключ - для where 265 | CLEAR lt_upd_where. 266 | LOOP AT lt_dd03l_loc ASSIGNING WHERE keyflag = abap_true 267 | AND comptype EQ 'E'. 268 | IF -fieldname EQ 'MANDT' 269 | OR -fieldname EQ 'CLIENT'. 270 | CONTINUE. 271 | ENDIF. 272 | 273 | ASSIGN COMPONENT -fieldname OF STRUCTURE TO . 274 | IF sy-subrc EQ 0. 275 | 276 | IF IS INITIAL. 277 | CONTINUE. 278 | ENDIF. 279 | 280 | CLEAR lv_upd_where_line. 281 | lv_upd_where_line = -fieldname && ` = ` && `'` && && `'`. 282 | IF lines( lt_upd_where ) GT 0. 283 | lv_upd_where_line = ` AND ` && lv_upd_where_line. 284 | ENDIF. 285 | APPEND lv_upd_where_line TO lt_upd_where. 286 | 287 | * IF lv_upd_where_line IS INITIAL. 288 | * lv_upd_where = 289 | * ELSE. 290 | * lv_upd_where = lv_upd_where && ` AND ` && -fieldname && ` = ` && `'` && && `'`. 291 | * ENDIF. 292 | ELSE. 293 | lv_do_skip_line = abap_true. 294 | ENDIF. 295 | ENDLOOP. 296 | 297 | IF lv_do_skip_line EQ abap_true. 298 | CONTINUE. 299 | ENDIF. 300 | 301 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 302 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 303 | """""""""""""" 304 | " Значения целевых полей - which is not initial (if not in array empty_fields) 305 | CLEAR lt_upd_set. 306 | LOOP AT lt_dd03l_loc ASSIGNING WHERE keyflag = abap_false 307 | AND comptype EQ 'E'. 308 | ASSIGN COMPONENT -fieldname OF STRUCTURE TO . 309 | IF sy-subrc EQ 0. 310 | IF IS INITIAL. 311 | "CONTINUE. 312 | READ TABLE lt_list_of_empty_fields TRANSPORTING NO FIELDS WITH KEY 313 | table_line = -fieldname BINARY SEARCH. 314 | IF sy-subrc EQ 0. 315 | ELSE. 316 | CONTINUE. 317 | ENDIF. 318 | ENDIF. 319 | 320 | CLEAR lv_upd_set_line. 321 | lv_upd_set_line = -fieldname && ` = ` && `'` && && `'`. 322 | IF lines( lt_upd_set ) GT 0. 323 | lv_upd_set_line = ` , ` && lv_upd_set_line. 324 | ENDIF. 325 | APPEND lv_upd_set_line TO lt_upd_set. 326 | * IF lv_upd_set IS INITIAL. 327 | * lv_upd_set = -fieldname && ` = ` && `'` && && `'`. 328 | * ELSE. 329 | * lv_upd_set = lv_upd_where && ` AND ` && -fieldname && ` = ` && `'` && && `'`. 330 | * ENDIF. 331 | ELSE. 332 | lv_do_skip_line = abap_true. 333 | ENDIF. 334 | ENDLOOP. 335 | 336 | 337 | IF lv_do_skip_line EQ abap_true. 338 | CONTINUE. 339 | ENDIF. 340 | 341 | IF lt_upd_set IS INITIAL 342 | OR lt_upd_where IS INITIAL. 343 | CONTINUE. 344 | ENDIF. 345 | 346 | " update для LUW 347 | UPDATE (iv_tabname) SET (lt_upd_set) WHERE (lt_upd_where). 348 | 349 | ENDLOOP. 350 | ENDMETHOD. 351 | 352 | METHOD get_json_string. 353 | * IMPORTING it_tab_data TYPE any 354 | * EXPORTING ev_json_str TYPE string. 355 | DATA lo_writer TYPE REF TO cl_sxml_string_writer. 356 | DATA lv_xstr_json TYPE xstring. 357 | " DATA lv_str_json TYPE string. 358 | DATA lv_reponse2pend TYPE string. 359 | lo_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ). 360 | 361 | CALL TRANSFORMATION id SOURCE json = it_tab_data 362 | RESULT XML lo_writer. 363 | 364 | lv_xstr_json = lo_writer->get_output( ). 365 | TRY. 366 | ev_json_str = cl_abap_codepage=>convert_from( 367 | source = lv_xstr_json 368 | * codepage = `UTF-8` 369 | * endian = 370 | * replacement = '#' 371 | * ignore_cerr = ABAP_FALSE 372 | ). 373 | CATCH cx_parameter_invalid_range. " Parameter with Invalid Range 374 | CATCH cx_sy_codepage_converter_init. " System Exception for Code Page Converter Initialization 375 | CATCH cx_sy_conversion_codepage. " System Exception Converting Character Set 376 | CATCH cx_parameter_invalid_type. " Parameter with Invalid Type 377 | ENDTRY. 378 | 379 | 380 | 381 | 382 | "REPLACE FIRST OCCURRENCE OF '{"JSON":[' IN ev_json_str WITH '{"request":['. 383 | " REPLACE ALL OCCURRENCES OF '{"JSON":' IN lv_str_json WITH ''. 384 | REPLACE ALL OCCURRENCES OF mc-json_open IN ev_json_str WITH ''. 385 | ev_json_str = shift_right( val = ev_json_str places = 1 ). 386 | 387 | " ev_json_str = lv_str_json. 388 | ENDMETHOD. "get_json_string 389 | 390 | 391 | METHOD get_tab_n_line_type. 392 | * METHODS get_tab_n_line_type 393 | * IMPORTING 394 | * !iv_tabname TYPE tabname 395 | * EXPORTING 396 | * !eo_line_type TYPE REF TO cl_abap_structdescr 397 | * !eo_tab_type TYPE REF TO cl_abap_tabledescr. 398 | DATA lo_struct TYPE REF TO cl_abap_structdescr. 399 | DATA lt_comp TYPE cl_abap_structdescr=>component_table. 400 | 401 | DATA lv_msg TYPE string. 402 | DATA lo_typedescr TYPE REF TO cl_abap_typedescr. 403 | 404 | lo_struct ?= cl_abap_typedescr=>describe_by_name( iv_tabname ). 405 | 406 | lt_comp = lo_struct->get_components( ). 407 | 408 | TRY . 409 | eo_line_type = cl_abap_structdescr=>create( 410 | p_components = lt_comp 411 | * p_strict = true 412 | ). 413 | eo_tab_type = cl_abap_tabledescr=>create( 414 | p_line_type = eo_line_type 415 | * p_table_kind = tablekind_std 416 | * p_unique = abap_false 417 | * p_key = 418 | * p_key_kind = keydefkind_default 419 | ). 420 | 421 | CATCH cx_sy_table_creation. " Exception when Creating a Table Type 422 | MESSAGE e001(cl) WITH iv_tabname INTO lv_msg. 423 | 424 | 425 | ENDTRY. 426 | ENDMETHOD. "get_tab_n_line_type 427 | 428 | 429 | METHOD put_json2dest_none. 430 | * IMPORTING iv_tabname TYPE tabname 431 | * iv_json_str TYPE string 432 | * iv_kz TYPE updkz OPTIONAL. 433 | 434 | CALL FUNCTION 'Z_C8A005_DEST_BYJSON' 435 | DESTINATION 'NONE' 436 | EXPORTING 437 | iv_tabname = iv_tabname " Имя таблицы 438 | iv_json_str = iv_json_str 439 | iv_kz = iv_kz 440 | iv_empty_fields = iv_empty_fields. 441 | 442 | 443 | ENDMETHOD. "put_json2update 444 | 445 | 446 | METHOD put_json2update. 447 | * IMPORTING iv_tabname TYPE tabname 448 | * iv_json_str TYPE string 449 | * iv_kz TYPE updkz OPTIONAL. 450 | 451 | CALL FUNCTION 'Z_C8A005_UPD_BYJSON' 452 | IN UPDATE TASK 453 | EXPORTING 454 | iv_tabname = iv_tabname " Имя таблицы 455 | iv_json_str = iv_json_str 456 | iv_kz = iv_kz 457 | iv_empty_fields = iv_empty_fields. 458 | 459 | 460 | ENDMETHOD. "put_json2update 461 | ENDCLASS. 462 | -------------------------------------------------------------------------------- /src/zcl_c8a005_tab_json.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_C8A005_TAB_JSON 7 | E 8 | ZCL_C8a005_TAB_JSON 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_c8a005_tabtype.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_c8a005_tabtype DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | METHODS get_by_data 8 | IMPORTING it_tabcontent TYPE any 9 | RETURNING VALUE(rv_val) TYPE tabname 10 | RAISING zcx_c8a005_error. 11 | PROTECTED SECTION. 12 | PRIVATE SECTION. 13 | 14 | TYPES: BEGIN OF ts_dd03l_join_in 15 | , fieldname TYPE dd03l-fieldname 16 | , inttype TYPE dd03l-inttype 17 | , position TYPE dd03l-position 18 | , intlen TYPE dd03l-intlen 19 | , decimals TYPE dd03l-decimals 20 | , END OF ts_dd03l_join_in 21 | , tt_dd03l_join_in TYPE STANDARD TABLE OF ts_dd03l_join_in WITH DEFAULT KEY 22 | . 23 | 24 | TYPES: BEGIN OF ts_dd03l_loc 25 | , tabname TYPE dd03l-tabname 26 | , fieldname TYPE dd03l-fieldname 27 | , as4local TYPE dd03l-as4local 28 | , as4vers TYPE dd03l-as4vers 29 | , position TYPE dd03l-position 30 | , keyflag TYPE dd03l-keyflag 31 | , mandatory TYPE dd03l-mandatory 32 | , rollname TYPE dd03l-rollname 33 | , comptype TYPE dd03l-comptype 34 | , END OF ts_dd03l_loc 35 | , tt_dd03l_loc TYPE STANDARD TABLE OF ts_dd03l_loc WITH DEFAULT KEY 36 | . 37 | 38 | TYPES: BEGIN OF ts_sel_strings 39 | , from_join_dyn TYPE STANDARD TABLE OF string WITH DEFAULT KEY 40 | , where_dyn TYPE STANDARD TABLE OF string WITH DEFAULT KEY 41 | , tab_result TYPE tt_dd03l_loc 42 | , END OF ts_sel_strings 43 | , tt_sel_strings TYPE STANDARD TABLE OF ts_sel_strings WITH DEFAULT KEY 44 | . 45 | CONSTANTS mc_max_joins TYPE syindex VALUE 42. 46 | 47 | METHODS get_by_components 48 | IMPORTING io_strcutdescr TYPE REF TO cl_abap_structdescr 49 | RETURNING VALUE(rv_val) TYPE tabname 50 | RAISING zcx_c8a005_error. 51 | 52 | METHODS prepare_sql_params 53 | IMPORTING io_strcutdescr TYPE REF TO cl_abap_structdescr 54 | EXPORTING et_dd03l_join_in TYPE tt_dd03l_join_in 55 | RAISING zcx_c8a005_error. 56 | 57 | METHODS prepare_sql_string 58 | IMPORTING it_dd03l_join_in TYPE tt_dd03l_join_in 59 | EXPORTING et_sel_strings TYPE tt_sel_strings 60 | RAISING zcx_c8a005_error. 61 | 62 | METHODS do_select 63 | CHANGING ct_sel_strings TYPE tt_sel_strings 64 | RAISING zcx_c8a005_error. 65 | 66 | METHODS get_tab_from_by_res 67 | EXPORTING ev_tabname TYPE tabname 68 | CHANGING ct_sel_strings TYPE tt_sel_strings 69 | RAISING zcx_c8a005_error. 70 | 71 | METHODS compare_components 72 | IMPORTING io_strcutdescr TYPE REF TO cl_abap_structdescr 73 | iv_tabname TYPE tabname 74 | RAISING zcx_c8a005_error. 75 | 76 | ENDCLASS. 77 | 78 | 79 | 80 | CLASS zcl_c8a005_tabtype IMPLEMENTATION. 81 | METHOD get_by_data. 82 | * IMPORTING it_tabcontent TYPE any 83 | * RETURNING VALUE(rv_val) TYPE tabname 84 | * RAISING zcx_c8a005_error. 85 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 86 | DATA lo_structdescr TYPE REF TO cl_abap_structdescr. 87 | DATA ls_X030L TYPE x030l. 88 | FIELD-SYMBOLS TYPE ANY TABLE. 89 | FIELD-SYMBOLS TYPE any. 90 | 91 | ASSIGN it_tabcontent TO . 92 | IF sy-subrc EQ 0. 93 | LOOP AT ASSIGNING . 94 | lo_structdescr ?= cl_abap_typedescr=>describe_by_data( ). 95 | 96 | IF lo_structdescr->is_ddic_type( ) EQ abap_true. 97 | lo_structdescr->get_ddic_header( 98 | RECEIVING p_header = ls_X030L 99 | EXCEPTIONS 100 | not_found = 1 101 | no_ddic_type = 2 102 | OTHERS = 3 103 | ). 104 | IF sy-subrc <> 0. 105 | * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO 106 | * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. 107 | ELSE. 108 | IF ls_X030L-tabtype EQ 'T'. 109 | rv_val = ls_X030L-tabname. 110 | ENDIF. 111 | ENDIF. 112 | ELSE. 113 | 114 | rv_val = get_by_components( lo_structdescr ). 115 | 116 | ENDIF. 117 | 118 | EXIT. 119 | ENDLOOP. 120 | ENDIF. 121 | 122 | ENDMETHOD. 123 | 124 | METHOD get_by_components. 125 | * IMPORTING io_strcutdescr TYPE REF TO cl_abap_structdescr 126 | * RETURNING VALUE(rv_val) TYPE tabname 127 | * RAISING zcx_c8a005_error. 128 | 129 | DATA lt_all_join_params_in TYPE tt_dd03l_join_in. 130 | DATA lt_sel_strings TYPE tt_sel_strings. 131 | DATA lv_target_tabname TYPE tabname. 132 | 133 | 134 | 135 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 136 | prepare_sql_params( EXPORTING io_strcutdescr = io_strcutdescr 137 | IMPORTING et_dd03l_join_in = lt_all_join_params_in ). 138 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 139 | 140 | prepare_sql_string( EXPORTING it_dd03l_join_in = lt_all_join_params_in 141 | IMPORTING et_sel_strings = lt_sel_strings ). 142 | 143 | 144 | do_select( CHANGING ct_sel_strings = lt_sel_strings ). 145 | 146 | get_tab_from_by_res( IMPORTING ev_tabname = lv_target_tabname 147 | CHANGING ct_sel_strings = lt_sel_strings ). 148 | 149 | compare_components( EXPORTING io_strcutdescr = io_strcutdescr 150 | iv_tabname = lv_target_tabname ). 151 | 152 | rv_val = lv_target_tabname. 153 | ENDMETHOD. 154 | 155 | METHOD prepare_sql_params. 156 | * IMPORTING io_strcutdescr TYPE REF TO cl_abap_structdescr 157 | * EXPORTING et_dd03l_join_in TYPE tt_dd03l_join_in 158 | * RAISING zcx_c8a005_error. 159 | 160 | DATA lv_position_num TYPE tabfdpos. 161 | 162 | FIELD-SYMBOLS TYPE abap_compdescr. 163 | FIELD-SYMBOLS TYPE ts_dd03l_join_in. 164 | 165 | CLEAR et_dd03l_join_in. 166 | 167 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 168 | 169 | LOOP AT io_strcutdescr->components ASSIGNING . 170 | " lv_position_num += 1. 171 | lv_position_num = lv_position_num + 1. 172 | 173 | IF -name EQ 'MANDT' OR -name EQ 'CLIENT'. 174 | CONTINUE. 175 | ENDIF. 176 | 177 | APPEND INITIAL LINE TO et_dd03l_join_in ASSIGNING . 178 | -fieldname = -name. 179 | -inttype = -type_kind. 180 | -position = lv_position_num. 181 | -intlen = -length. 182 | -decimals = -decimals. 183 | 184 | 185 | ENDLOOP. 186 | 187 | ENDMETHOD. 188 | 189 | METHOD prepare_sql_string. 190 | * IMPORTING it_dd03l_join_in TYPE tt_dd03l_join_in 191 | * EXPORTING et_sel_strings TYPE tt_sel_strings 192 | * RAISING zcx_c8a005_error. 193 | 194 | DATA lv_select_times TYPE syindex. 195 | DATA lv_loop_from TYPE syindex. 196 | DATA lv_loop_to TYPE syindex. 197 | DATA lv_sql_trg_line TYPE string. 198 | DATA lv_join_index TYPE syindex. 199 | FIELD-SYMBOLS TYPE ts_dd03l_join_in. 200 | FIELD-SYMBOLS TYPE ts_sel_strings. 201 | 202 | * IF lines( it_dd03l_join_in ) LE mc_max_joins. 203 | * lv_select_times = 1. 204 | * ELSE. 205 | IF lines( it_dd03l_join_in ) MOD mc_max_joins EQ 0. 206 | lv_select_times = lines( it_dd03l_join_in ) / mc_max_joins. 207 | ELSE. 208 | lv_select_times = ( lines( it_dd03l_join_in ) DIV mc_max_joins ) + 1. 209 | ENDIF. 210 | " ENDIF. 211 | 212 | 213 | CLEAR et_sel_strings. 214 | 215 | DO lv_select_times TIMES. 216 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 217 | lv_loop_from = ( ( sy-index - 1 ) * mc_max_joins ) + 1. 218 | lv_loop_to = sy-index * mc_max_joins. 219 | CLEAR lv_sql_trg_line. 220 | 221 | APPEND INITIAL LINE TO et_sel_strings ASSIGNING . 222 | 223 | lv_join_index = 0. 224 | LOOP AT it_dd03l_join_in ASSIGNING FROM lv_loop_from TO lv_loop_to. 225 | lv_join_index = lv_join_index + 1. 226 | lv_sql_trg_line = 227 | |t{ lv_join_index }~fieldname EQ '{ -fieldname }'| && 228 | " | AND t{ lv_join_index }~inttype = '{ -inttype }' | && 229 | | AND t{ lv_join_index }~position >= '{ -position }' | && 230 | | AND t{ lv_join_index }~intlen = '{ -intlen }' | && 231 | | AND t{ lv_join_index }~decimals = '{ -decimals }'|. 232 | 233 | IF lv_join_index EQ 1. 234 | ELSE. 235 | lv_sql_trg_line = ` AND ` && lv_sql_trg_line. 236 | ENDIF. 237 | APPEND lv_sql_trg_line TO -where_dyn. 238 | 239 | ENDLOOP. 240 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 241 | DO lv_join_index TIMES. 242 | IF sy-index = 1. 243 | lv_sql_trg_line = |DD03L AS t1 join DD02L as DD02L on t1~tabname EQ DD02L~tabname and DD02L~TABCLASS = 'TRANSP'|. 244 | ELSE. 245 | lv_sql_trg_line = |INNER JOIN dd03l AS t{ sy-index } ON t1~tabname EQ t{ sy-index }~tabname|. 246 | ENDIF. 247 | APPEND lv_sql_trg_line TO -from_join_dyn. 248 | ENDDO. 249 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 250 | ENDDO. 251 | 252 | ENDMETHOD. 253 | 254 | METHOD do_select. 255 | * changing ct_sel_strings TYPE tt_sel_strings 256 | * RAISING zcx_c8a005_error. 257 | FIELD-SYMBOLS TYPE ts_sel_strings. 258 | 259 | LOOP AT ct_sel_strings ASSIGNING . 260 | SELECT t1~tabname t1~fieldname t1~as4local t1~as4vers t1~position t1~keyflag 261 | FROM (-from_join_dyn) 262 | INTO TABLE -tab_result 263 | WHERE (-where_dyn). 264 | 265 | IF -tab_result IS INITIAL. 266 | RAISE EXCEPTION TYPE zcx_c8a005_error. 267 | ENDIF. 268 | 269 | ENDLOOP. 270 | 271 | ENDMETHOD. 272 | 273 | METHOD get_tab_from_by_res. 274 | * EXPORTING ev_tabname TYPE tabname 275 | * CHANGING ct_sel_strings TYPE tt_sel_strings 276 | * RAISING zcx_c8a005_error. 277 | DATA lt_potential_tab_list TYPE STANDARD TABLE OF tabname. 278 | DATA lv_found_in_result TYPE syindex. 279 | 280 | FIELD-SYMBOLS TYPE ts_sel_strings. 281 | FIELD-SYMBOLS TYPE ts_sel_strings. 282 | FIELD-SYMBOLS TYPE ts_dd03l_loc. 283 | FIELD-SYMBOLS TYPE ts_dd03l_loc. 284 | 285 | CLEAR lt_potential_tab_list. 286 | LOOP AT ct_sel_strings ASSIGNING . 287 | 288 | 289 | IF -tab_result IS INITIAL. 290 | RAISE EXCEPTION TYPE zcx_c8a005_error. 291 | ENDIF. 292 | 293 | 294 | LOOP AT -tab_result ASSIGNING 295 | WHERE tabname IS NOT INITIAL. 296 | 297 | lv_found_in_result = 0. 298 | LOOP AT ct_sel_strings ASSIGNING . 299 | LOOP AT -tab_result ASSIGNING 300 | WHERE tabname = -tabname. 301 | lv_found_in_result = lv_found_in_result + 1. 302 | ENDLOOP. 303 | ENDLOOP. 304 | IF lv_found_in_result EQ lines( ct_sel_strings ). 305 | READ TABLE lt_potential_tab_list TRANSPORTING NO FIELDS 306 | WITH KEY table_line = -tabname. 307 | IF sy-subrc EQ 0. 308 | ELSE. 309 | APPEND -tabname TO lt_potential_tab_list. 310 | ENDIF. 311 | ENDIF. 312 | 313 | IF lines( lt_potential_tab_list ) GE 2. 314 | RAISE EXCEPTION TYPE zcx_c8a005_error. 315 | ENDIF. 316 | 317 | ENDLOOP. 318 | ENDLOOP. 319 | 320 | IF lt_potential_tab_list IS INITIAL. 321 | RAISE EXCEPTION TYPE zcx_c8a005_error. 322 | ENDIF. 323 | 324 | LOOP AT lt_potential_tab_list INTO ev_tabname. 325 | EXIT. 326 | ENDLOOP. 327 | 328 | ENDMETHOD. 329 | 330 | METHOD compare_components. 331 | * IMPORTING io_strcutdescr TYPE REF TO cl_abap_structdescr 332 | * iv_tabname TYPE tabname 333 | * RAISING zcx_c8a005_error. 334 | 335 | DATA lt_dd03l_loc TYPE tt_dd03l_loc. 336 | 337 | DATA lv_comp_index TYPE syindex. 338 | 339 | FIELD-SYMBOLS TYPE abap_compdescr. 340 | FIELD-SYMBOLS TYPE ts_dd03l_loc. 341 | 342 | SELECT tabname fieldname as4local as4vers position keyflag mandatory rollname comptype 343 | FROM dd03l 344 | INTO TABLE lt_dd03l_loc 345 | WHERE tabname = iv_tabname 346 | AND as4local = 'A' 347 | AND comptype = 'E' 348 | ORDER BY position ASCENDING 349 | . 350 | 351 | IF lines( lt_dd03l_loc ) EQ lines( io_strcutdescr->components ). 352 | " ok 353 | ELSE. 354 | RAISE EXCEPTION TYPE zcx_c8a005_error. 355 | ENDIF. 356 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 357 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 358 | lv_comp_index = 0. 359 | LOOP AT io_strcutdescr->components ASSIGNING . 360 | lv_comp_index = lv_comp_index + 1. 361 | 362 | READ TABLE lt_dd03l_loc ASSIGNING INDEX lv_comp_index. 363 | IF sy-subrc EQ 0. 364 | 365 | IF -name EQ -fieldname. 366 | ELSE. 367 | RAISE EXCEPTION TYPE zcx_c8a005_error. 368 | ENDIF. 369 | 370 | ENDIF. 371 | 372 | ENDLOOP. 373 | 374 | ENDMETHOD. 375 | ENDCLASS. 376 | -------------------------------------------------------------------------------- /src/zcl_c8a005_tabtype.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | *"* use this source file for your ABAP unit test classes 2 | 3 | INTERFACE ltc_interface4type. 4 | TYPES ts_data TYPE ztc8a005_sample. 5 | TYPES tt_data TYPE STANDARD TABLE OF ts_data WITH DEFAULT KEY. 6 | 7 | TYPES ts_wide_tab TYPE bseg. 8 | TYPES tt_wide_tab TYPE STANDARD TABLE OF ts_wide_tab WITH DEFAULT KEY. 9 | 10 | TYPES: BEGIN OF ts_part_of_sample 11 | , entity_param1 TYPE ztc8a005_sample-entity_param1 12 | , entity_param2 TYPE ztc8a005_sample-entity_param2 13 | , entity_param3 TYPE ztc8a005_sample-entity_param3 14 | , entity_param4 TYPE ztc8a005_sample-entity_param4 15 | , END OF ts_part_of_sample 16 | , tt_part_of_sample TYPE STANDARD TABLE OF ts_part_of_sample WITH DEFAULT KEY 17 | . 18 | 19 | ENDINTERFACE. 20 | 21 | CLASS ltc_find_tab DEFINITION FOR TESTING 22 | DURATION SHORT 23 | RISK LEVEL HARMLESS 24 | INHERITING FROM cl_aunit_assert. 25 | 26 | PUBLIC SECTION. 27 | METHODS run_test_on_db_tab FOR TESTING. 28 | METHODS run_test_on_tab_type FOR TESTING. 29 | METHODS run_test_on_intf_type FOR TESTING. 30 | METHODS run_test_on_intf_widetype FOR TESTING. 31 | METHODS run_test_on_no_in_ddic FOR TESTING. 32 | PROTECTED SECTION. 33 | 34 | PRIVATE SECTION. 35 | 36 | 37 | ENDCLASS. 38 | 39 | 40 | CLASS ltc_find_tab IMPLEMENTATION. 41 | 42 | METHOD run_test_on_db_tab. 43 | 44 | DATA lo_tabtype TYPE REF TO zcl_c8a005_tabtype. 45 | CREATE OBJECT lo_tabtype. 46 | 47 | "DATA lt_sample TYPE STANDARD TABLE OF ztc8a005_sample. 48 | DATA lt_sample TYPE ztc8a005_sample_tab_type. 49 | DATA lv_tab_name TYPE tabname. 50 | 51 | lt_sample = VALUE #( 52 | ( entity_guid = 'XXXXXXGUID01' entity_param1 = 'CHAR11' entity_param2 = '1002003001' entity_param3 = sy-uzeit ) 53 | ( entity_guid = 'XXXXXXGUID02' entity_param1 = 'CHAR12' entity_param2 = '1002003002' entity_param3 = ( sy-uzeit + 20 ) ) 54 | ( entity_guid = 'XXXXXXGUID03' entity_param1 = 'CHAR13' entity_param2 = '1002003003' entity_param3 = ( sy-uzeit + 30 ) ) 55 | ). 56 | 57 | 58 | BREAK-POINT. 59 | 60 | TRY. 61 | lv_tab_name = 62 | lo_tabtype->get_by_data( lt_sample ). 63 | CATCH zcx_c8a005_error. 64 | fail( 65 | * EXPORTING 66 | * msg = 67 | * level = if_aunit_constants=>severity-medium 68 | * quit = if_aunit_constants=>quit-test 69 | * detail = 70 | ). 71 | ENDTRY. 72 | ENDMETHOD. 73 | 74 | METHOD run_test_on_tab_type. 75 | 76 | DATA lo_tabtype TYPE REF TO zcl_c8a005_tabtype. 77 | CREATE OBJECT lo_tabtype. 78 | 79 | DATA lt_sample TYPE STANDARD TABLE OF ztc8a005_sample. 80 | DATA lv_tab_name TYPE tabname. 81 | 82 | lt_sample = VALUE #( 83 | ( entity_guid = 'XXXXXXGUID01' entity_param1 = 'CHAR11' entity_param2 = '1002003001' entity_param3 = sy-uzeit ) 84 | ( entity_guid = 'XXXXXXGUID02' entity_param1 = 'CHAR12' entity_param2 = '1002003002' entity_param3 = ( sy-uzeit + 20 ) ) 85 | ( entity_guid = 'XXXXXXGUID03' entity_param1 = 'CHAR13' entity_param2 = '1002003003' entity_param3 = ( sy-uzeit + 30 ) ) 86 | ). 87 | 88 | 89 | BREAK-POINT. 90 | 91 | TRY. 92 | lv_tab_name = 93 | lo_tabtype->get_by_data( lt_sample ). 94 | CATCH zcx_c8a005_error. 95 | fail( 96 | * EXPORTING 97 | * msg = 98 | * level = if_aunit_constants=>severity-medium 99 | * quit = if_aunit_constants=>quit-test 100 | * detail = 101 | ). 102 | ENDTRY. 103 | 104 | ENDMETHOD. 105 | 106 | METHOD run_test_on_intf_type. 107 | 108 | DATA lo_tabtype TYPE REF TO zcl_c8a005_tabtype. 109 | CREATE OBJECT lo_tabtype. 110 | 111 | DATA lt_sample TYPE STANDARD TABLE OF ltc_interface4type=>ts_data. 112 | DATA lv_tab_name TYPE tabname. 113 | 114 | lt_sample = VALUE #( 115 | ( entity_guid = 'XXXXXXGUID01' entity_param1 = 'CHAR11' entity_param2 = '1002003001' entity_param3 = sy-uzeit ) 116 | ( entity_guid = 'XXXXXXGUID02' entity_param1 = 'CHAR12' entity_param2 = '1002003002' entity_param3 = ( sy-uzeit + 20 ) ) 117 | ( entity_guid = 'XXXXXXGUID03' entity_param1 = 'CHAR13' entity_param2 = '1002003003' entity_param3 = ( sy-uzeit + 30 ) ) 118 | ). 119 | 120 | 121 | BREAK-POINT. 122 | 123 | TRY. 124 | lv_tab_name = 125 | lo_tabtype->get_by_data( lt_sample ). 126 | CATCH zcx_c8a005_error. 127 | fail( 128 | * EXPORTING 129 | * msg = 130 | * level = if_aunit_constants=>severity-medium 131 | * quit = if_aunit_constants=>quit-test 132 | * detail = 133 | ). 134 | ENDTRY. 135 | 136 | ENDMETHOD. 137 | 138 | METHOD run_test_on_intf_widetype. 139 | 140 | DATA lo_tabtype TYPE REF TO zcl_c8a005_tabtype. 141 | CREATE OBJECT lo_tabtype. 142 | 143 | DATA lt_sample TYPE STANDARD TABLE OF ltc_interface4type=>ts_wide_tab. 144 | DATA lv_tab_name TYPE tabname. 145 | 146 | lt_sample = VALUE #( 147 | ( bukrs = '2001' belnr = 'CHAR11' gjahr = sy-datum(4) buzei = '003' buzid = 'Z' augdt = ( sy-datum - 2 ) augcp = sy-datum ) 148 | ( bukrs = '2001' belnr = 'CHAR12' gjahr = sy-datum(4) buzei = '003' buzid = 'Z' augdt = ( sy-datum - 2 ) augcp = sy-datum ) 149 | ( bukrs = '2001' belnr = 'CHAR13' gjahr = sy-datum(4) buzei = '003' buzid = 'Z' augdt = ( sy-datum - 2 ) augcp = sy-datum ) 150 | ). 151 | 152 | 153 | BREAK-POINT. 154 | 155 | TRY. 156 | lv_tab_name = 157 | lo_tabtype->get_by_data( lt_sample ). 158 | CATCH zcx_c8a005_error. 159 | fail( 160 | * EXPORTING 161 | * msg = 162 | * level = if_aunit_constants=>severity-medium 163 | * quit = if_aunit_constants=>quit-test 164 | * detail = 165 | ). 166 | ENDTRY. 167 | 168 | ENDMETHOD. 169 | 170 | METHOD run_test_on_no_in_ddic. 171 | 172 | DATA lo_tabtype TYPE REF TO zcl_c8a005_tabtype. 173 | CREATE OBJECT lo_tabtype. 174 | 175 | DATA lt_sample TYPE ltc_interface4type=>tt_part_of_sample. 176 | DATA lv_tab_name TYPE tabname. 177 | 178 | lt_sample = VALUE #( ( entity_param1 = 'CHAR11' entity_param2 = '1002003001' entity_param3 = sy-uzeit ) 179 | ( entity_param1 = 'CHAR12' entity_param2 = '1002003002' entity_param3 = ( sy-uzeit + 20 ) ) 180 | ( entity_param1 = 'CHAR13' entity_param2 = '1002003003' entity_param3 = ( sy-uzeit + 30 ) ) 181 | ). 182 | 183 | 184 | BREAK-POINT. 185 | 186 | TRY. 187 | lv_tab_name = 188 | lo_tabtype->get_by_data( lt_sample ). 189 | fail( 190 | * EXPORTING 191 | * msg = 192 | * level = if_aunit_constants=>severity-medium 193 | * quit = if_aunit_constants=>quit-test 194 | * detail = 195 | ). 196 | CATCH zcx_c8a005_error. 197 | " test is ok 198 | ENDTRY. 199 | 200 | 201 | ENDMETHOD. 202 | 203 | ENDCLASS. 204 | -------------------------------------------------------------------------------- /src/zcl_c8a005_tabtype.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_C8A005_TABTYPE 7 | E 8 | Get TabType 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcx_c8a005_error.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCX_C8A005_ERROR definition 2 | public 3 | inheriting from CX_STATIC_CHECK 4 | create public . 5 | 6 | public section. 7 | 8 | interfaces IF_T100_DYN_MSG . 9 | interfaces IF_T100_MESSAGE . 10 | 11 | data MV_TXT type STRING . 12 | 13 | methods CONSTRUCTOR 14 | importing 15 | !TEXTID like IF_T100_MESSAGE=>T100KEY optional 16 | !PREVIOUS like PREVIOUS optional 17 | !MV_TXT type STRING optional . 18 | protected section. 19 | private section. 20 | ENDCLASS. 21 | 22 | 23 | 24 | CLASS ZCX_C8A005_ERROR IMPLEMENTATION. 25 | 26 | 27 | method CONSTRUCTOR. 28 | CALL METHOD SUPER->CONSTRUCTOR 29 | EXPORTING 30 | PREVIOUS = PREVIOUS 31 | . 32 | me->MV_TXT = MV_TXT . 33 | clear me->textid. 34 | if textid is initial. 35 | IF_T100_MESSAGE~T100KEY = IF_T100_MESSAGE=>DEFAULT_TEXTID. 36 | else. 37 | IF_T100_MESSAGE~T100KEY = TEXTID. 38 | endif. 39 | endmethod. 40 | ENDCLASS. 41 | -------------------------------------------------------------------------------- /src/zcx_c8a005_error.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCX_C8A005_ERROR 7 | E 8 | AnyTab UpdateTask Exception 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | CONSTRUCTOR 18 | R 19 | CONSTRUCTOR 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.lzfg_c8a005_updd01.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Include LZFG_C8A005_UPDD01 3 | *&---------------------------------------------------------------------* 4 | 5 | CLASS lcl_tab_json DEFINITION. 6 | 7 | PUBLIC SECTION. 8 | METHODS constructor. 9 | 10 | METHODS get_json_string 11 | IMPORTING it_tab_data TYPE any 12 | EXPORTING ev_json_str TYPE string. 13 | 14 | METHODS put_json2update 15 | IMPORTING iv_tabname TYPE tabname 16 | iv_json_str TYPE string. 17 | 18 | METHODS do_commit . 19 | METHODS get_from_json2tab 20 | IMPORTING iv_tabname TYPE tabname 21 | iv_json_str TYPE string. 22 | 23 | 24 | PROTECTED SECTION. 25 | 26 | PRIVATE SECTION. 27 | CONSTANTS: BEGIN OF mc 28 | , json_open TYPE string VALUE '{"JSON":' 29 | , json_close TYPE string VALUE '}' 30 | , END OF mc. 31 | 32 | METHODS create_tab_n_line 33 | IMPORTING 34 | !iv_tabname TYPE tabname 35 | EXPORTING 36 | !ert_ref TYPE REF TO data 37 | !ers_ref TYPE REF TO data 38 | . 39 | 40 | METHODS get_tab_n_line_type 41 | IMPORTING 42 | !iv_tabname TYPE tabname 43 | EXPORTING 44 | !eo_line_type TYPE REF TO cl_abap_structdescr 45 | !eo_tab_type TYPE REF TO cl_abap_tabledescr. 46 | 47 | ENDCLASS. 48 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.lzfg_c8a005_updd01.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | LZFG_C8A005_UPDD01 7 | I 8 | S 9 | R 10 | X 11 | 12 | 13 | 14 | R 15 | Include LZFG_C8A005_UPDD01 16 | 26 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.lzfg_c8a005_updp01.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Include LZFG_C8A005_UPDP01 3 | *&---------------------------------------------------------------------* 4 | 5 | CLASS lcl_tab_json IMPLEMENTATION. 6 | METHOD constructor. 7 | 8 | ENDMETHOD. "constructor 9 | 10 | METHOD get_json_string. 11 | * IMPORTING it_tab_data TYPE any 12 | * EXPORTING ev_json_str TYPE string. 13 | DATA lo_writer TYPE REF TO cl_sxml_string_writer. 14 | DATA lv_xstr_json TYPE xstring. 15 | " DATA lv_str_json TYPE string. 16 | DATA lv_reponse2pend TYPE string. 17 | lo_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ). 18 | 19 | CALL TRANSFORMATION id SOURCE json = it_tab_data 20 | RESULT XML lo_writer. 21 | 22 | lv_xstr_json = lo_writer->get_output( ). 23 | TRY. 24 | ev_json_str = cl_abap_codepage=>convert_from( 25 | source = lv_xstr_json 26 | * codepage = `UTF-8` 27 | * endian = 28 | * replacement = '#' 29 | * ignore_cerr = ABAP_FALSE 30 | ). 31 | CATCH cx_parameter_invalid_range. " Parameter with Invalid Range 32 | CATCH cx_sy_codepage_converter_init. " System Exception for Code Page Converter Initialization 33 | CATCH cx_sy_conversion_codepage. " System Exception Converting Character Set 34 | CATCH cx_parameter_invalid_type. " Parameter with Invalid Type 35 | ENDTRY. 36 | 37 | 38 | 39 | 40 | "REPLACE FIRST OCCURRENCE OF '{"JSON":[' IN ev_json_str WITH '{"request":['. 41 | " REPLACE ALL OCCURRENCES OF '{"JSON":' IN lv_str_json WITH ''. 42 | REPLACE ALL OCCURRENCES OF mc-json_open IN ev_json_str WITH ''. 43 | ev_json_str = shift_right( val = ev_json_str places = 1 ). 44 | 45 | " ev_json_str = lv_str_json. 46 | ENDMETHOD. "get_json_string 47 | 48 | METHOD put_json2update. 49 | * IMPORTING iv_tabname TYPE tabname 50 | * iv_json_str TYPE string. 51 | 52 | CALL FUNCTION 'Z_C8A005_UPD_BYJSON' 53 | IN UPDATE TASK 54 | EXPORTING 55 | iv_tabname = iv_tabname " Имя таблицы 56 | iv_json_str = iv_json_str. 57 | 58 | 59 | ENDMETHOD. "put_json2update 60 | 61 | METHOD do_commit . 62 | CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 63 | EXPORTING 64 | wait = abap_true " Use of Command `COMMIT AND WAIT` 65 | * IMPORTING 66 | * return = " Return Messages 67 | . 68 | ENDMETHOD. "do_commit 69 | 70 | METHOD get_from_json2tab. 71 | * IMPORTING iv_tabname TYPE tabname 72 | * iv_json_str TYPE string. 73 | 74 | DATA lv_json_str TYPE string. 75 | DATA lr_db_content TYPE REF TO data. 76 | DATA lr_reader TYPE REF TO if_sxml_reader. 77 | 78 | FIELD-SYMBOLS TYPE STANDARD TABLE. 79 | 80 | 81 | TRY . 82 | create_tab_n_line( 83 | EXPORTING 84 | iv_tabname = iv_tabname " Имя таблицы 85 | IMPORTING 86 | ert_ref = lr_db_content ). 87 | 88 | CATCH cx_root. 89 | MESSAGE e000(cl). 90 | RETURN. 91 | ENDTRY. 92 | 93 | 94 | ASSIGN lr_db_content->* TO . 95 | lv_json_str = mc-json_open && iv_json_str && mc-json_close. 96 | 97 | 98 | TRY. 99 | 100 | CLEAR . 101 | 102 | CALL TRANSFORMATION id 103 | SOURCE XML lv_json_str 104 | RESULT json = . 105 | 106 | CATCH cx_root. 107 | MESSAGE e000(cl). 108 | ENDTRY. 109 | 110 | 111 | TRY. 112 | MODIFY (iv_tabname) FROM TABLE . 113 | " OK 114 | CATCH cx_sy_open_sql_db. 115 | MESSAGE e000(cl). 116 | RETURN. 117 | ENDTRY. 118 | 119 | 120 | ENDMETHOD. "get_from_json2tab 121 | 122 | METHOD create_tab_n_line. 123 | * IMPORTING 124 | * !iv_tabname TYPE tabname 125 | * EXPORTING 126 | * !ert_ref TYPE REF TO data 127 | * !ers_ref TYPE REF TO data 128 | * . 129 | 130 | DATA lv_tabname TYPE tabname. 131 | 132 | DATA lo_line_type TYPE REF TO cl_abap_structdescr. 133 | DATA lo_tab_type TYPE REF TO cl_abap_tabledescr. 134 | 135 | DATA lt_tab_ref TYPE REF TO data. 136 | DATA ls_line_ref TYPE REF TO data. 137 | 138 | lv_tabname = iv_tabname. 139 | 140 | TRY. 141 | me->get_tab_n_line_type( 142 | EXPORTING 143 | iv_tabname = lv_tabname " Имя таблицы 144 | IMPORTING 145 | eo_line_type = lo_line_type " Runtime Type Services 146 | eo_tab_type = lo_tab_type " Runtime Type Services 147 | ). 148 | " CATCH zcx_nm0002_templ. " Exceptions while template 149 | 150 | CREATE DATA lt_tab_ref TYPE HANDLE lo_tab_type. 151 | CREATE DATA ls_line_ref TYPE HANDLE lo_line_type. 152 | 153 | ert_ref ?= lt_tab_ref. 154 | ers_ref ?= ls_line_ref. 155 | 156 | CATCH cx_root. 157 | " dump any way 158 | MESSAGE x000(cl). 159 | ENDTRY. 160 | 161 | ENDMETHOD. "create_tab_n_line 162 | 163 | METHOD get_tab_n_line_type. 164 | * METHODS get_tab_n_line_type 165 | * IMPORTING 166 | * !iv_tabname TYPE tabname 167 | * EXPORTING 168 | * !eo_line_type TYPE REF TO cl_abap_structdescr 169 | * !eo_tab_type TYPE REF TO cl_abap_tabledescr. 170 | DATA lo_struct TYPE REF TO cl_abap_structdescr. 171 | DATA lt_comp TYPE cl_abap_structdescr=>component_table. 172 | 173 | DATA lv_msg TYPE string. 174 | DATA lo_typedescr TYPE REF TO cl_abap_typedescr. 175 | 176 | lo_struct ?= cl_abap_typedescr=>describe_by_name( iv_tabname ). 177 | 178 | lt_comp = lo_struct->get_components( ). 179 | 180 | TRY . 181 | eo_line_type = cl_abap_structdescr=>create( 182 | p_components = lt_comp 183 | * p_strict = true 184 | ). 185 | eo_tab_type = cl_abap_tabledescr=>create( 186 | p_line_type = eo_line_type 187 | * p_table_kind = tablekind_std 188 | * p_unique = abap_false 189 | * p_key = 190 | * p_key_kind = keydefkind_default 191 | ). 192 | CATCH cx_sy_table_creation. " Exception when Creating a Table Type 193 | MESSAGE e001(cl) WITH iv_tabname INTO lv_msg. 194 | 195 | 196 | ENDTRY. 197 | ENDMETHOD. "get_tab_n_line_type 198 | 199 | ENDCLASS. "lcl_tab_json IMPLEMENTATION 200 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.lzfg_c8a005_updp01.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | LZFG_C8A005_UPDP01 7 | I 8 | S 9 | R 10 | X 11 | 12 | 13 | 14 | R 15 | Include LZFG_C8A005_UPDP01 16 | 26 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.lzfg_c8a005_updtop.abap: -------------------------------------------------------------------------------- 1 | FUNCTION-POOL ZFG_C8A005_UPD. "MESSAGE-ID .. 2 | 3 | INCLUDE LZFG_C8A005_UPDD01. " Local class definition 4 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.lzfg_c8a005_updtop.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | LZFG_C8A005_UPDTOP 7 | S 8 | D$ 9 | I 10 | S 11 | X 12 | D$S 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.saplzfg_c8a005_upd.abap: -------------------------------------------------------------------------------- 1 | ******************************************************************* 2 | * System-defined Include-files. * 3 | ******************************************************************* 4 | INCLUDE LZFG_C8A005_UPDTOP. " Global Data 5 | INCLUDE LZFG_C8A005_UPDUXX. " Function Modules 6 | 7 | ******************************************************************* 8 | * User-defined Include-files (if necessary). * 9 | ******************************************************************* 10 | * INCLUDE LZFG_C8A005_UPDF... " Subroutines 11 | * INCLUDE LZFG_C8A005_UPDO... " PBO-Modules 12 | * INCLUDE LZFG_C8A005_UPDI... " PAI-Modules 13 | * INCLUDE LZFG_C8A005_UPDE... " Events 14 | INCLUDE LZFG_C8A005_UPDP01. " Local class implement. 15 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.saplzfg_c8a005_upd.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | SAPLZFG_C8A005_UPD 7 | S 8 | D$ 9 | F 10 | S 11 | R 12 | X 13 | D$S 14 | X 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Function for Any Tab Update 6 | 7 | LZFG_C8A005_UPDD01 8 | LZFG_C8A005_UPDP01 9 | LZFG_C8A005_UPDTOP 10 | SAPLZFG_C8A005_UPD 11 | 12 | 13 | 14 | Z_C8A005_DEST_BYJSON 15 | R 16 | Update By tab TABNAME in Destination NONE 17 | 18 | 19 | IV_TABNAME 20 | TABNAME 21 | 22 | 23 | IV_JSON_STR 24 | STRING 25 | 26 | 27 | IV_KZ 28 | X 29 | UPDKZ_D 30 | 31 | 32 | IV_EMPTY_FIELDS 33 | X 34 | STRING 35 | 36 | 37 | 38 | 39 | IV_TABNAME 40 | P 41 | Имя таблицы 42 | 43 | 44 | IV_JSON_STR 45 | P 46 | 47 | 48 | IV_KZ 49 | P 50 | Таблица для индикаторов обновления 51 | 52 | 53 | IV_EMPTY_FIELDS 54 | P 55 | 56 | 57 | 58 | 59 | Z_C8A005_UPD_ANYTAB 60 | Update By tab TABNAME 61 | 62 | 63 | IV_TABNAME 64 | X 65 | TABNAME 66 | 67 | 68 | IT_TAB_DATA 69 | X 70 | ANY 71 | 72 | 73 | IV_DO_COMMIT 74 | ABAP_FALSE 75 | X 76 | X 77 | CHAR1 78 | 79 | 80 | IV_KZ 81 | X 82 | X 83 | UPDKZ_D 84 | 85 | 86 | IV_DEST_NONE 87 | ABAP_FALSE 88 | X 89 | X 90 | CHAR1 91 | 92 | 93 | IV_EMPTY_FIELDS 94 | X 95 | X 96 | STRING 97 | 98 | 99 | 100 | 101 | IV_TABNAME 102 | P 103 | Имя таблицы 104 | 105 | 106 | IT_TAB_DATA 107 | P 108 | 109 | 110 | IV_DO_COMMIT 111 | P 112 | Индикатор из одной позиции 113 | 114 | 115 | IV_KZ 116 | P 117 | Таблица для индикаторов обновления 118 | 119 | 120 | IV_DEST_NONE 121 | P 122 | Destination NONE call 123 | 124 | 125 | IV_EMPTY_FIELDS 126 | P 127 | 128 | 129 | 130 | 131 | Z_C8A005_UPD_BYJSON 132 | 1 133 | Update By tab TABNAME 134 | 135 | 136 | IV_TABNAME 137 | TABNAME 138 | 139 | 140 | IV_JSON_STR 141 | STRING 142 | 143 | 144 | IV_KZ 145 | X 146 | UPDKZ_D 147 | 148 | 149 | IV_EMPTY_FIELDS 150 | X 151 | STRING 152 | 153 | 154 | 155 | 156 | IV_TABNAME 157 | P 158 | Имя таблицы 159 | 160 | 161 | IV_JSON_STR 162 | P 163 | 164 | 165 | IV_KZ 166 | P 167 | Таблица для индикаторов обновления 168 | 169 | 170 | IV_EMPTY_FIELDS 171 | P 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.z_c8a005_dest_byjson.abap: -------------------------------------------------------------------------------- 1 | FUNCTION z_c8a005_dest_byjson. 2 | *"---------------------------------------------------------------------- 3 | *"*"Локальный интерфейс: 4 | *" IMPORTING 5 | *" VALUE(IV_TABNAME) TYPE TABNAME 6 | *" VALUE(IV_JSON_STR) TYPE STRING 7 | *" VALUE(IV_KZ) TYPE UPDKZ_D OPTIONAL 8 | *" VALUE(IV_EMPTY_FIELDS) TYPE STRING OPTIONAL 9 | *"---------------------------------------------------------------------- 10 | 11 | 12 | DATA lo_tab_json TYPE REF TO zcl_c8a005_tab_json. 13 | 14 | CALL FUNCTION 'Z_C8A005_UPD_BYJSON' 15 | IN UPDATE TASK 16 | EXPORTING 17 | iv_tabname = iv_tabname " Имя таблицы 18 | iv_json_str = iv_json_str 19 | iv_kz = iv_kz " Таблица для индикаторов обновления 20 | iv_empty_fields = iv_empty_fields. 21 | 22 | 23 | CREATE OBJECT lo_tab_json. 24 | 25 | lo_tab_json->do_commit( ). 26 | 27 | ENDFUNCTION. 28 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.z_c8a005_upd_anytab.abap: -------------------------------------------------------------------------------- 1 | FUNCTION z_c8a005_upd_anytab. 2 | *"---------------------------------------------------------------------- 3 | *"*"Локальный интерфейс: 4 | *" IMPORTING 5 | *" REFERENCE(IV_TABNAME) TYPE TABNAME 6 | *" REFERENCE(IT_TAB_DATA) TYPE ANY 7 | *" REFERENCE(IV_DO_COMMIT) TYPE CHAR1 DEFAULT ABAP_FALSE 8 | *" REFERENCE(IV_KZ) TYPE UPDKZ_D OPTIONAL 9 | *" REFERENCE(IV_DEST_NONE) TYPE CHAR1 DEFAULT ABAP_FALSE 10 | *" REFERENCE(IV_EMPTY_FIELDS) TYPE STRING OPTIONAL 11 | *"---------------------------------------------------------------------- 12 | 13 | " DATA lo_tab_json TYPE REF TO lcl_tab_json. 14 | DATA lo_tab_json TYPE REF TO zcl_c8a005_tab_json. 15 | DATA lv_json_str TYPE string. 16 | 17 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 18 | DATA lv_subkey_saab_log TYPE string. 19 | DATA lv_ts TYPE timestampl. 20 | DATA sycprog TYPE sycprog. 21 | DATA syuname TYPE syuname. 22 | DATA lv_bcs_mod TYPE bcs_blmodule. 23 | 24 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 25 | GET TIME STAMP FIELD lv_ts. 26 | 27 | lv_subkey_saab_log = iv_tabname && `_` && lv_ts. 28 | sycprog = sy-cprog. 29 | syuname = sy-uname. 30 | 31 | LOG-POINT ID zc8a005_control SUBKEY lv_subkey_saab_log 32 | FIELDS it_tab_data 33 | iv_do_commit 34 | iv_kz 35 | iv_dest_none 36 | iv_empty_fields 37 | sycprog 38 | syuname. 39 | lv_bcs_mod = iv_tabname. 40 | cl_bcs_breakloop=>execute_loop( iv_module = lv_bcs_mod ). 41 | """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 42 | CREATE OBJECT lo_tab_json. 43 | 44 | lo_tab_json->get_json_string( EXPORTING it_tab_data = it_tab_data 45 | IMPORTING ev_json_str = lv_json_str ). 46 | 47 | 48 | CASE abap_true. 49 | WHEN iv_dest_none. 50 | lo_tab_json->put_json2dest_none( EXPORTING iv_tabname = iv_tabname 51 | iv_json_str = lv_json_str 52 | iv_kz = iv_kz 53 | iv_empty_fields = iv_empty_fields ). 54 | 55 | WHEN OTHERS. 56 | lo_tab_json->put_json2update( EXPORTING iv_tabname = iv_tabname 57 | iv_json_str = lv_json_str 58 | iv_kz = iv_kz 59 | iv_empty_fields = iv_empty_fields ). 60 | 61 | IF iv_do_commit EQ abap_true. 62 | lo_tab_json->do_commit( ). 63 | ENDIF. 64 | ENDCASE. 65 | 66 | 67 | 68 | ENDFUNCTION. 69 | -------------------------------------------------------------------------------- /src/zfg_c8a005_upd.fugr.z_c8a005_upd_byjson.abap: -------------------------------------------------------------------------------- 1 | FUNCTION z_c8a005_upd_byjson. 2 | *"---------------------------------------------------------------------- 3 | *"*"Функциональный модуль обновления: 4 | *" 5 | *"*"Локальный интерфейс: 6 | *" IMPORTING 7 | *" VALUE(IV_TABNAME) TYPE TABNAME 8 | *" VALUE(IV_JSON_STR) TYPE STRING 9 | *" VALUE(IV_KZ) TYPE UPDKZ_D OPTIONAL 10 | *" VALUE(IV_EMPTY_FIELDS) TYPE STRING OPTIONAL 11 | *"---------------------------------------------------------------------- 12 | 13 | DATA lo_tab_json TYPE REF TO zcl_c8a005_tab_json. 14 | DATA lv_json_str TYPE string. 15 | 16 | CREATE OBJECT lo_tab_json. 17 | 18 | lo_tab_json->get_from_json2tab( EXPORTING iv_tabname = iv_tabname 19 | iv_json_str = iv_json_str 20 | iv_kz = iv_kz 21 | iv_empty_fields = iv_empty_fields ). 22 | 23 | 24 | 25 | 26 | 27 | 28 | ENDFUNCTION. 29 | -------------------------------------------------------------------------------- /version_label.svg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | Production purposes, 10 | High load tested 11 | 12 | 13 | --------------------------------------------------------------------------------