ABAP AnyTab UpdateTask

ABAP-Функционал для консистентного (в рамках SAP LUW) обновления любой таблицы базы данных без создания дополнительных функциональных модулей обновления. Для импорта в целевую систему можно использовать:

  1. Архив ABAPGIT (offline-установка):
    RU
    EN

  2. Скачав напрямую с github по ссылке AnyTabUpdateTask

Прошу обратить внимание, что сам функционал находится в пакете ZC8A_005, а отдельным под-пакетом ZC8A_005_DEMO прилагаются DEMO-программы по использованию функционала.
В этом случае Вы можете оставить DEMO-программы в системе разработки, а сам функционал без лишних объектов переносить по ландшафту.

Описание, что такое abapGit и как его использовать доступно по ссылке abapGit. Там же можно найти примеры импорта и экспорта ZIP-файла

Если остались вопросы - то воспользуйтесь пунктом Поддержка и обратная связь

Краткий обзор

  • ООП-реализация на основе композиции (для использования не предполагается наследование)
  • Обновление любой таблицы в режиме UpdateTask без создания функциональных модулей
  • Обновление любой таблицы в параллельном режиме (для случая, если в текущем COMMIT нежелателен)
  • Обновление таблицы в режиме DELETE
  • Обновление таблицы в режиме UPDATE по конкретным полям
  • Обновление в режием BACKGROUND TASK для нагруженных процессов
  • Объединение обновлений и обновление с COMMIT
  • Для целей удобной отладки и трассировки: в функционал включены контрольные точки и возможности отладки в отдельных процессах

Системные требования

Уровень системы

  1. Версия SAP NetWeaver 7.02 и выше.
  2. Версия SAP Logon значения не имеет, но проверялось, начиная с 640.

Полномочия в системе

  1. Для установки нужно иметь права разработчика.

Примеры использования

Примеры для возможности запуска представлены в под-пакете ZC8A_005_DEMO Z8A005_AnyTabUpdate.zip

Простое использование: Сохранение одной внутренней таблицы с COMMIT
Внутренняя таблица заполняется, класс ZCL_C8A005_SAVE2DB передает данные в режиме IN UPDATE TASK, затем вызывается команда COMMIT

    
    
    DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'.
    DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample.
    
    lt_sample_tab = VALUE #(
    	( entity_guid = 'ANY_SIMPL_GUID_MOD' entity_param1 = 'CHAR10' entity_param2 = '0504030201')
    	( entity_guid = 'ANY_SIMPL_GUID2_MOD' entity_param1 = '2CHAR10' entity_param2 = '0102030405')
    	( entity_guid = 'ANY_SIMPL_GUID2_DEL' entity_param1 = '2CHAR10' entity_param2 = '777909034')
    	).
     
    NEW zcl_c8a005_save2db(
      )->save2db( iv_tabname = lc_db_tab_sample
    			   it_tab_content = lt_sample_tab )->do_commit_if_any( ).
                    


Частое использование: Сохранение нескольких внутренних таблиц с COMMIT по завершению
Внутренние таблицы (пустые или с данными) передаются классу ZCL_C8A005_SAVE2DB. НЕобязательно, чтобы это была одна инстанция. По завершению вызывается команда COMMIT .

    
    DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'.
    DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample.
    DATA lt_sample_empty_tab TYPE STANDARD TABLE OF ztc8a005_sample.
    DATA lt_head_tab TYPE STANDARD TABLE OF ztc8a005_head.
    DATA lt_item_tab TYPE STANDARD TABLE OF ztc8a005_item.
    DATA lv_ts TYPE timestamp.
    DATA lo_saver_anytab TYPE REF TO zcl_c8a005_save2db.
     
    GET TIME STAMP FIELD lv_ts.
         
    lt_sample_tab = VALUE #(
    	( entity_guid = 'ANY_GUID_MOD' entity_param1 = 'CHAR10' entity_param2 = '0504030201'
    		entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts )
    	( entity_guid = 'ANY_GUID2_MOD' entity_param1 = '2CHAR10' entity_param2 = '0102030405'
    	  entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts )
    	( entity_guid = 'ANY_GUID2_DEL' entity_param1 = '2CHAR10' entity_param2 = '777909034'
    	  entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts )
    	).
         
    lt_head_tab = VALUE #(
    	( head_guid = 'ANY_GUID_UPD' head_param1 = 'ANY_GUID_ADD' head_param2 = '9988776655'
    		head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts )
    	( head_guid = 'ANY_GUID2_UPD' head_param1 = 'ANY_GUID2_ADD' head_param2 = '9988776655'
    		head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts )
    	( head_guid = 'ANY_GUID_DEL' head_param1 = 'ANY_GUID_ADD' head_param2 = '9988774444'
    		head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts )
    	( head_guid = 'ANY_GUID2_DEL' head_param1 = 'ANY_GUID2_ADD' head_param2 = '9988774444'
    		head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts )
     ).
     
    lt_item_tab = VALUE #(
    	( head_guid = 'ANY_GUID_UPD'item_guid = 'ANY_ITEM_GUID_ADD'
    		item_param1 = '2CHAR10'item_param2 = '9988776655'
    		item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts )
    	( head_guid = 'ANY_GUID2_UPD'item_guid = 'ANY_ITEM_GUID2_ADD'item_param1 = '2CHAR10'
    		item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts )
    	( head_guid = 'ANY_GUID_DEL'item_guid = 'ANY_ITEM_GUID_ADD'item_param2 = '9988776655'
    		item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts )
    	( head_guid = 'ANY_GUID2_DEL'item_guid = 'ANY_ITEM_GUID2_ADD'item_param1 = '2CHAR10'
    		item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts )
    ).      
    
    
       CREATE OBJECT lo_saver_anytab.
       lo_saver_anytab->save2db( EXPORTING iv_tabname = lc_db_tab_sample
                                           it_tab_content = lt_sample_tab ).
      
       lo_saver_anytab->save2db( EXPORTING iv_tabname = 'ZTC8A005_HEAD'
                                           it_tab_content = lt_head_tab ).
    
       lo_saver_anytab->save2db( EXPORTING iv_tabname = 'ZTC8A005_ITEM'
                                           it_tab_content = lt_item_tab ).
    
       CLEAR lt_sample_empty_tab.
       lo_saver_anytab->save2db( EXPORTING iv_tabname     = lc_db_tab_sample
                                           it_tab_content = lt_sample_empty_tab ).
    
       " обновление всех таблиц будет одномоментно после commit
       " а по пустой таблицы ничего происходить не будет (не будет поставлен Update Task)
       lo_saver_anytab->do_commit_if_any( ).    
                    

Обновление конкретных полей (обновление в режиме U).
в БД передаются только непустые поля из внутренней таблицы. Обновление происходит по ключевым полям.

    
    DATA lt_tab_with_key_2fields TYPE STANDARD TABLE OF ztc8a005_item. "в таблице в ключе 2 поля
    DATA lc_tab_trg TYPE tabname VALUE 'ZTC8A005_ITEM'.
    
    lt_tab_with_key_2fields = VALUE #(
    	( head_guid = 'ANY_GUID_UPD' item_guid = 'ANY_ITEM_GUID_ADD' item_param2 = '1234563214' )
    	( head_guid = 'ANY_GUID2_UPD' item_guid = 'ANY_ITEM_GUID2_ADD' item_param1 = '2UPDCHAR' )
    	).
    
    " обновление по ключу, но в обновляемых непустые поля
    NEW zcl_c8a005_save2db(  )->save2db(
      EXPORTING
    	iv_tabname     = lc_tab_trg
    	it_tab_content = lt_tab_with_key_2fields
    	iv_do_commit   = ABAP_true " можно включать COMMIT сразу
    	iv_kz          = 'U'
      ).
                    

Сохранение данных без COMMIT в текущем процессе
Внутренняя таблица передается в БД в отдельном процессе через опцию DESTINATION 'NONE'. Сохранение данных происходит сразу же.

    
    DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'.
    DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample.
    lt_sample_tab = VALUE #(
    	( entity_guid = 'AVOID_CUR_COMMIT1_MOD' entity_param1 = 'DEST1NONE' 
    		entity_param2 = '1234512121' entity_param3 = sy-uzeit entity_param4 = sy-datum )
    	( entity_guid = 'AVOID_CUR_COMMIT2_MOD' entity_param1 = 'DEST2NONE' 
    		entity_param2 = '0102030405' entity_param3 = sy-uzeit entity_param4 = sy-datum )
    	( entity_guid = 'AVOID_CUR_COMMIT3_MOD' entity_param1 = 'DEST3NONE' 
    		entity_param2 = '220629909'  entity_param3 = sy-uzeit entity_param4 = sy-datum )
    	).
    
    " обновление происходит не в текущем процессе, а параллельном через DESTINATION 'NONE'
    " нужно для случаев, когда в текущем процессе необходимость COMMIT пока не определена,
    " или он будет позже
    NEW zcl_c8a005_save2db(
      )->save2db( iv_tabname = lc_db_tab_sample
                  it_tab_content = lt_sample_tab
                  iv_dest_none = abap_true ).
                    

Описание параметров

Класс ZCL_C8A005_SAVE2DB

Метод SAVE2DB
iv_tabname Имя таблицы в базы данных, в которую производится сохранение. Опциональный. В случае, если пустой - система сама попытается найти целевую таблицу. Если не найдет - то обновления не будет.
it_tab_content Содержимое внутренней таблицы. Структуру должна совпадать с именем таблицы в параметре iv_tabname. Обязательный.
iv_do_commit Принимает значения abap_true/abap_false (по умолчанию). Если abap_true, то COMMIT пройдет сразу же в текущем процессе.
iv_kz Принимает значения M (MODIFY, по умолчанию), U (UPDATE), D (DELETE).
Режим M вызывает комманду MODIFY и в БД будут переданы значения в том виде, как они находятся во внутренней таблицы;
U - вызывает команду UPDATE и в БД будут переданы непустые значения из внутренней таблицы, пустые значения в БД переданы не будут
D - вызывает ком DELETE и из БД будут удалены значения по ключу (во внутренней таблице достаточно передачи только ключевых полей)
iv_dest_none Принимает значения abap_true/abap_false (по умолчанию). Если abap_true, то сохранение пройдет в отдельном процессе и сразу без необходимости COMMIT в текущем
Метод SAVE2DB_LINE Позволяет отправить значения в базу на основе структуры, а не внутренней таблицы. Предназначается, чтобы не создавать ненужных переменных.
iv_tabname Имя таблицы в базы данных, в которую производится сохранение. Обязательный.
is_tab_content Содержимое структуры; структура должна совпадать по типу с iv_tabname. Обязательный.
iv_do_commit Принимает значения abap_true/abap_false (по умолчанию). Если abap_true, то COMMIT пройдет сразу же в текущем процессе.
iv_dest_none Принимает значения abap_true/abap_false (по умолчанию). Если abap_true, то сохранение пройдет в отдельном процессе и сразу без необходимости COMMIT в текущем
Метод DO_COMMIT_IF_ANY Вызывает команду COMMIT.
iv_do_commit Принимает значения abap_true/abap_false (по умолчанию). Если abap_true, то COMMIT будет вызван в любом случае; если abap_false, то только в том случае, если инстанции была передана непустая таблица (хотя бы одна)

Поддержка и обратная связь

Для предоставления комментариев/багов/прояснений/обратной связи можно использовать:

Ожидаемый ответ по всем каналам не более 3х календарных дней. Моментального ответа не будет точно :-)